From edb977c601bbde444bb2d104722846a33f051329 Mon Sep 17 00:00:00 2001 From: pawan-dot <71133473+pawan-dot@users.noreply.github.com> Date: Fri, 5 Jul 2024 14:34:16 +0530 Subject: [PATCH] change mobile number Update Profile get Profile etc --- middlewares/PatientAuth.js | 19 ++- resources/Patients/PatientController.js | 209 ++++++++++++++++++++---- resources/Patients/PatientModel.js | 2 +- resources/Patients/PatientRoute.js | 12 +- 4 files changed, 198 insertions(+), 44 deletions(-) diff --git a/middlewares/PatientAuth.js b/middlewares/PatientAuth.js index 11b980b..aec0fdb 100644 --- a/middlewares/PatientAuth.js +++ b/middlewares/PatientAuth.js @@ -31,10 +31,21 @@ export const isAuthenticatedPatient = async (req, res, next) => { }); } } catch (error) { - return res.status(401).json({ - success: false, - message: error.message, - }); + if (error.name === 'TokenExpiredError') { + return res.status(401).json({ message: 'Token has expired.' }); + } else if (error.name === 'JsonWebTokenError') { + if (error.message === 'invalid signature') { + return res.status(401).json({ message: 'Invalid token!.' }); + } else { + return res.status(401).json({ message: 'Invalid token.' }); + } + } else { + return res.status(500).json({ message: 'An internal error occurred while verifying the token.' }); + } + // return res.status(401).json({ + // success: false, + // message: error.message, + // }); } }; diff --git a/resources/Patients/PatientController.js b/resources/Patients/PatientController.js index 4ea49ad..a88e2f4 100644 --- a/resources/Patients/PatientController.js +++ b/resources/Patients/PatientController.js @@ -10,8 +10,8 @@ import cloudinary from '../../Utils/cloudinary.js'; export const register = async (req, res) => { let { name, countryCode, mobileNumber } = req.body; // Trim the country code and mobile number - countryCode = countryCode.trim(); - mobileNumber = mobileNumber.trim(); + countryCode = countryCode?.trim(); + mobileNumber = mobileNumber?.trim(); const fullMobileNumber = `${countryCode}${mobileNumber}`; try { let patient = await Patient.findOne({ mobileNumber: fullMobileNumber }); @@ -43,7 +43,7 @@ export const register = async (req, res) => { export const verifyOtp = async (req, res) => { const { mobileNumber, otp } = req.body; try { - let mobileNmr = mobileNumber.trim(); + let mobileNmr = mobileNumber?.trim(); const patient = await Patient.findOne({ mobileNumber: mobileNmr }); if (!patient) { @@ -391,10 +391,8 @@ export const UploadProfileImage = async (req, res) => { const patientImage = req.files?.avatar; const patient = await Patient.findById(req.patient._id); - if (patient?.avatar === null) { - // console.log(patient?.avatar) + if (patient?.avatar?.public_id) { const imageId = patient?.avatar?.public_id; - await cloudinary.uploader.destroy(imageId) } @@ -430,7 +428,97 @@ export const UploadProfileImage = async (req, res) => { }; +//Update mobile Number +export const updateMobileNumber = async (req, res) => { + let { newCountryCode, newMobileNumber } = req.body; + newCountryCode = newCountryCode?.trim(); + newMobileNumber = newMobileNumber?.trim(); + const newFullMobileNumber = `${newCountryCode}${newMobileNumber}`; + try { + if (req.patient?.mobileNumber === newFullMobileNumber) { + return res.status(400).json({ message: 'New mobile number cannot be the same as the old mobile number' }); + } + let patient = await Patient.findOne({ mobileNumber: req.patient?.mobileNumber }); + if (!patient) { + return res.status(400).json({ message: 'Patient not found' }); + } + + const otp = crypto.randomInt(100000, 1000000).toString(); + const otpExpires = Date.now() + 3 * 60 * 1000; // 3 minutes + + patient.newMobileNumber = newFullMobileNumber; + patient.otp = otp; + patient.otpExpires = otpExpires; + + await patient.save(); + await sendOtp(newFullMobileNumber, `Your tavisa verification OTP is: ${otp}`); + + return res.status(200).json({ message: `OTP sent to your new mobile number ${newFullMobileNumber} successfully` }); + } catch (error) { + res.status(500).json({ + message: error.message ? error.message : "Server error!", + }); + } +}; +//verify Updated Number OTP +export const verifyUpdatedMobileOtp = async (req, res) => { + const { newMobileNumber, otp } = req.body; + try { + let mobileNmr = newMobileNumber?.trim(); + const patient = await Patient.findOne({ newMobileNumber: mobileNmr }); + + if (!patient) { + return res.status(400).json({ message: 'Invalid mobile number or OTP' }); + } + + if (patient.otp !== otp || patient.otpExpires < Date.now()) { + return res.status(400).json({ message: 'Invalid or expired OTP' }); + } + + patient.mobileNumber = patient.newMobileNumber; + patient.newMobileNumber = undefined; + patient.isVerified = true; + patient.otp = undefined; + patient.otpExpires = undefined; + await patient.save(); + const token = patient.getJWTToken(); + res.status(200).json({ + success: true, + token, message: 'Mobile number updated and verified successfully' + }); + } catch (error) { + res.status(500).json({ + message: error.message ? error.message : "Server error!", + }); + } +}; +//getmyProfile +export const getmyProfile = async (req, res) => { + try { + const myData = await Patient.findById(req.patient?._id); + if (myData) { + return res.status(200).json({ + success: true, + message: "feched!", + myData, + }); + } + } catch (error) { + return res.status(500).json({ + success: false, + message: error.message ? error.message : "Something went wrong!", + }); + } +} + + + + + + + +// export const deletePatient = async (req, res) => { try { if (!req.params.id) { @@ -471,55 +559,104 @@ export const deletePatient = async (req, res) => { }; -export const completeRegistration = async (req, res) => { +export const UpdateProile = async (req, res) => { const { - mobileNumber, + name, email, - password, - confirmPassword, gender, - weight, - height, + weightValue, + weightUnit, + heightValue, + heightUnit, age, commonHealthComplaints, familyHistory, personalHistory, dailyRoutine, } = req.body; - if (password !== confirmPassword) { - return res.status(400).json({ message: 'Password and confirm password do not match' }); + // Validate email + if (email && !validator.isEmail(email)) { + return res.status(400).json({ message: 'Invalid email address' }); } - try { - const patient = await Patient.findOne({ mobileNumber }); - if (!patient || !patient.isVerified) { - return res.status(400).json({ message: 'Patient not found or not verified' }); + //gender Validate + if (gender && !['Male', 'Female'].includes(gender)) { + return res.status(400).json({ message: 'Invalid gender:gender Must be "Male" or "Female"' }); + } + // Validate weightUnit + if (weightUnit && !['Kgs', 'Lbs'].includes(weightUnit)) { + return res.status(400).json({ message: 'Invalid weight unit. Must be "Kgs" or "Lbs"' }); + } + // Ensure weightValue is a number + if (weightValue && isNaN(weightValue)) { + return res.status(400).json({ message: 'Weight value must be a number' }); + } + // Validate heightUnit + if (heightUnit && !['Ft', 'Cm'].includes(heightUnit)) { + return res.status(400).json({ message: 'Invalid height unit. Must be "Ft" or "Cm"' }); + } + // Ensure heightValue is a number + if (heightValue && isNaN(heightValue)) { + return res.status(400).json({ message: 'Height value must be a number' }); + } + if (age && isNaN(age)) { + return res.status(400).json({ message: 'age must be a number' }); + } + + try { + const patient = await Patient.findById(req.patient._id); + if (!patient) { + return res.status(404).json({ message: 'Patient not found ' }); + } + if (!patient.isVerified) { + return res.status(400).json({ message: 'Patient not verified' }); + } + if (email) { + const emailExists = await Patient.findOne({ email }); + if (emailExists && emailExists._id.toString() !== req.patient._id) { + return res.status(400).json({ message: 'This Email ID is already in use By Another patient' }); + } } - // const hashedPassword = await hashPassword(password); - - patient.email = email; - patient.password = hashedPassword; - patient.gender = gender; - patient.weight = weight; - patient.height = height; - patient.age = age; - patient.commonHealthComplaints = commonHealthComplaints; - patient.familyHistory = familyHistory; - patient.personalHistory = personalHistory; - patient.dailyRoutine = dailyRoutine; - - await patient.save(); - - res.status(200).json({ message: 'Registration details updated successfully' }); + const updateData = { + weight: { + value: weightValue, + unit: weightUnit, + }, + height: { + value: heightValue, + unit: heightUnit, + }, + ...req.body + }; + let NewPatientDetail = await Patient.findByIdAndUpdate( + req.patient._id, + updateData + , + { new: true } // Return the updated document + ); + // patient.gender = gender; + // patient.weight = { + // value: weightValue, + // unit: weightUnit, + // }; + // patient.height = { + // value: heightValue, + // unit: heightUnit, + // }; + // patient.age = age; + // await patient.save(); + // const patientResponse = patient.toObject(); + // delete patientResponse.password; + return res.status(200).json({ patient: NewPatientDetail, message: 'Profile updated successfully' }); } catch (error) { - res.status(500).json({ message: error.message ? error.message : "Server error!", }); } -}; +} + export const Otp = async (req, res) => { diff --git a/resources/Patients/PatientModel.js b/resources/Patients/PatientModel.js index b233c8b..0de4dc3 100644 --- a/resources/Patients/PatientModel.js +++ b/resources/Patients/PatientModel.js @@ -82,7 +82,7 @@ const patientSchema = new mongoose.Schema( familyHistory: String, personalHistory: String, dailyRoutine: String, - + newMobileNumber: { type: String }, resetPasswordToken: String, resetPasswordExpire: Date, }, diff --git a/resources/Patients/PatientRoute.js b/resources/Patients/PatientRoute.js index 5a3efa9..eb0e223 100644 --- a/resources/Patients/PatientRoute.js +++ b/resources/Patients/PatientRoute.js @@ -1,7 +1,7 @@ import express from "express"; const router = express.Router(); -import { EnterPatientDetails, EnterPersonalDetails, Otp, UploadProfileImage, completeRegistration, create1RegistrationDetails, deletePatient, forgotPassword, getAllPatient, loginPatient, register, verifyOtp } from "./PatientController.js"; +import { EnterPatientDetails, EnterPersonalDetails, Otp, UploadProfileImage, create1RegistrationDetails, deletePatient, forgotPassword, getAllPatient, loginPatient, register, updateMobileNumber, verifyUpdatedMobileOtp, verifyOtp, UpdateProile, getmyProfile } from "./PatientController.js"; import { isAuthenticatedPatient } from "../../middlewares/PatientAuth.js"; import { authorizeRoles, isAuthenticatedUser } from "../../middlewares/auth.js"; @@ -16,11 +16,17 @@ router.post('/rgstr_details-p2', isAuthenticatedPatient, EnterPatientDetails); router.post('/rgstr_psrnl_details-p3', isAuthenticatedPatient, EnterPersonalDetails); router.get('/getAll', isAuthenticatedUser, authorizeRoles("admin"), getAllPatient); +router.get('/my-profile', isAuthenticatedPatient, getmyProfile); -router.post('/complete-registration', completeRegistration); - +//Update Mobile Number +router.post('/update-mobile-number', isAuthenticatedPatient, updateMobileNumber); +router.post('/verify-updated-mobile-otp', isAuthenticatedPatient, verifyUpdatedMobileOtp); router.post('/forgot-password', forgotPassword); router.post('/profile-image/upload', isAuthenticatedPatient, UploadProfileImage); +router.patch('/profile/update', isAuthenticatedPatient, UpdateProile); + + + //delete Patient router.delete('/delete/:id', isAuthenticatedUser, authorizeRoles("admin"), deletePatient);