143 lines
4.3 KiB
TypeScript
143 lines
4.3 KiB
TypeScript
import { PrismaClient, StatusPost } from '@/prisma/generated/client';
|
|
import { faker } from '@faker-js/faker';
|
|
import {
|
|
PostWithRelations,
|
|
KoasProfileWithUser,
|
|
TreatmentSeedData,
|
|
} from '../types/seeding';
|
|
import { getRandomPostImages } from '../../utils/cloudinaryHelper';
|
|
import { koasUser } from '../data/users'; // pastikan import ini
|
|
|
|
export const seedPosts = async (
|
|
prisma: PrismaClient,
|
|
treatments: TreatmentSeedData[]
|
|
): Promise<PostWithRelations[]> => {
|
|
try {
|
|
// Clean up existing data
|
|
await prisma.post.deleteMany({});
|
|
|
|
// Get all approved koas profiles
|
|
const koasProfiles = (await prisma.koasProfile.findMany({
|
|
where: { status: 'Approved' },
|
|
include: {
|
|
user: true,
|
|
},
|
|
})) as KoasProfileWithUser[];
|
|
|
|
if (koasProfiles.length === 0) {
|
|
console.log('No approved koas profiles found. Skipping post creation.');
|
|
return [];
|
|
}
|
|
|
|
// Ensure we have treatments to work with
|
|
if (!treatments || treatments.length === 0) {
|
|
console.log('No treatments found. Skipping post creation.');
|
|
return [];
|
|
}
|
|
|
|
const posts: PostWithRelations[] = [];
|
|
|
|
// Buat 1 post untuk setiap koasUser, desc & image sesuai data
|
|
for (const koas of koasUser) {
|
|
// Cari koasProfile yang email-nya sama
|
|
const koasProfile = koasProfiles.find(
|
|
(kp) => kp.user?.email?.toLowerCase() === koas.email.toLowerCase()
|
|
);
|
|
if (!koasProfile) continue;
|
|
|
|
// Pilih treatment random
|
|
const treatment = faker.helpers.arrayElement(treatments);
|
|
|
|
// Title random
|
|
const titles = [
|
|
`Mencari Pasien untuk ${treatment.name}`,
|
|
`${treatment.alias} - Butuh Partisipan`,
|
|
`Program ${treatment.name} oleh KOAS UNJ`,
|
|
`${treatment.name} - Gratis untuk Pasien Terpilih`,
|
|
`Jadwal Terbuka: ${treatment.alias}`,
|
|
];
|
|
const title = faker.helpers.arrayElement(titles);
|
|
|
|
// Patient requirement random
|
|
const numRequirements = faker.helpers.rangeToNumber({ min: 2, max: 5 });
|
|
const patientRequirements: string[] = [];
|
|
const possibleRequirements = [
|
|
'Tidak memiliki riwayat penyakit jantung',
|
|
'Tidak sedang mengonsumsi obat pengencer darah',
|
|
'Tidak memiliki alergi anestesi',
|
|
'Tidak sedang hamil',
|
|
'Usia minimal 18 tahun',
|
|
'Tidak memiliki infeksi gusi akut',
|
|
'Sudah pernah melakukan pemeriksaan gigi sebelumnya',
|
|
'Tidak memiliki riwayat diabetes',
|
|
'Tidak mengalami tekanan darah tinggi',
|
|
'Bersedia mengikuti instruksi pasca perawatan',
|
|
'Membawa KTP',
|
|
'Bersedia Review',
|
|
'Membawa Tissue',
|
|
];
|
|
for (let j = 0; j < numRequirements; j++) {
|
|
const req = faker.helpers.arrayElement(possibleRequirements);
|
|
if (!patientRequirements.includes(req)) {
|
|
patientRequirements.push(req);
|
|
}
|
|
}
|
|
|
|
// Required participant random
|
|
const requiredParticipant = faker.helpers.rangeToNumber({
|
|
min: 3,
|
|
max: 10,
|
|
});
|
|
|
|
// Set status always 'Open' and createdAt default (today)
|
|
const status: StatusPost = 'Open';
|
|
const published = true;
|
|
|
|
try {
|
|
const post = await prisma.post.create({
|
|
data: {
|
|
userId: koasProfile.userId,
|
|
koasId: koasProfile.id,
|
|
treatmentId: treatment.id || '',
|
|
title: title,
|
|
desc: koas.desc,
|
|
images: [koas.img],
|
|
patientRequirement: patientRequirements,
|
|
requiredParticipant: requiredParticipant,
|
|
status: status,
|
|
published: published,
|
|
// createdAt: default (today)
|
|
},
|
|
include: {
|
|
user: {
|
|
include: {
|
|
KoasProfile: true,
|
|
},
|
|
},
|
|
koas: {
|
|
include: {
|
|
user: true,
|
|
},
|
|
},
|
|
treatment: true,
|
|
},
|
|
});
|
|
|
|
posts.push({
|
|
...post,
|
|
likes: 0,
|
|
Schedule: [],
|
|
} as PostWithRelations);
|
|
} catch (error) {
|
|
console.error('Error creating post:', error);
|
|
}
|
|
}
|
|
|
|
console.log(`Successfully created ${posts.length} posts`);
|
|
return posts;
|
|
} catch (error) {
|
|
console.error('Error in seedPosts:', error);
|
|
return [];
|
|
}
|
|
};
|