Files
nextplacement/apps/student/app/signup/action.ts
2025-07-07 01:07:35 +05:30

117 lines
4.1 KiB
TypeScript

'use server'
import { db, students, grades, internships as internshipsTable, resumes as resumesTable } from '@workspace/db';
import { eq } from '@workspace/db/drizzle';
import { studentSignupSchema } from './schema';
import { auth } from '@/auth';
export async function signupAction(data: FormData) {
const session = await auth();
const studentId = session?.user?.studentId;
if (!studentId) {
return { error: 'Student ID not found in session.' };
}
const formData = Object.fromEntries(data.entries());
// Parse arrays/objects from formData if sent as JSON strings
if (typeof formData.skills === 'string') formData.skills = JSON.parse(formData.skills);
if (typeof formData.sgpi === 'string') formData.sgpi = JSON.parse(formData.sgpi);
if (typeof formData.internships === 'string') formData.internships = JSON.parse(formData.internships);
if (typeof formData.resume === 'string') formData.resume = JSON.parse(formData.resume);
const parsedData = await studentSignupSchema.safeParseAsync(formData);
if (!parsedData.success) {
return { error: parsedData.error.issues };
}
const student = parsedData.data;
// Update student table
await db.update(students).set({
rollNumber: student.rollNumber,
firstName: student.firstName,
middleName: student.middleName,
lastName: student.lastName,
mothersName: student.mothersName,
gender: student.gender,
dob: student.dob,
personalGmail: student.personalGmail,
phoneNumber: student.phoneNumber,
address: student.address,
degree: student.degree,
branch: student.branch,
year: student.year,
skills: student.skills, // store as array
linkedin: student.linkedin,
github: student.github,
ssc: String(student.ssc),
hsc: String(student.hsc),
isDiploma: student.isDiploma,
}).where(eq(students.id, studentId));
// Upsert grades (sgpi)
if (Array.isArray(student.sgpi)) {
for (const grade of student.sgpi) {
await db.insert(grades).values({
studentId: studentId,
sem: grade.sem,
sgpi: String(grade.sgpi),
isKT: grade.kt,
deadKT: grade.ktDead,
}).onConflictDoUpdate({
target: [grades.studentId, grades.sem],
set: {
sgpi: String(grade.sgpi),
isKT: grade.kt,
deadKT: grade.ktDead,
updatedAt: new Date(),
},
});
}
}
// Upsert internships
if (Array.isArray(student.internships)) {
for (const internship of student.internships) {
await db.insert(internshipsTable).values({
studentId,
title: internship.title,
company: internship.company,
description: internship.description,
location: internship.location,
startDate: internship.startDate,
endDate: internship.endDate,
}).onConflictDoUpdate({
target: [internshipsTable.studentId, internshipsTable.title, internshipsTable.company],
set: {
description: internship.description,
location: internship.location,
startDate: internship.startDate,
endDate: internship.endDate,
updatedAt: new Date(),
},
});
}
}
// Upsert resumes
if (Array.isArray(student.resume)) {
for (const resume of student.resume) {
await db.insert(resumesTable).values({
studentId,
title: resume.title,
link: resume.link,
}).onConflictDoUpdate({
target: [resumesTable.studentId, resumesTable.title],
set: {
link: resume.link,
updatedAt: new Date(),
},
});
}
}
return { success: true };
}