Skip to content

Commit

Permalink
coordinator forms export
Browse files Browse the repository at this point in the history
  • Loading branch information
valentin-stamate committed May 17, 2022
1 parent 1ad20c1 commit d1f2f1c
Show file tree
Hide file tree
Showing 6 changed files with 94 additions and 64 deletions.
24 changes: 12 additions & 12 deletions endpoints.json
Original file line number Diff line number Diff line change
Expand Up @@ -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"
]
}
},
Expand Down Expand Up @@ -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"
]
}
},
Expand All @@ -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"
]
}
},
Expand Down Expand Up @@ -2712,7 +2712,7 @@
"name": "Admin",
"item": [
{
"name": "User",
"name": "Students",
"protocolProfileBehavior": {
"disableBodyPruning": true
},
Expand All @@ -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": [
Expand All @@ -2768,13 +2768,13 @@
}
},
"url": {
"raw": "{{host}}/api/user/2",
"raw": "{{host}}/api/student/2",
"host": [
"{{host}}"
],
"path": [
"api",
"user",
"student",
"2"
]
}
Expand Down
22 changes: 7 additions & 15 deletions src/app/controller/admin.controller.ts
Original file line number Diff line number Diff line change
@@ -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";
Expand All @@ -12,22 +10,19 @@ export class AdminController {
/************************************************************************************
* Admin only
***********************************************************************************/
static async allUsers(req: Request<any>, res: Response, next: NextFunction) {
static async allStudents(req: Request<any>, 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<any>, res: Response, next: NextFunction) {
static async deleteStudent(req: Request<any>, res: Response, next: NextFunction) {
try {
const id = req.params.id;
await AdminService.deleteUser(id);
await AdminService.deleteStudent(id);

res.end();
} catch (err) {
Expand All @@ -37,10 +32,7 @@ export class AdminController {

static async getBaseInformation(req: Request<any>, 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);
Expand Down Expand Up @@ -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) {
Expand Down
4 changes: 2 additions & 2 deletions src/app/endpoints/admin.endpoints.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
77 changes: 44 additions & 33 deletions src/app/service/admin.service.ts
Original file line number Diff line number Diff line change
@@ -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,
Expand All @@ -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";
Expand All @@ -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<any> {
static async allStudents(): Promise<any> {
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<void> {
static async deleteStudent(id: number): Promise<void> {
const row = await StudentModel.findOne({
where: {
id: id
Expand All @@ -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());
}
Expand Down Expand Up @@ -135,8 +129,7 @@ export class AdminService {
}

static async exportForms(): Promise<Buffer> {
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());
Expand Down Expand Up @@ -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<any> {
Expand Down
29 changes: 28 additions & 1 deletion src/app/services/forms.service.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import {
AcademyMember,
AwardAndNomination,
Citation,
Citation, CoordinatorReferentialActivity, CoordinatorScientificActivity,
DidacticActivity,
EditorialMember,
ISIProceeding,
Expand All @@ -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 {
Expand Down
2 changes: 1 addition & 1 deletion src/endpoint.identifier.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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',
Expand Down

0 comments on commit d1f2f1c

Please sign in to comment.