From 86b9f6ead84775b4a618aabeebe59e0a1100a4e4 Mon Sep 17 00:00:00 2001 From: hknsh Date: Sun, 20 Oct 2024 21:46:30 +0100 Subject: [PATCH] feat: replaced prisma to kysely for queries --- bun.lockb | Bin 452520 -> 503232 bytes package.json | 8 +- .../migration.sql | 11 + .../migration.sql | 11 + prisma/schema.prisma | 10 +- src/app.module.ts | 12 +- src/configuration.ts | 5 + src/db/types.ts | 71 +++++++ src/kweeks/comments.service.ts | 136 ++++-------- src/kweeks/kweeks.module.ts | 16 +- src/kweeks/kweeks.service.ts | 130 +++--------- src/kweeks/repository/comments.repository.ts | 117 ++++++++++ src/kweeks/repository/kweeks.repository.ts | 99 +++++++++ src/main.ts | 2 + src/services/kysely/kysely.definition.ts | 16 ++ src/services/kysely/kysely.module.ts | 40 ++++ src/services/kysely/kysely.service.ts | 4 + src/users/repository/users.repository.ts | 171 +++++++++++++++ src/users/users.module.ts | 5 +- src/users/users.service.ts | 200 ++++-------------- 20 files changed, 712 insertions(+), 352 deletions(-) create mode 100644 prisma/migrations/20241020160756_removed_kweek_like_id/migration.sql create mode 100644 prisma/migrations/20241020204058_remove_comment_like_id/migration.sql create mode 100644 src/db/types.ts create mode 100644 src/kweeks/repository/comments.repository.ts create mode 100644 src/kweeks/repository/kweeks.repository.ts create mode 100644 src/services/kysely/kysely.definition.ts create mode 100644 src/services/kysely/kysely.module.ts create mode 100644 src/services/kysely/kysely.service.ts create mode 100644 src/users/repository/users.repository.ts diff --git a/bun.lockb b/bun.lockb index c1c18f3b5a4b0375bc8ea2d5f3420326d0087c46..598674e8b2e6acebf85abe71392d7efe26c872f7 100755 GIT binary patch delta 127934 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 delta 97855 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 Re--e>0}jDB;6wKI{{b4hyD|U( diff --git a/package.json b/package.json index cc22cae..29a56aa 100644 --- a/package.json +++ b/package.json @@ -48,15 +48,19 @@ "dotenv-expand": "^11.0.6", "file-type": "16.5.4", "ioredis": "^5.4.1", + "kysely": "^0.27.4", "nestjs-s3": "^2.0.1", "nestjs-zod": "^3.0.0", "passport": "^0.7.0", "passport-jwt": "^4.0.1", "passport-local": "^1.0.0", + "pg": "^8.13.0", + "prisma-kysely": "^1.8.0", "reflect-metadata": "^0.2.2", "rxjs": "^7.8.1", "sharp": "^0.33.5", - "tstl": "^3.0.0" + "tstl": "^3.0.0", + "uuid": "^10.0.0" }, "devDependencies": { "@biomejs/biome": "1.5.3", @@ -72,7 +76,9 @@ "@types/node": "^20.16.11", "@types/passport-jwt": "^4.0.1", "@types/passport-local": "^1.0.38", + "@types/pg": "^8.11.10", "@types/supertest": "^6.0.2", + "@types/uuid": "^10.0.0", "husky": "^9.1.6", "jest": "^29.7.0", "lint-staged": "^15.2.10", diff --git a/prisma/migrations/20241020160756_removed_kweek_like_id/migration.sql b/prisma/migrations/20241020160756_removed_kweek_like_id/migration.sql new file mode 100644 index 0000000..4d2a5fb --- /dev/null +++ b/prisma/migrations/20241020160756_removed_kweek_like_id/migration.sql @@ -0,0 +1,11 @@ +/* + Warnings: + + - The primary key for the `KweekLike` table will be changed. If it partially fails, the table could be left without primary key constraint. + - You are about to drop the column `id` on the `KweekLike` table. All the data in the column will be lost. + +*/ +-- AlterTable +ALTER TABLE "KweekLike" DROP CONSTRAINT "KweekLike_pkey", +DROP COLUMN "id", +ADD CONSTRAINT "KweekLike_pkey" PRIMARY KEY ("kweekId", "userId"); diff --git a/prisma/migrations/20241020204058_remove_comment_like_id/migration.sql b/prisma/migrations/20241020204058_remove_comment_like_id/migration.sql new file mode 100644 index 0000000..52da5d9 --- /dev/null +++ b/prisma/migrations/20241020204058_remove_comment_like_id/migration.sql @@ -0,0 +1,11 @@ +/* + Warnings: + + - The primary key for the `CommentLike` table will be changed. If it partially fails, the table could be left without primary key constraint. + - You are about to drop the column `id` on the `CommentLike` table. All the data in the column will be lost. + +*/ +-- AlterTable +ALTER TABLE "CommentLike" DROP CONSTRAINT "CommentLike_pkey", +DROP COLUMN "id", +ADD CONSTRAINT "CommentLike_pkey" PRIMARY KEY ("commentId", "userId"); diff --git a/prisma/schema.prisma b/prisma/schema.prisma index fd2cec6..5a30317 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -1,5 +1,7 @@ generator client { - provider = "prisma-client-js" + provider = "prisma-kysely" + output = "../src/db" + fileName = "types.ts" } datasource db { @@ -39,23 +41,25 @@ model Kweek { } model KweekLike { - id String @id @default(uuid()) kweekId String kweek Kweek @relation(fields: [kweekId], references: [id], onDelete: Cascade) userId String user User @relation(fields: [userId], references: [id], onDelete: Cascade) createdAt DateTime @default(now()) + + @@id([kweekId, userId]) } // I should join these two up? Yeah, but I will not do it since it didn't work on the first time. model CommentLike { - id String @id @default(uuid()) commentId String comment Comments @relation(fields: [commentId], references: [id], onDelete: Cascade) userId String user User @relation(fields: [userId], references: [id], onDelete: Cascade) createdAt DateTime @default(now()) + + @@id([commentId, userId]) } model Follows { diff --git a/src/app.module.ts b/src/app.module.ts index ed1d73d..9b81055 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -1,7 +1,7 @@ import { FastifyMulterModule } from "@nest-lab/fastify-multer"; import { ThrottlerStorageRedisService } from "@nest-lab/throttler-storage-redis"; import { Module } from "@nestjs/common"; -import { ConfigModule } from "@nestjs/config"; +import { ConfigModule, ConfigService } from "@nestjs/config"; import { APP_GUARD, APP_PIPE } from "@nestjs/core"; import { ThrottlerGuard, ThrottlerModule, seconds } from "@nestjs/throttler"; import { S3Module } from "nestjs-s3"; @@ -10,6 +10,7 @@ import { AuthModule } from "./auth/auth.module"; import { JwtAuthGuard } from "./auth/jwt-auth.guard"; import { Configuration } from "./configuration"; import { KweeksModule } from "./kweeks/kweeks.module"; +import { KyselyModule } from "./services/kysely/kysely.module"; import { UserModule } from "./users/users.module"; @Module({ @@ -19,6 +20,15 @@ import { UserModule } from "./users/users.module"; storage: new ThrottlerStorageRedisService(Configuration.REDIS_URL()), errorMessage: "Too many requests", }), + KyselyModule.forRootAsync({ + useFactory: () => ({ + host: Configuration.POSTGRES_HOST(), + port: Number(Configuration.POSTGRES_PORT()), + user: Configuration.POSTGRES_USER(), + password: Configuration.POSTGRES_PASSWORD(), + database: Configuration.POSTGRES_DB(), + }), + }), ConfigModule.forRoot({ isGlobal: true, }), diff --git a/src/configuration.ts b/src/configuration.ts index f927127..085cdeb 100644 --- a/src/configuration.ts +++ b/src/configuration.ts @@ -11,4 +11,9 @@ export namespace Configuration { export const MINIO_DEFAULT_BUCKETS = () => Environment.env.MINIO_DEFAULT_BUCKETS; export const MINIO_ENDPOINT = () => Environment.env.MINIO_ENDPOINT; + export const POSTGRES_HOST = () => Environment.env.POSTGRES_HOST; + export const POSTGRES_PORT = () => Environment.env.POSTGRES_PORT; + export const POSTGRES_USER = () => Environment.env.POSTGRES_USER; + export const POSTGRES_PASSWORD = () => Environment.env.POSTGRES_PASSWORD; + export const POSTGRES_DB = () => Environment.env.POSTGRES_DB; } diff --git a/src/db/types.ts b/src/db/types.ts new file mode 100644 index 0000000..d99d3c1 --- /dev/null +++ b/src/db/types.ts @@ -0,0 +1,71 @@ +import type { ColumnType } from "kysely"; +export type Generated = T extends ColumnType + ? ColumnType + : ColumnType; +export type Timestamp = ColumnType; + +export const NotificationType = { + WARNING: "WARNING", + INFO: "INFO", +} as const; +export type NotificationType = + (typeof NotificationType)[keyof typeof NotificationType]; +export type CommentLike = { + commentId: string; + userId: string; + createdAt: Generated; +}; +export type Comments = { + id: Generated; + content: string; + userId: string; + kweekId: string | null; + attachments: string[]; + createdAt: Generated; + updatedAt: Generated; + parentId: string | null; +}; +export type Follows = { + followerId: string; + followingId: string; +}; +export type Kweek = { + id: Generated; + content: string; + authorId: string; + attachments: string[]; + createdAt: Generated; + updatedAt: Timestamp; +}; +export type KweekLike = { + kweekId: string; + userId: string; + createdAt: Generated; +}; +export type Notifications = { + id: Generated; + type: NotificationType; + content: string; + createdAt: Generated; + fromUserId: string; + toUserId: string; +}; +export type User = { + id: Generated; + displayName: string | null; + username: string; + email: string; + password: string; + profileImage: string | null; + socketId: string | null; + createdAt: Generated; +}; +export type DB = { + CommentLike: CommentLike; + Comments: Comments; + Follows: Follows; + Kweek: Kweek; + KweekLike: KweekLike; + Notifications: Notifications; + User: User; +}; diff --git a/src/kweeks/comments.service.ts b/src/kweeks/comments.service.ts index 6f049ba..11bb311 100644 --- a/src/kweeks/comments.service.ts +++ b/src/kweeks/comments.service.ts @@ -7,11 +7,15 @@ import { } from "@nestjs/common"; import { PrismaService } from "src/services/prisma/prisma.service"; import { S3Service } from "src/services/s3/s3.service"; +import { CommentsRepository } from "./repository/comments.repository"; +import { KweeksRepository } from "./repository/kweeks.repository"; import { selectCommentsWithReplies } from "./schemas/prisma_queries.schema"; @Injectable() export class CommentsService { constructor( + private readonly commentsRepository: CommentsRepository, + private readonly kweeksRepository: KweeksRepository, private readonly prisma: PrismaService, private readonly s3: S3Service, ) {} @@ -29,33 +33,24 @@ export class CommentsService { } // Verifies if the kweek_id is a kweek or a comment - const parentComment = await this.prisma.comments.findUnique({ - where: { id: kweek_id }, - }); + const parentComment = await this.commentsRepository.findOne(kweek_id); - let kweek = null; + let kweek = undefined; - if (parentComment === null) { - kweek = await this.prisma.kweek.findFirst({ - where: { id: kweek_id }, - }); + if (parentComment === undefined) { + kweek = await this.kweeksRepository.findOne(kweek_id); - if (kweek === null) { + if (kweek === undefined) { throw new NotFoundException("Kweek/Comment not found"); } } - const { id } = await this.prisma.comments.create({ - data: { - content, - userId: user_id, - kweekId: kweek ? kweek.id : null, - parentId: parentComment ? parentComment.id : null, - }, - select: { - id: true, - }, - }); + const { id } = await this.commentsRepository.create( + content, + user_id, + kweek ? kweek.id : null, + parentComment ? parentComment.id : null, + ); let attachments = []; @@ -63,41 +58,34 @@ export class CommentsService { attachments = await this.s3.multiImageUpload(id, files); } - await this.prisma.comments.update({ - where: { - id, - }, - data: { - attachments, - }, - }); + await this.commentsRepository.addAttachments(id, attachments); - return await this.prisma.comments.findFirst({ where: { id } }); + return await this.commentsRepository.findOne(id); } async info(comment_id: string) { - const comment = await this.prisma.comments.findUnique({ - where: { id: comment_id }, - select: { - ...selectCommentsWithReplies, - }, - }); + const comment = await this.commentsRepository.findOne(comment_id); - if (comment === null) { + if (comment === undefined) { throw new NotFoundException("Comment not found"); } - return comment; + const likes = await this.commentsRepository.countLikes(comment.id); + const comments = await this.commentsRepository.countComments(comment.id); + + return { + ...comment, + count: { + likes, + comments, + }, + }; } async update(comment_id: string, user_id: string, content: string) { - let new_content = content; + const comment = await this.commentsRepository.findOne(comment_id); - const comment = await this.prisma.comments.findFirst({ - where: { id: comment_id }, - }); - - if (comment === null) { + if (comment === undefined) { throw new NotFoundException("Comment not found"); } @@ -105,29 +93,16 @@ export class CommentsService { throw new UnauthorizedException("Forbidden"); } - if (comment.content === content.trim()) { - new_content = comment.content; - } + const new_content = + comment.content === content.trim() ? comment.content : content; - return await this.prisma.comments.update({ - where: { - id: comment_id, - }, - data: { - content: new_content, - }, - select: { - ...selectCommentsWithReplies, - }, - }); + return await this.commentsRepository.update(comment_id, new_content); } async delete(comment_id: string, user_id: string) { - const comment = await this.prisma.comments.findFirst({ - where: { id: comment_id }, - }); + const comment = await this.commentsRepository.findOne(comment_id); - if (comment === null) { + if (comment === undefined) { throw new NotFoundException("Comment not found"); } @@ -137,49 +112,28 @@ export class CommentsService { await this.s3.deleteFiles(comment.attachments); - await this.prisma.comments.delete({ - where: { - id: comment_id, - }, - }); + await this.commentsRepository.delete(comment.id); return {}; } async like(comment_id: string, user_id: string) { - const comment = await this.prisma.comments.findFirst({ - where: { - id: comment_id, - }, - }); + const comment = await this.commentsRepository.findOne(comment_id); - if (comment === null) { + if (comment === undefined) { throw new NotFoundException("Comment not found"); } - const is_comment_already_liked = await this.prisma.commentLike.findFirst({ - where: { - commentId: comment.id, - userId: user_id, - }, - }); + const is_comment_already_liked = + await this.commentsRepository.isAlreadyLiked(comment.id, user_id); - if (is_comment_already_liked !== null) { - await this.prisma.commentLike.deleteMany({ - where: { - commentId: comment.id, - userId: user_id, - }, - }); + console.log(is_comment_already_liked); + if (is_comment_already_liked) { + await this.commentsRepository.dislike(comment.id, user_id); return {}; } - return await this.prisma.commentLike.create({ - data: { - commentId: comment.id, - userId: user_id, - }, - }); + return await this.commentsRepository.like(user_id, comment.id); } } diff --git a/src/kweeks/kweeks.module.ts b/src/kweeks/kweeks.module.ts index b2fde9b..4e54662 100644 --- a/src/kweeks/kweeks.module.ts +++ b/src/kweeks/kweeks.module.ts @@ -1,14 +1,24 @@ import { Module } from "@nestjs/common"; -import { PrismaModule } from "src/services/prisma/prisma.module"; +import { PrismaService } from "src/services/prisma/prisma.service"; import { S3Service } from "src/services/s3/s3.service"; +import { UsersRepository } from "src/users/repository/users.repository"; import { CommentsController } from "./comments.controller"; import { CommentsService } from "./comments.service"; import { KweeksController } from "./kweeks.controller"; import { KweeksService } from "./kweeks.service"; +import { CommentsRepository } from "./repository/comments.repository"; +import { KweeksRepository } from "./repository/kweeks.repository"; @Module({ - imports: [PrismaModule], controllers: [KweeksController, CommentsController], - providers: [KweeksService, S3Service, CommentsService], + providers: [ + PrismaService, + KweeksService, + S3Service, + CommentsService, + UsersRepository, + CommentsRepository, + KweeksRepository, + ], }) export class KweeksModule {} diff --git a/src/kweeks/kweeks.service.ts b/src/kweeks/kweeks.service.ts index f4bcea8..87e7f47 100644 --- a/src/kweeks/kweeks.service.ts +++ b/src/kweeks/kweeks.service.ts @@ -5,14 +5,13 @@ import { NotFoundException, UnauthorizedException, } from "@nestjs/common"; -import { PrismaService } from "src/services/prisma/prisma.service"; import { S3Service } from "src/services/s3/s3.service"; -import { selectComments, selectUser } from "./schemas/prisma_queries.schema"; +import { KweeksRepository } from "./repository/kweeks.repository"; @Injectable() export class KweeksService { constructor( - private readonly prisma: PrismaService, + private readonly kweekRepository: KweeksRepository, private readonly s3: S3Service, ) {} async create(content: string, authorId: string, files: Array) { @@ -22,15 +21,7 @@ export class KweeksService { ); } - const { id } = await this.prisma.kweek.create({ - data: { - content, - authorId, - }, - select: { - id: true, - }, - }); + const { id } = await this.kweekRepository.create(content, authorId); let attachments = []; @@ -38,46 +29,34 @@ export class KweeksService { attachments = await this.s3.multiImageUpload(id, files); } - await this.prisma.kweek.update({ - where: { - id, - }, - data: { - attachments, - }, - }); + await this.kweekRepository.addAttachments(id, attachments); - return await this.prisma.kweek.findFirst({ where: { id } }); + return await this.kweekRepository.findOne(id); } async findOne(id: string) { - const post = await this.prisma.kweek.findFirst({ - where: { - id, - }, - include: { - author: selectUser, - _count: { - select: { comments: true, likes: true }, - }, - likes: true, - comments: selectComments, - }, - }); + const post = await this.kweekRepository.findOne(id); - if (post === null) { + if (post === undefined) { throw new NotFoundException("Post not found"); } - return post; + const likes = await this.kweekRepository.countLikes(post.id); + const comments = await this.kweekRepository.countComments(post.id); + + return { + ...post, + count: { + likes, + comments, + }, + }; } async update(user_id: string, post_id: string, content: string) { - let new_content = content; + const post = await this.kweekRepository.findOne(post_id); - const post = await this.prisma.kweek.findFirst({ where: { id: post_id } }); - - if (post === null) { + if (post === undefined) { throw new NotFoundException("Post not found"); } @@ -85,37 +64,16 @@ export class KweeksService { throw new UnauthorizedException("Forbidden"); } - if (post.content === content.trim()) { - new_content = post.content; - } + const new_content = + post.content === content.trim() ? post.content : content; - return await this.prisma.kweek.update({ - where: { - id: post_id, - }, - data: { - content: new_content, - }, - select: { - id: true, - content: true, - attachments: true, - createdAt: true, - updatedAt: true, - author: { - select: { - displayName: true, - username: true, - }, - }, - }, - }); + return await this.kweekRepository.update(post_id, new_content); } async remove(user_id: string, id: string) { - const post = await this.prisma.kweek.findFirst({ where: { id } }); + const post = await this.kweekRepository.findOne(id); - if (post === null) { + if (post === undefined) { throw new NotFoundException("Post not found"); } @@ -125,49 +83,29 @@ export class KweeksService { await this.s3.deleteFiles(post.attachments); - await this.prisma.kweek.delete({ - where: { - id, - }, - }); + await this.kweekRepository.delete(id); return {}; } async like(user_id: string, kweek_id: string) { - const kweek = await this.prisma.kweek.findFirst({ - where: { - id: kweek_id, - }, - }); + const kweek = await this.kweekRepository.findOne(kweek_id); - if (kweek === null) { + if (kweek === undefined) { throw new NotFoundException("Post not found"); } - const is_kweek_already_liked = await this.prisma.kweekLike.findFirst({ - where: { - kweekId: kweek.id, - userId: user_id, - }, - }); + const is_kweek_already_liked = await this.kweekRepository.isAlreadyLiked( + kweek.id, + user_id, + ); - if (is_kweek_already_liked !== null) { - await this.prisma.kweekLike.deleteMany({ - where: { - kweekId: kweek.id, - userId: user_id, - }, - }); + if (is_kweek_already_liked) { + await this.kweekRepository.dislike(kweek.id, user_id); return {}; } - return await this.prisma.kweekLike.create({ - data: { - kweekId: kweek.id, - userId: user_id, - }, - }); + return await this.kweekRepository.like(user_id, kweek.id); } } diff --git a/src/kweeks/repository/comments.repository.ts b/src/kweeks/repository/comments.repository.ts new file mode 100644 index 0000000..6cb6bd7 --- /dev/null +++ b/src/kweeks/repository/comments.repository.ts @@ -0,0 +1,117 @@ +import { Injectable } from "@nestjs/common"; +import { Database } from "src/services/kysely/kysely.service"; +import { v4 as uuid } from "uuid"; + +@Injectable() +export class CommentsRepository { + constructor(private readonly database: Database) {} + + async create( + content: string, + userId: string, + kweekId: string | null, + parentId: string | null, + ): Promise<{ id: string }> { + const [comment] = await this.database + .insertInto("Comments") + .values({ + id: uuid(), + content, + userId, + kweekId, + parentId, + createdAt: new Date(), + updatedAt: new Date(), + }) + .returning(["id"]) + .execute(); + + return comment; + } + + async update(id: string, content: string) { + return await this.database + .updateTable("Comments") + .set({ content, updatedAt: new Date() }) + .where("id", "=", id) + .returningAll() + .executeTakeFirst(); + } + + async findOne(id: string) { + return await this.database + .selectFrom("Comments") + .select([ + "id", + "content", + "attachments", + "createdAt", + "userId", + "updatedAt", + "kweekId", + "parentId", + ]) + .where("id", "=", id) + .executeTakeFirst(); + } + + async delete(id: string) { + return await this.database + .deleteFrom("Comments") + .where("id", "=", id) + .execute(); + } + + async like(userId: string, commentId: string) { + return await this.database + .insertInto("CommentLike") + .values({ userId, commentId }) + .returningAll() + .execute(); + } + + async dislike(commentId: string, userId: string) { + await this.database + .deleteFrom("CommentLike") + .where("commentId", "=", commentId) + .where("userId", "=", userId) + .execute(); + } + + async isAlreadyLiked(commentId: string, userId: string) { + return await this.database + .selectFrom("CommentLike") + .where("commentId", "=", commentId) + .where("userId", "=", userId) + .executeTakeFirst(); + } + + async addAttachments(commentId: string, attachments: string[]) { + return await this.database + .updateTable("Comments") + .where("id", "=", commentId) + .set({ attachments }) + .returningAll() + .executeTakeFirst(); + } + + async countLikes(id: string) { + const count = await this.database + .selectFrom("CommentLike") + .where("commentId", "=", id) + .select(this.database.fn.countAll().as("count")) + .executeTakeFirstOrThrow(); + + return count.count ?? 0; + } + + async countComments(id: string) { + const count = await this.database + .selectFrom("Comments") + .where((qb) => qb("kweekId", "=", id).or("parentId", "=", id)) + .select(this.database.fn.countAll().as("count")) + .executeTakeFirstOrThrow(); + + return count.count ?? 0; + } +} diff --git a/src/kweeks/repository/kweeks.repository.ts b/src/kweeks/repository/kweeks.repository.ts new file mode 100644 index 0000000..31cd276 --- /dev/null +++ b/src/kweeks/repository/kweeks.repository.ts @@ -0,0 +1,99 @@ +import { Injectable } from "@nestjs/common"; +import { Database } from "src/services/kysely/kysely.service"; +import { v4 as uuid } from "uuid"; + +@Injectable() +export class KweeksRepository { + constructor(private readonly database: Database) {} + + async create(content: string, authorId: string): Promise<{ id: string }> { + const [kweek] = await this.database + .insertInto("Kweek") + .values({ + id: uuid(), + content, + authorId, + createdAt: new Date(), + updatedAt: new Date(), + }) + .returning(["id"]) + .execute(); + + return kweek; + } + + async update(id: string, content: string) { + return await this.database + .updateTable("Kweek") + .set({ content, updatedAt: new Date() }) + .where("id", "=", id) + .returningAll() + .executeTakeFirst(); + } + + async findOne(id: string) { + return await this.database + .selectFrom("Kweek") + .selectAll() + .where("id", "=", id) + .executeTakeFirst(); + } + + async delete(id: string) { + return await this.database + .deleteFrom("Kweek") + .where("id", "=", id) + .execute(); + } + + async like(userId: string, kweekId: string) { + return await this.database + .insertInto("KweekLike") + .values({ userId, kweekId }) + .returningAll() + .execute(); + } + + async dislike(kweekId: string, userId: string) { + await this.database + .deleteFrom("KweekLike") + .where("kweekId", "=", kweekId) + .where("userId", "=", userId) + .execute(); + } + + async isAlreadyLiked(kweekId: string, userId: string) { + return await this.database + .selectFrom("KweekLike") + .where("kweekId", "=", kweekId) + .where("userId", "=", userId) + .executeTakeFirst(); + } + + async addAttachments(kweekId: string, attachments: string[]) { + return await this.database + .updateTable("Kweek") + .where("id", "=", kweekId) + .set({ attachments }) + .returningAll() + .executeTakeFirst(); + } + + async countLikes(id: string) { + const count = await this.database + .selectFrom("KweekLike") + .where("kweekId", "=", id) + .select(this.database.fn.countAll().as("count")) + .executeTakeFirstOrThrow(); + return count.count ?? 0; + } + + async countComments(id: string) { + const count = await this.database + .selectFrom("Comments") + .where("kweekId", "=", id) + .select(this.database.fn.countAll().as("count")) + .executeTakeFirstOrThrow(); + return count.count ?? 0; + } +} diff --git a/src/main.ts b/src/main.ts index 039c820..7549bed 100644 --- a/src/main.ts +++ b/src/main.ts @@ -20,6 +20,8 @@ import { Configuration } from "./configuration"; TODO: Create the chat system. -> Initialize the websocket system first. TODO: Create a TOS. + TODO: Improve Kysely Queries. + TODO: Fix Docker Image. */ async function bootstrap() { diff --git a/src/services/kysely/kysely.definition.ts b/src/services/kysely/kysely.definition.ts new file mode 100644 index 0000000..7baa7e8 --- /dev/null +++ b/src/services/kysely/kysely.definition.ts @@ -0,0 +1,16 @@ +import { ConfigurableModuleBuilder } from "@nestjs/common"; + +export interface DatabaseOptions { + host: string; + port: number; + user: string; + password: string; + database: string; +} + +export const { + ConfigurableModuleClass: ConfigurableDatabaseModule, + MODULE_OPTIONS_TOKEN: DATABASE_OPTIONS, +} = new ConfigurableModuleBuilder() + .setClassMethodName("forRoot") + .build(); diff --git a/src/services/kysely/kysely.module.ts b/src/services/kysely/kysely.module.ts new file mode 100644 index 0000000..9d9e89f --- /dev/null +++ b/src/services/kysely/kysely.module.ts @@ -0,0 +1,40 @@ +import { Global, Module } from "@nestjs/common"; +import { PostgresDialect } from "kysely"; +import { Pool } from "pg"; +import { + ConfigurableDatabaseModule, + DATABASE_OPTIONS, + DatabaseOptions, +} from "./kysely.definition"; +import { Database } from "./kysely.service"; + +@Global() +@Module({ + exports: [Database], + providers: [ + { + provide: Database, + inject: [DATABASE_OPTIONS], + useFactory: ({ + host, + port, + user, + password, + database, + }: DatabaseOptions) => { + const dialect = new PostgresDialect({ + pool: new Pool({ + host, + port, + user, + password, + database, + }), + }); + + return new Database({ dialect }); + }, + }, + ], +}) +export class KyselyModule extends ConfigurableDatabaseModule {} diff --git a/src/services/kysely/kysely.service.ts b/src/services/kysely/kysely.service.ts new file mode 100644 index 0000000..6b07cd1 --- /dev/null +++ b/src/services/kysely/kysely.service.ts @@ -0,0 +1,4 @@ +import { Kysely } from "kysely"; +import { DB } from "src/db/types"; + +export class Database extends Kysely {} diff --git a/src/users/repository/users.repository.ts b/src/users/repository/users.repository.ts new file mode 100644 index 0000000..fa4b75e --- /dev/null +++ b/src/users/repository/users.repository.ts @@ -0,0 +1,171 @@ +import { Injectable } from "@nestjs/common"; +import { Database } from "src/services/kysely/kysely.service"; +import { v4 as uuid } from "uuid"; +import { UserModel } from "../models/user.model"; +import { User } from "../types/user.type"; + +@Injectable() +export class UsersRepository { + constructor(private readonly database: Database) {} + + async authSearch(identifier: string): Promise { + const user = await this.database + .selectFrom("User") + .selectAll() + .where((eb) => + eb.or([eb("username", "=", identifier), eb("id", "=", identifier)]), + ) + .executeTakeFirst(); + + return user ?? undefined; + } + + async findById(id: string): Promise { + const user = await this.database + .selectFrom("User") + .select(["id", "displayName", "username", "createdAt"]) + .where("id", "=", id) + .executeTakeFirst(); + + return user ?? undefined; + } + + async findByUsername(username: string): Promise { + const user = await this.database + .selectFrom("User") + .select(["id", "displayName", "username", "createdAt"]) + .where("username", "=", username) + .executeTakeFirst(); + + return user ?? undefined; + } + + async findByEmail(email: string): Promise { + const user = await this.database + .selectFrom("User") + .select(["id", "displayName", "username", "createdAt"]) + .where("email", "=", email) + .executeTakeFirst(); + return user ?? undefined; + } + + async create(data: { + username: string; + email: string; + password: string; + }): Promise> { + const user = this.database + .insertInto("User") + .values({ + id: uuid(), + username: data.username, + email: data.email, + password: data.password, + createdAt: new Date(), + }) + .returning(["displayName", "username", "createdAt"]) + .executeTakeFirst(); + + return user; + } + + async countFollowers(id: string): Promise { + const count = await this.database + .selectFrom("Follows") + .where("followerId", "=", id) + .select(this.database.fn.countAll().as("count")) + .executeTakeFirstOrThrow(); + + return count.count ?? 0; + } + + async countFollowing(id: string): Promise { + const count = await this.database + .selectFrom("Follows") + .where("followingId", "=", id) + .select(this.database.fn.countAll().as("count")) + .executeTakeFirstOrThrow(); + + return count.count ?? 0; + } + + async getUserKweeks(id: string) { + const kweeks = await this.database + .selectFrom("Kweek") + .where("authorId", "=", id) + .select(["id", "content", "attachments", "createdAt", "updatedAt"]) + .execute(); + return kweeks; + } + async updateEmail(id: string, email: string): Promise { + await this.database + .updateTable("User") + .set({ email }) + .where("id", "=", id) + .execute(); + } + + async updateUsername( + id: string, + username: string | undefined, + displayName: string | undefined, + ): Promise> { + const user = await this.database + .updateTable("User") + .set({ username, displayName }) + .where("id", "=", id) + .returning(["username", "displayName"]) + .executeTakeFirst(); + return user; + } + + async updatePassword(id: string, password: string): Promise { + await this.database + .updateTable("User") + .set({ password }) + .where("id", "=", id) + .execute(); + } + + async updateProfileImage( + id: string, + url: string, + ): Promise<{ profileImage: string }> { + return await this.database + .updateTable("User") + .set({ profileImage: url }) + .where("id", "=", id) + .returning(["profileImage"]) + .executeTakeFirst(); + } + + async delete(id: string): Promise { + await this.database.deleteFrom("User").where("id", "=", id).execute(); + } + + async isFollowing(followerId: string, followingId: string): Promise { + const follows = await this.database + .selectFrom("Follows") + .where("followerId", "=", followerId) + .where("followingId", "=", followingId) + .executeTakeFirst(); + + return follows !== undefined; + } + + async follow(followerId: string, followingId: string) { + return await this.database + .insertInto("Follows") + .values({ followerId, followingId }) + .returning(["followingId", "followerId"]) + .executeTakeFirst(); + } + + async unfollow(followerId: string, followingId) { + return await this.database + .deleteFrom("Follows") + .where("followerId", "=", followerId) + .where("followingId", "=", followingId) + .execute(); + } +} diff --git a/src/users/users.module.ts b/src/users/users.module.ts index 8dac932..fb538d2 100644 --- a/src/users/users.module.ts +++ b/src/users/users.module.ts @@ -1,13 +1,12 @@ import { Module } from "@nestjs/common"; -import { PrismaModule } from "src/services/prisma/prisma.module"; import { S3Service } from "src/services/s3/s3.service"; +import { UsersRepository } from "./repository/users.repository"; import { UserController } from "./users.controller"; import { UserService } from "./users.service"; @Module({ - imports: [PrismaModule], controllers: [UserController], - providers: [UserService, S3Service], + providers: [UserService, S3Service, UsersRepository], exports: [UserService], }) export class UserModule {} diff --git a/src/users/users.service.ts b/src/users/users.service.ts index 2f2a78d..08efde3 100644 --- a/src/users/users.service.ts +++ b/src/users/users.service.ts @@ -5,76 +5,38 @@ import { NotFoundException, } from "@nestjs/common"; import * as argon2 from "argon2"; -import { PrismaService } from "src/services/prisma/prisma.service"; import { S3Service } from "src/services/s3/s3.service"; import { CreateUserDTO } from "./dto/create_user.dto"; import { UserModel } from "./models/user.model"; +import { UsersRepository } from "./repository/users.repository"; import { User } from "./types/user.type"; @Injectable() export class UserService { constructor( - private readonly prisma: PrismaService, private readonly s3: S3Service, + private readonly userRepository: UsersRepository, ) {} async auth_search(username: string): Promise { - const user = await this.prisma.user.findFirst({ - where: { - username, - }, - select: { - id: true, - profileImage: true, - displayName: true, - username: true, - password: true, - }, - }); - - if (user == null) { - return undefined; - } - - return user; + return await this.userRepository.authSearch(username); } async info(username: string): Promise { - const user = await this.prisma.user.findFirst({ - where: { username }, - select: { - id: true, - profileImage: true, - displayName: true, - username: true, - createdAt: true, - followers: true, - following: true, - kweeks: { - select: { - id: true, - content: true, - attachments: true, - createdAt: true, - updatedAt: true, - _count: { - select: { - comments: true, - likes: true, - }, - }, - }, - }, - }, - }); + const user = await this.userRepository.findByUsername(username); - if (user === null) { + if (user === undefined) { throw new NotFoundException("User not found"); } + const followers = await this.userRepository.countFollowers(user.id); + const following = await this.userRepository.countFollowing(user.id); + const kweeks = await this.userRepository.getUserKweeks(user.id); + return { ...user, - followers: user.followers.length, - following: user.following.length, + followers, + following, + kweeks, }; } @@ -85,88 +47,56 @@ export class UserService { }: CreateUserDTO): Promise< Pick > { - if ((await this.prisma.user.findFirst({ where: { username } })) != null) { + if ((await this.userRepository.findByUsername(username)) !== undefined) { throw new BadRequestException("Username already in use"); } - if ((await this.prisma.user.findFirst({ where: { email } })) != null) { + if ((await this.userRepository.findByEmail(email)) !== undefined) { throw new BadRequestException("Email already in use"); } - // Password encryption const hash = await argon2.hash(password); - const user = await this.prisma.user.create({ - data: { - username, - email, - password: hash, - }, - select: { - displayName: true, - username: true, - createdAt: true, - }, + return await this.userRepository.create({ + username, + email, + password: hash, }); - - return user; } async follow(authenticated_id: string, username: string) { - const user_to_follow = await this.prisma.user.findFirst({ - where: { username }, - }); + const user_to_follow = await this.userRepository.findByUsername(username); - if (user_to_follow === null) { + if (user_to_follow === undefined) { throw new NotFoundException("User to follow not found"); } - const is_already_following = await this.prisma.follows.findFirst({ - where: { - followerId: user_to_follow.id, - followingId: authenticated_id, - }, - }); + const is_already_following = await this.userRepository.isFollowing( + user_to_follow.id, + authenticated_id, + ); - if (is_already_following !== null) { - await this.prisma.follows.deleteMany({ - where: { - followerId: user_to_follow.id, - followingId: authenticated_id, - }, - }); + if (is_already_following) { + await this.userRepository.unfollow(user_to_follow.id, authenticated_id); return {}; } - return await this.prisma.follows.create({ - data: { - followerId: user_to_follow.id, - followingId: authenticated_id, - }, - }); + return await this.userRepository.follow( + user_to_follow.id, + authenticated_id, + ); } async updateEmail(id: string, email: string): Promise<{ message: string }> { - const user = await this.prisma.user.findFirst({ - where: { id }, - }); + const user = await this.userRepository.findById(id); if (email !== undefined && email.trim() !== user.email) { - const isAlreadyInUse = await this.prisma.user.findFirst({ - where: { email }, - }); - if (isAlreadyInUse != null && isAlreadyInUse.email !== user.email) { + const isAlreadyInUse = await this.userRepository.findByEmail(email); + if (isAlreadyInUse !== undefined && isAlreadyInUse.email !== user.email) { throw new BadRequestException("Email already in use"); } - await this.prisma.user.update({ - where: { - id, - }, - data: { - email: email ?? user.email, - }, - }); + await this.userRepository.updateEmail(id, email); return { message: "Email updated successfully" }; } @@ -177,32 +107,19 @@ export class UserService { username: string | undefined, displayName: string, ): Promise> { - const user = await this.prisma.user.findFirst({ - where: { id }, - }); + const user = await this.userRepository.findById(id); if (username !== undefined && username.trim() !== user.username) { - const isAlreadyInUse = await this.prisma.user.findFirst({ - where: { username }, - }); - if (isAlreadyInUse != null && isAlreadyInUse.username !== user.username) { + const isAlreadyInUse = await this.userRepository.findByUsername(username); + if ( + isAlreadyInUse !== undefined && + isAlreadyInUse.username !== user.username + ) { throw new BadRequestException("Username already in use"); } } - return await this.prisma.user.update({ - where: { - id, - }, - data: { - displayName, - username: username ?? user.username, - }, - select: { - displayName: true, - username: true, - }, - }); + return await this.userRepository.updateUsername(id, username, displayName); } async updatePassword( @@ -210,9 +127,7 @@ export class UserService { old_password: string, new_password: string, ): Promise<{ message: string }> { - const user = await this.prisma.user.findFirst({ - where: { id }, - }); + const user = await this.userRepository.authSearch(id); const validatePassword = await argon2.verify(user.password, old_password); @@ -222,14 +137,7 @@ export class UserService { const hash = await argon2.hash(new_password); - await this.prisma.user.update({ - where: { - id, - }, - data: { - password: hash, - }, - }); + await this.userRepository.updatePassword(id, hash); return { message: "Password updated successfully" }; } @@ -237,27 +145,11 @@ export class UserService { async uploadImage(id: string, image: File) { const url = await this.s3.uploadImage(id, image.buffer); - return await this.prisma.user.update({ - where: { - id, - }, - data: { - profileImage: url, - }, - select: { - profileImage: true, - }, - }); + return await this.userRepository.updateProfileImage(id, url); } async delete(id: string) { - // TODO: Add validation for safety (like e-mail confirmation or password) - // TODO: Delete the user's attachments when deleting, like Kweeks attachments and profile pictures. - try { - await this.prisma.user.deleteMany({ where: { id } }); - return { message: "User deleted" }; - } catch (e) { - throw new BadRequestException("Error while trying to delete user"); - } + await this.userRepository.delete(id); + return { message: "User deleted" }; } }