Files
BizOne-portal/backend/prisma/seed-campaigns.js

181 lines
6.7 KiB
JavaScript

const path = require('node:path');
const { PrismaClient } = require('@prisma/client');
const dotenv = require('dotenv');
const { randomUUID } = require('node:crypto');
dotenv.config({ path: path.resolve(process.cwd(), '../.env'), quiet: true });
dotenv.config({ path: path.resolve(process.cwd(), '.env'), quiet: true });
const prisma = new PrismaClient();
const sentAt = new Date('2024-07-15T09:45:00.000Z');
const campaigns = [
{
code: 'CAM-98231',
name: 'Summer Sale 2024',
audienceLabel: '45,200 recipients',
audienceGroup: 'Retail subscribers',
status: 'Sent',
totalRecipients: 48250,
deliveredCount: 47482,
readCount: 30987,
failedCount: 578,
deliveryRate: 98.4,
readRate: 64.2,
sentAt,
templateName: 'summer_promo_v2',
language: 'English (US)',
messageTitle: 'Hi {{name}}, ☀️',
messageBody: 'Our Summer Sale is here! Get up to 40% OFF on all new arrivals. Use code SUMMER40 at checkout.',
primaryButton: 'Shop Collection',
secondaryButton: 'View Catalog',
bannerImageUrl: 'https://lh3.googleusercontent.com/aida-public/AB6AXuDEStTHrI49NhOpgRMdXx3saVUtVNe9fBtTvDiMZMeuDcQNU8eJHfAxc5hS5M8ligofVNNpUi59-kOLD9peg5njH1bWmsrHGXIx7A37_pAFEfxEAGVbjVjWCD0mGWIHu4LIShS9yDlFmvznUPzlye_JNLPzs7S8LIULMi-bL7cP6qt-uzXKuoWUwj1sw0uq0UcJnkCb6Y-04pNG8iNd2MINCbLOSbmRyf8OSOe1b9-u-sA6p5Mq3CKRjP-Fvk0vk3ZKdritVLiB0U8',
recipients: [
{ phoneNumber: '+1 (555) 012-3456', status: 'Read', sentAt: new Date('2024-07-15T10:12:00.000Z'), deviceOs: 'Android' },
{ phoneNumber: '+1 (555) 012-7890', status: 'Delivered', sentAt: new Date('2024-07-15T09:48:00.000Z'), deviceOs: 'iOS' },
{ phoneNumber: '+1 (555) 013-1122', status: 'Failed', sentAt: new Date('2024-07-15T09:45:00.000Z'), errorReason: 'Policy Violation', deviceOs: 'Android' },
{ phoneNumber: '+1 (555) 014-3344', status: 'Read', sentAt: new Date('2024-07-15T10:05:00.000Z'), deviceOs: 'Android' },
{ phoneNumber: '+1 (555) 015-5566', status: 'Delivered', sentAt: new Date('2024-07-15T09:52:00.000Z'), deviceOs: 'iOS' },
],
},
{
code: 'CAM-98244',
name: 'Weekly Newsletter #42',
audienceLabel: 'VIP Customer List',
audienceGroup: 'High-value segment',
status: 'Scheduled',
totalRecipients: 18640,
deliveredCount: 0,
readCount: 0,
failedCount: 0,
deliveryRate: null,
readRate: null,
scheduledAt: new Date('2024-07-16T14:00:00.000Z'),
templateName: 'vip_newsletter_v42',
language: 'English (US)',
messageTitle: 'Your insider update is almost here',
messageBody: 'A curated digest for premium customers with fresh offers and product stories.',
primaryButton: 'Open Newsletter',
secondaryButton: 'Manage Preferences',
bannerImageUrl: 'https://images.unsplash.com/photo-1520607162513-77705c0f0d4a?auto=format&fit=crop&w=800&q=80',
recipients: [],
},
{
code: 'CAM-98255',
name: 'Product Launch Promo',
audienceLabel: 'New Leads Segment',
audienceGroup: 'Cold outreach',
status: 'Draft',
totalRecipients: 9300,
deliveredCount: 0,
readCount: 0,
failedCount: 0,
deliveryRate: 0,
readRate: 0,
templateName: 'launch_teaser_v1',
language: 'English (US)',
messageTitle: 'Be first to see the launch',
messageBody: 'A teaser sequence for high-intent prospects before the public product announcement.',
primaryButton: 'Join Waitlist',
secondaryButton: 'See Features',
bannerImageUrl: 'https://images.unsplash.com/photo-1516321318423-f06f85e504b3?auto=format&fit=crop&w=800&q=80',
recipients: [],
},
{
code: 'CAM-98201',
name: 'Loyalty Program Update',
audienceLabel: 'Dormant Users',
audienceGroup: 'Reactivation list',
status: 'Failed',
totalRecipients: 60700,
deliveredCount: 27315,
readCount: 10844,
failedCount: 33385,
deliveryRate: 45,
readRate: 17.9,
sentAt: new Date('2024-07-10T08:30:00.000Z'),
templateName: 'loyalty_reactivation_v1',
language: 'English (US)',
messageTitle: 'We saved your rewards for you',
messageBody: 'A recovery campaign for inactive users with points reminder and welcome-back offer.',
primaryButton: 'Claim Rewards',
secondaryButton: 'Need Help',
bannerImageUrl: 'https://images.unsplash.com/photo-1515169067868-5387ec356754?auto=format&fit=crop&w=800&q=80',
recipients: [],
},
];
async function main() {
for (const campaign of campaigns) {
await prisma.campaign.upsert({
where: { code: campaign.code },
update: {
name: campaign.name,
audienceLabel: campaign.audienceLabel,
audienceGroup: campaign.audienceGroup,
status: campaign.status,
totalRecipients: campaign.totalRecipients,
deliveredCount: campaign.deliveredCount,
readCount: campaign.readCount,
failedCount: campaign.failedCount,
deliveryRate: campaign.deliveryRate,
readRate: campaign.readRate,
sentAt: campaign.sentAt || null,
scheduledAt: campaign.scheduledAt || null,
templateName: campaign.templateName,
language: campaign.language,
messageTitle: campaign.messageTitle,
messageBody: campaign.messageBody,
primaryButton: campaign.primaryButton,
secondaryButton: campaign.secondaryButton,
bannerImageUrl: campaign.bannerImageUrl,
},
create: {
id: randomUUID(),
code: campaign.code,
name: campaign.name,
audienceLabel: campaign.audienceLabel,
audienceGroup: campaign.audienceGroup,
status: campaign.status,
totalRecipients: campaign.totalRecipients,
deliveredCount: campaign.deliveredCount,
readCount: campaign.readCount,
failedCount: campaign.failedCount,
deliveryRate: campaign.deliveryRate,
readRate: campaign.readRate,
sentAt: campaign.sentAt || null,
scheduledAt: campaign.scheduledAt || null,
templateName: campaign.templateName,
language: campaign.language,
messageTitle: campaign.messageTitle,
messageBody: campaign.messageBody,
primaryButton: campaign.primaryButton,
secondaryButton: campaign.secondaryButton,
bannerImageUrl: campaign.bannerImageUrl,
recipients: {
create: campaign.recipients.map((recipient) => ({
id: randomUUID(),
phoneNumber: recipient.phoneNumber,
status: recipient.status,
sentAt: recipient.sentAt || null,
errorReason: recipient.errorReason || null,
deviceOs: recipient.deviceOs || null,
})),
},
},
});
}
console.log(`Seeded ${campaigns.length} campaigns.`);
}
main()
.catch((error) => {
console.error(error);
process.exit(1);
})
.finally(async () => {
await prisma.$disconnect();
});