You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

744 lines
20 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

const fastify = require("fastify");
const supplierController = require("../controllers/supplierController");
const validationHandler = require("../handlers/supplierHandler");
const { profilePictureSupplier } = require("../models/supplier");
module.exports = function (fastify, opts, next) {
fastify.post("/api/suppliersforbooking/:customerId", {
schema: {
tags: ["Supplier-Data"],
description: "This is for Get All Suppliers",
summary: "This is for to Get All Suppliers",
params: {
type: "object",
properties: {
customerId: {
type: "string",
description: "customerId",
},
},
},
body: {
type: "object",
properties: {
type_of_water: { type: "string" },
capacity: { type: "string" },
quantity: { type: "string" },
date: { type: "string" },
radius_from:{ type: "string" },
radius_to:{ type: "string" },
rating_to:{ type: "string" },
rating_to:{ type: "string" },
price_from: { type: "string" },
price_to: { type: "string" },
time: { type: "string" },
pump: { type: "string" },
},
},
security: [
{
basicAuth: [],
},
],
},
handler: validationHandler.getSuppliers,
});
fastify.post("/api/getSupplierswithoutbooking/:customerId", {
schema: {
tags: ["Supplier-Data"],
description: "Get all suppliers with favorite & connection flags for a customer",
summary: "List suppliers with isFavorite & isConnected",
params: {
type: "object",
required: ["customerId"],
properties: {
customerId: { type: "string", description: "Customer ID" },
},
},
// Body is not needed; keep empty schema or remove `body` entirely
security: [{ basicAuth: [] }],
},
handler: validationHandler.getSupplierswithoutbooking, // or `exports.getSuppliers` if wired directly
});
fastify.post("/api/requestedbookings", {
schema: {
tags: ["Supplier-Data"],
description: "API to create requested bookings and send to suppliers",
summary: "Create requested booking",
body: {
type: "object",
required: ["customerId", "type_of_water", "capacity", "quantity", "date", "time", "requested_suppliers"],
properties: {
customerId: { type: "string" },
type_of_water: { type: "string" },
capacity: { type: "string" },
quantity: { type: "string" },
date: { type: "string" },
time: { type: "string" },
requested_suppliers: {
type: "array",
items: {
type: "object",
required: ["supplierId", "quoted_amount"],
properties: {
supplierId: { type: "string" },
quoted_amount: { type: "number" },
time: { type: "string" } // ✅ New field
}
}
}
}
},
security: [{ basicAuth: [] }]
},
handler: validationHandler.createRequestedBooking
});
fastify.get("/api/connectedSuppliers/:customerId", {
schema: {
tags: ["Supplier-Data"],
description: "This is for Get All connected Suppliers",
summary: "This is for to Get All connected Suppliers",
params: {
type: "object",
properties: {
customerId: {
type: "string",
description: "customerId",
},
},
},
security: [
{
basicAuth: [],
},
],
},
//preHandler: fastify.auth([fastify.authenticate]),
handler: validationHandler.getConnectedSuppliers,
});
fastify.get("/api/pendingSuppliers/:customerId", {
schema: {
tags: ["Supplier-Data"],
description: "This is for Get All pending Suppliers",
summary: "This is for to Get All pending Suppliers",
params: {
type: "object",
properties: {
customerId: {
type: "string",
description: "customerId",
},
},
},
security: [
{
basicAuth: [],
},
],
},
preHandler: fastify.auth([fastify.authenticate]),
handler: validationHandler.getPendingSuppliers,
});
fastify.post("/api/plan/suppliers/:customerId", {
schema: {
tags: ["Supplier-Data"],
summary: "Search suppliers for Plans page",
description: "Filters by type_of_water and capacity×quantity. No bookings/price/radius/rating filters.",
params: {
type: "object",
required: ["customerId"],
properties: { customerId: { type: "string" } },
},
body: {
type: "object",
required: ["type_of_water", "capacity", "quantity", "frequency", "start_date", "end_date"],
properties: {
type_of_water: { type: "string" },
capacity: { type: "string" }, // UI field
quantity: { type: "string" }, // UI field
frequency: { // UI field: daily/weekly_once/_twice/_thrice
type: "string",
enum: ["daily","weekly_once","weekly_twice","weekly_thrice","weekly"]
},
start_date: { type: "string" }, // UI field "Start date"
end_date: { type: "string" } // UI field "End date"
},
additionalProperties: false
},
security: [{ basicAuth: [] }],
},
handler: validationHandler.getSuppliersForPlanSearch,
});
fastify.post("/api/requestedplanbookings", {
schema: {
tags: ["Supplier-Data"],
summary: "Create plan requested booking (daily/weekly once|twice|thrice)",
body: {
type: "object",
required: [
"customerId","type_of_water","capacity","quantity",
"start_date","end_date","time","frequency","requested_suppliers"
],
properties: {
customerId: { type: "string" },
type_of_water: { type: "string" },
capacity: { type: "string" },
quantity: { type: "string" },
start_date: { type: "string" }, // "YYYY-MM-DD"
end_date: { type: "string" }, // "YYYY-MM-DD"
time: { type: "string" }, // "HH:mm"
frequency: {
type: "string",
enum: ["daily","weekly_once","weekly_twice","weekly_thrice","weekly"]
},
weekly_count: { type: "integer", minimum: 1, maximum: 3 }, // only if frequency === "weekly"
requested_suppliers: {
type: "array",
minItems: 1,
items: {
type: "object",
required: ["supplierId","quoted_amount"],
properties: {
supplierId: { type: "string" },
quoted_amount: { type: "number" },
time: { type: "string" }
},
additionalProperties: false
}
}
},
additionalProperties: false
},
security: [{ basicAuth: [] }]
},
handler: validationHandler.createRequestedPlanBooking
});
fastify.get("/api/rejectSuppliers/:customerId", {
schema: {
tags: ["Supplier-Data"],
description: "This is for Get All rejected Suppliers",
summary: "This is for to Get All rejected Suppliers",
params: {
type: "object",
properties: {
customerId: {
type: "string",
description: "customerId",
},
},
},
security: [
{
basicAuth: [],
},
],
},
preHandler: fastify.auth([fastify.authenticate]),
handler: validationHandler.getRejectSuppliers,
});
fastify.get("/api/rejectCustomers/:supplierId", {
schema: {
tags: ["Supplier-Data"],
description: "This is for Get All rejected Customers",
summary: "This is for to Get All rejected Customers",
params: {
type: "object",
properties: {
supplierId: {
type: "string",
description: "supplierId",
},
},
},
security: [
{
basicAuth: [],
},
],
},
preHandler: fastify.auth([fastify.authenticate]),
handler: validationHandler.getRejectCustomers,
});
fastify.get("/api/pendingCustomers/:supplierId", {
schema: {
tags: ["Supplier-Data"],
description: "This is for Get All pending Customers",
summary: "This is for to Get All pending Customers",
params: {
type: "object",
properties: {
supplierId: {
type: "string",
description: "supplierId",
},
},
},
security: [
{
basicAuth: [],
},
],
},
preHandler: fastify.auth([fastify.authenticate]),
handler: validationHandler.getPendingCustomers,
});
fastify.get("/api/connectedCustomers/:supplierId", {
schema: {
tags: ["Supplier-Data"],
description: "This is for Get All connected Customers for Suppliers",
summary: "This is for to Get All connected Customers for suppliers",
params: {
type: "object",
properties: {
supplierId: {
type: "string",
description: "supplierId",
},
},
},
security: [
{
basicAuth: [],
},
],
},
preHandler: fastify.auth([fastify.authenticate]),
handler: validationHandler.getconnectedCustomers,
});
fastify.post("/api/supplierlogin", {
schema: {
description: "This is for Login Supplier",
tags: ["Supplier-Data"],
summary: "This is for Login Supplier",
body: {
type: "object",
required: ["phone", "password"],
properties: {
phone: { type: "string" },
password: { type: "string" },
},
},
},
handler: validationHandler.loginSupplier,
});
fastify.post("/api/deliveryboylogin", {
schema: {
description: "This is for Login Delivery Boy",
tags: ["Delivery"],
summary: "This is for Login Delivery Boy",
body: {
type: "object",
required: ["phone"],
properties: {
phoneVerificationCode: { type: "string" },
phone: { type: "string" },
},
},
},
handler: validationHandler.deliveryBoyVerifyPhone,
});
fastify.route({
method: "POST",
url: "/api/supplierlogout",
schema: {
description: "This is for Supplier logout",
tags: ["Supplier-Data"],
summary: "This is for Supplier logout",
params: {
type: "object",
properties: {
supplierId: {
type: "string",
description: "supplierId",
},
},
},
},
// preHandler: fastify.auth([fastify.authenticate]),
handler: validationHandler.logoutsupplier,
// onResponse: (request,reply) => {validationHandler.resetPassword(request,reply)}
});
fastify.route({
method: "POST",
url: "/api/suppliers",
schema: {
tags: ["Supplier-Data"],
description: "This is for cretae New supplier",
summary: "This is for Create New supplier.",
body: {
type: "object",
properties: {
suppliername: { type: "string" },
phone: { type: "string" },
alternativeContactNumber : { type : "string" },
password: { type: "string" },
emails: {
type: "array",
maxItems: 2,
items: {
type: "object",
properties: {
email: { type: "string", default: null },
},
},
},
office_address: { type: "string", default: null },
city: { type: "string", default: null },
state: { type: "string", default: null },
zip: { type: "string", default: null },
country: { type: "string", default: null },
latitude: { type: 'number', default: 0.0},
longitude: { type: 'number', default: 0.0},
fcmId: { type: "string", default: null },
description: { type: "string", default: null },
bussinessname: { type: "string", default: null },
registration_number: { type: "string", default: null },
years_in_business: { type: "string", default: null },
},
},
security: [
{
basicAuth: [],
},
],
},
preHandler: [
validationHandler.fieldCheck,
validationHandler.verifySupplier,
// validationHandler.validatePhoneFormat,
validationHandler.validateEmailFormat,
],
handler: supplierController.addSupplier,
});
fastify.route({
method: "POST",
url: "/api/supplierphone",
schema: {
tags: ["Supplier-Data"],
description: "This is for verify Supplier Phone",
summary: "This is to Verify Supplier 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/deliveryboyphone",
schema: {
tags: ["Delivery"],
description: "This is for verify Delivery Boy Phone",
summary: "This is to Verify Delivery Boy Phone.",
body: {
type: "object",
required: ["phone"],
properties: {
phoneVerificationCode: { type: "string" },
phone: { type: "string" },
},
},
security: [
{
basicAuth: [],
},
],
},
// preHandler: fastify.auth([fastify.authenticate]),
handler: validationHandler.deliveryBoyVerifyPhone,
});
fastify.route({
method: "PUT",
url: "/api/deletedeliveryboy/:supplierId",
schema: {
tags: ["Delivery"],
summary: "This is for delete delivery boy",
description: "This is for delete delivery boy",
params: {
required: ["supplierId"],
type: "object",
properties: {
supplierId: {
type: "string",
description: "supplierId",
},
},
},
querystring: {
phone: {type: 'string'}
},
security: [
{
basicAuth: [],
},
],
},
preHandler: fastify.auth([fastify.authenticate]),
handler: validationHandler.deleteDeliveryBoy,
});
fastify.route({
method: "PUT",
url: "/api/updatedeliveryboy/:supplierId",
schema: {
tags: ["Delivery"],
summary: "This is for update deliveryboy details",
params: {
required: ["supplierId"],
type: "object",
properties: {
supplierId: {
type: "string",
description: "supplierId",
},
},
},
querystring: {
phone: {type: 'string'}
},
body: {
type: "object",
// required: ['phone'],
properties: {
name: { type: "string", default: null },
phone: { type: "string", default: null },
alternativeContactNumber: { type: "string" },
address: { type: "string", default: null },
city: { type: "string" , default: null},
state: { type: "string", default: null },
zip: { type: "string", default: null },
},
},
security: [
{
basicAuth: [],
},
],
},
// preHandler: [
// fastify.auth([fastify.operatorAuthenticate]),
// validationHandler.validatePhoneFormat,
// ],
preHandler: fastify.auth([fastify.authenticate]),
handler: validationHandler.updateDeliveryBoy,
});
fastify.route({
method: "POST",
url: "/api/suppliers/:supplierId",
schema: {
description: "To Get Supplier by supplierId",
tags: ["Supplier-Data"],
summary: "This is for Get a Single Supplier by supplierId",
params: {
type: "object",
properties: {
supplierId: {
type: "string",
description: "supplierId",
},
},
},
security: [
{
basicAuth: [],
},
],
},
preHandler: fastify.auth([fastify.authenticate]),
handler: validationHandler.getSingleSupplier,
});
fastify.route({
method: "POST",
url: "/api/currentsupplier",
schema: {
tags: ["Supplier-Data"],
description: "This is for Get Current Supplier by supplierId by Post Body",
summary: "This is for Get a Current Supplier.",
body: {
type: "object",
required: ["supplierId"],
properties: {
supplierId: { type: "string" },
},
},
security: [
{
basicAuth: [],
},
],
},
preHandler: fastify.auth([fastify.authenticate]),
handler: validationHandler.getCurrentSupplier,
});
fastify.route({
method: "PUT",
url: "/api/update/currentSupplier/:supplierId",
schema: {
tags: ["Supplier-Data"],
summary: "This is for update current supplier",
description: "This is for update current supplier",
params: {
type: "object",
properties: {
supplierId: {
type: "string",
description: "supplierId",
},
},
},
body: {
type: "object",
properties: {
phone: { type: "string" },
firstName: { type: "string" },
lastName: { type: "string" },
suppliername: { type: "string" },
emails: {
type: "array",
maxItems: 2,
items: {
type: "object",
properties: {
email: { type: "string", default: null },
},
},
},
office_address: { type: "string" },
alternativeContactNumber: { type: "string" },
city: { type: "string" },
state: { type: "string" },
country: { type: "string" },
zip: { type: "string" },
description: { type: "string" },
status: {type: "string" },
startingPrice : {type : "string"}
},
},
security: [
{
basicAuth: [],
},
],
},
preHandler: [fastify.auth([fastify.authenticate])],
handler: supplierController.editCuurentSupplierInfo,
});
fastify.route({
method: "POST",
url: "/api/supplier/booking/respond/:_id",
schema: {
description: "Supplier accepts or rejects a requested booking",
tags: ["Supplier-Data"],
summary: "Supplier action on requested booking",
params: {
type: "object",
properties: {
_id: { type: "string", description: "Requested Booking ID" }
},
required: ["_id"]
},
body: {
type: "object",
properties: {
supplierId: { type: "string", description: "Supplier ID" },
action: {
type: "string",
enum: ["accept", "reject"],
description: "Action to perform by supplier"
}
},
required: ["supplierId", "action"]
},
security: [
{
basicAuth: [],
},
],
},
// preHandler: fastify.auth([fastify.authenticate]), // Uncomment if auth is needed
handler: supplierController.respondToRequestedBooking
});
next();
}