From d1f2f1c4ac565870a7bcb9440da5e32b0491dc92 Mon Sep 17 00:00:00 2001 From: Stamate Valentin Date: Tue, 17 May 2022 21:49:28 +0300 Subject: [PATCH] coordinator forms export --- endpoints.json | 24 ++++---- src/app/controller/admin.controller.ts | 22 +++----- src/app/endpoints/admin.endpoints.ts | 4 +- src/app/service/admin.service.ts | 77 +++++++++++++++----------- src/app/services/forms.service.ts | 29 +++++++++- src/endpoint.identifier.ts | 2 +- 6 files changed, 94 insertions(+), 64 deletions(-) diff --git a/endpoints.json b/endpoints.json index 0a6cb77..7d0faf6 100644 --- a/endpoints.json +++ b/endpoints.json @@ -2565,14 +2565,14 @@ "formdata": [] }, "url": { - "raw": "{{host}}/api/coordinator/scientific-activity", + "raw": "{{host}}/api/coordinator/referential-activity", "host": [ "{{host}}" ], "path": [ "api", "coordinator", - "scientific-activity" + "referential-activity" ] } }, @@ -2615,14 +2615,14 @@ ] }, "url": { - "raw": "{{host}}/api/coordinator/scientific-activity", + "raw": "{{host}}/api/coordinator/referential-activity", "host": [ "{{host}}" ], "path": [ "api", "coordinator", - "scientific-activity" + "referential-activity" ] } }, @@ -2640,14 +2640,14 @@ } ], "url": { - "raw": "{{host}}/api/coordinator/scientific-activity", + "raw": "{{host}}/api/coordinator/referential-activity", "host": [ "{{host}}" ], "path": [ "api", "coordinator", - "scientific-activity" + "referential-activity" ] } }, @@ -2712,7 +2712,7 @@ "name": "Admin", "item": [ { - "name": "User", + "name": "Students", "protocolProfileBehavior": { "disableBodyPruning": true }, @@ -2735,20 +2735,20 @@ } }, "url": { - "raw": "{{host}}/api/user", + "raw": "{{host}}/api/student", "host": [ "{{host}}" ], "path": [ "api", - "user" + "student" ] } }, "response": [] }, { - "name": "User", + "name": "Student", "request": { "method": "DELETE", "header": [ @@ -2768,13 +2768,13 @@ } }, "url": { - "raw": "{{host}}/api/user/2", + "raw": "{{host}}/api/student/2", "host": [ "{{host}}" ], "path": [ "api", - "user", + "student", "2" ] } diff --git a/src/app/controller/admin.controller.ts b/src/app/controller/admin.controller.ts index 6399328..e94bc89 100644 --- a/src/app/controller/admin.controller.ts +++ b/src/app/controller/admin.controller.ts @@ -1,6 +1,4 @@ import {NextFunction, Request, Response} from "express"; -import {JwtService} from "../services/jwt.service"; -import {Coordinator, Student} from "../database/models"; import {ResponseError} from "../middleware/middleware"; import {ContentType, ResponseMessage, StatusCode} from "../services/rest.util"; import {UploadedFile} from "express-fileupload"; @@ -12,22 +10,19 @@ export class AdminController { /************************************************************************************ * Admin only ***********************************************************************************/ - static async allUsers(req: Request, res: Response, next: NextFunction) { + static async allStudents(req: Request, res: Response, next: NextFunction) { try { - const token = req.get('Authorization') as string; - const user = JwtService.verifyToken(token) as Student; - - const data = await AdminService.allUsers(user); + const data = await AdminService.allStudents(); res.end(JSON.stringify(data)); } catch (err) { next(err); } } - static async deleteUser(req: Request, res: Response, next: NextFunction) { + static async deleteStudent(req: Request, res: Response, next: NextFunction) { try { const id = req.params.id; - await AdminService.deleteUser(id); + await AdminService.deleteStudent(id); res.end(); } catch (err) { @@ -37,10 +32,7 @@ export class AdminController { static async getBaseInformation(req: Request, res: Response, next: NextFunction) { try { - const token = req.get('Authorization') as string; - const user = JwtService.verifyToken(token) as Student; - - const data = await AdminService.getBaseInformation(user); + const data = await AdminService.getBaseInformation(); res.end(JSON.stringify(data)); } catch (err) { next(err); @@ -127,10 +119,10 @@ export class AdminController { try { const fileBuffer: Buffer = await AdminService.exportForms(); - const fileName = `data_${UtilService.stringDate(new Date())}.xlsx`; + const fileName = `data_${UtilService.stringDate(new Date())}.zip`; res.setHeader('Content-disposition', 'attachment; filename=' + fileName); - res.setHeader('Content-type', ContentType.XLSX); + res.setHeader('Content-type', ContentType.ZIP); res.end(fileBuffer); } catch (err) { diff --git a/src/app/endpoints/admin.endpoints.ts b/src/app/endpoints/admin.endpoints.ts index 9aaa9f7..d7ad106 100644 --- a/src/app/endpoints/admin.endpoints.ts +++ b/src/app/endpoints/admin.endpoints.ts @@ -4,8 +4,8 @@ import {Middleware} from "../middleware/middleware"; import {AdminController} from "../controller/admin.controller"; export function registerAdminEndpoints(app: Express) { - app.get(EndpointIdentifier.USER, Middleware.adminMiddleware, AdminController.allUsers); - app.delete(`${EndpointIdentifier.USER}/:id`, Middleware.adminMiddleware, AdminController.deleteUser); + app.get(EndpointIdentifier.STUDENT, Middleware.adminMiddleware, AdminController.allStudents); + app.delete(`${EndpointIdentifier.STUDENT}/:id`, Middleware.adminMiddleware, AdminController.deleteStudent); app.get(EndpointIdentifier.BASE_INFORMATION, Middleware.adminMiddleware, AdminController.getBaseInformation); app.post(EndpointIdentifier.BASE_INFORMATION, Middleware.adminMiddleware, AdminController.importBaseInformation); diff --git a/src/app/service/admin.service.ts b/src/app/service/admin.service.ts index ad0b1a9..3f439fc 100644 --- a/src/app/service/admin.service.ts +++ b/src/app/service/admin.service.ts @@ -1,10 +1,10 @@ -import {Coordinator, EmailResult, Student} from "../database/models"; +import {Coordinator, EmailResult} from "../database/models"; import { AcademyMemberModel, AllowedStudentsModel, AwardAndNominationModel, CitationModel, - CoordinatorModel, + CoordinatorModel, CoordinatorReferentialActivityModel, CoordinatorScientificActivityModel, DidacticActivityModel, EditorialMemberModel, ISIProceedingModel, @@ -19,7 +19,6 @@ import { TranslationModel, WithoutActivityModel } from "../database/sequelize"; -import {Op} from "@sequelize/core"; import {ResponseError} from "../middleware/middleware"; import {ResponseMessage, StatusCode} from "../services/rest.util"; import {UploadedFile} from "express-fileupload"; @@ -31,22 +30,20 @@ import {DocxService} from "../services/file/docx.service"; import {UtilService} from "../services/util.service"; import sha256 from "crypto-js/sha256"; import {CryptoUtil} from "../services/crypto.util"; +import XLSX from "xlsx"; export class AdminService { /* Get all the users except to the one that is making the request */ - static async allUsers(userExcept: Student): Promise { + static async allStudents(): Promise { const rows = await StudentModel.findAll({ - where: { - id: {[Op.not]: userExcept.id}, - }, order: ['id'], }); return rows.map(item => item.toJSON()); } - static async deleteUser(id: number): Promise { + static async deleteStudent(id: number): Promise { const row = await StudentModel.findOne({ where: { id: id @@ -62,11 +59,8 @@ export class AdminService { } /* Get all base information except to the one that is making the request */ - static async getBaseInformation(user: Student) { + static async getBaseInformation() { return (await AllowedStudentsModel.findAll({ - where: { - identifier: {[Op.not]: user.identifier}, - }, order: ['id'], })).map(item => item.toJSON()); } @@ -135,8 +129,7 @@ export class AdminService { } static async exportForms(): Promise { - const XLSX = require('XLSX'); - + /* Student Data */ let scArticleISI = (await ScientificArticleISIModel.findAll({order: ['id'],})).map(item => item.toJSON()); let isiProceedings = (await ISIProceedingModel.findAll({order: ['id'],})).map(item => item.toJSON()); let scArticleBDI = (await ScientificArticleBDIModel.findAll({order: ['id'],})).map(item => item.toJSON()); @@ -169,25 +162,43 @@ export class AdminService { const withoutActivitySheet = FormsService.getWithoutActivitySheet(withoutActivity); const didacticActivitySheet = FormsService.getDidacticActivitySheet(didacticActivity); - const workBook = XLSX.utils.book_new(); - XLSX.utils.book_append_sheet(workBook, scISISheet, 'Articole ştiintifice...ISI...'); - XLSX.utils.book_append_sheet(workBook, isiProceedingsSheet, 'ISI proceedings'); - XLSX.utils.book_append_sheet(workBook, scArticleBDISheet, 'Articole științifice...BDI..'); - XLSX.utils.book_append_sheet(workBook, scBookSheet, 'Cărţi ştiinţifice...'); - XLSX.utils.book_append_sheet(workBook, translationSheet, 'Traduceri'); - XLSX.utils.book_append_sheet(workBook, scCommunicationSheet, 'Comunicări...'); - XLSX.utils.book_append_sheet(workBook, patentSheet, 'Brevete'); - XLSX.utils.book_append_sheet(workBook, researchContractSheet, 'Contracte de cercetare'); - XLSX.utils.book_append_sheet(workBook, citationSheet, 'Citări'); - XLSX.utils.book_append_sheet(workBook, awardsNominationSheet, 'Premii si nominalizari'); - XLSX.utils.book_append_sheet(workBook, academyMemberSheet, 'Membru în academii'); - XLSX.utils.book_append_sheet(workBook, editorialMemberSheet, 'Membru în echipa editorială'); - XLSX.utils.book_append_sheet(workBook, organizedEventSheet, 'Evenimente organizate'); - XLSX.utils.book_append_sheet(workBook, withoutActivitySheet, 'Fără activitate științifică'); - XLSX.utils.book_append_sheet(workBook, didacticActivitySheet, 'Activitate didactică'); - - /* Generate Excel Buffer and return */ - return new Buffer(XLSX.write(workBook, {bookType: 'xlsx', type: 'buffer'})); + const studentDataWorkBook = XLSX.utils.book_new(); + XLSX.utils.book_append_sheet(studentDataWorkBook, scISISheet, 'Articole ştiintifice...ISI...'); + XLSX.utils.book_append_sheet(studentDataWorkBook, isiProceedingsSheet, 'ISI proceedings'); + XLSX.utils.book_append_sheet(studentDataWorkBook, scArticleBDISheet, 'Articole științifice...BDI..'); + XLSX.utils.book_append_sheet(studentDataWorkBook, scBookSheet, 'Cărţi ştiinţifice...'); + XLSX.utils.book_append_sheet(studentDataWorkBook, translationSheet, 'Traduceri'); + XLSX.utils.book_append_sheet(studentDataWorkBook, scCommunicationSheet, 'Comunicări...'); + XLSX.utils.book_append_sheet(studentDataWorkBook, patentSheet, 'Brevete'); + XLSX.utils.book_append_sheet(studentDataWorkBook, researchContractSheet, 'Contracte de cercetare'); + XLSX.utils.book_append_sheet(studentDataWorkBook, citationSheet, 'Citări'); + XLSX.utils.book_append_sheet(studentDataWorkBook, awardsNominationSheet, 'Premii si nominalizari'); + XLSX.utils.book_append_sheet(studentDataWorkBook, academyMemberSheet, 'Membru în academii'); + XLSX.utils.book_append_sheet(studentDataWorkBook, editorialMemberSheet, 'Membru în echipa editorială'); + XLSX.utils.book_append_sheet(studentDataWorkBook, organizedEventSheet, 'Evenimente organizate'); + XLSX.utils.book_append_sheet(studentDataWorkBook, withoutActivitySheet, 'Fără activitate științifică'); + XLSX.utils.book_append_sheet(studentDataWorkBook, didacticActivitySheet, 'Activitate didactică'); + + /* Coordinators Data */ + const coordinatorScientificActivity = (await CoordinatorScientificActivityModel.findAll({order: ['id'],})).map(item => item.toJSON()); + const coordinatorReferenceActivity = (await CoordinatorReferentialActivityModel.findAll({order: ['id'],})).map(item => item.toJSON()); + + const coordinatorScientificActivitySheet = FormsService.getCoordinatorScientificActivitySheet(coordinatorScientificActivity); + const coordinatorReferenceActivitySheet = FormsService.getCoordinatorReferenceActivitySheet(coordinatorReferenceActivity); + + const coordinatorDataWorkBook = XLSX.utils.book_new(); + XLSX.utils.book_append_sheet(coordinatorDataWorkBook, coordinatorScientificActivitySheet, 'Activitatea științifică'); + XLSX.utils.book_append_sheet(coordinatorDataWorkBook, coordinatorReferenceActivitySheet, 'Activitatea referențială'); + + const studentFormsBuffer = new Buffer(XLSX.write(studentDataWorkBook, {bookType: 'xlsx', type: 'buffer'})); + const coordinatorFormsBuffer = new Buffer(XLSX.write(coordinatorDataWorkBook, {bookType: 'xlsx', type: 'buffer'})); + + const zip = new JSZip(); + /* Generate Excel Buffer With Exported Student Data */ + zip.file(`forms_students_${UtilService.stringDate(new Date())}.xlsx`, studentFormsBuffer, {compression: 'DEFLATE'}); + zip.file(`forms_coordinator_${UtilService.stringDate(new Date())}.xlsx`, coordinatorFormsBuffer, {compression: 'DEFLATE'}); + + return await zip.generateAsync( { type : "nodebuffer", compression: 'DEFLATE' }); } static async faz(timetableFile: UploadedFile, afterTableNote: string, ignoreStart: number, ignoreEnd: number): Promise { diff --git a/src/app/services/forms.service.ts b/src/app/services/forms.service.ts index 15482e2..a2dc4cb 100644 --- a/src/app/services/forms.service.ts +++ b/src/app/services/forms.service.ts @@ -1,7 +1,7 @@ import { AcademyMember, AwardAndNomination, - Citation, + Citation, CoordinatorReferentialActivity, CoordinatorScientificActivity, DidacticActivity, EditorialMember, ISIProceeding, @@ -20,6 +20,33 @@ import XLSX, {WorkSheet} from "xlsx"; /* The final form method :D */ export class FormsService { + static getCoordinatorScientificActivitySheet(rows: CoordinatorScientificActivity[]): WorkSheet { + const parsedRows = rows.map((item) => { + return { + 'Nume şi prenume': item.fullName, + 'Număr publicaţii indexate Web of Science/ERIH/altele cu factor de impact': item.publicationNumberWebOfScience, + 'Comisii/comitete/asociații științifice internaționale în care are calitatea de membru': item.committees, + 'Conferințe/comisii la care a participat ca invitat/expert': item.conferences, + 'Anul raportării': item.reportYear, + }; + }); + + return XLSX.utils.json_to_sheet(parsedRows); + } + + static getCoordinatorReferenceActivitySheet(rows: CoordinatorReferentialActivity[]): WorkSheet { + const parsedRows = rows.map((item) => { + return { + 'Nume, prenume referent de la IOSUD UAIC': item.fullName, + 'Domeniul de doctorat': item.thesisDomain, + 'Teza la care a fost referent': item.thesisReference, + 'IOSUD organizatoare a tezei evaluate': item.IOSUD, + }; + }); + + return XLSX.utils.json_to_sheet(parsedRows); + } + static getScientificArticleISISheet(rows: ScientificArticleISI[]): WorkSheet { const parsedRows = rows.map((item) => { return { diff --git a/src/endpoint.identifier.ts b/src/endpoint.identifier.ts index 28e7ed5..9e4acfa 100644 --- a/src/endpoint.identifier.ts +++ b/src/endpoint.identifier.ts @@ -31,7 +31,7 @@ export enum EndpointIdentifier { DIDACTIC_ACTIVITY = '/api/didactic-activity', /** Admin */ - USER = '/api/user', + STUDENT = '/api/student', BASE_INFORMATION = '/api/base-information', SEMESTER_ACTIVITY_EMAIL = '/api/semester-activity', EXPORT_FORMS = '/api/export-forms',