# IPT revamp documentation
How to maintain this document:
1. Jot down ideas/designs here **while you work**.
2. Easily copy-paste your docs into PR description.
3. Include images
4. Include postman links
5. Include [fancy drawings](https://hackmd.io/features#UML-Diagrams).
-----
# Resumes
### Zipping/Downloading multiple resumes
Notes:
- [Usage] Ideally there shouldn't be a need to use the `getAllFiles` controller(/resume/files-all)
- [Usage] `getFiles` service can be used by other modules; just needs a `ResumeModel[]`.
- resume-applicant-student is queried multiple times (but only if headered resume is not in cache); keeps logics separate
- Not saving zips on disk
-----
# Academics Module
## Qualifications
Qualifications for an applicant need to collectively satisfy some criteria involving levels:
- Postdocs should have a qualification of level 'Doctorate' and 'Graduation'
- Doctorates and Postgraduates should have a qualfication of level 'Graduation'
- Everyone should have qualifications of levels 'Intermediate' and 'Matriculation'
To enforce this, the API has been designed in the following manner:
- The create end point accepts
- a json containing a `qualifications` array
- the `specialization` field is optional
- If the level criteria is already satisfied from previous insertions, this will insert more without any errors
- Thus, levels must be satisfied in the first insertion request
- Raises UnprocessableEntityError otherwise
- Requests to delete endpoint succeed if deletion does not result in dissatisfaction of the levels criteria
- Raises UnprocessableEntityError otherwise
- The update endpoint does not allow updates to levels, for the sake of simplicity
----
# Company
## Tracker
Trackers represent the company-coordinator (CC) relationship. Active Trackers are the ones with `accessFrom <= now() <= accessUntil`. Unless stated (or asked for, e.g. in /tracker), all returned trackers are active.
While creating company, a tracker is also created, with `coordinator` and `createdBy` both being `request.user`.
GET `/tracker`
Optional parameters: *default*
"inactive": false [if true, returns all trackers]
"coordinatorId":
"companyId":
"createdById":
GET `/company/:companyId/tracker`
POST `/tracker`
Will succeed only for CCs and APCs; otherwise raises `UnprocessableEntityError`
Parameters: *default*
"companyId":
"coordinatorId":
"accessFrom": *now()*
"accessUntil": *now() + 1 year*
DELETE `/tracker/:id`
Allows deletion of tracker if a) `AccessUntil` has passed OR b) Company has >1 *active* trackers
-----
# Seeding data
- Seed files are present in cindex/src/database/seeds.
- Knex doesn't have support for saving seed run status, i.e whether a seed has been run or not. So if you run `npm run seed` multiple times, it will be executed again. So we created a custom knex_seeds table to track this.
- Each seed file contains a check at the top so that it doesn't get executed more than once.
- Some seeds need to be run only for dev/test environment. So we just wrote a check at the top to check the env. The seed.stub file allows the seed to run for all envs. Remove the env from the `forEnv` variable, that you don't want to run the seed in.
----
# Flare
- Group together related components into modules.
- All api calls are implemented inside services.
- All routes are based off app-routing.module.ts.
- Nested routes are implemented inside modules.
- Sidebars are inside shared/components
## Role switching
- JWT includes roles concatenated into a string with '-' separator.
- After login, roles are split and if 'applicant' exists in roles, then student is taken to applicant dashboard, else to coordinator dashboard
- In applicant dashboard, if roles includes any of the coordinator roles, then a 'switch to coordinator' button is shown
- Similarly, a 'switch to applicant' button is shown in coordinator dashboard.
## Downloading files
- There are 2 ways to "download" a file - initiate a direct browser download or open the file in a new tab from where the user can choose to view/download/print.
- The first method is accomplished using a hack. We create a dummy anchor tag, change its href and simulate a click. This has been implemented in utilService.downloadFile(file, fileName)
- The second approach has been implemented in 2 ways
- Open the file in a browser tab as is, and let the browser take care of rendering it. To do this call utilService.displayFile(file)
- If the file is a PDF, we can display it using the PDF js plugin. Create an ng2-pdfjs-viewer element in the component html and trigger it using a function. Refer resume/list/list.component.ts for use case