const express = require('express'); const RfqsService = require('../services/rfqs'); const RfqsDBApi = require('../db/api/rfqs'); const wrapAsync = require('../helpers').wrapAsync; const router = express.Router(); const { parse } = require('json2csv'); const { checkCrudPermissions } = require('../middlewares/check-permissions'); router.use(checkCrudPermissions('rfqs')); /** * @swagger * components: * schemas: * Rfqs: * type: object * properties: * client_name: * type: string * default: client_name * project: * type: string * default: project * location_1: * type: string * default: location_1 * location_2: * type: string * default: location_2 * location_3: * type: string * default: location_3 * trunnion_roller_support: * type: integer * format: int64 * connected_container_qty: * type: integer * format: int64 * storage_container_qty: * type: integer * format: int64 * manifold_type: * type: integer * format: int64 * manifold_qty: * type: integer * format: int64 * chlorinator_capacity_required: * type: integer * format: int64 * chlorinator_capacity_offered: * type: integer * format: int64 * chlorinator_qty_required: * type: integer * format: int64 * chlorinator_qty_offered: * type: integer * format: int64 * working_standby_required: * type: integer * format: int64 * working_standby_offered: * type: integer * format: int64 * * * * * * * * * */ /** * @swagger * tags: * name: Rfqs * description: The Rfqs managing API */ /** * @swagger * /api/rfqs: * post: * security: * - bearerAuth: [] * tags: [Rfqs] * summary: Add new item * description: Add new item * requestBody: * required: true * content: * application/json: * schema: * properties: * data: * description: Data of the updated item * type: object * $ref: "#/components/schemas/Rfqs" * responses: * 200: * description: The item was successfully added * content: * application/json: * schema: * $ref: "#/components/schemas/Rfqs" * 401: * $ref: "#/components/responses/UnauthorizedError" * 405: * description: Invalid input data * 500: * description: Some server error */ router.post( '/', wrapAsync(async (req, res) => { const referer = req.headers.referer || `${req.protocol}://${req.hostname}${req.originalUrl}`; const link = new URL(referer); await RfqsService.create(req.body.data, req.currentUser, true, link.host); const payload = true; res.status(200).send(payload); }), ); /** * @swagger * /api/budgets/bulk-import: * post: * security: * - bearerAuth: [] * tags: [Rfqs] * summary: Bulk import items * description: Bulk import items * requestBody: * required: true * content: * application/json: * schema: * properties: * data: * description: Data of the updated items * type: array * items: * $ref: "#/components/schemas/Rfqs" * responses: * 200: * description: The items were successfully imported * content: * application/json: * schema: * $ref: "#/components/schemas/Rfqs" * 401: * $ref: "#/components/responses/UnauthorizedError" * 405: * description: Invalid input data * 500: * description: Some server error * */ router.post( '/bulk-import', wrapAsync(async (req, res) => { const referer = req.headers.referer || `${req.protocol}://${req.hostname}${req.originalUrl}`; const link = new URL(referer); await RfqsService.bulkImport(req, res, true, link.host); const payload = true; res.status(200).send(payload); }), ); /** * @swagger * /api/rfqs/{id}: * put: * security: * - bearerAuth: [] * tags: [Rfqs] * summary: Update the data of the selected item * description: Update the data of the selected item * parameters: * - in: path * name: id * description: Item ID to update * required: true * schema: * type: string * requestBody: * description: Set new item data * required: true * content: * application/json: * schema: * properties: * id: * description: ID of the updated item * type: string * data: * description: Data of the updated item * type: object * $ref: "#/components/schemas/Rfqs" * required: * - id * responses: * 200: * description: The item data was successfully updated * content: * application/json: * schema: * $ref: "#/components/schemas/Rfqs" * 400: * description: Invalid ID supplied * 401: * $ref: "#/components/responses/UnauthorizedError" * 404: * description: Item not found * 500: * description: Some server error */ router.put( '/:id', wrapAsync(async (req, res) => { await RfqsService.update(req.body.data, req.body.id, req.currentUser); const payload = true; res.status(200).send(payload); }), ); /** * @swagger * /api/rfqs/{id}: * delete: * security: * - bearerAuth: [] * tags: [Rfqs] * summary: Delete the selected item * description: Delete the selected item * parameters: * - in: path * name: id * description: Item ID to delete * required: true * schema: * type: string * responses: * 200: * description: The item was successfully deleted * content: * application/json: * schema: * $ref: "#/components/schemas/Rfqs" * 400: * description: Invalid ID supplied * 401: * $ref: "#/components/responses/UnauthorizedError" * 404: * description: Item not found * 500: * description: Some server error */ router.delete( '/:id', wrapAsync(async (req, res) => { await RfqsService.remove(req.params.id, req.currentUser); const payload = true; res.status(200).send(payload); }), ); /** * @swagger * /api/rfqs/deleteByIds: * post: * security: * - bearerAuth: [] * tags: [Rfqs] * summary: Delete the selected item list * description: Delete the selected item list * requestBody: * required: true * content: * application/json: * schema: * properties: * ids: * description: IDs of the updated items * type: array * responses: * 200: * description: The items was successfully deleted * content: * application/json: * schema: * $ref: "#/components/schemas/Rfqs" * 401: * $ref: "#/components/responses/UnauthorizedError" * 404: * description: Items not found * 500: * description: Some server error */ router.post( '/deleteByIds', wrapAsync(async (req, res) => { await RfqsService.deleteByIds(req.body.data, req.currentUser); const payload = true; res.status(200).send(payload); }), ); /** * @swagger * /api/rfqs: * get: * security: * - bearerAuth: [] * tags: [Rfqs] * summary: Get all rfqs * description: Get all rfqs * responses: * 200: * description: Rfqs list successfully received * content: * application/json: * schema: * type: array * items: * $ref: "#/components/schemas/Rfqs" * 401: * $ref: "#/components/responses/UnauthorizedError" * 404: * description: Data not found * 500: * description: Some server error */ router.get( '/', wrapAsync(async (req, res) => { const filetype = req.query.filetype; const currentUser = req.currentUser; const payload = await RfqsDBApi.findAll(req.query, { currentUser }); if (filetype && filetype === 'csv') { const fields = [ 'id', 'client_name', 'project', 'location_1', 'location_2', 'location_3', 'trunnion_roller_support', 'connected_container_qty', 'storage_container_qty', 'manifold_type', 'manifold_qty', 'chlorinator_capacity_required', 'chlorinator_capacity_offered', 'chlorinator_qty_required', 'chlorinator_qty_offered', 'working_standby_required', 'working_standby_offered', 'offer_date', ]; const opts = { fields }; try { const csv = parse(payload.rows, opts); res.status(200).attachment(csv); res.send(csv); } catch (err) { console.error(err); } } else { res.status(200).send(payload); } }), ); /** * @swagger * /api/rfqs/count: * get: * security: * - bearerAuth: [] * tags: [Rfqs] * summary: Count all rfqs * description: Count all rfqs * responses: * 200: * description: Rfqs count successfully received * content: * application/json: * schema: * type: array * items: * $ref: "#/components/schemas/Rfqs" * 401: * $ref: "#/components/responses/UnauthorizedError" * 404: * description: Data not found * 500: * description: Some server error */ router.get( '/count', wrapAsync(async (req, res) => { const currentUser = req.currentUser; const payload = await RfqsDBApi.findAll(req.query, null, { countOnly: true, currentUser, }); res.status(200).send(payload); }), ); /** * @swagger * /api/rfqs/autocomplete: * get: * security: * - bearerAuth: [] * tags: [Rfqs] * summary: Find all rfqs that match search criteria * description: Find all rfqs that match search criteria * responses: * 200: * description: Rfqs list successfully received * content: * application/json: * schema: * type: array * items: * $ref: "#/components/schemas/Rfqs" * 401: * $ref: "#/components/responses/UnauthorizedError" * 404: * description: Data not found * 500: * description: Some server error */ router.get('/autocomplete', async (req, res) => { const payload = await RfqsDBApi.findAllAutocomplete( req.query.query, req.query.limit, req.query.offset, ); res.status(200).send(payload); }); /** * @swagger * /api/rfqs/{id}: * get: * security: * - bearerAuth: [] * tags: [Rfqs] * summary: Get selected item * description: Get selected item * parameters: * - in: path * name: id * description: ID of item to get * required: true * schema: * type: string * responses: * 200: * description: Selected item successfully received * content: * application/json: * schema: * $ref: "#/components/schemas/Rfqs" * 400: * description: Invalid ID supplied * 401: * $ref: "#/components/responses/UnauthorizedError" * 404: * description: Item not found * 500: * description: Some server error */ router.get( '/:id', wrapAsync(async (req, res) => { const payload = await RfqsDBApi.findBy({ id: req.params.id }); res.status(200).send(payload); }), ); router.use('/', require('../helpers').commonErrorHandler); module.exports = router;