/
MariaTsys
/
courseworkPP
Обзор
Документация
Войти
/
MariaTsys
/
courseworkPP
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
src/server/api/routers/bookStatus.ts
267 строк
6 KB
Maria
first_commit
09 май 2025, 12:17
09 май 2025, 12:17
af55308
Код
Авторство
О чём код?
import { z } from "zod"; import { createTRPCRouter, protectedProcedure } from "~/server/api/trpc"; export const bookStatusRouter = createTRPCRouter({ // Добавление книги в коллекцию "Хочу прочитать" addToCollection: protectedProcedure .input(z.object({ bookId: z.string() })) .mutation(async ({ ctx, input }) => { const { bookId } = input; const userId = ctx.session.user.id; const existingStatus = await ctx.db.bookStatus.findUnique({ where: { userId_bookId: { userId, bookId, }, }, }); if (!existingStatus) { await ctx.db.bookStatus.create({ data: { bookId, userId, status: "WANT_TO_READ", // Добавляем только этот статус }, }); return { success: true, created: true }; } return { success: true, created: false }; }), // Проверка, в коллекции ли книга isInCollection: protectedProcedure .input(z.object({ bookId: z.string() })) .query(async ({ ctx, input }) => { const { bookId } = input; const userId = ctx.session.user.id; const status = await ctx.db.bookStatus.findUnique({ where: { userId_bookId: { userId, bookId, }, }, }); return status?.status === "WANT_TO_READ"; }), // Лайк книги (допустимо только если статус "READING" или "READ") addToFavorites: protectedProcedure .input(z.object({ bookId: z.string() })) .mutation(async ({ ctx, input }) => { const { bookId } = input; const userId = ctx.session.user.id; const existingStatus = await ctx.db.bookStatus.findUnique({ where: { userId_bookId: { userId, bookId, }, }, }); if ( existingStatus && (existingStatus.status === "READING" || existingStatus.status === "READ") ) { await ctx.db.bookStatus.update({ where: { userId_bookId: { userId, bookId, }, }, data: { liked: true, }, }); return { success: true, liked: true }; } return { success: false, liked: false, reason: "Book must be marked as READING or READ before liking.", }; }), // Удаление лайка removeFromFavorites: protectedProcedure .input(z.object({ bookId: z.string() })) .mutation(async ({ ctx, input }) => { const { bookId } = input; const userId = ctx.session.user.id; const existingStatus = await ctx.db.bookStatus.findUnique({ where: { userId_bookId: { userId, bookId, }, }, }); if (existingStatus && existingStatus.liked) { await ctx.db.bookStatus.update({ where: { userId_bookId: { userId, bookId, }, }, data: { liked: false, }, }); return { success: true, liked: false }; } return { success: false, liked: false }; }), // Проверка, лайкнута ли книга isBookLiked: protectedProcedure .input(z.object({ bookId: z.string() })) .query(async ({ ctx, input }) => { const { bookId } = input; const userId = ctx.session.user.id; const status = await ctx.db.bookStatus.findUnique({ where: { userId_bookId: { userId, bookId, }, }, }); return status?.liked ?? false; }), // Удаление из коллекции "Хочу прочитать" removeFromCollection: protectedProcedure .input(z.object({ bookId: z.string() })) .mutation(async ({ ctx, input }) => { const { bookId } = input; const userId = ctx.session.user.id; const existingStatus = await ctx.db.bookStatus.findUnique({ where: { userId_bookId: { userId, bookId, }, }, }); if (existingStatus && existingStatus.status === "WANT_TO_READ" && !existingStatus.liked) { await ctx.db.bookStatus.delete({ where: { userId_bookId: { userId, bookId, }, }, }); return { success: true, removed: true }; } return { success: false, removed: false }; }), // Добавление книги в коллекцию "Читаю" markAsReading: protectedProcedure .input(z.object({ bookId: z.string() })) .mutation(async ({ ctx, input }) => { const { bookId } = input; const userId = ctx.session.user.id; const existingStatus = await ctx.db.bookStatus.findUnique({ where: { userId_bookId: { userId, bookId, }, }, }); if (existingStatus) { await ctx.db.bookStatus.update({ where: { userId_bookId: { userId, bookId, }, }, data: { status: "READING", }, }); } else { await ctx.db.bookStatus.create({ data: { bookId, userId, status: "READING", }, }); } return { success: true }; }), // Добавление книги в подборку "Прочитал" markAsRead: protectedProcedure .input(z.object({ bookId: z.string() })) .mutation(async ({ ctx, input }) => { const { bookId } = input; const userId = ctx.session.user.id; const existingStatus = await ctx.db.bookStatus.findUnique({ where: { userId_bookId: { userId, bookId, }, }, }); if (existingStatus) { await ctx.db.bookStatus.update({ where: { userId_bookId: { userId, bookId, }, }, data: { status: "READ", // Обновляем статус на "Прочитал" }, }); } else { await ctx.db.bookStatus.create({ data: { bookId, userId, status: "READ", // Создаем запись со статусом "Прочитал" }, }); } return { success: true }; }), });