import { APIObject } from './APIObject'; import { API, APICredentials } from './API'; type TemplateData = { id?: number, name: string, type: 'campaign' | 'tx', body: string, subject?: string, is_default?: boolean, created_at?: string, updated_at?: string }; /** * A class that represents a template in Listmonk. */ export class Template extends APIObject { private id?: number; /** Name of the template */ private name: string; /** Type of the template (`campaign` or `tx`) */ private type?: 'campaign' | 'tx'; /** Raw HTML body of the template */ private body: string; /** Subject line for the template (only for tx) */ private subject?: string; /** Whether the template is the default template */ private isDefault?: boolean; /** Timestamp when the template was created. Format: `YYYY-MM-DDTHH:MM:SSZ` */ private createdAt?: string; /** Timestamp when the template was last updated. Format: `YYYY-MM-DDTHH:MM:SSZ` */ private updatedAt?: string; /** * Create a new template object * * @param credentials Optional credentials to use to authenticate API requests * @param id The identifier for the template * @param name The name of the template * @param type The type of the template (`campaign` or `tx`) * @param body The raw HTML body of the template * @param isDefault Whether the template is the default template * @param createdAt When the template was created. Format: `YYYY-MM-DDTHH:MM:SSZ` * @param updatedAt When the template was last updated. Format: `YYYY-MM-DDTHH:MM:SSZ` */ constructor(credentials?: APICredentials, id?: number, name?: string, type?: "campaign" | "tx", body?: string, isDefault?: boolean, createdAt?: string, updatedAt?: string) { super(credentials); this.id = id; this.name = typeof name !== 'undefined' ? name : ''; this.body = typeof body !== 'undefined' ? body : ''; this.type = type; this.isDefault = isDefault; this.createdAt = createdAt; this.updatedAt = updatedAt; } /** * @returns Identifier for the template */ getID(): number | undefined { return this.id; } /** * @returns The name of the template */ getName(): string { return this.name; } /** * Set the name of the template * * @param name Name of the template */ setName(name: string): void { this.name = name; } /** * @returns Raw HTML body of the template */ getBody(): string { return this.body; } /** * Set the raw HTML body of the template * * @param body Raw HTML body of the template */ setBody(body: string): void { this.body = body; } /** * @returns Type of the template (`campaign` or `tx`) */ getType(): 'campaign' | 'tx' | undefined { return this.type; } /** * Set the type of the template * * @param type Type of the template (`campaign` or `tx`) */ setType(type: 'campaign' | 'tx'): void { this.type = type; } /** * @returns Subject line for the template (only for tx) */ getSubject(): string | undefined { return this.subject; } /** * Set the subject line for the template * * NOTE: ONLY relevant for `tx` type templates * * @param subject Subject line for the template */ setSubject(subject: string): void { this.subject = subject; } /** * @returns Whether the template is the default template */ getIsDefault(): boolean | undefined { return this.isDefault; } /** * Set whether the template is the default template * * @param isDefault Whether the template is the default template */ setIsDefault(isDefault: boolean): void { this.isDefault = isDefault; } /** * @returns Timestamp when the template was created. Format: `YYYY-MM-DDTHH:MM:SSZ` */ getCreatedAt(): string | undefined { return this.createdAt; } /** * @returns Timestamp when the template was last updated. Format: `YYYY-MM-DDTHH:MM:SSZ` */ getUpdatedAt(): string | undefined { return this.updatedAt; } /** * Creates or updates the template in Listmonk. */ async save() { const data = this.toJSON(); // If the UUID is not set, then we assume we need to create the subscriber in Listmonk if(typeof data.id === 'undefined') { // Technically, this might be unnecessary since the values should be set to undefined anyway, but it's good to be safe delete data.id; delete data.created_at; delete data.updated_at; // Make the API call to create the subscriber in Listmonk await this.api.post('/templates', data); } else { await this.api.put('/templates/' + data.id, data); } } toJSON(): TemplateData { return { id: this.id, name: this.name, body: this.body, type: typeof this.type !== 'undefined' ? this.type : 'campaign', is_default: this.isDefault, created_at: this.createdAt, updated_at: this.updatedAt }; } fromData(data: TemplateData): Template { const typedData = data as { id?: number, name: string, type: 'campaign' | 'tx', body: string, subject?: string, is_default?: boolean, created_at?: string, updated_at?: string}; this.id = typedData.id; this.name = typedData.name this.type = typedData.type; this.body = typedData.body; this.isDefault = typedData.is_default; this.createdAt = typedData.created_at; this.updatedAt = typedData.updated_at; return this; } /** * Create a new Template object with the given data. * * Note, this doesn't automatically create the template in Listmonk. You need to call `save` to do that. * * @param name Name of the new template. * @param type Type of the template (`campaign` or `tx`) * @param body Raw HTML body of the template * @param credentials Optional credentials to use to authenticate API requests * @returns The new template object */ static async create(name: string, type: 'campaign' | 'tx', body: string, credentials?: APICredentials): Promise