Skip to content

Commit

Permalink
Merge branch 'feature/60-verification-code-seeder' into develop
Browse files Browse the repository at this point in the history
# Conflicts:
#	src/database/factories/member.factory.ts
#	src/database/factories/refresh-token.factory.ts
  • Loading branch information
yanggwangseong committed Jan 7, 2025
2 parents ab3f0da + 6abef23 commit e6b2e7c
Show file tree
Hide file tree
Showing 9 changed files with 158 additions and 3 deletions.
18 changes: 15 additions & 3 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 2 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@
"cross-env": "^7.0.3",
"dotenv": "^16.4.7",
"express": "^4.21.1",
"jsonwebtoken": "^9.0.2",
"multer": "^1.4.5-lts.1",
"mysql2": "^3.11.4",
"nodemailer": "^6.9.16",
Expand All @@ -48,6 +49,7 @@
"@types/bcrypt": "^5.0.2",
"@types/express": "^5.0.0",
"@types/jest": "^29.5.14",
"@types/jsonwebtoken": "^9.0.7",
"@types/multer": "^1.4.12",
"@types/node": "^22.9.0",
"@types/nodemailer": "^6.4.17",
Expand Down
9 changes: 9 additions & 0 deletions src/database/factories/category.factory.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
import { setSeederFactory } from "typeorm-extension";

import { CategoryEntity } from "@APP/entities/category.entity";

export default setSeederFactory(CategoryEntity, async () => {
const category = new CategoryEntity();

return category;
});
18 changes: 18 additions & 0 deletions src/database/factories/member.factory.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
import * as bcrypt from "bcrypt";
import { setSeederFactory } from "typeorm-extension";

import { MemberEntity } from "../../entities/member.entity";

export default setSeederFactory(MemberEntity, async (faker) => {
const hashedPassword = await bcrypt.hash("123456", 10);

const member = new MemberEntity();
member.name = faker.person.firstName();
member.nickname = faker.person.lastName();
member.email = faker.internet.email();
member.password = hashedPassword;
member.isEmailVerified = true;
member.profileImage = Math.random() > 0.5 ? faker.image.avatar() : null;

return member;
});
24 changes: 24 additions & 0 deletions src/database/factories/refresh-token.factory.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
import * as bcrypt from "bcrypt";
import jwt from "jsonwebtoken";
import { setSeederFactory } from "typeorm-extension";

import { ENV_JWT_SECRET_KEY } from "@APP/common/constants/env-keys.const";
import { RefreshTokenEntity } from "@APP/entities/refresh-token.entity";

export default setSeederFactory(RefreshTokenEntity, async () => {
const payload = {
email: "[email protected]",
sub: 8,
type: "refresh",
};

const secret = process.env[ENV_JWT_SECRET_KEY] || "secret";
const expiresIn = "3600";

const refreshToken = new RefreshTokenEntity();

const token = jwt.sign(payload, secret, { expiresIn });
refreshToken.token = await bcrypt.hash(token, 10);

return refreshToken;
});
16 changes: 16 additions & 0 deletions src/database/factories/verification-code.factory.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import * as crypto from "crypto";
import { setSeederFactory } from "typeorm-extension";

import { VerificationCodeEntity } from "@APP/entities/verification-code.entity";

export default setSeederFactory(VerificationCodeEntity, () => {
const verificationCode = crypto
.randomBytes(3)
.toString("hex")
.toUpperCase();

const verificationCodeEntity = new VerificationCodeEntity();
verificationCodeEntity.code = verificationCode;

return verificationCodeEntity;
});
38 changes: 38 additions & 0 deletions src/database/seeds/category.seeder.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
import { DataSource } from "typeorm";
import { Seeder, SeederFactoryManager } from "typeorm-extension";

import { CategoryEntity } from "@APP/entities/category.entity";

const CATEGORY_NAMES = [
"치킨",
"고기",
"한식",
"중식",
"일식",
"양식",
"족발,보쌈",
"찜,탕,찌개",
"피자",
"아시안",
"도시락",
"분식",
"카페,디저트",
"패스트푸드",
"야식",
"기타",
];

export default class CategorySeeder implements Seeder {
public async run(
_dataSource: DataSource,
factoryManager: SeederFactoryManager,
): Promise<void> {
const categoryFactory = factoryManager.get(CategoryEntity);

await Promise.all(
CATEGORY_NAMES.map((name) => categoryFactory.save({ name })),
);

console.log(`카테고리 생성 완료`);
}
}
17 changes: 17 additions & 0 deletions src/database/seeds/refresh-token.seeder.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import { DataSource } from "typeorm";
import { Seeder, SeederFactoryManager } from "typeorm-extension";

import { RefreshTokenEntity } from "@APP/entities/refresh-token.entity";

export default class RefreshTokenSeeder implements Seeder {
public async run(
_dataSource: DataSource,
factoryManager: SeederFactoryManager,
): Promise<void> {
const refreshTokenFactory = factoryManager.get(RefreshTokenEntity);

await refreshTokenFactory.save();

console.log(`리프레시토큰 생성 완료`);
}
}
19 changes: 19 additions & 0 deletions src/database/seeds/verification-code.seeder.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
import { DataSource } from "typeorm";
import { Seeder, SeederFactoryManager } from "typeorm-extension";

import { VerificationCodeEntity } from "@APP/entities/verification-code.entity";

export default class VerificationCodeSeeder implements Seeder {
public async run(
_dataSource: DataSource,
factoryManager: SeederFactoryManager,
): Promise<void> {
const verificationCodeFactory = factoryManager.get(
VerificationCodeEntity,
);

await verificationCodeFactory.save();

console.log(`인증코드 생성 완료`);
}
}

0 comments on commit e6b2e7c

Please sign in to comment.