Upgrade system finished

This commit is contained in:
2026-03-22 21:47:09 -06:00
parent a71ba20176
commit bb1935027d
299 changed files with 8067 additions and 2758 deletions

View File

@@ -1 +1 @@
{"version":3,"file":"email-templates-admin.routes.d.ts","sourceRoot":"","sources":["../../../src/modules/email-templates/email-templates-admin.routes.ts"],"names":[],"mappings":"AAqBA,QAAA,MAAM,MAAM,4CAAW,CAAC;AA8UxB,eAAe,MAAM,CAAC"}
{"version":3,"file":"email-templates-admin.routes.d.ts","sourceRoot":"","sources":["../../../src/modules/email-templates/email-templates-admin.routes.ts"],"names":[],"mappings":"AAuBA,QAAA,MAAM,MAAM,4CAAW,CAAC;AAqUxB,eAAe,MAAM,CAAC"}

View File

@@ -12,19 +12,21 @@ const logger_1 = require("../../utils/logger");
const auth_middleware_1 = require("../../middleware/auth.middleware");
const rbac_middleware_1 = require("../../middleware/rbac.middleware");
const client_1 = require("@prisma/client");
const roles_1 = require("../../utils/roles");
const express_rate_limit_1 = __importDefault(require("express-rate-limit"));
const rate_limit_redis_1 = __importDefault(require("rate-limit-redis"));
const redis_1 = require("../../config/redis");
const seed_email_templates_1 = require("../../scripts/seed-email-templates");
const router = (0, express_1.Router)();
// All email template routes require authentication
router.use(auth_middleware_1.authenticate);
// All routes require admin role (SUPER_ADMIN, INFLUENCE_ADMIN, or MAP_ADMIN)
const requireAdminRole = (0, rbac_middleware_1.requireRole)(client_1.UserRole.SUPER_ADMIN, client_1.UserRole.INFLUENCE_ADMIN, client_1.UserRole.MAP_ADMIN);
// All routes require broadcast admin role
const requireBroadcastRole = (0, rbac_middleware_1.requireRole)(...roles_1.BROADCAST_ROLES);
/**
* List email templates
* GET /email-templates
*/
router.get('/', requireAdminRole, (0, validate_1.validate)(email_templates_schemas_1.listEmailTemplatesSchema, 'query'), async (req, res) => {
router.get('/', requireBroadcastRole, (0, validate_1.validate)(email_templates_schemas_1.listEmailTemplatesSchema, 'query'), async (req, res) => {
try {
const result = await email_templates_service_1.emailTemplatesService.list(req.query);
res.json(result);
@@ -38,7 +40,7 @@ router.get('/', requireAdminRole, (0, validate_1.validate)(email_templates_schem
* Get single email template
* GET /email-templates/:id
*/
router.get('/:id', requireAdminRole, async (req, res) => {
router.get('/:id', requireBroadcastRole, async (req, res) => {
try {
const template = await email_templates_service_1.emailTemplatesService.getById(req.params.id);
res.json(template);
@@ -56,7 +58,7 @@ router.get('/:id', requireAdminRole, async (req, res) => {
* Create email template
* POST /email-templates
*/
router.post('/', requireAdminRole, (0, validate_1.validate)(email_templates_schemas_1.createEmailTemplateSchema), async (req, res) => {
router.post('/', requireBroadcastRole, (0, validate_1.validate)(email_templates_schemas_1.createEmailTemplateSchema), async (req, res) => {
try {
const template = await email_templates_service_1.emailTemplatesService.create(req.body, req.user.id);
res.status(201).json(template);
@@ -78,7 +80,7 @@ router.post('/', requireAdminRole, (0, validate_1.validate)(email_templates_sche
* Update email template
* PUT /email-templates/:id
*/
router.put('/:id', requireAdminRole, (0, validate_1.validate)(email_templates_schemas_1.updateEmailTemplateSchema), async (req, res) => {
router.put('/:id', requireBroadcastRole, (0, validate_1.validate)(email_templates_schemas_1.updateEmailTemplateSchema), async (req, res) => {
try {
const template = await email_templates_service_1.emailTemplatesService.update(req.params.id, req.body, req.user.id);
// Clear cache so changes take effect immediately
@@ -103,7 +105,7 @@ router.put('/:id', requireAdminRole, (0, validate_1.validate)(email_templates_sc
* Delete email template
* DELETE /email-templates/:id
*/
router.delete('/:id', requireAdminRole, async (req, res) => {
router.delete('/:id', requireBroadcastRole, async (req, res) => {
try {
// Fetch template before deleting to get the key
const template = await email_templates_service_1.emailTemplatesService.getById(req.params.id);
@@ -130,7 +132,7 @@ router.delete('/:id', requireAdminRole, async (req, res) => {
* Get version history
* GET /email-templates/:id/versions
*/
router.get('/:id/versions', requireAdminRole, async (req, res) => {
router.get('/:id/versions', requireBroadcastRole, async (req, res) => {
try {
const versions = await email_templates_service_1.emailTemplatesService.getVersions(req.params.id);
res.json(versions);
@@ -144,7 +146,7 @@ router.get('/:id/versions', requireAdminRole, async (req, res) => {
* Get specific version
* GET /email-templates/:id/versions/:versionNumber
*/
router.get('/:id/versions/:versionNumber', requireAdminRole, async (req, res) => {
router.get('/:id/versions/:versionNumber', requireBroadcastRole, async (req, res) => {
try {
const version = await email_templates_service_1.emailTemplatesService.getVersion(req.params.id, parseInt(req.params.versionNumber, 10));
res.json(version);
@@ -162,7 +164,7 @@ router.get('/:id/versions/:versionNumber', requireAdminRole, async (req, res) =>
* Rollback to previous version
* POST /email-templates/:id/rollback
*/
router.post('/:id/rollback', requireAdminRole, (0, validate_1.validate)(email_templates_schemas_1.rollbackToVersionSchema), async (req, res) => {
router.post('/:id/rollback', requireBroadcastRole, (0, validate_1.validate)(email_templates_schemas_1.rollbackToVersionSchema), async (req, res) => {
try {
const template = await email_templates_service_1.emailTemplatesService.rollbackToVersion(req.params.id, req.body, req.user.id);
res.json(template);
@@ -180,7 +182,7 @@ router.post('/:id/rollback', requireAdminRole, (0, validate_1.validate)(email_te
* Validate template syntax
* POST /email-templates/validate
*/
router.post('/validate', requireAdminRole, (0, validate_1.validate)(email_templates_schemas_1.validateTemplateSchema), async (req, res) => {
router.post('/validate', requireBroadcastRole, (0, validate_1.validate)(email_templates_schemas_1.validateTemplateSchema), async (req, res) => {
try {
const result = email_templates_service_1.emailTemplatesService.validateTemplate(req.body);
res.json(result);
@@ -195,7 +197,7 @@ router.post('/validate', requireAdminRole, (0, validate_1.validate)(email_templa
* POST /email-templates/:id/test
* Rate limited to 10 per 15 minutes per user
*/
router.post('/:id/test', requireAdminRole, (0, express_rate_limit_1.default)({
router.post('/:id/test', requireBroadcastRole, (0, express_rate_limit_1.default)({
windowMs: 15 * 60 * 1000, // 15 minutes
max: 10,
standardHeaders: true,
@@ -223,7 +225,7 @@ router.post('/:id/test', requireAdminRole, (0, express_rate_limit_1.default)({
* Get test logs for template
* GET /email-templates/:id/test-logs
*/
router.get('/:id/test-logs', requireAdminRole, async (req, res) => {
router.get('/:id/test-logs', requireBroadcastRole, async (req, res) => {
try {
const limit = req.query.limit ? parseInt(req.query.limit, 10) : 10;
const logs = await email_templates_service_1.emailTemplatesService.getTestLogs(req.params.id, limit);
@@ -240,16 +242,9 @@ router.get('/:id/test-logs', requireAdminRole, async (req, res) => {
*/
router.post('/seed', (0, rbac_middleware_1.requireRole)(client_1.UserRole.SUPER_ADMIN), async (req, res) => {
try {
// This is a placeholder - the actual seeding is done via the script
// But we keep this endpoint for manual triggering if needed
const { exec } = require('child_process');
const { promisify } = require('util');
const execAsync = promisify(exec);
const result = await execAsync('npx tsx src/scripts/seed-email-templates.ts', {
cwd: '/app',
});
await (0, seed_email_templates_1.seedEmailTemplates)();
logger_1.logger.info('Email templates seeded via API');
res.json({ success: true, output: result.stdout });
res.json({ success: true, message: 'Templates seeded successfully' });
}
catch (error) {
logger_1.logger.error('Error seeding templates:', error);

File diff suppressed because one or more lines are too long

View File

@@ -14,8 +14,8 @@ export declare const emailTemplateVariableSchema: z.ZodEffects<z.ZodObject<{
}, "strip", z.ZodTypeAny, {
type: "VIDEO" | "TEXT";
key: string;
label: string;
sortOrder: number;
label: string;
isRequired: boolean;
isConditional: boolean;
videoId?: number | undefined;
@@ -34,8 +34,8 @@ export declare const emailTemplateVariableSchema: z.ZodEffects<z.ZodObject<{
}>, {
type: "VIDEO" | "TEXT";
key: string;
label: string;
sortOrder: number;
label: string;
isRequired: boolean;
isConditional: boolean;
videoId?: number | undefined;
@@ -60,20 +60,21 @@ export declare const listEmailTemplatesSchema: z.ZodObject<{
INFLUENCE: "INFLUENCE";
MAP: "MAP";
SYSTEM: "SYSTEM";
PAYMENT: "PAYMENT";
}>>;
isActive: z.ZodOptional<z.ZodBoolean>;
}, "strip", z.ZodTypeAny, {
limit: number;
page: number;
search?: string | undefined;
category?: "INFLUENCE" | "MAP" | "SYSTEM" | undefined;
category?: "INFLUENCE" | "MAP" | "SYSTEM" | "PAYMENT" | undefined;
isActive?: boolean | undefined;
}, {
search?: string | undefined;
category?: "INFLUENCE" | "MAP" | "SYSTEM" | "PAYMENT" | undefined;
limit?: number | undefined;
category?: "INFLUENCE" | "MAP" | "SYSTEM" | undefined;
page?: number | undefined;
isActive?: boolean | undefined;
page?: number | undefined;
}>;
export type ListEmailTemplatesDto = z.infer<typeof listEmailTemplatesSchema>;
export declare const createEmailTemplateSchema: z.ZodObject<{
@@ -84,6 +85,7 @@ export declare const createEmailTemplateSchema: z.ZodObject<{
INFLUENCE: "INFLUENCE";
MAP: "MAP";
SYSTEM: "SYSTEM";
PAYMENT: "PAYMENT";
}>;
subjectLine: z.ZodString;
htmlContent: z.ZodString;
@@ -102,8 +104,8 @@ export declare const createEmailTemplateSchema: z.ZodObject<{
}, "strip", z.ZodTypeAny, {
type: "VIDEO" | "TEXT";
key: string;
label: string;
sortOrder: number;
label: string;
isRequired: boolean;
isConditional: boolean;
videoId?: number | undefined;
@@ -122,8 +124,8 @@ export declare const createEmailTemplateSchema: z.ZodObject<{
}>, {
type: "VIDEO" | "TEXT";
key: string;
label: string;
sortOrder: number;
label: string;
isRequired: boolean;
isConditional: boolean;
videoId?: number | undefined;
@@ -142,9 +144,9 @@ export declare const createEmailTemplateSchema: z.ZodObject<{
}>, "many">>;
}, "strip", z.ZodTypeAny, {
name: string;
category: "INFLUENCE" | "MAP" | "SYSTEM";
isActive: boolean;
category: "INFLUENCE" | "MAP" | "SYSTEM" | "PAYMENT";
key: string;
isActive: boolean;
subjectLine: string;
htmlContent: string;
textContent: string;
@@ -152,8 +154,8 @@ export declare const createEmailTemplateSchema: z.ZodObject<{
variables?: {
type: "VIDEO" | "TEXT";
key: string;
label: string;
sortOrder: number;
label: string;
isRequired: boolean;
isConditional: boolean;
videoId?: number | undefined;
@@ -162,13 +164,13 @@ export declare const createEmailTemplateSchema: z.ZodObject<{
}[] | undefined;
}, {
name: string;
category: "INFLUENCE" | "MAP" | "SYSTEM";
category: "INFLUENCE" | "MAP" | "SYSTEM" | "PAYMENT";
key: string;
subjectLine: string;
htmlContent: string;
textContent: string;
description?: string | undefined;
isActive?: boolean | undefined;
description?: string | undefined;
variables?: {
key: string;
label: string;
@@ -189,6 +191,7 @@ export declare const updateEmailTemplateSchema: z.ZodObject<{
INFLUENCE: "INFLUENCE";
MAP: "MAP";
SYSTEM: "SYSTEM";
PAYMENT: "PAYMENT";
}>>;
subjectLine: z.ZodOptional<z.ZodString>;
htmlContent: z.ZodOptional<z.ZodString>;
@@ -207,8 +210,8 @@ export declare const updateEmailTemplateSchema: z.ZodObject<{
}, "strip", z.ZodTypeAny, {
type: "VIDEO" | "TEXT";
key: string;
label: string;
sortOrder: number;
label: string;
isRequired: boolean;
isConditional: boolean;
videoId?: number | undefined;
@@ -227,8 +230,8 @@ export declare const updateEmailTemplateSchema: z.ZodObject<{
}>, {
type: "VIDEO" | "TEXT";
key: string;
label: string;
sortOrder: number;
label: string;
isRequired: boolean;
isConditional: boolean;
videoId?: number | undefined;
@@ -247,17 +250,17 @@ export declare const updateEmailTemplateSchema: z.ZodObject<{
}>, "many">>;
}, "strip", z.ZodTypeAny, {
name?: string | undefined;
category?: "INFLUENCE" | "MAP" | "SYSTEM" | undefined;
description?: string | null | undefined;
category?: "INFLUENCE" | "MAP" | "SYSTEM" | "PAYMENT" | undefined;
isActive?: boolean | undefined;
description?: string | null | undefined;
subjectLine?: string | undefined;
htmlContent?: string | undefined;
textContent?: string | undefined;
variables?: {
type: "VIDEO" | "TEXT";
key: string;
label: string;
sortOrder: number;
label: string;
isRequired: boolean;
isConditional: boolean;
videoId?: number | undefined;
@@ -266,9 +269,9 @@ export declare const updateEmailTemplateSchema: z.ZodObject<{
}[] | undefined;
}, {
name?: string | undefined;
category?: "INFLUENCE" | "MAP" | "SYSTEM" | undefined;
description?: string | null | undefined;
category?: "INFLUENCE" | "MAP" | "SYSTEM" | "PAYMENT" | undefined;
isActive?: boolean | undefined;
description?: string | null | undefined;
subjectLine?: string | undefined;
htmlContent?: string | undefined;
textContent?: string | undefined;

View File

@@ -1 +1 @@
{"version":3,"file":"email-templates.schemas.d.ts","sourceRoot":"","sources":["../../../src/modules/email-templates/email-templates.schemas.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,eAAO,MAAM,+BAA+B,8BAA4B,CAAC;AACzE,MAAM,MAAM,6BAA6B,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,+BAA+B,CAAC,CAAC;AAG5F,eAAO,MAAM,2BAA2B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAmBvC,CAAC;AAGF,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;;;;;;;;EAMnC,CAAC;AAEH,MAAM,MAAM,qBAAqB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC,CAAC;AAG7E,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAUpC,CAAC;AAEH,MAAM,MAAM,sBAAsB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAC;AAG/E,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EASpC,CAAC;AAEH,MAAM,MAAM,sBAAsB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAC;AAG/E,eAAO,MAAM,uBAAuB;;;;;;;;;EAGlC,CAAC;AAEH,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC;AAG3E,eAAO,MAAM,sBAAsB;;;;;;;;;;;;EAIjC,CAAC;AAEH,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAGzE,eAAO,MAAM,mBAAmB;;;;;;;;;EAG9B,CAAC;AAEH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC"}
{"version":3,"file":"email-templates.schemas.d.ts","sourceRoot":"","sources":["../../../src/modules/email-templates/email-templates.schemas.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,eAAO,MAAM,+BAA+B,8BAA4B,CAAC;AACzE,MAAM,MAAM,6BAA6B,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,+BAA+B,CAAC,CAAC;AAG5F,eAAO,MAAM,2BAA2B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAmBvC,CAAC;AAGF,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;;;;;;;;;EAMnC,CAAC;AAEH,MAAM,MAAM,qBAAqB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC,CAAC;AAG7E,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAUpC,CAAC;AAEH,MAAM,MAAM,sBAAsB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAC;AAG/E,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EASpC,CAAC;AAEH,MAAM,MAAM,sBAAsB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAC;AAG/E,eAAO,MAAM,uBAAuB;;;;;;;;;EAGlC,CAAC;AAEH,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC;AAG3E,eAAO,MAAM,sBAAsB;;;;;;;;;;;;EAIjC,CAAC;AAEH,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAGzE,eAAO,MAAM,mBAAmB;;;;;;;;;EAG9B,CAAC;AAEH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC"}

View File

@@ -28,15 +28,20 @@ export declare class EmailTemplatesService {
versions: number;
testLogs: number;
};
createdBy: {
id: string;
email: string;
name: string | null;
};
variables: {
type: import(".prisma/client").$Enums.EmailTemplateVariableType;
id: string;
videoId: number | null;
description: string | null;
key: string;
templateId: string;
label: string;
description: string | null;
sortOrder: number;
label: string;
templateId: string;
isRequired: boolean;
isConditional: boolean;
sampleValue: string | null;
@@ -46,26 +51,21 @@ export declare class EmailTemplatesService {
email: string;
name: string | null;
} | null;
createdBy: {
id: string;
email: string;
name: string | null;
};
} & {
id: string;
name: string;
createdAt: Date;
updatedAt: Date;
category: import(".prisma/client").$Enums.EmailTemplateCategory;
description: string | null;
isActive: boolean;
key: string;
createdByUserId: string;
updatedByUserId: string | null;
isActive: boolean;
description: string | null;
subjectLine: string;
htmlContent: string;
textContent: string;
isSystem: boolean;
createdByUserId: string;
updatedByUserId: string | null;
}>;
/**
* Get template by key
@@ -75,11 +75,11 @@ export declare class EmailTemplatesService {
type: import(".prisma/client").$Enums.EmailTemplateVariableType;
id: string;
videoId: number | null;
description: string | null;
key: string;
templateId: string;
label: string;
description: string | null;
sortOrder: number;
label: string;
templateId: string;
isRequired: boolean;
isConditional: boolean;
sampleValue: string | null;
@@ -90,15 +90,15 @@ export declare class EmailTemplatesService {
createdAt: Date;
updatedAt: Date;
category: import(".prisma/client").$Enums.EmailTemplateCategory;
description: string | null;
isActive: boolean;
key: string;
createdByUserId: string;
updatedByUserId: string | null;
isActive: boolean;
description: string | null;
subjectLine: string;
htmlContent: string;
textContent: string;
isSystem: boolean;
createdByUserId: string;
updatedByUserId: string | null;
}) | null>;
/**
* Create a new email template
@@ -108,11 +108,11 @@ export declare class EmailTemplatesService {
type: import(".prisma/client").$Enums.EmailTemplateVariableType;
id: string;
videoId: number | null;
description: string | null;
key: string;
templateId: string;
label: string;
description: string | null;
sortOrder: number;
label: string;
templateId: string;
isRequired: boolean;
isConditional: boolean;
sampleValue: string | null;
@@ -123,15 +123,15 @@ export declare class EmailTemplatesService {
createdAt: Date;
updatedAt: Date;
category: import(".prisma/client").$Enums.EmailTemplateCategory;
description: string | null;
isActive: boolean;
key: string;
createdByUserId: string;
updatedByUserId: string | null;
isActive: boolean;
description: string | null;
subjectLine: string;
htmlContent: string;
textContent: string;
isSystem: boolean;
createdByUserId: string;
updatedByUserId: string | null;
}>;
/**
* Update an email template
@@ -141,11 +141,11 @@ export declare class EmailTemplatesService {
type: import(".prisma/client").$Enums.EmailTemplateVariableType;
id: string;
videoId: number | null;
description: string | null;
key: string;
templateId: string;
label: string;
description: string | null;
sortOrder: number;
label: string;
templateId: string;
isRequired: boolean;
isConditional: boolean;
sampleValue: string | null;
@@ -156,15 +156,15 @@ export declare class EmailTemplatesService {
createdAt: Date;
updatedAt: Date;
category: import(".prisma/client").$Enums.EmailTemplateCategory;
description: string | null;
isActive: boolean;
key: string;
createdByUserId: string;
updatedByUserId: string | null;
isActive: boolean;
description: string | null;
subjectLine: string;
htmlContent: string;
textContent: string;
isSystem: boolean;
createdByUserId: string;
updatedByUserId: string | null;
}>;
/**
* Delete an email template
@@ -182,10 +182,10 @@ export declare class EmailTemplatesService {
} & {
id: string;
createdAt: Date;
createdByUserId: string;
subjectLine: string;
htmlContent: string;
textContent: string;
createdByUserId: string;
versionNumber: number;
changeNotes: string | null;
templateId: string;
@@ -202,10 +202,10 @@ export declare class EmailTemplatesService {
} & {
id: string;
createdAt: Date;
createdByUserId: string;
subjectLine: string;
htmlContent: string;
textContent: string;
createdByUserId: string;
versionNumber: number;
changeNotes: string | null;
templateId: string;
@@ -219,15 +219,15 @@ export declare class EmailTemplatesService {
createdAt: Date;
updatedAt: Date;
category: import(".prisma/client").$Enums.EmailTemplateCategory;
description: string | null;
isActive: boolean;
key: string;
createdByUserId: string;
updatedByUserId: string | null;
isActive: boolean;
description: string | null;
subjectLine: string;
htmlContent: string;
textContent: string;
isSystem: boolean;
createdByUserId: string;
updatedByUserId: string | null;
}>;
/**
* Validate template syntax
@@ -252,12 +252,12 @@ export declare class EmailTemplatesService {
} & {
id: string;
success: boolean;
messageId: string | null;
recipientEmail: string;
sentAt: Date;
templateId: string;
testData: Prisma.JsonValue;
errorMessage: string | null;
messageId: string | null;
sentByUserId: string;
})[]>;
}