Skip to content

Commit

Permalink
small bugs and readme changed
Browse files Browse the repository at this point in the history
  • Loading branch information
valentin-stamate committed Jun 22, 2022
1 parent 0b5406a commit a6e055a
Show file tree
Hide file tree
Showing 16 changed files with 96 additions and 102 deletions.
14 changes: 13 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1 +1,13 @@
# Thesis
# Aplicația de Management a Activității Doctorale

## How to build and the docker containers

1. Put into `docker-compose.yml` the values for the environment variables
2. Build the docker containers: ```docker-compose build```
3. Run the containers in detached mode: ```docker-compose up -d```


## Credits
* Author: Stamate Valentin
* Coordinator: Prof. Univ. Drd. Lenuța Alboaie

44 changes: 26 additions & 18 deletions backend/README.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,28 @@
# Backend

## How to run?

1. Install the dependencies: ```npm install```
2. Create a file in the root of the project called `.env` and put the environment variables there.
3. Run the server: ```npm start```

## ENV
* PORT (default is 8080)
* NODE_ENV (development | production)
* PASSWORD_SECRET (used as a salt for encryption)
* TOKEN_SECRET (used for jwt)
* DB_DIALECT
* DB_HOST
* DB_USERNAME
* DB_PASSWORD
* DB_NAME
* SMTP_HOST
* SMTP_USER
* SMTP_PASS
* SMTP_SECURE
* POPULATE_DB (force initialize the database and populates it with the default users)
* DB_LOGGING

## Resources

* GraphQl with Express : https://graphql.org/graphql-js/running-an-express-graphql-server
Expand Down Expand Up @@ -122,21 +147,4 @@
* https://www.npmjs.com/package/crypto-js
* ts-node bug https://github.com/facebook/jest/issues/12655
* TypeORM find: https://typeorm.io/find-options
* Capitalize all words: https://www.codegrepper.com/code-examples/javascript/capitalize+all+words+javascript

## ENV
* PORT (default is 8080)
* NODE_ENV (development | production)
* PASSWORD_SECRET (used as a salt for encryption)
* TOKEN_SECRET (used for jwt)
* DB_DIALECT
* DB_HOST
* DB_USERNAME
* DB_PASSWORD
* DB_NAME
* SMTP_HOST
* SMTP_USER
* SMTP_PASS
* SMTP_SECURE
* POPULATE_DB (force initialize the database and populates it with the default users)
* DB_LOGGING
* Capitalize all words: https://www.codegrepper.com/code-examples/javascript/capitalize+all+words+javascript
4 changes: 1 addition & 3 deletions backend/src/app/controller/admin.controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,6 @@ import {ContentType, ResponseMessage, StatusCode} from "../services/rest.util";
import {UploadedFile} from "express-fileupload";
import {UtilService} from "../services/util.service";
import {AdminService} from "../service/admin.service";
import {JwtService} from "../services/jwt.service";
import {AdminModel, CoordinatorModel} from "../database/db.models";
import {CoordinatorService} from "../service/coordinator.service";

export class AdminController {
Expand Down Expand Up @@ -124,7 +122,7 @@ export class AdminController {
const files = req.files;

if (files == null || body.intervals == null || body.afterTableNote == null || body.month == null) {
next(new ResponseError(ResponseMessage.INCOMPLETE_FORM, StatusCode.BAD_REQUEST));
next(new ResponseError(ResponseMessage.INCOMPLETE_FORM, StatusCode.BAD_REQUEST, ContentType.TEXT));
return;
}

Expand Down
8 changes: 4 additions & 4 deletions backend/src/app/service/admin.email.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import {UploadedFile} from "express-fileupload";
import {EmailEndpointResponse} from "./models";
import {XLSXService, XLSXVerificationService} from "../services/file/xlsx.service";
import {ResponseError} from "../middleware/middleware";
import {ContentType, StatusCode} from "../services/rest.util";
import {ContentType, ResponseMessage, StatusCode} from "../services/rest.util";
import {MailService} from "../services/email.service";
import {DOCXService} from "../services/file/docx.service";
import {UtilService} from "../services/util.service";
Expand All @@ -14,7 +14,7 @@ export class AdminEmailService {
const checkingResult = XLSXVerificationService.checkExcelFile(file, Object.values(SemesterTimetableHeaders));

if (checkingResult != null) {
throw new ResponseError(checkingResult, StatusCode.BAD_REQUEST, ContentType.JSON);
throw new ResponseError(ResponseMessage.INVALID_FILE, StatusCode.BAD_REQUEST, ContentType.TEXT);
}

const semesterActivityDataList = XLSXService.parseSemesterActivityTimetable(file);
Expand Down Expand Up @@ -76,7 +76,7 @@ export class AdminEmailService {
const checkingResult = XLSXVerificationService.checkExcelFile(file, Object.values(ReportsAnnouncementHeaders));

if (checkingResult != null) {
throw new ResponseError(checkingResult, StatusCode.BAD_REQUEST, ContentType.JSON);
throw new ResponseError(ResponseMessage.INVALID_FILE, StatusCode.BAD_REQUEST, ContentType.TEXT);
}

const verbalProcessDataList = XLSXService.parseReportAnnouncement(file, true, startDate, endDate);
Expand Down Expand Up @@ -149,7 +149,7 @@ export class AdminEmailService {
const checkingResult = XLSXVerificationService.checkExcelFile(file, Object.values(ReportsAnnouncementHeaders));

if (checkingResult != null) {
throw new ResponseError(checkingResult, StatusCode.BAD_REQUEST, ContentType.JSON);
throw new ResponseError(ResponseMessage.INVALID_FILE, StatusCode.BAD_REQUEST, ContentType.TEXT);
}

const verbalProcessDataList = XLSXService.parseReportAnnouncement(file, false, startDate, endDate);
Expand Down
31 changes: 5 additions & 26 deletions backend/src/app/service/admin.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,27 +9,6 @@ import {UtilService} from "../services/util.service";
import XLSX from "xlsx";
import {AllowedStudentModel, CoordinatorModel, StudentModel} from "../database/db.models";
import {dbConnection} from "../database/connect";
import {
AcademyMemberModel,
AwardAndNominationModel,
CitationModel,
DidacticActivityModel,
EditorialMemberModel,
ISIProceedingModel,
OrganizedEventModel,
PatentModel,
ResearchContractModel,
ScientificArticleBDIModel,
ScientificArticleISIModel,
ScientificBookModel,
ScientificCommunicationModel,
TranslationModel,
WithoutActivityModel
} from "../database/forms/db.student.form.models";
import {
CoordinatorReferentialActivityModel,
CoordinatorScientificActivityModel
} from "../database/forms/db.coordinator.forms";
import {AllowedStudentsHeaders, CoordinatorsHeaders, TimetableHeaders} from "../services/file/xlsx.utils";

export class AdminService {
Expand Down Expand Up @@ -72,7 +51,7 @@ export class AdminService {
const checkingResult = XLSXVerificationService.checkExcelFile(file, Object.values(AllowedStudentsHeaders));

if (checkingResult != null) {
throw new ResponseError(checkingResult, StatusCode.BAD_REQUEST, ContentType.JSON);
throw new ResponseError(ResponseMessage.INVALID_FILE, StatusCode.BAD_REQUEST, ContentType.TEXT);
}

const allowedStudentsList = XLSXService.parseExistingStudents(file);
Expand Down Expand Up @@ -220,8 +199,8 @@ export class AdminService {
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 studentFormsBuffer = Buffer.from(XLSX.write(studentDataWorkBook, {bookType: 'xlsx', type: 'buffer'}));
const coordinatorFormsBuffer = Buffer.from(XLSX.write(coordinatorDataWorkBook, {bookType: 'xlsx', type: 'buffer'}));

const zip = new JSZip();
/* Generate Excel Buffer With Exported Student Data */
Expand All @@ -235,7 +214,7 @@ export class AdminService {
const checkingResult = XLSXVerificationService.checkExcelFile(timetableFile, Object.values(TimetableHeaders));

if (checkingResult != null) {
throw new ResponseError(checkingResult, StatusCode.BAD_REQUEST, ContentType.JSON);
throw new ResponseError(ResponseMessage.INVALID_FILE, StatusCode.BAD_REQUEST, ContentType.TEXT);
}

const fazProfessorDataList = XLSXService.parseFAZ(timetableFile, month, intervals);
Expand All @@ -256,7 +235,7 @@ export class AdminService {
const checkingResult = XLSXVerificationService.checkExcelFile(file, Object.values(CoordinatorsHeaders));

if (checkingResult != null) {
throw new ResponseError(checkingResult, StatusCode.BAD_REQUEST, ContentType.JSON);
throw new ResponseError(ResponseMessage.INVALID_FILE, StatusCode.BAD_REQUEST, ContentType.TEXT);
}

const coordinators = XLSXService.parseCoordinatorsExcel(file);
Expand Down
1 change: 1 addition & 0 deletions backend/src/app/services/rest.util.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ export enum ResponseMessage {
FORM_NOT_FOUND = 'Formularul nu a fost găsit',
FILES_NOT_FOUND = 'Nu au fost găsite fișiere',
FILE_NOT_FOUND = 'Fișierul nu a fost găsit',
INVALID_FILE = 'Fișier invalid',
}

export enum ContentType {
Expand Down
7 changes: 7 additions & 0 deletions frontend/README.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,13 @@
# System Management: Frontend

## How to run?

1. Install the dependencies using npm: ```npm install```
2. Run the server: ```npm start```
3. Build the project (for deployment): ```npm run build```

## Resources

* Inspiration for layout & design : https://dribbble.com/
* Angular tutorial: https://youtu.be/3dHNOWTI7H8
* Installing bootstrap: https://stackoverflow.com/a/65519961/10805602
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -84,17 +84,9 @@ export class ActivityNotificationComponent implements OnInit {
axios.post(RestEndpoints.REPORT_NOTIFICATION, formData, this.config)
.then(res => {
this.emailToList = res.data;
console.log(res.data)

console.log(res.data);
}).catch(err => {
console.log(err.response.data);

if (typeof err.response.data === typeof '') {
this.notificationMessage = err.response.data;
} else {
this.notificationMessage = 'Fișier invalid';
}

this.notificationMessage = err.response.data;
}).finally(() => {

});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -67,13 +67,8 @@ export class SemesterActivityComponent implements OnInit {
axios.post(RestEndpoints.SEMESTER_ACTIVITY, formData, this.config)
.then(res => {
this.emailToList = res.data;
}).catch(err => {
console.log(err.response.data);
if (typeof err.response.data === typeof '') {
this.notificationMessage = err.response.data;
} else {
this.notificationMessage = 'Fișier invalid';
}
}).catch(async err => {
this.notificationMessage = err.response.data;
}).finally(() => {

});
Expand All @@ -99,7 +94,6 @@ export class SemesterActivityComponent implements OnInit {
this.modalData = data.successfulEmails;
this.organizationEmailFinish = true;
}).catch(err => {
console.log(err);
this.notificationMessage = err.response.data;
}).finally(() => {
this.organizationEmailLoading = false;
Expand All @@ -125,7 +119,6 @@ export class SemesterActivityComponent implements OnInit {
this.previewModalData = data.emailPreview;
this.previewModal = true;
}).catch(err => {
console.log(err);
this.notificationMessage = err.response.data;
}).finally(() => {
this.previewEmailLoading = false;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -86,13 +86,7 @@ export class VerbalProcessComponent implements OnInit {
.then(res => {
this.emailToList = res.data;
}).catch(err => {
console.log(err.response.data);

if (typeof err.response.data === typeof '') {
this.notificationMessage = err.response.data;
} else {
this.notificationMessage = 'Fișier invalid';
}
this.notificationMessage = err.response.data;
}).finally(() => {

});
Expand Down
9 changes: 2 additions & 7 deletions frontend/src/app/components/admin-files/faz/faz.component.ts
Original file line number Diff line number Diff line change
Expand Up @@ -69,13 +69,8 @@ export class FazComponent implements OnInit {
const fileName = `faz_${UtilService.stringDate(new Date())}.zip`;
UtilService.downloadBuffer(res.data, fileName);
}).catch(async err => {

if (typeof err.response.data === typeof '') {
const errBlob = err.response.data as Blob;
this.notificationMessage = await errBlob.text();
} else {
this.notificationMessage = 'Fișier invalid';
}
const errBlob = err.response.data as Blob;
this.notificationMessage = await errBlob.text();
}).finally(() => {
this.loading = false;
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
<li routerLinkActive="is-active">
<a routerLink="coordinators">
<span class="icon is-small"><i class="fa-solid fa-users"></i></span>
<span>Management Conducători de doctorat</span>
<span>Management Conducători de Doctorat</span>
</a>
</li>
</ul>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,13 @@ export class UsersComponent implements OnInit {
.then(res => {
this.notificationMessage = `Numărul de studenți adăugați cu succes: ${res.data}`;
}).catch(err => {
this.notificationMessage = err.response.data;
console.log(err.response.data);

if (typeof err.response.data === typeof '') {
this.notificationMessage = err.response.data;
} else {
this.notificationMessage = 'Fișier invalid';
}
}).finally(() => {
this.allowedStudentsImportLoading = false;
this.onAllowedStudentsRefresh();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,8 @@
<div class="panel-heading is-flex is-flex-direction-row is-align-items-center">
<div>Activitatea științifică a conducatorului de doctorat</div>
<div class="is-flex-grow-1"></div>
<small *ngIf="existingScientificActivity" class="small-text is-success"><b>Completat</b></small>
<small *ngIf="!existingScientificActivity" class="small-text is-danger"><b>Incomplet</b></small>
<small *ngIf="existingScientificActivity" class="small-text has-text-success"><b>Completat</b></small>
<small *ngIf="!existingScientificActivity" class="small-text has-text-danger"><b>Incomplet</b></small>
</div>

<div class="p-5 flex-column">
Expand Down Expand Up @@ -71,8 +71,8 @@
IOSUD-UAIC
</div>
<div class="is-flex-grow-1"></div>
<small *ngIf="existingReferentialActivity" class="small-text is-success"><b>Completat</b></small>
<small *ngIf="!existingReferentialActivity" class="small-text is-danger"><b>Incomplet</b></small>
<small *ngIf="existingReferentialActivity" class="small-text has-text-success"><b>Completat</b></small>
<small *ngIf="!existingReferentialActivity" class="small-text has-text-danger"><b>Incomplet</b></small>
</div>

<div class="p-5 flex-column">
Expand Down Expand Up @@ -152,16 +152,23 @@

</form>

<div>
<div class="subtitle"><b>Listă fișiere încărcate</b></div>

<div class="subtitle">Listă fișiere încărcate</div>
<div class="simple-card white">
Aici se află lista tuturor fișierelor doveditoare pentru activitatea dumneavoastră. Pentru
a descărca un fișier dați click pe numele lui, iar pentru stergere, butonul roșu.
</div>

<div class="is-flex is-flex-wrap-wrap" style="gap: 32px">
<div *ngFor="let item of files" class="is-flex">
<button class="button is-small" (click)="onDownloadFile(item)">{{item.name}}</button>
<button class="button is-small is-danger" (click)="onDeleteFile(item)">X</button>
<div class="is-flex is-flex-wrap-wrap" style="gap: 32px">
<div *ngFor="let item of files" class="is-flex">
<button class="button is-small" (click)="onDownloadFile(item)">{{item.name}}</button>
<button class="button is-small is-danger" (click)="onDeleteFile(item)">X</button>
</div>
</div>
</div>


</div>
</nav>

Expand Down
Loading

0 comments on commit a6e055a

Please sign in to comment.