diff --git a/prisma/dbml/schema.dbml b/prisma/dbml/schema.dbml index d546b66..2567404 100644 --- a/prisma/dbml/schema.dbml +++ b/prisma/dbml/schema.dbml @@ -369,6 +369,7 @@ Table user_logs { Table collections { id String [pk] name String [not null] + slug String [not null] medias medias [not null] owner users [not null] ownerId String [not null] @@ -379,6 +380,10 @@ Table collections { deletedAt DateTime createdAt DateTime [default: `now()`, not null] updatedAt DateTime [default: `now()`, not null] + + indexes { + (slug, ownerId) [unique] + } } Table watch_histories { diff --git a/src/modules/collection/controllers/addItemToCollection.controller.ts b/src/modules/collection/controllers/addItemToCollection.controller.ts index 5024e0e..00a5885 100644 --- a/src/modules/collection/controllers/addItemToCollection.controller.ts +++ b/src/modules/collection/controllers/addItemToCollection.controller.ts @@ -1,10 +1,23 @@ import { Context, Static } from "elysia"; import { returnWriteResponse } from "../../../helpers/callback/httpResponse"; import { addItemToCollectionSchema } from "../schemas/addItemToCollection.schema"; +import { addItemToCollectionService } from "../services/addItemToCollection.service"; +import { mainErrorHandler } from "../../../helpers/error/handler"; export const addItemToCollectionController = async (ctx: { set: Context["set"]; headers: Static; + params: Static; + body: Static; }) => { - return returnWriteResponse(ctx.set, 200, "Item added to collection successfully" + ctx.headers.cookie); + try { + const savedItem = await addItemToCollectionService({ + cookie: ctx.headers.cookie, + collectionName: ctx.params.name, + mediaId: ctx.body.itemId, + }); + return returnWriteResponse(ctx.set, 200, "Item added to collection successfully", savedItem); + } catch (error) { + return mainErrorHandler(ctx.set, error); + } }; diff --git a/src/modules/collection/repositories/UpsertUserCollection.repository.ts b/src/modules/collection/repositories/UpsertUserCollection.repository.ts new file mode 100644 index 0000000..5c8157b --- /dev/null +++ b/src/modules/collection/repositories/UpsertUserCollection.repository.ts @@ -0,0 +1,43 @@ +import slugify from "slugify"; +import { AppError } from "../../../helpers/error/instances/app"; +import { prisma } from "../../../utils/databases/prisma/connection"; +import { generateUUIDv7 } from "../../../helpers/databases/uuidv7"; + +export interface UpsertUserCollectionRepositoryPayload { + userId: string; + collectionName: string; + mediaConnectId: string; +} + +export const upsertUserCollectionRepository = async (payload: UpsertUserCollectionRepositoryPayload) => { + try { + return await prisma.collection.upsert({ + where: { + slug_ownerId: { + slug: slugify(payload.collectionName, { lower: true }), + ownerId: payload.userId, + }, + }, + update: { + medias: { + connect: { + id: payload.mediaConnectId, + }, + }, + }, + create: { + id: generateUUIDv7(), + name: payload.collectionName, + slug: slugify(payload.collectionName, { lower: true }), + ownerId: payload.userId, + medias: { + connect: { + id: payload.mediaConnectId, + }, + }, + }, + }); + } catch (error) { + throw new AppError(500, "Failed to upsert user collection"); + } +}; diff --git a/src/modules/collection/services/addItemToCollection.service.ts b/src/modules/collection/services/addItemToCollection.service.ts new file mode 100644 index 0000000..dff1e06 --- /dev/null +++ b/src/modules/collection/services/addItemToCollection.service.ts @@ -0,0 +1,15 @@ +import { parse } from "cookie"; +import { jwtDecode } from "../../../helpers/http/jwt/decode"; +import { tokenValidationService } from "../../auth/services/http/tokenValidation.service"; +import slugify from "slugify"; + +export type AddItemToCollectionPayload = { + cookie: string; + collectionName: string; + mediaId: string; +}; + +export const addItemToCollectionService = async (payload: AddItemToCollectionPayload) => { + const { auth_token } = parse(payload.cookie); + return (await tokenValidationService(auth_token as string)).user.id; +};