181 lines
6.7 KiB
JavaScript
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();
|
|
});
|