Skip to content

Commit 9b31495

Browse files
committed
refactor: database package
1 parent 28f22fe commit 9b31495

File tree

17 files changed

+283
-135
lines changed

17 files changed

+283
-135
lines changed

apps/book-server/scripts/createMock.mts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ class Seeder {
107107
}
108108

109109
const main = async () => {
110-
const mongo = new MongoService()
110+
const mongo = new MongoService({ datasourceUrl: process.env.MONGO_URL })
111111
const seeder = new Seeder(mongo)
112112

113113
try {

apps/cron/src/lib/db/DbService.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,13 @@
1+
import { ENV } from '@env'
12
import { PrismaClient } from '@packages/database/velog-rds'
23
import { injectable, singleton } from 'tsyringe'
34

45
@injectable()
56
@singleton()
6-
export class DbService extends PrismaClient {}
7+
export class DbService extends PrismaClient {
8+
constructor() {
9+
super({
10+
datasourceUrl: ENV.databaseUrl,
11+
})
12+
}
13+
}

apps/server/package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,8 @@
2323
"test": "pnpm jest --detectOpenHandles",
2424
"create-service": "tsx ./scripts/createService.ts",
2525
"create-mock": "NODE_ENV=development tsx ./scripts/createMock.ts",
26-
"ssm": "tsx ./scripts/ssm.mts"
26+
"ssm": "tsx ./scripts/ssm.mts",
27+
"turbo": "turbo build"
2728
},
2829
"dependencies": {
2930
"@aws-sdk/client-s3": "^3.473.0",

apps/server/src/lib/db/DbService.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,13 @@
1+
import { ENV } from '@env'
12
import { PrismaClient } from '@packages/database/velog-rds'
23
import { injectable, singleton } from 'tsyringe'
34

45
@injectable()
56
@singleton()
6-
export class DbService extends PrismaClient {}
7+
export class DbService extends PrismaClient {
8+
constructor() {
9+
super({
10+
datasourceUrl: ENV.databaseUrl,
11+
})
12+
}
13+
}

apps/server/src/lib/discord/DiscordService.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,15 @@
1-
import { container, injectable, singleton } from 'tsyringe'
1+
import { injectable, singleton } from 'tsyringe'
22
import { Client, GatewayIntentBits } from 'discord.js'
33
import { ENV } from '@env'
4-
import { RedisService } from '@lib/redis/RedisService.js'
54
import { Time } from '@constants/TimeConstants.js'
5+
import { RedisService } from '@lib/redis/RedisService.js'
66

77
@injectable()
88
@singleton()
99
export class DiscordService {
1010
private client!: Client
1111
public isSending: boolean = false
12+
constructor(private readonly redis: RedisService) {}
1213
public connection(): Promise<Client> {
1314
return new Promise((resolve) => {
1415
this.client = new Client({
@@ -57,11 +58,10 @@ export class DiscordService {
5758
}
5859

5960
if (typeof payload === 'object' && message.includes('WritePost') && payload?.user?.id) {
60-
const redisService = container.resolve(RedisService)
61-
const key = redisService.generateKey.errorMessageCache(payload.type, payload?.user?.id)
62-
const exists = await redisService.exists(key)
61+
const key = this.redis.generateKey.errorMessageCache(payload.type, payload?.user?.id)
62+
const exists = await this.redis.exists(key)
6363
if (exists === 1) return
64-
await redisService.setex(key, Time.ONE_MINUTE_IN_S * 10, 'true')
64+
await this.redis.setex(key, Time.ONE_MINUTE_IN_S * 10, 'true')
6565
}
6666

6767
try {

apps/server/src/main.mts

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,17 +11,14 @@ async function main() {
1111
app.listen({ port: ENV.port, host: '::' })
1212

1313
const dbService = container.resolve(DbService)
14-
await dbService.$connect()
14+
await dbService.connection()
1515

1616
const redis = container.resolve(RedisService)
17-
await redis.connection().then((message) => console.log(message))
17+
await redis.connection()
1818

1919
const discord = container.resolve(DiscordService)
2020
await discord.connection()
2121

22-
console.info(`INFO: Database connected to "${ENV.databaseUrl.split('@')[1]}"`)
23-
console.info(`INFO: Redis connected to "${ENV.redisHost}:${ENV.redisPort}"`)
24-
2522
process.send?.('ready')
2623
process.on('SIGINT', function () {
2724
startClosing()

apps/server/src/services/UserService/index.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,10 @@ import { UtilsService } from '@lib/utils/UtilsService.js'
1919
import DataLoader from 'dataloader'
2020
import { AuthService } from '@services/AuthService/index.js'
2121
import { FastifyReply } from 'fastify'
22-
import { RedisService } from '@lib/redis/RedisService.js'
22+
import { RedisService, ChangeEmailArgs } from '@lib/redis/RedisService.js'
2323
import { changeEmailTemplate } from '@template/changeEmailTemplate.js'
2424
import { ENV } from '@env'
2525
import { MailService } from '@lib/mail/MailService.js'
26-
import { ChangeEmailArgs } from '@lib/redis/RedisService.js'
2726
import { differenceInDays } from 'date-fns'
2827

2928
interface Service {

apps/web/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@
3030
"@sentry/browser": "^7.75.0",
3131
"@tanstack/react-query": "^5.29.0",
3232
"axios": "^1.4.0",
33-
"codemirror": "5.51",
33+
"codemirror": "~6.0.1",
3434
"date-fns": "^2.30.0",
3535
"date-fns-tz": "^2.0.0",
3636
"dotenv": "^16.3.1",

packages/database/prisma/velog-rds/schema.prisma

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -653,8 +653,3 @@ model DynamicConfigItem {
653653
@@index([value])
654654
@@map("dynamic_config_items")
655655
}
656-
657-
model HiDgimon {
658-
id String @id @default(dbgenerated("uuid_generate_v4()")) @db.Uuid
659-
value String @db.VarChar(50)
660-
}

packages/database/scripts/env.mts

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
import path from 'path'
2+
import { z } from 'zod'
3+
import { existsSync } from 'fs'
4+
import dotenv from 'dotenv'
5+
6+
// Only used for migration and deployment
7+
if (!process.env.DOCKER_ENV && process.env.NODE_ENV !== undefined) {
8+
console.error(
9+
'Development environment was initiated, despite the absence of the Docker environment.',
10+
)
11+
}
12+
13+
const configPath = path.resolve(process.cwd(), '.env')
14+
15+
if (!existsSync(configPath)) {
16+
console.log(`Read target: ${configPath}`)
17+
throw new Error('Not found environment file')
18+
}
19+
20+
dotenv.config({ path: configPath })
21+
22+
const env = z.object({
23+
velogRdsUrl: z.string(),
24+
velogBookMongoUrl: z.string(),
25+
velogRedisHost: z.string(),
26+
velogRedisPort: z.number(),
27+
})
28+
29+
export const ENV = env.parse({
30+
velogRdsUrl: process.env.VELOG_RDS_URL,
31+
velogBookMongoUrl: process.env.VELOG_BOOK_MONGO_URL,
32+
velogRedisHost: process.env.VELOG_REDIS_HOST,
33+
velogRedisPort: Number(process.env.VELOG_REDIS_PORT),
34+
})

packages/database/scripts/mongoDeploy.mts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import inquirer from 'inquirer'
22
import { exec } from 'child_process'
3+
import { ENV } from 'scripts/env.mjs'
34

45
const main = async () => {
56
const { answer } = await inquirer.prompt([
@@ -12,6 +13,8 @@ const main = async () => {
1213
},
1314
])
1415

16+
console.log(`Target Database Info: ${ENV.velogBookMongoUrl}`)
17+
1518
if (answer === 'No') {
1619
console.info('🚫 db push process stopped by user.')
1720
process.exit(0)

packages/database/scripts/rdsDeploy.mts

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,18 +3,21 @@ import path from 'path'
33
import fs from 'fs'
44
import inquirer from 'inquirer'
55
import { exec } from 'child_process'
6+
import { ENV } from 'scripts/env.mjs'
67

78
// "prisma-migrate:deploy": "pnpm env:copy && pnpm prisma migrate deploy --schema=./prisma/velog-rds/schema.prisma"
89

9-
const db = new PrismaClient()
10+
const db = new PrismaClient({ datasourceUrl: ENV.velogRdsUrl })
11+
const migraionsPath = './prisma/velog-rds/migrations'
1012

1113
const main = async () => {
1214
const filenames = getMigrationFilenames()
1315
const appliedMigrationNames = await getAppliedMigrationNames()
1416
const diff = filenames.filter((filename) => !appliedMigrationNames.includes(filename))
1517

1618
const message = getMessage(diff)
17-
console.log(`Target Database Info: ${process.env.DATABASE_URL}\n`)
19+
20+
console.log(`Target Database Info: ${ENV.velogRdsUrl}`)
1821

1922
const { answer } = await inquirer.prompt([
2023
{
@@ -45,7 +48,7 @@ const main = async () => {
4548
main()
4649

4750
function getMigrationFilenames() {
48-
const dirPath = path.resolve(process.cwd(), './prisma/migrations/')
51+
const dirPath = path.resolve(process.cwd(), migraionsPath)
4952
return fs.readdirSync(dirPath).filter((file) => path.extname(file) !== '.toml')
5053
}
5154

@@ -66,12 +69,7 @@ function getMessage(migrationDiff: string[]): string {
6669
}
6770

6871
function getMigrationSummary(filename: string) {
69-
const filepath = path.resolve(
70-
process.cwd(),
71-
`./prisma/migrations`,
72-
`${filename}`,
73-
'./migration.sql',
74-
)
72+
const filepath = path.resolve(process.cwd(), migraionsPath, `${filename}`, './migration.sql')
7573

7674
const sql = fs.readFileSync(filepath, { encoding: 'utf-8' })
7775
const lines = sql.split('\n')

packages/database/src/lib/env/EnvService.mts

Lines changed: 0 additions & 91 deletions
This file was deleted.
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,19 @@
1+
import type { PrismaClientOptions } from '@prisma/client/runtime/library'
2+
import { PrismaClient as Client } from '@prisma/velog-book-mongo/client/index.js'
13
export * from '@prisma/velog-book-mongo/client/index.js'
4+
5+
type Options = Omit<PrismaClientOptions, 'transactionOptions'>
6+
7+
export class PrismaClient extends Client {
8+
private datasourceUrl: string
9+
constructor(options: Options) {
10+
if (!options.datasourceUrl) throw new Error('velog book datasourceUrl is required')
11+
super(options)
12+
this.datasourceUrl = options.datasourceUrl
13+
}
14+
15+
public async connection(): Promise<void> {
16+
await super.$connect()
17+
console.info(`INFO: Database connected to "${this.datasourceUrl.split('@')[1]}"`)
18+
}
19+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,19 @@
1+
import type { PrismaClientOptions } from '@prisma/client/runtime/library'
2+
import { PrismaClient as Client } from '@prisma/velog-rds/client/index.js'
13
export * from '@prisma/velog-rds/client/index.js'
4+
5+
type Options = Omit<PrismaClientOptions, 'transactionOptions'>
6+
7+
export class PrismaClient extends Client {
8+
private datasourceUrl: string
9+
constructor(options: Options) {
10+
if (!options.datasourceUrl) throw new Error('velog rds datasourceUrl is required')
11+
super(options)
12+
this.datasourceUrl = options.datasourceUrl
13+
}
14+
15+
public async connection(): Promise<void> {
16+
await super.$connect()
17+
console.info(`INFO: Database connected to "${this.datasourceUrl.split('@')[1]}"`)
18+
}
19+
}

packages/database/src/velog-redis/index.mts

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import Redis from 'ioredis'
22

33
interface Service {
4-
connection(): Promise<string>
4+
connection(): Promise<void>
55
get generateKey(): GenerateRedisKey
66
get queueName(): Record<QueueName, string>
77
createFeedQueue(data: CreateFeedArgs): Promise<number>
@@ -14,15 +14,20 @@ type RedisOptions = {
1414

1515
export class RedisService extends Redis.default implements Service {
1616
host: string
17+
port: number
1718
constructor({ port, host }: RedisOptions) {
19+
if (!port) throw new Error('redis port is required')
20+
if (!host) throw new Error('redis host is required')
1821
super({ port: port, host })
1922
this.host = host
23+
this.port = port
2024
}
2125

22-
public async connection(): Promise<string> {
26+
public async connection(): Promise<void> {
2327
return new Promise((resolve) => {
24-
this.connect(() => {
25-
resolve(`Redis connection established to ${this.host}`)
28+
super.connect(() => {
29+
resolve()
30+
console.info(`INFO: Redis connected to "${this.host}:${this.port}"`)
2631
})
2732
})
2833
}

0 commit comments

Comments
 (0)