diff --git a/controllers/forms/addForm.js b/controllers/forms/addForm.js index 7ae73dc..f26efee 100644 --- a/controllers/forms/addForm.js +++ b/controllers/forms/addForm.js @@ -4,13 +4,9 @@ const { ApiError } = require("../../utils/error/ApiError"); const uploadimage = require("../../utils/image/uploadImage"); const status = require("http-status"); -const QrImageHeight = 150; -const QrImageWidth = 400; - const FormImageHeight = 350.67; const FormImageWidth = 196.37; - // @description Add regForm // @route POST /api/form/addForm // @access Admins @@ -21,8 +17,9 @@ const addForm = async (req, res, next) => { eventdescription, eventDate, eventType, - upi, + paymentLink, // Payment link field eventAmount, + upi, // UPI field eventMaxReg, relatedEvent, participationType, @@ -36,12 +33,32 @@ const addForm = async (req, res, next) => { isEventPast, } = req.body; + if (!eventTitle || !eventdescription) { + return next(new ApiError(status.BAD_REQUEST, "Title and description are required")); + } + + // Improved validation for paid events + if (eventType === "Paid") { + if (!eventAmount || eventAmount === "0") { + return next(new ApiError(status.BAD_REQUEST, "Amount is required for paid events")); + } + if (!paymentLink && !upi) { + return next(new ApiError(status.BAD_REQUEST, "Either Payment link or UPI is required for paid events")); + } + } + const info = { eventTitle, eventdescription, eventDate, eventType, eventAmount, + receiverDetails: { + upi: upi || null, + paymentLink: paymentLink || null, + // Store payment type preference + preferredPaymentMethod: paymentLink ? 'link' : (upi ? 'upi' : null) + }, eventMaxReg, relatedEvent, participationType, @@ -53,32 +70,16 @@ const addForm = async (req, res, next) => { isPublic: Boolean(isPublic) || false, isRegistrationClosed: Boolean(isRegistrationClosed) || false, isEventPast: Boolean(isEventPast) || false, - receiverDetails: { upi: upi, media: null }, }; - const eventImgFile = req.files - ? req.files?.eventImg - ? req.files.eventImg[0] - : null - : null; - const qrmediaFile = req.files - ? req.files?.media - ? req.files.media[0] - : null - : null; - - if (eventImgFile) { - const result = await uploadimage(eventImgFile.path, "FormImages", FormImageHeight, FormImageWidth); - info.eventImg = result ? result.secure_url : null; - } else { - new ApiError(status.BAD_REQUEST, "Event image not found"); - } - - if (qrmediaFile) { - const result = await uploadimage(qrmediaFile.path, "QRMediaImages", QrImageWidth, QrImageHeight); - info.receiverDetails.media = result ? result.secure_url : null; - } else { - new ApiError(status.BAD_REQUEST, "QR media image not found"); + if (req.file) { + try { + const result = await uploadimage(req.file.path, "FormImages", FormImageHeight, FormImageWidth); + info.eventImg = result ? result.secure_url : null; + } catch (uploadError) { + console.error("Error uploading image:", uploadError); + return next(new ApiError(status.INTERNAL_SERVER_ERROR, "Error uploading image")); + } } const newForm = await prisma.form.create({ diff --git a/controllers/forms/editForm.js b/controllers/forms/editForm.js index b3a8d08..99b1d70 100644 --- a/controllers/forms/editForm.js +++ b/controllers/forms/editForm.js @@ -20,9 +20,9 @@ const editForm = async (req, res, next) => { eventdescription, eventDate, eventType, - upi, + paymentLink, eventAmount, - eventMaxReg, + upi, relatedEvent, participationType, maxTeamSize, @@ -53,21 +53,15 @@ const editForm = async (req, res, next) => { eventDate, eventType, eventAmount, - eventMaxReg, - relatedEvent, - participationType, - maxTeamSize, - minTeamSize, - regDateAndTime, - eventPriority, + receiverDetails: { + upi: upi || null, + paymentLink: paymentLink || null, + preferredPaymentMethod: paymentLink ? 'link' : (upi ? 'upi' : null) + }, successMessage, isPublic: isPublic === "true", isRegistrationClosed: isRegistrationClosed === "true", isEventPast: isEventPast === "true", - receiverDetails: { - ...currentForm.info.receiverDetails, - upi, - }, }; // Handle image upload if present in the request diff --git a/controllers/registration/addRegistration.js b/controllers/registration/addRegistration.js index bc805ef..cf569a6 100644 --- a/controllers/registration/addRegistration.js +++ b/controllers/registration/addRegistration.js @@ -1,5 +1,5 @@ const { PrismaClient, AccessTypes } = require("@prisma/client"); - const moment = require('moment-timezone'); +const moment = require('moment-timezone'); const prisma = new PrismaClient(); const { ApiError } = require("../../utils/error/ApiError"); const expressAsyncHandler = require("express-async-handler"); @@ -8,7 +8,7 @@ const { sendMail } = require("../../utils/email/nodeMailer"); const loadTemplate = require("../../utils/email/loadTemplate"); const uploadImage = require("../../utils/image/uploadImage"); -const validateCurrentForm = expressAsyncHandler(async (form, user, userSubmittedSections) => { +const validateCurrentForm = expressAsyncHandler(async (form, user, userSubmittedSections, req) => { const { info, sections, formAnalytics } = form; const { eventMaxReg, isRegistrationClosed, isEventPast, isPublic } = info; @@ -21,25 +21,24 @@ const validateCurrentForm = expressAsyncHandler(async (form, user, userSubmitted throw new ApiError(401, "Registering to a private form is not allowed. If you feel this is an error, kindly contact us on fedkiit@gmail.com"); } - console.log(formAnalytics[0]?.regUserEmails) - console.log(user.regForm) + console.log(formAnalytics[0]?.regUserEmails); + console.log(user.regForm); const isAlreadyRegistered = formAnalytics[0]?.regUserEmails.includes(user.email) || user.regForm.includes(form._id); if (isAlreadyRegistered) { throw new ApiError(400, "User has already registered for this form. If you feel this is an error, kindly contact us on fedkiit@gmail.com"); } - console.log("Form analytics ", formAnalytics[0]) + console.log("Form analytics ", formAnalytics[0]); if ((formAnalytics[0]?.regUserEmails?.length || formAnalytics[0]?.totalRegistrationCount || 0) >= ((parseInt(eventMaxReg)) || 1)) { console.log((formAnalytics[0]?.regUserEmails?.length || formAnalytics[0]?.totalRegistrationCount) >= (parseInt(eventMaxReg) || 1)); console.log(eventMaxReg); - console.log(parseInt(eventMaxReg)) + console.log(parseInt(eventMaxReg)); throw new ApiError(400, "Maximum registration limit reached. If you feel this is an error, kindly contact us on fedkiit@gmail.com"); } }); - const addRegistration = expressAsyncHandler(async (req, res, next) => { console.log("Entering add", req.body); - console.log(req.body) + console.log(req.body); const { _id } = req.body; let sections = req.body.sections; @@ -59,13 +58,13 @@ const addRegistration = expressAsyncHandler(async (req, res, next) => { where: { id: _id }, include: { formAnalytics: true }, }); - console.log("Form fetched from the database", form) + console.log("Form fetched from the database", form); if (!form) { return next(new ApiError(404, "Form not found")); } - await validateCurrentForm(form, req.user, sections); + await validateCurrentForm(form, req.user, sections, req); console.log('form validation passed'); const { info } = form; @@ -103,30 +102,28 @@ const addRegistration = expressAsyncHandler(async (req, res, next) => { let regTeamMemEmails = []; // console.log("Team Name :", teamName) // console.log("Team Code : ", teamCode) - console.log("setions : ", sections); + console.log("sections : ", sections); const sectionsObject = { user_name: req.user.name, user_id: req.user.id, user_email: req.user.email, date_time: moment().tz("Asia/Kolkata").format(), - amount : form?.info?.eventAmount || '0', + amount: form?.info?.eventAmount || '0', sections: sections }; - console.log("sections Object : ", sectionsObject) + console.log("sections Object : ", sectionsObject); if (info.participationType !== "Individual") { - console.log("related", relatedEventForm?.info?.eventTitle) - console.log("eventTitle", info.eventTitle) + console.log("related", relatedEventForm?.info?.eventTitle); + console.log("eventTitle", info.eventTitle); console.log("count", form.formAnalytics[0]?.regUserEmails.length); teamCode = await generateTeamCode(relatedEventForm?.info?.eventTitle, info.eventTitle, form.formAnalytics[0]?.regUserEmails.length); - createTeamSection = sections.find(section => section.name === "Create Team"); joinTeamSection = !createTeamSection ? sections.find(section => section.name === "Join Team") : null; - if (createTeamSection) { const teamNameField = createTeamSection.fields.find(field => field.name === "Team Name"); if (teamNameField) { @@ -164,67 +161,46 @@ const addRegistration = expressAsyncHandler(async (req, res, next) => { // Log the teamExists object in a readable format console.log("team Exists", JSON.stringify(teamExists, null, 2)); - teamName = [teamExists.teamName]; // console.log("team name array joining creating team", teamName) // teamName = [...new Set([...teamName, ...(form.formAnalytics?.length > 0 ? form.formAnalytics[0].regTeamNames : [])])]; - console.log("team name before ", teamName) + console.log("team name before ", teamName); console.log("existing team names", form.formAnalytics?.length > 0 ? form.formAnalytics[0].regTeamNames : []); // console.log("Team name array after joining team") teamCode = teamCodeField.value; regTeamMemEmails = [...teamExists.regTeamMemEmails, req.user.email]; - } - else { + } else { return next(new ApiError(400, "Team Code field is required for Join Team")); } - // sections.user_id = req.user.id; // sections.user_email = req.user.email; // sections.user_name = req.user.name; - // sectionsObject.push({ sections }); } - } formTrackerTeamNameList = [...new Set([...teamName, ...(form.formAnalytics?.length > 0 ? form.formAnalytics[0].regTeamNames : [])])]; console.log("set data ", formTrackerTeamNameList); - console.log("reg team members ", regTeamMemEmails) + console.log("reg team members ", regTeamMemEmails); const paymentSection = sections.find(section => section.name === "Payment Details"); - const paymentSectionInActualForm = form.sections.find(section => section.name === "Payment Details") + const paymentSectionInActualForm = form.sections.find(section => section.name === "Payment Details"); if (paymentSectionInActualForm && paymentSection) { console.log("payment section is present in the form"); - if (req.files?.length > 0) { - console.log("files", req.files); - const imagePath = req.files[0].path; - const result = await uploadImage(imagePath, req.files[0].fieldname || "PaymentScreenshot"); - console.log(result); - sectionsObject.transactionScreenShot = result.secure_url; - - const paymentScreenshotField = paymentSection.fields.find(field => field.name === "Payment Screenshot" && field.type === "image"); - - if (paymentScreenshotField) { - // Update the value of the "Payment Screenshot" field with the secure URL - paymentScreenshotField.value = result.secure_url; - console.log("Payment Screenshot field updated successfully."); - } else { - console.error("Payment Screenshot field not found."); - } - - } - else { - return next(new ApiError(400, "Kindly Attach Payment Screenshot")); + const transactionIdField = paymentSection.fields.find(field => field.name === "Transaction ID"); + if (!transactionIdField || !transactionIdField.value) { + return next(new ApiError(400, "Transaction ID is required")); } + sectionsObject.transactionId = transactionIdField.value; } else if (paymentSectionInActualForm && !paymentSection) { return next(new ApiError(400, "Kindly fill the Payment section")); } - console.log(sectionsObject) + console.log(sectionsObject); const transaction = await prisma.$transaction(async (prisma) => { @@ -295,11 +271,16 @@ const addRegistration = expressAsyncHandler(async (req, res, next) => { return { registration, updatedUser, updateFormRegistrationList }; }); - console.log(transaction.updatedUser); console.log("regTracker", transaction.updateFormRegistrationList); - res.json({ message: form.info.successMessage || "Registration successful", teamName: transaction.registration.teamName, teamCode: transaction.registration.teamCode, user: transaction.updatedUser }); + res.json({ + message: form.info.successMessage || "Registration successful", + teamName: transaction.registration.teamName, + teamCode: transaction.registration.teamCode, + user: transaction.updatedUser + }); + // const placeholder = { // name: req.user.email, // successMessage: info.successMessage @@ -309,7 +290,6 @@ const addRegistration = expressAsyncHandler(async (req, res, next) => { // placeholder // ) - const subject = `Successfully registered on ${info.eventTitle}`; let template; const placeholders = { @@ -318,28 +298,22 @@ const addRegistration = expressAsyncHandler(async (req, res, next) => { name: req.user.name ? req.user.name : "", teamCode: transaction.registration.teamCode ? transaction.registration.teamCode : "", successMessage: info.successMessage - } + }; //take content form the team if (info.participationType === "Team") { - template = loadTemplate('teamEventRegistrationSuccess', placeholders); - } - else { + } else { template = loadTemplate('individualEventRegistrationSuccess', placeholders); - } // const textContent = `Registration successfull in ${info.eventTitle}`; sendMail(req.user.email, subject, template); - } - catch (error) { + } catch (error) { console.error("Error during registration:", error); - next(new ApiError(error.stausCode || 500, error.message || "Error during registration process", error)); + next(new ApiError(error.statusCode || 500, error.message || "Error during registration process", error)); } - }); - const generateTeamCode = async (relatedFormName, currentFormName, existingTeamsCount = 0) => { const relatedEventCode = relatedFormName?.slice(0, 2).toUpperCase(); const currentFormCode = currentFormName?.slice(0, 2).toUpperCase(); @@ -350,4 +324,4 @@ const generateTeamCode = async (relatedFormName, currentFormName, existingTeamsC return teamCode; }; -module.exports = { addRegistration }; +module.exports = { addRegistration }; \ No newline at end of file