Skip to content
Snippets Groups Projects
Commit 88786291 authored by Renzo Beux's avatar Renzo Beux
Browse files

feat: typed feature

parent 8193b2f2
No related branches found
No related tags found
No related merge requests found
import {
Handler, Request, Response, Router,
} from 'express';
import { SheetParserResponse } from '../Models/SheetParserResponse';
import SheetService from '../Services/SheetService';
const router = Router();
// const parseExcel = async (req:Request, res:Response) => {
// 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);
const parsedSheet: SheetParserResponse = SheetService.parseSheetService(sheet);
return res.status(200).send(parsedSheet);
} catch (error) {
return res.status(400).send({ error });
const e = error as Error;
return res.status(400).json({ error: e.message });
}
};
......
type SheetParserResponse = {
hombresMenores: Menores[] | null;
mujeresMenores: Menores[] | null;
hombres: Mayores[] | null;
mujeres: Mayores[] | null;
} | null;
type Menores = {
edad: number;
peso: number;
} | null;
type Mayores = {
edad: number;
peso?: number;
talla?: number;
} | null;
type MenoresSheet = {
'Edad (meses)': number;
'Peso (Kg)': number;
};
type MayoresSheet = {
'Edad (años)': number;
'Peso (Kg)': number;
'Talla (cm)': number;
};
export type {
SheetParserResponse, Menores, Mayores, MenoresSheet, MayoresSheet,
};
import * as XLSX from 'xlsx';
import {
SheetParserResponse, Menores, Mayores, MenoresSheet, MayoresSheet,
} from '../Models/SheetParserResponse';
/* PRIVATE FUNCTIONS */
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 -= 1;
work['!ref'] = XLSX.utils.encode_range(variable.s, variable.e);
return work;
};
// 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 -= 1;
// work['!ref'] = XLSX.utils.encode_range(variable.s, variable.e);
// return work;
// };
/* EXPORT FUNCTIONS */
const parseMen = (worksheet: XLSX.WorkSheet): Mayores[] => {
const res: Mayores[] = [];
const ref = worksheet['!ref'];
if (ref === undefined) throw new Error('An error ocurred');
const range = XLSX.utils.decode_range(ref);
range.s.c = 0;
range.e.c = 2;
const newRange = XLSX.utils.encode_range(range);
const parseSheetService = (data: Buffer): JSON => {
const workbook: XLSX.WorkBook = XLSX.read(data);
let parsed: JSON = JSON.parse('{}');
const aux = XLSX.utils.sheet_to_json(worksheet, { range: newRange }) as unknown as MayoresSheet[];
const sheetName = workbook.SheetNames[0];
const worksheet: XLSX.WorkSheet = workbook.Sheets[sheetName];
aux.forEach((element: MayoresSheet) => {
res.push(
{
edad: element['Edad (años)'],
peso: element['Peso (Kg)'],
talla: element['Talla (cm)'],
},
);
});
return res;
};
const parseWomen = (worksheet: XLSX.WorkSheet): Mayores[] => {
const res: Mayores[] = [];
const ref = worksheet['!ref'];
if (ref === undefined) throw new Error('An error has ocurred in parseSheetService');
if (ref === undefined) throw new Error('An error ocurred');
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")
range.s.c = 0;
range.e.c = 2;
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;
const aux = XLSX.utils.sheet_to_json(worksheet, { range: newRange }) as unknown as MayoresSheet[];
aux.forEach((element: MayoresSheet) => {
res.push(
{
edad: element['Edad (años)'],
peso: element['Peso (Kg)'],
talla: element['Talla (cm)'],
},
);
});
return res;
};
const parseMenLessThanAYear = (worksheet: XLSX.WorkSheet): Menores[] => {
const res: Menores[] = [];
const aux = XLSX.utils.sheet_to_json(worksheet) as unknown as MenoresSheet[];
aux.forEach((element: MenoresSheet) => {
res.push(
{
edad: element['Edad (meses)'],
peso: element['Peso (Kg)'],
},
);
});
return res;
};
const parseWomenLessThanAYear = (worksheet: XLSX.WorkSheet): Menores[] => {
const res: Menores[] = [];
const aux = XLSX.utils.sheet_to_json(worksheet) as unknown as MenoresSheet[];
aux.forEach((element: MenoresSheet) => {
res.push(
{
edad: element['Edad (meses)'],
peso: element['Peso (Kg)'],
},
);
});
return res;
};
/* EXPORT FUNCTIONS */
const parseSheetService = (data: Buffer): SheetParserResponse => {
const workbook: XLSX.WorkBook = XLSX.read(data);
let parsed: SheetParserResponse = null;
let hombresMenores: Menores[] = [];
let hombres: Mayores[] = [];
let mujeresMenores: Menores[] = [];
let mujeres: Mayores[] = [];
const sheetNames: string[] = workbook.SheetNames;
// Check there are 4 sheets, no more, no less
if (sheetNames.length !== 4) {
throw new Error('File does not respect scheme, there are more or less than 4 sheets');
}
sheetNames.forEach((name) => {
const worksheet: XLSX.WorkSheet = workbook.Sheets[name];
switch (name) {
case 'Hombres<1':
hombresMenores = parseMenLessThanAYear(worksheet);
break;
case 'Hombres':
hombres = parseMen(worksheet);
break;
case 'Mujeres<1':
mujeresMenores = parseWomenLessThanAYear(worksheet);
break;
case 'Mujeres':
mujeres = parseWomen(worksheet);
break;
default:
throw new Error(`Sheet name ${name} is not part of the scheme `);
}
});
parsed = {
hombresMenores,
hombres,
mujeresMenores,
mujeres,
};
return parsed;
// TODO: depends on sheet layout what to do
......
No preview for this file type
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment