[resumes][feat] Add route to submit resume reviews

pull/313/head
Terence Ho 3 years ago
parent 641a565e5c
commit 0f9ad2894a

@ -3,7 +3,10 @@ import type { SubmitHandler } from 'react-hook-form';
import { useForm } from 'react-hook-form'; import { useForm } from 'react-hook-form';
import { Button, Dialog, TextInput } from '@tih/ui'; import { Button, Dialog, TextInput } from '@tih/ui';
import { trpc } from '~/utils/trpc';
type CommentsFormProps = Readonly<{ type CommentsFormProps = Readonly<{
resumeId: string;
setShowCommentsForm: (show: boolean) => void; setShowCommentsForm: (show: boolean) => void;
}>; }>;
@ -17,7 +20,9 @@ type IFormInput = {
type InputKeys = keyof IFormInput; type InputKeys = keyof IFormInput;
// TODO: Retrieve resumeId and remove default
export default function CommentsForm({ export default function CommentsForm({
resumeId = '',
setShowCommentsForm, setShowCommentsForm,
}: CommentsFormProps) { }: CommentsFormProps) {
const [showDialog, setShowDialog] = useState(false); const [showDialog, setShowDialog] = useState(false);
@ -35,10 +40,16 @@ export default function CommentsForm({
skills: '', skills: '',
}, },
}); });
const reviewCreateMutation = trpc.useMutation('resumes.reviews.user.create');
const onSubmit: SubmitHandler<IFormInput> = async (data) => {
await reviewCreateMutation.mutate({
resumeId,
...data,
});
// TODO: Implement mutation to database // Redirect back to comments section
const onSubmit: SubmitHandler<IFormInput> = (data) => { setShowCommentsForm(false);
alert(JSON.stringify(data));
}; };
const onCancel = () => { const onCancel = () => {

@ -3,6 +3,7 @@ import superjson from 'superjson';
import { createRouter } from './context'; import { createRouter } from './context';
import { protectedExampleRouter } from './protected-example-router'; import { protectedExampleRouter } from './protected-example-router';
import { resumesResumeUserRouter } from './resumes-resume-user-router'; import { resumesResumeUserRouter } from './resumes-resume-user-router';
import { resumesReviewsUserRouter } from './resumes-reviews-user-router';
import { todosRouter } from './todos'; import { todosRouter } from './todos';
import { todosUserRouter } from './todos-user-router'; import { todosUserRouter } from './todos-user-router';
@ -14,7 +15,8 @@ export const appRouter = createRouter()
.merge('auth.', protectedExampleRouter) .merge('auth.', protectedExampleRouter)
.merge('todos.', todosRouter) .merge('todos.', todosRouter)
.merge('todos.user.', todosUserRouter) .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 definition of API
export type AppRouter = typeof appRouter; export type AppRouter = typeof appRouter;

@ -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<IResumeCommentInput> = [
{ 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,
});
},
},
);
Loading…
Cancel
Save