import { ApiResult } from "./ApiResult"; import { BaseRoute } from "../routes/BaseRoute"; import { NextFunction, Request, Response, Router } from "express"; import * as fs from "fs"; import * as formidable from "formidable"; import { StepOnePdfParser, PdfParser } from "@rolesvillesoftware/steponeimport"; import { StepOneRepository } from "@rolesvillesoftware/tiberhealthmodel/repositories/StepOneRepository"; import { SafePromise } from "@rolesvillesoftware/tools/dist"; export class StepOneApi extends BaseRoute { get concrete(): StepOneApi { return this; } static createRoute(router: Router) { console.log("[IndexRoute::create] Creating USMLE Step One Exam API."); router.post("/stepOneImport", (req: Request, res: Response, next: NextFunction) => { new StepOneApi(req, res, next).checkAuth(controller => controller.upload(req, res, next)); }); router.post("/stepOneSave", (req: Request, res: Response, next: NextFunction) => { new StepOneApi(req, res, next).checkAuth(controller => controller.save(req, res, next)); }); } private deleteFile(path: string) { try { fs.unlinkSync(path); } catch (e) {} } private upload(req, res, next) { const apiResult = new ApiResult(res); let warehouseConnection = this.warehouseConnection; let form = new formidable.IncomingForm(); form.uploadDir = "./files"; form.keepExtensions = true; form.parse(this.req, (err, fields, files) => { try { let parser = new PdfParser(null, StepOnePdfParser, data => { let apiData = { name: data.name, usmleId: data.usmleId, testDate: data.testDate, score: data.score, status: data.status, graphData: data.graphData.map(item => { return { sectionName: item.sectionName, categoryName: item.categoryName, start: item.start, end: item.end, mid: item.mid, spread: item.spread, stdDev: item.stdDev }; }) }; apiResult.setSuccess(apiData); this.deleteFile(files.file.path); }); parser.processFile(files.file.path); } catch (error) { apiResult.setError(error); } }); } private save(req, res, next) { const apiResult = new ApiResult(res); if (req == null || req.body == null || req.body.reportData == null) { apiResult.setError("No report data to process"); } else { try { let reportData = Object.assign({}, req.body.reportData); if (reportData.examDate !== null && !(reportData.examDate instanceof Date)) { reportData.testDate = new Date(reportData.testDate); } SafePromise.run(() => new StepOneRepository(this.contextConnection).saveReport(reportData)) .then(result => { if (result.isError) { apiResult.setError(result.error); } else { apiResult.setSuccess(result.value); } }) .catch(error => { apiResult.setError(error); }); } catch (error) { apiResult.setError(error); } } } }