'use server'; import { db, students, grades, internships as internshipsTable, resumes as resumesTable, } from '@workspace/db'; import { eq } from '@workspace/db/drizzle'; import { studentSignupSchema, StudentSignup } from './schema'; import { auth } from '@/auth'; export async function signupAction(data: StudentSignup) { try { const session = await auth(); const studentId = session?.user?.studentId; if (!studentId) { return { error: 'Student ID not found in session.' }; } // Validate data using schema const parsedData = await studentSignupSchema.safeParseAsync(data); if (!parsedData.success) { return { error: parsedData.error.issues }; } const student = parsedData.data; // Sequential DB operations (no transaction) // Update student table await db .update(students) .set({ rollNumber: student.rollNumber, firstName: student.firstName, middleName: student.middleName, lastName: student.lastName, mothersName: student.mothersName, mothersEmail: student.mothersEmail && student.mothersEmail.length ? student.mothersEmail : null, mothersPhone: student.mothersPhone && student.mothersPhone.length ? student.mothersPhone : null, fathersName: student.fathersName, fathersEmail: student.fathersEmail && student.fathersEmail.length ? student.fathersEmail : null, fathersPhone: student.fathersPhone && student.fathersPhone.length ? student.fathersPhone : null, 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)); // Clear existing grades for this student await db.delete(grades).where(eq(grades.studentId, studentId)); // Insert 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, }); } } // Clear existing internships for this student await db.delete(internshipsTable).where(eq(internshipsTable.studentId, studentId)); // Insert 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, }); } } // Clear existing resumes for this student await db.delete(resumesTable).where(eq(resumesTable.studentId, studentId)); // Insert resumes if (Array.isArray(student.resume)) { for (const resume of student.resume) { await db.insert(resumesTable).values({ studentId, title: resume.title, link: resume.link, }); } } return { success: true }; } catch (error) { console.error('Signup action error:', error); return { error: error instanceof Error ? error.message : 'An unexpected error occurred during signup.', }; } }