Seeder tools for prisma
yarn add @technote-space/prisma-seeder-tools
or
npm i @technote-space/prisma-seeder-tools
e.g.
import {PrismaClient} from './client';
import {seed, createDefinition, Seeder} from '@technote-space/prisma-seeder-tools';
class RoomSeeder extends Seeder<PrismaClient> {
constructor(prisma: PrismaClient) {
super(prisma);
}
public async run(): Promise<void> {
await this.factory('room').createMany(5);
}
}
class GuestSeeder extends Seeder<PrismaClient> {
constructor(prisma: PrismaClient) {
super(prisma);
}
public async run(): Promise<void> {
await this.factory('guest').createMany(10);
}
}
class ReservationSeeder extends Seeder<PrismaClient> {
constructor(prisma: PrismaClient) {
super(prisma);
}
public async run(): Promise<void> {
const rooms = await this.factory('room').list();
const guests = await this.factory('guest').list();
await [...Array(300)].reduce(async prev => {
await prev;
await this.factory('reservation').create({}, rooms.random(), guests.random());
}, Promise.resolve());
}
}
(async() => {
const prisma = new PrismaClient();
await seed(prisma, [
createDefinition('guest', faker => ({
email: `${faker.random.number()}${faker.random.number()}@example.com`,
name: `${faker.name.lastName()} ${faker.name.firstName()}`,
phone: faker.phone.phoneNumber(),
})),
createDefinition('room', faker => ({
name: faker.name.firstName() + faker.random.number(),
number: faker.random.number({ min: 1, max: 10 }),
price: faker.random.number({ min: 1000, max: 100000 }),
})),
createDefinition('reservation', (faker, params) => {
const room = params[0] as Room;
const guest = params[1] as Guest;
const number = faker.random.number({ min: 1, max: room.number });
const checkin = faker.date.between(faker.date.past(2), faker.date.future(2));
checkin.setHours(15, 0, 0, 0);
const nights = faker.random.number({ min: 1, max: 7 });
const checkout = new Date(checkin.valueOf());
checkout.setDate(checkin.getDate() + nights);
checkout.setHours(10, 0, 0, 0);
const amount = room.price * number * nights;
return {
checkin,
checkout,
status,
number,
amount,
room: {
connect: {
id: room.id,
},
},
guest: {
connect: {
id: guest.id,
},
},
};
}),
], [
new GuestSeeder(prisma),
new RoomSeeder(prisma),
new ReservationSeeder(prisma),
]);
})();