diff --git a/src/Controllers/SheetController.ts b/src/Controllers/SheetController.ts index f9c3ddf0c4ee84e350705b6f51d6c226f508f4e3..57cc9bcaab7fbf6df0bcef01a6a5efb3a3f51b80 100644 --- a/src/Controllers/SheetController.ts +++ b/src/Controllers/SheetController.ts @@ -1,25 +1,23 @@ -import { Request, Response, Router } from "express"; -import SheetService from "../Services/SheetService"; +import { + Handler, 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}) - } - - } +// res.status(200).send(parseExcelService()); +// }; - +const parseSheet: Handler = async (req: Request, res: Response) => { + const sheet: Buffer = req.body; + try { + const parsedSheet: JSON = SheetService.parseSheetService(sheet); + return res.status(200).send(parsedSheet); + } catch (error) { + return res.status(400).send({ error }); + } +}; /** * @swagger @@ -51,7 +49,6 @@ const router = Router(); * excelParsed: * type: string */ -router.post("/", parseSheet) - +router.post('/', parseSheet); -export default router; \ No newline at end of file +export default router; diff --git a/src/Services/SheetService.ts b/src/Services/SheetService.ts index 5ad4f25b8e51337724e19d380eecf6e5ad8a03df..846ca0e5e60c4b5b57e2daebcd18236c8348401b 100644 --- a/src/Services/SheetService.ts +++ b/src/Services/SheetService.ts @@ -1,45 +1,44 @@ -/* eslint-disable no-param-reassign */ -/* eslint-disable no-plusplus */ -/* eslint-disable no-console */ -import * as XLSX from "xlsx"; +import * as XLSX from 'xlsx'; /* PRIVATE FUNCTIONS */ -const ec = (r:any, c:any) => XLSX.utils.encode_cell({ r, c }); -const deleteRow = (ws:any, rowIndex:any) => { - const variable = XLSX.utils.decode_range(ws["!ref"]); - for (let R = rowIndex; R < variable.e.r; ++R) { - for (let C = variable.s.c; C <= variable.e.c; ++C) { - ws[ec(R, C)] = ws[ec(R + 1, C)]; +const ec = (r: number, c: number): string => XLSX.utils.encode_cell({ r, c }); +const deleteRow = (ws: XLSX.WorkSheet, rowIndex: number): XLSX.WorkSheet => { + const work = ws; + if (work['!ref'] === undefined) throw new Error('An error has ocurred in deleteRow'); + const variable = XLSX.utils.decode_range(work['!ref']); + for (let R = rowIndex; R < variable.e.r; R += 1) { + for (let C = variable.s.c; C <= variable.e.c; C += 1) { + work[ec(R, C)] = work[ec(R + 1, C)]; } } - variable.e.r--; - ws["!ref"] = XLSX.utils.encode_range(variable.s, variable.e); + variable.e.r -= 1; + work['!ref'] = XLSX.utils.encode_range(variable.s, variable.e); + return work; }; /* EXPORT FUNCTIONS */ -const parseSheetService = (data:Buffer) =>{ - const workbook:XLSX.WorkBook = XLSX.read(data); - let parsed; +const parseSheetService = (data: Buffer): JSON => { + const workbook: XLSX.WorkBook = XLSX.read(data); + let parsed: JSON = JSON.parse('{}'); + + const sheetName = workbook.SheetNames[0]; + const worksheet: XLSX.WorkSheet = workbook.Sheets[sheetName]; + + const ref = worksheet['!ref']; + if (ref === undefined) throw new Error('An error has ocurred in parseSheetService'); + const range = XLSX.utils.decode_range(ref); + range.s.c = 0; // 0 == XLSX.utils.decode_col("A") + range.e.c = 1; // 1 == XLSX.utils.decode_col("B") + const newRange = XLSX.utils.encode_range(range); + const workSheetWithRowDeleted: XLSX.WorkSheet = deleteRow(worksheet, 0); + // eslint-disable-next-line max-len + parsed = XLSX.utils.sheet_to_json(workSheetWithRowDeleted, { range: newRange }) as unknown as JSON; - workbook.SheetNames.forEach((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); - parsed = XLSX.utils.sheet_to_json(worksheet, { range: newRange }); - console.log(parsed); - }); return parsed; // TODO: depends on sheet layout what to do - // let parsed:JSON; - - // return parsed; -} +}; export default { parseSheetService, -} +}; diff --git a/src/Services/test.xlsx b/src/Services/test.xlsx index 5c97acff2e60070edb20b52a1d7e9d28b9981e68..b667311d3984b4b12e566d04533cd3c294f50c94 100644 Binary files a/src/Services/test.xlsx and b/src/Services/test.xlsx differ diff --git a/src/index.ts b/src/index.ts index 5458d053d5d993ac55ada05e90c74b0c5bd1ed4f..9fdd678e0bcf2d912ae8503fedaa1f7dedd5552b 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,23 +1,23 @@ /* eslint-disable no-console */ -import express, { Application } from "express"; -import 'dotenv/config' +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"; +import swaggerJsDoc, { Options } from 'swagger-jsdoc'; +import swaggerUi from 'swagger-ui-express'; +import Routes from './routes'; -const app:Application = express(); +const app: Application = express(); const PORT = process.env.PORT || 8000; // swagger init -const swaggerOptions:Options = { +const swaggerOptions: Options = { swaggerDefinition: { openapi: '3.0.0', info: { - title: "REPP Rest API", - version: "1.0.0", - description: "", - servers: ["http://localhost:3000"], + title: 'REPP Rest API', + version: '1.0.0', + description: '', + servers: ['http://localhost:3000'], }, }, apis: ['src/routes.ts'], @@ -28,26 +28,22 @@ const swaggerDocs = swaggerJsDoc(swaggerOptions); app.use('/api-docs', swaggerUi.serve, swaggerUi.setup(swaggerDocs)); app.use(express.json({ - limit: '50mb' + limit: '50mb', })); -app.use(express.urlencoded({extended: false})); +app.use(express.urlencoded({ extended: false })); app.use(cors({ - "origin": "*", - "methods": "GET,HEAD,PUT,PATCH,POST,DELETE", - "preflightContinue": false, - "optionsSuccessStatus": 204 + origin: '*', + methods: 'GET,HEAD,PUT,PATCH,POST,DELETE', + preflightContinue: false, + optionsSuccessStatus: 204, })); -function o (){ - return NaN -} - app.use(express.raw({ - limit: '50mb' + 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 ae80fe4911431265bf5fce4fb491ba3e338f7ec3..ed8df5918a887121d647a539d424ec5e25525a09 100644 --- a/src/routes.ts +++ b/src/routes.ts @@ -1,16 +1,12 @@ -import { Request, Response } from "express"; +import { Request, Response, Router } from 'express'; import SheetController from './Controllers/SheetController'; -const { Router } = require("express"); -const { parseSheet } = require("./Controllers/SheetController.ts"); - const router = Router(); router.get('/', (req: Request, res: Response): void => { res.send('Hey! This is REPP API, you can go to /api-docs to learn more!'); }); - -router.use("/sheetParser",SheetController) +router.use('/sheetParser', SheetController); export default router;