Skip to content

Commit

Permalink
feat: add factory for seed
Browse files Browse the repository at this point in the history
  • Loading branch information
Shchepotin committed Nov 15, 2023
1 parent bdd6d84 commit d826030
Showing 1 changed file with 107 additions and 0 deletions.
107 changes: 107 additions & 0 deletions docs/database.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ In NestJS Boilerplate uses [TypeORM](https://www.npmjs.com/package/typeorm) and
- [Seeding](#seeding)
- [Creating seeds](#creating-seeds)
- [Run seed](#run-seed)
- [Factory and Faker](#factory-and-faker)
- [Performance optimization](#performance-optimization)
- [Indexes and Foreign Keys](#indexes-and-foreign-keys)
- [Max connections](#max-connections)
Expand Down Expand Up @@ -90,6 +91,112 @@ npm run schema:drop
npm run seed:run
```

### Factory and Faker

1. Install faker:

```bash
npm i --save-dev @faker-js/faker
```

1. Create `src/database/seeds/user/user.factory.ts`:

```ts
import { faker } from '@faker-js/faker';
import { RoleEnum } from 'src/roles/roles.enum';
import { StatusEnum } from 'src/statuses/statuses.enum';
import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import { Role } from 'src/roles/entities/role.entity';
import { Status } from 'src/statuses/entities/status.entity';
import { User } from 'src/users/entities/user.entity';
@Injectable()
export class UserFactory {
constructor(
@InjectRepository(User)
private repositoryUser: Repository<User>,
@InjectRepository(Role)
private repositoryRole: Repository<Role>,
@InjectRepository(Status)
private repositoryStatus: Repository<Status>,
) {}
createRandomUser() {
// Need for saving "this" context
return () => {
return this.repositoryUser.create({
firstName: faker.person.firstName(),
lastName: faker.person.lastName(),
email: faker.internet.email(),
password: faker.internet.password(),
role: this.repositoryRole.create({
id: RoleEnum.user,
name: 'User',
}),
status: this.repositoryStatus.create({
id: StatusEnum.active,
name: 'Active',
}),
});
};
}
}
```
1. Make changes in `src/database/seeds/user/user-seed.service.ts`:
```ts
// Some code here...
import { UserFactory } from './user.factory';
import { faker } from '@faker-js/faker';
@Injectable()
export class UserSeedService {
constructor(
// Some code here...
private userFactory: UserFactory,
) {}
async run() {
// Some code here...
await this.repository.save(
faker.helpers.multiple(this.userFactory.createRandomUser(), {
count: 5,
}),
);
}
}
```
1. Make changes in `src/database/seeds/user/user-seed.module.ts`:
```ts
import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { User } from 'src/users/entities/user.entity';
import { UserSeedService } from './user-seed.service';
import { UserFactory } from './user.factory';
import { Role } from 'src/roles/entities/role.entity';
import { Status } from 'src/statuses/entities/status.entity';
@Module({
imports: [TypeOrmModule.forFeature([User, Role, Status])],
providers: [UserSeedService, UserFactory],
exports: [UserSeedService, UserFactory],
})
export class UserSeedModule {}
```
1. Run seed:
```bash
npm run seed:run
```
---
## Performance optimization
Expand Down

0 comments on commit d826030

Please sign in to comment.