const fastify = require("fastify"); const userController = require("../controllers/userController"); const validationHandler = require("../handlers/userHandler"); module.exports = function (fastify, opts, next) { fastify.get("/api/users", { schema: { tags: ["User"], description: "This is for Get All Users", summary: "This is for to Get All Users", security: [ { basicAuth: [], }, ], }, preHandler: fastify.auth([fastify.authenticate]), handler: userController.getUsers, }); fastify.route({ method: "POST", url: "/api/users/:customerId", schema: { description: "To Get user by customerId", tags: ["User"], summary: "This is for Get a Single User by customerId", params: { type: "object", properties: { customerId: { type: "string", description: "customerId", }, }, }, security: [ { basicAuth: [], }, ], }, preHandler: fastify.auth([fastify.authenticate]), handler: userController.getSingleUser, }); fastify.route({ method: "POST", url: "/api/currentUser", schema: { tags: ["User"], description: "This is for Get Current User by customerId by Post Body", summary: "This is for Get a Current User.", body: { type: "object", required: ["customerId"], properties: { customerId: { type: "string" }, }, }, security: [ { basicAuth: [], }, ], }, preHandler: fastify.auth([fastify.authenticate]), handler: userController.getCurrentUser, // onSend: (request, reply, done) => { // // fire&forget // request.log.info("#########################################"); // request.log.info(reply); // done() // }, }); fastify.route({ method: "PUT", url: "/api/user/:userId", schema: { tags: ["User"], summary: "This is for update user", params: { type: "object", properties: { userId: { type: "string", description: "userId", }, }, }, body: { type: "object", // required: ['phone'], properties: { phone: { type: "string" }, firstName: { type: "string" }, lastName: { type: "string" }, address1: { type: "string" }, address2: { type: "string" }, city: { type: "string" }, state: { type: "string" }, country: { type: "string" }, zip: { type: "string" }, }, }, security: [ { basicAuth: [], }, ], }, preHandler: [ fastify.auth([fastify.operatorAuthenticate]), //validationHandler.validatePhoneFormat, ], // preHandler: fastify.auth([fastify.authenticate]), handler: userController.editUserInfo, }); fastify.route({ method: "POST", url: "/api/user/:installationId", schema: { tags: ["Install"], description: "This is for cretae New user", summary: "This is for Create New User.", params: { type: "object", properties: { installationId: { type: "string", description: "installationId", }, }, }, body: { type: "object", properties: { phone: { type: "string" }, password: { type: "string" }, emails: { type: "array", maxItems: 2, items: { type: "object", properties: { email: { type: "string", default: null }, }, }, }, firstName: { type: "string", default: null }, lastName: { type: "string", default: null }, username: { type: "string" }, buildingName: { type: "string", default: null }, inchargeName: { type: "string", default: null }, address1: { type: "string", default: null }, address2: { type: "string", default: null }, city: { type: "string", default: null }, state: { type: "string", default: null }, zip: { type: "string", default: null }, country: { type: "string", default: null }, notes: { type: "string", default: null }, latitude: { type: 'number', default: 0.0 }, longitude: { type: 'number', default: 0.0}, fcmId: { type: "string", default: null }, deviceId: { type: "string", default: null }, }, }, security: [ { basicAuth: [], }, ], }, preHandler: [ validationHandler.fieldCheck, // validationHandler.verifyUser, // validationHandler.validatePhoneFormat, validationHandler.validateEmailFormat, ], handler: userController.addUser, // onResponse: (request, reply) => { // validationHandler.sendPhoneVerificationCode(request, reply); // }, //onResponse: validationHandler.sendPhoneVerificationCode, }); fastify.route({ method: "POST", url: "/api/phone", schema: { tags: ["User"], description: "This is for verify User Phone", summary: "This is to Verify User Phone.", body: { type: "object", required: ["phone"], properties: { phoneVerificationCode: { type: "string" }, phone: { type: "string" }, }, }, security: [ { basicAuth: [], }, ], }, // preHandler: fastify.auth([fastify.authenticate]), handler: validationHandler.verifyPhone, }); fastify.route({ method: "POST", url: "/api/forgot-change-password", schema: { tags: ["User"], description: "After OTP validation Change user password using mobile number and confirmation.", summary: "After OTP validation Change user password using mobile number and confirmation.", body: { type: "object", required: ["phone", "newPassword", "confirmPassword"], properties: { phone: { type: "string" }, newPassword: { type: "string" }, confirmPassword: { type: "string"}, }, }, security: [ { basicAuth: [], }, ], }, handler: validationHandler.changePassword, }); // fastify.route({ // method: "POST", // url: "/api/change-password", // schema: { // tags: ["User"], // description: "Users to change their password using mobile number, old password, and new password.", // summary: "Users to change their password using mobile number, old password, and new password.", // body: { // type: "object", // required: ["phone", "oldPassword", "newPassword"], // properties: { // phone: { type: "string"}, // oldPassword: { type: "string"}, // newPassword: { type: "string" }, // //confirmPassword: { type: "string", minLength: 6 }, // }, // }, // }, // handler: validationHandler.verifyOldNewPassword, // Adjust the path to your handler // }); // fastify.route({ // method: "POST", // url: "/api/forgotpassword", // schema: { // tags: ["User"], // description: "This is for forget password for the User.", // summary: "This is for forget User Password.", // body: { // type: "object", // required: ["phone"], // properties: { // phone: { type: "string" }, // }, // }, // security: [ // { // basicAuth: [], // }, // ], // }, // // preHandler: [validationHandler.], // handler: userController.forgotPassword, // onResponse: (request, reply) => { // validationHandler.sendPasswordResetCode(request, reply); // }, // }); fastify.route({ method: "POST", url: "/api/forgotpassword", schema: { tags: ["User"], description: "This is for forget password for the User.", summary: "This is for forget User Password.", body: { type: "object", required: ["phone"], properties: { phone: { type: "string" }, }, }, security: [ { basicAuth: [], }, ], }, handler: userController.forgotPassword, }); fastify.route({ method: "POST", url: "/api/forgotpasswordsupplier", schema: { tags: ["Supplier-Data"], description: "This is for forgot password for the Supplier.", summary: "This is for forgot password for the Supplier.", body: { type: "object", required: ["phone"], properties: { phone: { type: "string" }, }, }, security: [ { basicAuth: [], }, ], }, // preHandler: [validationHandler.], handler: userController.forgotPasswordSupplier, onResponse: (request, reply) => { validationHandler.sendPasswordResetCode(request, reply); }, }); fastify.route({ method: "POST", url: "/api/changePassword", schema: { tags: ["User"], description: "This is to change password of user", summary: "This is to change password of user", body: { type: "object", required: ["phone"], properties: { phone: { type: "string" }, oldPassword: { type: "string" }, newPassword: { type: "string" }, }, }, security: [ { basicAuth: [], }, ], }, // preHandler: [validationHandler.], handler: userController.changePassword, }); fastify.route({ method: "POST", url: "/api/resetpassword", schema: { tags: ["User"], description: "This is for Reset User Password.", summary: "This is for Reset User Password.", body: { type: "object", //required: ["phone", "passwordResetCode", "newPassword"], properties: { phone: { type: "string" }, phoneVerificationCode: { type: "string" }, newPassword: { type: "string" }, }, }, security: [ { basicAuth: [], }, ], }, //preHandler: [validationHandler], handler: validationHandler.resetPassword, // onResponse: (request,reply) => {validationHandler.resetPassword(request,reply)} }); fastify.route({ method: "POST", url: "/api/resetpasswordsupplier", schema: { tags: ["Supplier-Data"], description: "This is for Supplier Reset Password.", summary: "This is for Supplier Reset Password.", body: { type: "object", required: ["phone", "resetPasswordCode", "newPassword"], properties: { phone: { type: "string" }, resetPasswordCode: { type: "string" }, newPassword: { type: "string" }, }, }, security: [ { basicAuth: [], }, ], }, //preHandler: [validationHandler], handler: validationHandler.resetPasswordSupplier, // onResponse: (request,reply) => {validationHandler.resetPassword(request,reply)} }); fastify.route({ method: "POST", url: "/api/resetPasswordFromAdmin", schema: { tags: ["User"], description: "This is for Reset Password for Admin.", summary: "This is for Reset Password for Admin.", body: { type: "object", properties: { customerId: { type: "string" }, }, }, security: [ { basicAuth: [], }, ], }, // preHandler: [validationHandler.], handler: validationHandler.resetPasswordFromAdmin, // onResponse: (request,reply) => {validationHandler.resetPassword(request,reply)} }); fastify.route({ method: "POST", url: "/api/resendphoneverificationcode", schema: { tags: ["User"], description: "This is for Reset phone Verification Code.", summary: "This is for Reset phone verification Code.", body: { type: "object", required: ["phone"], properties: { phone: { type: "string" }, }, }, security: [ { basicAuth: [], }, ], }, // preHandler: [validationHandler.], handler: validationHandler.sendPhoneVerificationCode, // onResponse: (request,reply) => {validationHandler.sendPhoneVerificationCode(request,reply)} }); fastify.route({ method: "POST", url: "/api/users/send_message", schema: { tags: ["User"], description: "This is for Send Message.", summary: "This is for Send Message.", body: { type: "object", required: ["userId"], properties: { userId: { type: "string" }, }, }, security: [ { basicAuth: [], }, ], }, handler: validationHandler.sendMessageNotification, }); fastify.route({ method: "PUT", url: "/api/update/currentUser/:customerId", schema: { tags: ["User"], summary: "This is for update current user", params: { type: "object", properties: { customerId: { type: "string", description: "customerId", }, }, }, body: { type: "object", properties: { phone: { type: "string" }, firstName: { type: "string" }, buildingName: { type: "string" }, lastName: { type: "string" }, username: { type: "string" }, emails: { type: "array", maxItems: 2, items: { type: "object", properties: { email: { type: "string", default: null }, }, }, }, address1: { type: "string" }, address2: { type: "string" }, city: { type: "string" }, state: { type: "string" }, country: { type: "string" }, zip: { type: "string" }, }, }, security: [ { basicAuth: [], }, ], }, preHandler: [fastify.auth([fastify.authenticate])], handler: userController.editCuurentUserInfo, }); // Login for a user is in the main index.js file. // fastify-jwt used to create the token was throwing exceptions and requierd // it be called before the route is loaded. const multer = require('multer'); const fs = require('fs'); const storage = multer.diskStorage({ destination: function (req, file, cb) { if (!fs.existsSync(__dirname + '/temp')) { fs.mkdirSync(__dirname + '/temp'); } cb(null, './temp'); }, filename: function (req, file, cb) { cb(null, file.originalname + '-' + Date.now() + '.' + file.mimetype.split('/')[1]); }, }); const upload = multer({ storage: storage }).single('picture'); fastify.route({ method: 'POST', url: '/api/users/profile-picture/:customerId', schema: { tags: ['User'], description: 'Upload a profile picture', summary: 'Upload a profile picture', params: { type: 'object', properties: { customerId: { type: 'string', description: 'Customer ID', }, }, }, body: { formData: { picture: { type: 'string', format: 'binary', description: 'Profile picture file', }, }, }, response: { 200: { description: 'Profile picture uploaded successfully', type: 'object', properties: { message: { type: 'string' }, }, }, 400: { description: 'Failed to upload profile picture', type: 'object', properties: { error: { type: 'string' }, }, }, 500: { description: 'Internal server error', type: 'object', properties: { error: { type: 'string' }, }, }, }, }, handler: async (req, reply) => { try { upload(req, reply, async (err) => { if (err) { reply.status(400).send({ error: 'Failed to upload profile picture' }); return; } const customerId = req.params.customerId; const picturePath = req.file.path; let profilePicture = await ProfilePicture.findOne({ customerId }); if (!profilePicture) { profilePicture = new ProfilePicture({ customerId, picture: fs.readFileSync(picturePath), }); } else { profilePicture.picture = fs.readFileSync(picturePath); } await profilePicture.save(); // Delete the temporary uploaded file fs.unlinkSync(picturePath); reply.send({ message: 'Profile picture uploaded successfully' }); }); } catch (error) { reply.status(500).send({ error: error.message }); } }, }); fastify.route({ method: "POST", url: "/api/sendSms", schema: { tags: ["User"], description: "This is to send Sms.", summary: "This is to send Sms.", body: { type: "object", required: ["mobileNumbers"], properties: { mobileNumbers: { type: "string" }, }, }, security: [ { basicAuth: [], }, ], }, //preHandler: [validationHandler], handler: userController.sendSms, // onResponse: (request,reply) => {validationHandler.resetPassword(request,reply)} }); fastify.route({ method: "POST", url: "/api/addTeammembers/:customerId", schema: { tags: ["User"], description: "This is for adding Team members", summary: "This is for adding Team members", params: { required: ["customerId"], type: "object", properties: { customerId: { type: "string", description: "customerId", }, }, }, body: { type: "object", properties: { teamAdminName: { type: "string"}, Name: { type: "string" }, phone: { type: "string" }, }, }, security: [ { basicAuth: [], }, ], }, preHandler: [ //validationHandler.fieldCheck, //validationHandler.verifySupplier, // validationHandler.validatePhoneFormat, //validationHandler.validateEmailFormat, ], handler: userController.addTeamMembers, }); fastify.route({ method: "PUT", url: "/api/deleteTeamMember/:customerId", schema: { tags: ["User"], summary: "This is for delete Team Member", description: "This is for delete Team Member", params: { required: ["customerId"], type: "object", properties: { customerId: { type: "string", description: "customerId", }, }, }, querystring: { phone: { type: "string" }, }, security: [ { basicAuth: [], }, ], }, preHandler: fastify.auth([fastify.authenticate]), handler: userController.deleteTeamMember, // Ensure this line points to the handler }); fastify.route({ method: "PUT", url: "/api/addingfavoratesupplier/:customerId", schema: { tags: ["User"], summary: "This is for adding favorate supplier", description: "This is for adding favorate supplier", params: { required: ["customerId"], type: "object", properties: { customerId: { type: "string", description: "customerId", }, }, }, querystring: { supplierId: { type: "string" }, }, security: [ { basicAuth: [], }, ], }, // preHandler: fastify.auth([fastify.authenticate]), handler: userController.addingfavoratesupplier, // Ensure this line points to the handler }); fastify.route({ method: "PUT", url: "/api/editfavoratesupplier/:customerId", schema: { tags: ["User"], summary: "Edit a favorite supplier", description: "Replace an existing supplierId with a new one", params: { required: ["customerId"], type: "object", properties: { customerId: { type: "string" }, }, }, querystring: { oldSupplierId: { type: "string" }, newSupplierId: { type: "string" }, }, security: [{ basicAuth: [] }], }, handler: userController.editFavoriteSupplier, }); fastify.route({ method: "DELETE", url: "/api/deletefavoratesupplier/:customerId", schema: { tags: ["User"], summary: "Delete a favorite supplier", description: "Remove a supplierId from favorite suppliers", params: { required: ["customerId"], type: "object", properties: { customerId: { type: "string" }, }, }, querystring: { supplierId: { type: "string" }, }, security: [{ basicAuth: [] }], }, handler: userController.deleteFavoriteSupplier, }); fastify.route({ method: "PUT", url: "/api/updateTeamMeber/:customerId", schema: { tags: ["User"], summary: "This is for update Team Member details", params: { required: ["customerId"], type: "object", properties: { customerId: { type: "string", description: "customerId", }, }, }, querystring: { phone: {type: 'string'} }, body: { type: "object", // required: ['phone'], properties: { name: { type: "string", default: null }, phone: { type: "string", default: null }, alternativeContactNumber: { type: "string" }, }, }, security: [ { basicAuth: [], }, ], }, // preHandler: [ // fastify.auth([fastify.operatorAuthenticate]), // validationHandler.validatePhoneFormat, // ], // preHandler: fastify.auth([fastify.authenticate]), handler: userController.updateTeamMember, }); fastify.route({ method: "DELETE", url: "/api/logout", schema: { description: "This is for logout", tags: ["Logout"], summary: "This is for logout", params: { type: "object", properties: { customerId: { type: "string", description: "customerId", }, }, }, }, // preHandler: fastify.auth([fastify.authenticate]), handler: userController.logout, }); fastify.route({ method: "POST", url: "/api/createstaff/:customerId", schema: { tags: ["User"], description: "This is for cretae New staff", summary: "This is for cretae New staff", params: { required: ["customerId"], type: "object", properties: { customerId: { type: "string", description: "customerId", }, }, }, body: { type: "object", properties: { staff: { type: "array", maxItems: 2500, items: { type: "object", properties: { name: { type: "string", default: null }, phone: { type: "string", default: null }, password:{ type: "string" ,default: null}, all_motor_access:{ type: "string" ,default: "read"}, }, }, }, }, }, security: [ { basicAuth: [], }, ], }, //preHandler: fastify.auth([fastify.authenticate]), handler: userController.createstaff, }); fastify.route({ method: "PUT", url: "/api/editstaff/:customerId/:phone", schema: { tags: ["User"], description: "Edit an existing staff member", params: { type: "object", properties: { customerId: { type: "string", description: "Customer ID" }, phone: { type: "string", description: "Staff phone number" } }, required: ["customerId", "phone"] }, body: { type: "object", properties: { name: { type: "string" }, password: { type: "string" }, all_motor_access:{type:"string"} }, required: ["name", "password"] } }, handler: userController.editStaff, }); fastify.route({ method: "DELETE", url: "/api/deletestaff/:customerId/:phone", schema: { tags: ["User"], description: "Delete a staff member", params: { type: "object", properties: { customerId: { type: "string", description: "Customer ID" }, phone: { type: "string", description: "Staff phone number" } }, required: ["customerId", "phone"] } }, handler: userController.deleteStaff, }); fastify.route({ method: "PATCH", url: "/api/blockstaff/:customerId/:phone", schema: { tags: ["User"], description: "Block a staff member by phone", params: { type: "object", properties: { customerId: { type: "string", description: "Customer ID" }, phone: { type: "string", description: "Staff phone number" } }, required: ["customerId", "phone"] } }, handler: userController.blockStaff, }); fastify.route({ method: "GET", url: "/api/favorites/:customerId", schema: { tags: ["User"], description: "Get all favorite suppliers of a customer", summary: "Get all favorite suppliers of a customer", params: { type: "object", required: ["customerId"], properties: { customerId: { type: "string", description: "Customer ID" } } }, security: [{ basicAuth: [] }] }, handler: userController.getFavoriteSuppliers }); next(); };