diff --git a/CHANGELOG.md b/CHANGELOG.md index 9b6516c..1db6d5b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +# [1.24.0](https://github.com/amalv/apollo-server-lambda-postgres/compare/v1.23.0...v1.24.0) (2024-01-05) + + +### Features + +* migrate favorite resolvers from TypeORM to Drizzle ORM ([a223c7b](https://github.com/amalv/apollo-server-lambda-postgres/commit/a223c7bd0fc58e627c424f21ea3435f2b362e134)) + # [1.23.0](https://github.com/amalv/apollo-server-lambda-postgres/compare/v1.22.0...v1.23.0) (2024-01-05) diff --git a/src/graphql/resolvers/Favorite.ts b/src/graphql/resolvers/Favorite.ts index c9f2ae0..91ebdf4 100644 --- a/src/graphql/resolvers/Favorite.ts +++ b/src/graphql/resolvers/Favorite.ts @@ -1,37 +1,19 @@ -import { dataSource } from "../../data-source"; -import { Favorite } from "../../entity/Favorite"; import { addFavorite, removeFavorite } from "../../services"; export const FavoriteResolvers = { Mutation: { addFavorite: async (_, { bookId }, context) => { const userId = context.userId; - const savedFavorite = await addFavorite(userId, bookId); - console.log("Saved favorite:", savedFavorite); - return savedFavorite; + return await addFavorite(userId, bookId); }, removeFavorite: async (_, { bookId }, context) => { const userId = context.userId; - const result = await removeFavorite(userId, bookId); - console.log("Removed favorite:", result); - return result; - }, - }, - Query: { - getFavorites: async (_, { userId }, context) => { try { - const dataSourceInstance = await dataSource; - const favoriteRepository = dataSourceInstance.getRepository(Favorite); - - const favorites = await favoriteRepository.find({ - where: { user: { id: userId } }, - relations: ["user", "book"], - }); - console.log("Fetched favorites:", favorites); - return favorites; + await removeFavorite(userId, bookId); + return true; } catch (error) { - console.error("Error fetching favorite books:", error); - throw error; + console.error(error); + return false; } }, }, diff --git a/src/graphql/resolvers/index.ts b/src/graphql/resolvers/index.ts index 8ba87b3..38267da 100644 --- a/src/graphql/resolvers/index.ts +++ b/src/graphql/resolvers/index.ts @@ -1,14 +1 @@ -import { UserResolvers } from "./User"; -import { BookResolvers } from "./Book"; -import { FavoriteResolvers } from "./Favorite"; - -export const resolvers = { - Query: { - ...UserResolvers.Query, - ...BookResolvers.Query, - ...FavoriteResolvers.Query, - }, - Mutation: { - ...FavoriteResolvers.Mutation, - }, -}; +export * from "./resolvers"; diff --git a/src/graphql/resolvers/resolvers.ts b/src/graphql/resolvers/resolvers.ts index 8ba87b3..0758d95 100644 --- a/src/graphql/resolvers/resolvers.ts +++ b/src/graphql/resolvers/resolvers.ts @@ -6,7 +6,6 @@ export const resolvers = { Query: { ...UserResolvers.Query, ...BookResolvers.Query, - ...FavoriteResolvers.Query, }, Mutation: { ...FavoriteResolvers.Mutation, diff --git a/src/graphql/types/typeDefs.ts b/src/graphql/types/typeDefs.ts index ec41501..378d1fa 100644 --- a/src/graphql/types/typeDefs.ts +++ b/src/graphql/types/typeDefs.ts @@ -14,7 +14,6 @@ export const typeDefs = `#graphql user: User users: [User!]! books(author: String, title: String, cursor: String, limit: Int): BooksPage! - getFavorites(userId: ID!): [Favorite!]! } type Mutation { addFavorite(bookId: ID!): Favorite diff --git a/src/services/favoriteService.ts b/src/services/favoriteService.ts index 8fc4d4e..15ef4a2 100644 --- a/src/services/favoriteService.ts +++ b/src/services/favoriteService.ts @@ -1,49 +1,52 @@ -import { Favorite } from "../entity/Favorite"; -import { User } from "../entity/User"; -import { Book } from "../entity/Book"; -import { dataSource } from "../data-source"; +import { db } from "../db"; +import { user, book, favorite } from "../schema"; +import { eq, and } from "drizzle-orm"; const setup = async (userId: string, bookId: string) => { - const dataSourceInstance = await dataSource; - const userRepository = dataSourceInstance.getRepository(User); - const bookRepository = dataSourceInstance.getRepository(Book); - const favoriteRepository = dataSourceInstance.getRepository(Favorite); + const userResult = await db + .select() + .from(user) + .where(eq(user.auth0Id, userId)) + .execute(); + const bookResult = await db + .select() + .from(book) + .where(eq(book.id, Number(bookId))) + .execute(); - const user = await userRepository.findOne({ where: { auth0Id: userId } }); - const book = await bookRepository.findOne({ where: { id: Number(bookId) } }); - - return { userRepository, bookRepository, favoriteRepository, user, book }; + return { user: userResult[0], book: bookResult[0] }; }; -export const addFavorite = async ( - userId: string, - bookId: string -): Promise => { - const { userRepository, bookRepository, favoriteRepository, user, book } = - await setup(userId, bookId); +export const addFavorite = async (userId: string, bookId: string) => { + const { user: existingUser, book } = await setup(userId, bookId); if (!book) { throw new Error("Book not found"); } - let userToSave = user; + let userToSave = existingUser; if (!userToSave) { - userToSave = userRepository.create({ auth0Id: userId }); - await userRepository.save(userToSave); + const userInsertResult = await db + .insert(user) + .values({ auth0Id: userId }) + .execute(); + userToSave = userInsertResult[0]; } - const favorite = new Favorite(); - favorite.user = userToSave; - favorite.book = book; - - return favoriteRepository.save(favorite); + const favoriteInsertResult = await db + .insert(favorite) + .values({ userId: userToSave.id, bookId: Number(bookId) }) + .returning() + .execute(); + return { + id: favoriteInsertResult[0].id, + user: userToSave, + book: book, + }; }; -export const removeFavorite = async ( - userId: string, - bookId: string -): Promise => { - const { favoriteRepository, user, book } = await setup(userId, bookId); +export const removeFavorite = async (userId: string, bookId: string) => { + const { user, book } = await setup(userId, bookId); if (!user) { throw new Error("User not found"); @@ -53,12 +56,20 @@ export const removeFavorite = async ( throw new Error("Book not found"); } - const favorite = await favoriteRepository.findOne({ where: { user, book } }); + const favoriteResult = await db + .select() + .from(favorite) + .where( + and(eq(favorite.userId, user.id), eq(favorite.bookId, Number(bookId))) + ) + .execute(); - if (!favorite) { + if (!favoriteResult[0]) { throw new Error("Favorite not found"); } - await favoriteRepository.remove(favorite); - return true; + await db + .delete(favorite) + .where(eq(favorite.id, favoriteResult[0].id)) + .execute(); };