diff --git a/package-lock.json b/package-lock.json index d7d143c3eddcc5839ca732a452baf22cd68b1fff..c007368bdf7e4b6b8f117743c73420c19a09c580 100644 --- a/package-lock.json +++ b/package-lock.json @@ -976,6 +976,12 @@ "@types/node": "*" } }, + "@types/cors": { + "version": "2.8.12", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.12.tgz", + "integrity": "sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw==", + "dev": true + }, "@types/eslint-visitor-keys": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", @@ -1101,6 +1107,22 @@ "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", "dev": true }, + "@types/swagger-jsdoc": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@types/swagger-jsdoc/-/swagger-jsdoc-6.0.1.tgz", + "integrity": "sha512-+MUpcbyxD528dECUBCEVm6abNuORdbuGjbrUdHDeAQ+rkPuo2a+L4N02WJHF3bonSSE6SJ3dUJwF2V6+cHnf0w==", + "dev": true + }, + "@types/swagger-ui-express": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@types/swagger-ui-express/-/swagger-ui-express-4.1.3.tgz", + "integrity": "sha512-jqCjGU/tGEaqIplPy3WyQg+Nrp6y80DCFnDEAvVKWkJyv0VivSSDCChkppHRHAablvInZe6pijDFMnavtN0vqA==", + "dev": true, + "requires": { + "@types/express": "*", + "@types/serve-static": "*" + } + }, "@types/yargs": { "version": "16.0.4", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.4.tgz", @@ -2156,6 +2178,15 @@ "integrity": "sha512-2VV7DlIbooyTI7Bh+yzOOWL9tGwLnQKHno7qATE+fqZzDKYr6llVjVQOzpD/QLZFgXDPb8T71pJokHEZHEYJhQ==", "dev": true }, + "cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "requires": { + "object-assign": "^4", + "vary": "^1" + } + }, "cosmiconfig": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", @@ -2392,6 +2423,11 @@ } } }, + "dotenv": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz", + "integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==" + }, "duplexer3": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", @@ -5611,8 +5647,7 @@ "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" }, "object-inspect": { "version": "1.11.0", diff --git a/package.json b/package.json index a4fe8c95f957d3a849c6c4b522fcb0b3d4c91433..12c97c56e5ee0fa24dc0e943f12e56b418236c62 100644 --- a/package.json +++ b/package.json @@ -5,6 +5,8 @@ "main": "index.ts", "dependencies": { "config.json": "0.0.4", + "cors": "^2.8.5", + "dotenv": "^10.0.0", "express": "^4.17.1", "gulp-eslint": "^6.0.0", "openapi-types": "^9.3.0", @@ -14,10 +16,13 @@ "xlsx": "^0.17.1" }, "devDependencies": { + "@types/cors": "^2.8.12", "@types/express": "^4.17.13", "@types/node": "^16.7.10", "@typescript-eslint/eslint-plugin": "^2.34.0", "@typescript-eslint/parser": "^2.0.0", + "@types/swagger-jsdoc": "^6.0.1", + "@types/swagger-ui-express": "^4.1.3", "eslint": "^7.32.0", "eslint-config-airbnb": "^18.2.1", "eslint-config-airbnb-base": "^14.2.1", diff --git a/src/Controllers/ExcelController.ts b/src/Controllers/ExcelController.ts deleted file mode 100644 index 18a8dd1c0cc55438532d5172e90aa80bc35c5e61..0000000000000000000000000000000000000000 --- a/src/Controllers/ExcelController.ts +++ /dev/null @@ -1,12 +0,0 @@ -/* eslint-disable import/extensions */ -/* eslint-disable no-console */ -import { Request, Response } from "express"; -import { parseExcelService } from "../Services/SheetService"; - -const parseExcel = async (req:Request, res:Response) => { - res.status(200).send(parseExcelService()); -}; - -module.exports = { - parseExcel, -}; diff --git a/src/Controllers/SheetController.ts b/src/Controllers/SheetController.ts new file mode 100644 index 0000000000000000000000000000000000000000..f9c3ddf0c4ee84e350705b6f51d6c226f508f4e3 --- /dev/null +++ b/src/Controllers/SheetController.ts @@ -0,0 +1,57 @@ +import { Request, Response, Router } from "express"; +import SheetService from "../Services/SheetService"; + +const router = Router(); + + +// const parseExcel = async (req:Request, res:Response) => { + // res.status(200).send(parseExcelService()); + // }; + + const parseSheet = async (req:Request, res:Response) => { + const sheet:Buffer = req.body; + try{ + const parsedSheet = SheetService.parseSheetService(sheet) + return res.status(200).send(parsedSheet) + } catch(error) { + return res.status(400).send({error:error}) + } + + } + + + +/** + * @swagger + * /excelParser: + * post: + * tags: + * - parser + * description: Sheet Parser + * requestBody: + * required: true + * content: + * application/json: + * schema: + * type: object + * required: + * - email + * - password + * properties: + * excel: + * type: string + * responses: + * '200': + * description: returns the parsed JSON of the excel file provided + * content: + * application/json: + * schema: + * type: object + * properties: + * excelParsed: + * type: string + */ +router.post("/", parseSheet) + + +export default router; \ No newline at end of file diff --git a/src/Services/SheetService.ts b/src/Services/SheetService.ts index 9311351afcedf2753de3c88ccab54858b7e04236..5ad4f25b8e51337724e19d380eecf6e5ad8a03df 100644 --- a/src/Services/SheetService.ts +++ b/src/Services/SheetService.ts @@ -1,6 +1,5 @@ /* eslint-disable no-param-reassign */ /* eslint-disable no-plusplus */ -/* eslint-disable import/prefer-default-export */ /* eslint-disable no-console */ import * as XLSX from "xlsx"; @@ -18,19 +17,29 @@ const deleteRow = (ws:any, rowIndex:any) => { }; /* EXPORT FUNCTIONS */ -export const parseExcelService = () => { - const workbook = XLSX.readFile("src\\Services\\test.xlsx"); - // TODO: need definition of sheet + +const parseSheetService = (data:Buffer) =>{ + const workbook:XLSX.WorkBook = XLSX.read(data); + let parsed; + workbook.SheetNames.forEach((sheetName) => { - const worksheet = workbook.Sheets[sheetName]; + const worksheet:XLSX.WorkSheet = workbook.Sheets[sheetName]; const ref = worksheet["!ref"]!; const range = XLSX.utils.decode_range(ref); range.s.c = 0; // 0 == XLSX.utils.decode_col("A") range.e.c = 1; // 6 == XLSX.utils.decode_col("B") const newRange = XLSX.utils.encode_range(range); deleteRow(worksheet, 0); - const parsed = XLSX.utils.sheet_to_json(worksheet, { range: newRange }); + parsed = XLSX.utils.sheet_to_json(worksheet, { range: newRange }); console.log(parsed); - return parsed; }); -}; + return parsed; + // TODO: depends on sheet layout what to do + // let parsed:JSON; + + // return parsed; +} + +export default { + parseSheetService, +} diff --git a/src/index.ts b/src/index.ts index 85aa98772319fc4e54d0fe5022076581b11da4e0..5458d053d5d993ac55ada05e90c74b0c5bd1ed4f 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,20 +1,23 @@ /* eslint-disable no-console */ -import express, { Application } from 'express'; +import express, { Application } from "express"; +import 'dotenv/config' +import cors from 'cors'; +import swaggerJsDoc, { Options } from "swagger-jsdoc"; +import swaggerUi from "swagger-ui-express"; +import Routes from "./routes"; -const swaggerJsDoc = require('swagger-jsdoc'); -const swaggerUi = require('swagger-ui-express'); - -const app: Application = express(); +const app:Application = express(); const PORT = process.env.PORT || 8000; // swagger init -const swaggerOptions = { +const swaggerOptions:Options = { swaggerDefinition: { openapi: '3.0.0', info: { - title: 'REPP Rest API', - description: '', - servers: ['http://localhost:3000'], + title: "REPP Rest API", + version: "1.0.0", + description: "", + servers: ["http://localhost:3000"], }, }, apis: ['src/routes.ts'], @@ -24,8 +27,27 @@ const swaggerDocs = swaggerJsDoc(swaggerOptions); // middlewares app.use('/api-docs', swaggerUi.serve, swaggerUi.setup(swaggerDocs)); -app.use(require('./routes.ts')); +app.use(express.json({ + limit: '50mb' +})); +app.use(express.urlencoded({extended: false})); +app.use(cors({ + "origin": "*", + "methods": "GET,HEAD,PUT,PATCH,POST,DELETE", + "preflightContinue": false, + "optionsSuccessStatus": 204 +})); + +function o (){ + return NaN +} + +app.use(express.raw({ + limit: '50mb' +})); + +app.use(Routes); -app.listen(PORT, (): void => { +app.listen(PORT, ():void => { console.log(`REPP Backend running here 👉 https://localhost:${PORT}`); }); diff --git a/src/routes.ts b/src/routes.ts index 984601854eea1449bff3b1a4f9b6ceb912e4ac95..ae80fe4911431265bf5fce4fb491ba3e338f7ec3 100644 --- a/src/routes.ts +++ b/src/routes.ts @@ -1,7 +1,8 @@ -import { Request, Response } from 'express'; +import { Request, Response } from "express"; +import SheetController from './Controllers/SheetController'; -const { Router } = require('express'); -const { parseExcel } = require('./Controllers/ExcelController.ts'); +const { Router } = require("express"); +const { parseSheet } = require("./Controllers/SheetController.ts"); const router = Router(); @@ -9,38 +10,7 @@ router.get('/', (req: Request, res: Response): void => { res.send('Hey! This is REPP API, you can go to /api-docs to learn more!'); }); -// Che esto es para ejemplo de como usar swagger, hay que arreglarlo -// TODO -/** - * @swagger - * /excelParser: - * post: - * tags: - * - parser - * description: Excel Parser - * requestBody: - * required: true - * content: - * application/json: - * schema: - * type: object - * required: - * - email - * - password - * properties: - * excel: - * type: string - * responses: - * '200': - * description: returns the parsed JSON of the excel file provided - * content: - * application/json: - * schema: - * type: object - * properties: - * excelParsed: - * type: string - */ -router.post('/excelParser', parseExcel); -module.exports = router; +router.use("/sheetParser",SheetController) + +export default router;