diff --git a/apps/portal/src/components/resumes/comments/CommentsForm.tsx b/apps/portal/src/components/resumes/comments/CommentsForm.tsx index a20bfd0c..97cbb34f 100644 --- a/apps/portal/src/components/resumes/comments/CommentsForm.tsx +++ b/apps/portal/src/components/resumes/comments/CommentsForm.tsx @@ -3,7 +3,10 @@ import type { SubmitHandler } from 'react-hook-form'; import { useForm } from 'react-hook-form'; import { Button, Dialog, TextInput } from '@tih/ui'; +import { trpc } from '~/utils/trpc'; + type CommentsFormProps = Readonly<{ + resumeId: string; setShowCommentsForm: (show: boolean) => void; }>; @@ -17,7 +20,9 @@ type IFormInput = { type InputKeys = keyof IFormInput; +// TODO: Retrieve resumeId and remove default export default function CommentsForm({ + resumeId = '', setShowCommentsForm, }: CommentsFormProps) { const [showDialog, setShowDialog] = useState(false); @@ -35,10 +40,16 @@ export default function CommentsForm({ skills: '', }, }); + const reviewCreateMutation = trpc.useMutation('resumes.reviews.user.create'); + + const onSubmit: SubmitHandler = async (data) => { + await reviewCreateMutation.mutate({ + resumeId, + ...data, + }); - // TODO: Implement mutation to database - const onSubmit: SubmitHandler = (data) => { - alert(JSON.stringify(data)); + // Redirect back to comments section + setShowCommentsForm(false); }; const onCancel = () => { diff --git a/apps/portal/src/server/router/index.ts b/apps/portal/src/server/router/index.ts index 92cb47cf..2c85edad 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 { createRouter } from './context'; import { protectedExampleRouter } from './protected-example-router'; import { resumesResumeUserRouter } from './resumes-resume-user-router'; +import { resumesReviewsUserRouter } from './resumes-reviews-user-router'; import { todosRouter } from './todos'; import { todosUserRouter } from './todos-user-router'; @@ -14,7 +15,8 @@ export const appRouter = createRouter() .merge('auth.', protectedExampleRouter) .merge('todos.', todosRouter) .merge('todos.user.', todosUserRouter) - .merge('resumes.resume.user.', resumesResumeUserRouter); + .merge('resumes.resume.user.', resumesResumeUserRouter) + .merge('resumes.reviews.user.', resumesReviewsUserRouter); // Export type definition of API export type AppRouter = typeof appRouter; diff --git a/apps/portal/src/server/router/resumes-reviews-user-router.ts b/apps/portal/src/server/router/resumes-reviews-user-router.ts new file mode 100644 index 00000000..ec42a36b --- /dev/null +++ b/apps/portal/src/server/router/resumes-reviews-user-router.ts @@ -0,0 +1,54 @@ +import { z } from 'zod'; +import { ResumesSection } from '@prisma/client'; + +import { createProtectedRouter } from './context'; + +type IResumeCommentInput = Readonly<{ + description: string; + resumeId: string; + section: ResumesSection; + userId: string; +}>; + +export const resumesReviewsUserRouter = createProtectedRouter().mutation( + 'create', + { + input: z.object({ + education: z.string(), + experience: z.string(), + general: z.string(), + projects: z.string(), + resumeId: z.string(), + skills: z.string(), + }), + async resolve({ ctx, input }) { + const userId = ctx.session?.user.id; + const { resumeId, education, experience, general, projects, skills } = + input; + + // For each section, convert them into ResumesComment model if provided + const comments: Array = [ + { description: education, section: ResumesSection.EDUCATION }, + { description: experience, section: ResumesSection.EXPERIENCE }, + { description: general, section: ResumesSection.GENERAL }, + { description: projects, section: ResumesSection.PROJECTS }, + { description: skills, section: ResumesSection.SKILLS }, + ] + .filter(({ description }) => { + return description.trim().length > 0; + }) + .map(({ description, section }) => { + return { + description, + resumeId, + section, + userId, + }; + }); + + return await ctx.prisma.resumesComment.createMany({ + data: comments, + }); + }, + }, +);