From 1ec0a4f20f7e791a050aca63b6e6d260e12c1a48 Mon Sep 17 00:00:00 2001
From: Stuart Long Chay Boon <chayboon@gmail.com>
Date: Fri, 14 Oct 2022 02:57:11 +0800
Subject: [PATCH] [offers][feat] add get comments endpoint

---
 .../src/pages/offers/test/createProfile.tsx   |  7 ++
 apps/portal/src/server/router/index.ts        |  4 +-
 .../router/offers/offers-comments-router.ts   | 64 ++++++++++++++++++-
 .../router/offers/offers-profile-router.ts    | 11 +++-
 4 files changed, 80 insertions(+), 6 deletions(-)

diff --git a/apps/portal/src/pages/offers/test/createProfile.tsx b/apps/portal/src/pages/offers/test/createProfile.tsx
index 67897015..158412ef 100644
--- a/apps/portal/src/pages/offers/test/createProfile.tsx
+++ b/apps/portal/src/pages/offers/test/createProfile.tsx
@@ -158,6 +158,12 @@ function Test() {
     }
   });
 
+  const replies = trpc.useQuery(['offers.comments.getComments', {profileId: 'cl96stky5002ew32gx2kale2x'}], {
+    onError(err) {
+      setError(err.shape?.message || "")
+    },
+  });
+
   const deleteMutation = trpc.useMutation(['offers.profile.delete']);
 
   const handleDelete = (id: string) => {
@@ -536,6 +542,7 @@ function Test() {
   return (
     <>
       <div>{createdData}</div>
+      <div>{JSON.stringify(replies.data)}</div>
       <button type="button" onClick={handleClick}>
         Click Me!
       </button>
diff --git a/apps/portal/src/server/router/index.ts b/apps/portal/src/server/router/index.ts
index fcea8526..43fcbd8d 100644
--- a/apps/portal/src/server/router/index.ts
+++ b/apps/portal/src/server/router/index.ts
@@ -3,6 +3,7 @@ import superjson from 'superjson';
 import { companiesRouter } from './companies-router';
 import { createRouter } from './context';
 import { offersRouter } from './offers/offers';
+import { offersCommentsRouter } from './offers/offers-comments-router';
 import { offersProfileRouter } from './offers/offers-profile-router';
 import { protectedExampleRouter } from './protected-example-router';
 import { questionsAnswerCommentRouter } from './questions-answer-comment-router';
@@ -36,7 +37,8 @@ export const appRouter = createRouter()
   .merge('questions.questions.comments.', questionsQuestionCommentRouter)
   .merge('questions.questions.', questionsQuestionRouter)
   .merge('offers.', offersRouter)
-  .merge('offers.profile.', offersProfileRouter);
+  .merge('offers.profile.', offersProfileRouter)
+  .merge('offers.comments.', offersCommentsRouter);
 
 // Export type definition of API
 export type AppRouter = typeof appRouter;
diff --git a/apps/portal/src/server/router/offers/offers-comments-router.ts b/apps/portal/src/server/router/offers/offers-comments-router.ts
index b0608cdd..9f20fe57 100644
--- a/apps/portal/src/server/router/offers/offers-comments-router.ts
+++ b/apps/portal/src/server/router/offers/offers-comments-router.ts
@@ -3,7 +3,67 @@ import * as trpc from '@trpc/server';
 
 import { createProtectedRouter } from '../context';
 
-export const offersProfileRouter = createProtectedRouter()
+export const offersCommentsRouter = createProtectedRouter()
+    .query('getComments', {
+        input: z.object({
+            profileId: z.string()
+        }),
+        async resolve({ ctx, input }) {
+            const result = await ctx.prisma.offersProfile.findFirst({
+                include: {
+                    discussion: {
+                        include: {
+                            replies: true,
+                            replyingTo: true,
+                            user: true
+                        }
+                    }
+                },
+                where: {
+                    id: input.profileId
+                }
+            })
+
+            if (result) {
+                return result.discussion.filter((x) => x.replyingToId === null)
+            }
+
+            return result
+        }
+    })
+    .mutation("create", {
+        input: z.object({
+            message: z.string(),
+            profileId: z.string(),
+            replyingToId: z.string().optional(),
+            userId: z.string()
+        }),
+        async resolve({ ctx, input }) {
+            await ctx.prisma.offersReply.create({
+                data: {
+                    message: input.message,
+                    profile: {
+                        connect: {
+                            id: input.profileId
+                        }
+                    },
+                    replyingTo: {
+                        connect: {
+                            id: input.replyingToId
+                        }
+                    },
+                    user: {
+                        connect: {
+                            id: input.userId
+                        }
+                    }
+                }
+            })
+
+            // Get replies
+            return
+        }
+    })
     .mutation("update", {
         input: z.object({
             id: z.string(),
@@ -30,7 +90,7 @@ export const offersProfileRouter = createProtectedRouter()
             // To validate user editing, OP or correct user
             // TODO: improve validation process
             if (profileEditToken === input.token || messageToUpdate?.userId === input.userId) {
-                await ctx.prisma.offersReply.update({
+                return await ctx.prisma.offersReply.update({
                     data: {
                         message: input.message
                     },
diff --git a/apps/portal/src/server/router/offers/offers-profile-router.ts b/apps/portal/src/server/router/offers/offers-profile-router.ts
index 944cc3e0..2cce77fb 100644
--- a/apps/portal/src/server/router/offers/offers-profile-router.ts
+++ b/apps/portal/src/server/router/offers/offers-profile-router.ts
@@ -985,6 +985,7 @@ export const offersProfileRouter = createRouter()
               include: {
                 replies: true,
                 replyingTo: true,
+                user: true
               },
             },
             offers: {
@@ -1042,10 +1043,8 @@ export const offersProfileRouter = createRouter()
 
       const profileEditToken = profile?.editToken;
 
-      // To validate user editing, OP or correct user
-      // TODO: improve validation process
       if (profileEditToken === input.token) {
-        return await ctx.prisma.offersProfile.update({
+        const updated = await ctx.prisma.offersProfile.update({
           data: {
             user: {
               connect: {
@@ -1057,6 +1056,12 @@ export const offersProfileRouter = createRouter()
             id: input.profileId
           }
         })
+
+        return {
+          id: updated.id,
+          profileName: updated.profileName,
+          userId: updated.userId
+        }
       }
 
       throw new trpc.TRPCError({