ํ๊ธฐ
๋ฆฌ์น์์ด๋ธ v1.0์ด ์์ฑ๋์๋ค.
๊ฒ์๊ธ ์์ฑ ๋ฐ ๋ต๊ธ ์์ฑ ๊ทธ๋ฆฌ๊ณ ํ๋ก์ฐ ๊ธฐ๋ฅ ๊น์ง ๋ฃ์๋ค.
๊ธฐ๋ณธ ๊ตฌ์กฐ๋ฅผ ์ก๋๋ฐ๋ง ๊ฑฐ์ 3์ฃผ๊ฐ ๊ฑธ๋ฆฐ ๋ฏ ํ๋ค ์ด ๊ณผ์ ์์ ์ฌ์ฉ์ ์๊ตฌ์ฌํญ์ ๋ฐ๋ฅธ ๋ฐ์ด๋๋ฒ ์ด์ค ์ค๊ณ ๋ฐ ๊ธฐ๋ฅ ๊ตฌํ์ ์์ด์ ์ข์ ๊ฒฝํ์ ์ป์ ์ ์๊ฒ ๋์๋ค. ํนํ ๋ฐ์ดํฐ ๋ฒ ์ด์ค ๋ถ๋ถ์ ๊ฒฝ์ฐ ํ ์ด๋ธ ๊ฐ ์๊ด๊ด๊ณ๊ฐ ์์ฃผ ์ค์ํ ๊ฒ์ ๋๊ผ๋ค.
model Thread {
id String @id @default(cuid())
content String
User User @relation(fields: [userId], references: [id], onDelete: Cascade)
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
userId String
ThreadLike ThreadLike[]
Origin Reply[] @relation("origin")
Reply Reply[] @relation("reply")
}
model Reply {
id String @id @default(cuid())
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
originThread String // The user who is following
replyThread String // The user being followed
origin Thread @relation("origin", fields: [originThread], references: [id], onDelete: Cascade)
reply Thread @relation("reply", fields: [replyThread], references: [id], onDelete: Cascade)
@@index([originThread, replyThread], name: "idx_follower_following")
@@unique([originThread, replyThread])
}
๊ทธ๋ฆฌ๊ณ ํ๋ก ํธ์๋ ๋ถ๋ถ์์์ ๋ฐ์ดํฐ API ๊ท๊ฒฉ ์ค์ ๋ฑ ๊ธฐ์ด๋ถํฐ ์ ํ์ง ์์ผ๋ฉด ํ๋ฐ์๋ ๊ผฌ์ด๋ ๊ฒ์ ๋๊ผ๋ค. ๊ทธ๋์ ๊ณตํต์ ์ผ๋ก ๋ฆฌํดํ๋ ํจ์๋ฅผ ๊ตฌํํ๊ณ ๊ธฐ๋ณธ Type์ ์ ๋ค๋ฆญ์ ํตํ์ฌ ์ผ๊ด๋ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ ์ค๋๋ก ๊ตฌ์ฑํ์๋ค.
export async function ResponseData<T>(data: T, result: boolean) {
const response: BasicType<T> = {
result: result,
createdAt: new Date(),
data: data,
};
return response;
}
export type BasicType<T> = {
result: boolean;
createdAt: Date;
data?: T;
};
์ด์ ๋ ๋์ ๋ณธ์ ์ผ๋ก ๋์๊ฐ๋ค.
์ด์
zod๋ก ๋๊ธธ ๋ ๊ตฌ๊ธ๋ก๊ทธ์ธ ์ฌ์ฉ์์ ๊ฒฝ์ฐ ์ด๋ฉ์ผ๊ณผ ๋น๋ฐ๋ฒํธ๋ ์ ํ์ ์ผ๋กํ๊ณ "" ๋ก ๋์ฒดํด์ ๋๊ฒจ์ค์ ๋์์ด ๊ฐ๋ฅํ๋ค. ๋ฌด๋ฐ์ ํ์ ์ ์ต์ ๋์ "" ์ถ๊ฐํ๋ ๊ฒ์ ๊ณ ๋ คํด๋ณด์
export const userUpdateSchema = z.object({
email: z.optional(z.string().email()).or(z.literal("")),
name: z.string().min(2).max(8, {
message: "์ต๋ 8์ ์ด๋ด๋ก ์
๋ ฅํด์ฃผ์ธ์.",
}),
password: z
.optional(z.string().regex(passwordValidation).min(8).max(16))
.or(z.literal("")),
image: z.optional(z.string().url().nullable()),
content: z.string().min(0).nullable(),
});
์ฌ์ดํธ
https://richable.cyber-luna.com
์์ค์ฝ๋
https://github.com/TwoIceFIsh/richable-web-server