├── .gitignore ├── README.md ├── client ├── src │ ├── app │ │ ├── app.config.ts │ │ ├── app.component.css │ │ ├── components │ │ │ ├── base │ │ │ │ ├── base.component.css │ │ │ │ ├── base.component.html │ │ │ │ ├── base.component.ts │ │ │ │ └── base.component.spec.ts │ │ │ ├── navbar │ │ │ │ ├── navbar.component.css │ │ │ │ ├── navbar.component.spec.ts │ │ │ │ ├── navbar.component.ts │ │ │ │ └── navbar.component.html │ │ │ ├── message-list │ │ │ │ ├── message-list.component.css │ │ │ │ ├── message-list.component.spec.ts │ │ │ │ ├── message-list.component.html │ │ │ │ └── message-list.component.ts │ │ │ ├── new-message-list │ │ │ │ ├── new-message-list.component.css │ │ │ │ ├── new-message-list.component.html │ │ │ │ ├── new-message-list.component.spec.ts │ │ │ │ └── new-message-list.component.ts │ │ │ ├── signup-success │ │ │ │ ├── signup-success.component.css │ │ │ │ ├── signup-success.component.ts │ │ │ │ ├── signup-success.component.spec.ts │ │ │ │ └── signup-success.component.html │ │ │ ├── student-profile │ │ │ │ ├── student-profile.component.css │ │ │ │ ├── student-profile.component.spec.ts │ │ │ │ ├── student-profile.component.html │ │ │ │ └── student-profile.component.ts │ │ │ ├── friend-list-modal │ │ │ │ ├── friend-list-modal.component.css │ │ │ │ ├── friend-list-modal.component.spec.ts │ │ │ │ ├── friend-list-modal.component.html │ │ │ │ └── friend-list-modal.component.ts │ │ │ ├── invitation-list │ │ │ │ ├── invitation-list.component.css │ │ │ │ ├── invitation-list.component.spec.ts │ │ │ │ ├── invitation-list.component.html │ │ │ │ └── invitation-list.component.ts │ │ │ ├── job-list │ │ │ │ ├── job-list.component.css │ │ │ │ ├── job-list.component.spec.ts │ │ │ │ ├── job-list.component.ts │ │ │ │ └── job-list.component.html │ │ │ ├── company-list │ │ │ │ ├── company-list.component.css │ │ │ │ ├── company-list.component.spec.ts │ │ │ │ ├── company-list.component.html │ │ │ │ └── company-list.component.ts │ │ │ ├── friend-list │ │ │ │ ├── friend-list.component.css │ │ │ │ ├── friend-list.component.spec.ts │ │ │ │ ├── friend-list.component.ts │ │ │ │ └── friend-list.component.html │ │ │ ├── job-detail │ │ │ │ ├── job-detail.component.css │ │ │ │ ├── job-detail.component.spec.ts │ │ │ │ ├── job-detail.component.html │ │ │ │ └── job-detail.component.ts │ │ │ ├── student-list │ │ │ │ ├── student-list.component.css │ │ │ │ ├── student-list.component.spec.ts │ │ │ │ ├── student-list.component.ts │ │ │ │ └── student-list.component.html │ │ │ ├── company-detail │ │ │ │ ├── company-detail.component.css │ │ │ │ ├── company-detail.component.spec.ts │ │ │ │ ├── company-detail.component.html │ │ │ │ └── company-detail.component.ts │ │ │ ├── following-list │ │ │ │ ├── following-list.component.css │ │ │ │ ├── following-list.component.spec.ts │ │ │ │ ├── following-list.component.ts │ │ │ │ └── following-list.component.html │ │ │ ├── student-detail │ │ │ │ ├── student-detail.component.css │ │ │ │ ├── student-detail.component.spec.ts │ │ │ │ ├── student-detail.component.html │ │ │ │ └── student-detail.component.ts │ │ │ ├── application-list │ │ │ │ ├── application-list.component.css │ │ │ │ ├── application-list.component.spec.ts │ │ │ │ ├── application-list.component.ts │ │ │ │ └── application-list.component.html │ │ │ ├── company-job-list │ │ │ │ ├── company-job-list.component.css │ │ │ │ ├── company-job-list.component.spec.ts │ │ │ │ ├── company-job-list.component.html │ │ │ │ └── company-job-list.component.ts │ │ │ ├── student-home │ │ │ │ ├── student-home.component.css │ │ │ │ ├── student-home.component.spec.ts │ │ │ │ └── student-home.component.ts │ │ │ ├── login │ │ │ │ ├── login.component.css │ │ │ │ ├── login.component.spec.ts │ │ │ │ ├── login.component.ts │ │ │ │ └── login.component.html │ │ │ └── signup │ │ │ │ ├── signup.component.spec.ts │ │ │ │ ├── signup.component.css │ │ │ │ ├── signup.component.html │ │ │ │ └── signup.component.ts │ │ ├── app.component.html │ │ ├── services │ │ │ ├── job.service.spec.ts │ │ │ ├── auth.service.spec.ts │ │ │ ├── search.service.spec.ts │ │ │ ├── message.service.spec.ts │ │ │ ├── connection.service.spec.ts │ │ │ ├── auth.service.ts │ │ │ ├── message.service.ts │ │ │ ├── connection.service.ts │ │ │ └── job.service.ts │ │ ├── app.component.ts │ │ ├── app.component.spec.ts │ │ └── app.module.ts │ ├── assets │ │ └── .gitkeep │ ├── environments │ │ ├── environment.prod.ts │ │ └── environment.ts │ ├── styles.css │ ├── favicon.png │ ├── typings.d.ts │ ├── tsconfig.app.json │ ├── index.html │ ├── tsconfig.spec.json │ ├── main.ts │ ├── test.ts │ └── polyfills.ts ├── e2e │ ├── app.po.ts │ ├── tsconfig.e2e.json │ └── app.e2e-spec.ts ├── .editorconfig ├── tsconfig.json ├── .gitignore ├── protractor.conf.js ├── karma.conf.js ├── README.md ├── package.json └── .angular-cli.json ├── server ├── .gitignore ├── mysqlConnection.js ├── package.json ├── routes │ └── auth.js └── server.js ├── employer-client ├── src │ ├── assets │ │ └── .gitkeep │ ├── app │ │ ├── app.component.css │ │ ├── components │ │ │ ├── navbar │ │ │ │ ├── navbar.component.css │ │ │ │ ├── navbar.component.ts │ │ │ │ ├── navbar.component.spec.ts │ │ │ │ └── navbar.component.html │ │ │ ├── new-job │ │ │ │ ├── new-job.component.css │ │ │ │ ├── new-job.component.spec.ts │ │ │ │ ├── new-job.component.ts │ │ │ │ └── new-job.component.html │ │ │ ├── job-detail │ │ │ │ ├── job-detail.component.css │ │ │ │ ├── job-detail.component.spec.ts │ │ │ │ ├── job-detail.component.ts │ │ │ │ └── job-detail.component.html │ │ │ ├── company-home │ │ │ │ ├── company-home.component.css │ │ │ │ ├── company-home.component.html │ │ │ │ ├── company-home.component.ts │ │ │ │ └── company-home.component.spec.ts │ │ │ ├── signup-success │ │ │ │ ├── signup-success.component.css │ │ │ │ ├── signup-success.component.ts │ │ │ │ ├── signup-success.component.spec.ts │ │ │ │ └── signup-success.component.html │ │ │ ├── company-profile │ │ │ │ ├── company-profile.component.css │ │ │ │ ├── company-profile.component.spec.ts │ │ │ │ ├── company-profile.component.html │ │ │ │ └── company-profile.component.ts │ │ │ ├── new-job-success │ │ │ │ ├── new-job-success.component.css │ │ │ │ ├── new-job-success.component.ts │ │ │ │ ├── new-job-success.component.spec.ts │ │ │ │ └── new-job-success.component.html │ │ │ ├── push-filter-modal │ │ │ │ ├── push-filter-modal.component.css │ │ │ │ ├── push-filter-modal.component.spec.ts │ │ │ │ ├── push-filter-modal.component.ts │ │ │ │ └── push-filter-modal.component.html │ │ │ ├── job-list │ │ │ │ ├── job-list.component.css │ │ │ │ ├── job-list.component.spec.ts │ │ │ │ ├── job-list.component.ts │ │ │ │ └── job-list.component.html │ │ │ ├── application-list │ │ │ │ ├── application-list.component.css │ │ │ │ ├── application-list.component.spec.ts │ │ │ │ ├── application-list.component.ts │ │ │ │ └── application-list.component.html │ │ │ ├── student-detail │ │ │ │ ├── student-detail.component.css │ │ │ │ ├── student-detail.component.spec.ts │ │ │ │ ├── student-detail.component.html │ │ │ │ └── student-detail.component.ts │ │ │ ├── login │ │ │ │ ├── login.component.css │ │ │ │ ├── login.component.spec.ts │ │ │ │ ├── login.component.ts │ │ │ │ └── login.component.html │ │ │ └── signup │ │ │ │ ├── signup.component.spec.ts │ │ │ │ ├── signup.component.css │ │ │ │ ├── signup.component.html │ │ │ │ └── signup.component.ts │ │ ├── app.component.html │ │ ├── services │ │ │ ├── job.service.spec.ts │ │ │ ├── auth.service.spec.ts │ │ │ ├── search.service.spec.ts │ │ │ ├── auth.service.ts │ │ │ └── search.service.ts │ │ ├── app.component.ts │ │ ├── app.component.spec.ts │ │ ├── app.routes.ts │ │ └── app.module.ts │ ├── environments │ │ ├── environment.prod.ts │ │ └── environment.ts │ ├── styles.css │ ├── favicon.png │ ├── typings.d.ts │ ├── tsconfig.app.json │ ├── index.html │ ├── tsconfig.spec.json │ ├── main.ts │ ├── test.ts │ └── polyfills.ts ├── e2e │ ├── app.po.ts │ ├── tsconfig.e2e.json │ └── app.e2e-spec.ts ├── .editorconfig ├── tsconfig.json ├── .gitignore ├── protractor.conf.js ├── karma.conf.js ├── README.md ├── package.json └── .angular-cli.json ├── public ├── favicon.png ├── glyphicons-halflings-regular.e18bbf611f2a2e43afc0.ttf ├── glyphicons-halflings-regular.f4769f9bdb7466be6508.eot ├── glyphicons-halflings-regular.448c34a56d699c29117a.woff2 ├── glyphicons-halflings-regular.fa2772327f55d8198301.woff └── index.html ├── public_employer ├── glyphicons-halflings-regular.e18bbf611f2a2e43afc0.ttf ├── glyphicons-halflings-regular.f4769f9bdb7466be6508.eot ├── glyphicons-halflings-regular.fa2772327f55d8198301.woff ├── glyphicons-halflings-regular.448c34a56d699c29117a.woff2 └── index.html └── launch.sh /.gitignore: -------------------------------------------------------------------------------- 1 | .vscode -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # DBproject_Jobster -------------------------------------------------------------------------------- /client/src/app/app.config.ts: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /client/src/assets/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /client/src/app/app.component.css: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /server/.gitignore: -------------------------------------------------------------------------------- 1 | /node_modules -------------------------------------------------------------------------------- /employer-client/src/assets/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /employer-client/src/app/app.component.css: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /client/src/app/components/base/base.component.css: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /client/src/app/components/base/base.component.html: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /client/src/app/components/navbar/navbar.component.css: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /employer-client/src/app/components/navbar/navbar.component.css: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /client/src/app/components/message-list/message-list.component.css: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /employer-client/src/app/components/new-job/new-job.component.css: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /client/src/app/components/new-message-list/new-message-list.component.css: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /client/src/app/components/signup-success/signup-success.component.css: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /client/src/app/components/student-profile/student-profile.component.css: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /employer-client/src/app/components/job-detail/job-detail.component.css: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /client/src/app/components/friend-list-modal/friend-list-modal.component.css: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /employer-client/src/app/components/company-home/company-home.component.css: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /employer-client/src/app/components/signup-success/signup-success.component.css: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /employer-client/src/app/components/company-profile/company-profile.component.css: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /employer-client/src/app/components/new-job-success/new-job-success.component.css: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /employer-client/src/app/components/push-filter-modal/push-filter-modal.component.css: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RichardLiuLiu/DBproject_Jobster/HEAD/public/favicon.png -------------------------------------------------------------------------------- /client/src/environments/environment.prod.ts: -------------------------------------------------------------------------------- 1 | export const environment = { 2 | production: true 3 | }; 4 | -------------------------------------------------------------------------------- /client/src/styles.css: -------------------------------------------------------------------------------- 1 | /* You can add global styles to this file, and also import other style files */ 2 | -------------------------------------------------------------------------------- /client/src/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RichardLiuLiu/DBproject_Jobster/HEAD/client/src/favicon.png -------------------------------------------------------------------------------- /employer-client/src/app/components/company-home/company-home.component.html: -------------------------------------------------------------------------------- 1 |

2 | company-home works! 3 |

4 | -------------------------------------------------------------------------------- /employer-client/src/environments/environment.prod.ts: -------------------------------------------------------------------------------- 1 | export const environment = { 2 | production: true 3 | }; 4 | -------------------------------------------------------------------------------- /employer-client/src/styles.css: -------------------------------------------------------------------------------- 1 | /* You can add global styles to this file, and also import other style files */ 2 | -------------------------------------------------------------------------------- /employer-client/src/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RichardLiuLiu/DBproject_Jobster/HEAD/employer-client/src/favicon.png -------------------------------------------------------------------------------- /client/src/app/app.component.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /employer-client/src/app/app.component.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /client/src/typings.d.ts: -------------------------------------------------------------------------------- 1 | /* SystemJS module definition */ 2 | declare var module: NodeModule; 3 | interface NodeModule { 4 | id: string; 5 | } 6 | -------------------------------------------------------------------------------- /employer-client/src/typings.d.ts: -------------------------------------------------------------------------------- 1 | /* SystemJS module definition */ 2 | declare var module: NodeModule; 3 | interface NodeModule { 4 | id: string; 5 | } 6 | -------------------------------------------------------------------------------- /client/src/app/components/invitation-list/invitation-list.component.css: -------------------------------------------------------------------------------- 1 | .table-item { 2 | font-size: 1.2em; 3 | } 4 | 5 | .table-column-name { 6 | font-size: 1.5em; 7 | } -------------------------------------------------------------------------------- /public/glyphicons-halflings-regular.e18bbf611f2a2e43afc0.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RichardLiuLiu/DBproject_Jobster/HEAD/public/glyphicons-halflings-regular.e18bbf611f2a2e43afc0.ttf -------------------------------------------------------------------------------- /public/glyphicons-halflings-regular.f4769f9bdb7466be6508.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RichardLiuLiu/DBproject_Jobster/HEAD/public/glyphicons-halflings-regular.f4769f9bdb7466be6508.eot -------------------------------------------------------------------------------- /public/glyphicons-halflings-regular.448c34a56d699c29117a.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RichardLiuLiu/DBproject_Jobster/HEAD/public/glyphicons-halflings-regular.448c34a56d699c29117a.woff2 -------------------------------------------------------------------------------- /public/glyphicons-halflings-regular.fa2772327f55d8198301.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RichardLiuLiu/DBproject_Jobster/HEAD/public/glyphicons-halflings-regular.fa2772327f55d8198301.woff -------------------------------------------------------------------------------- /public_employer/glyphicons-halflings-regular.e18bbf611f2a2e43afc0.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RichardLiuLiu/DBproject_Jobster/HEAD/public_employer/glyphicons-halflings-regular.e18bbf611f2a2e43afc0.ttf -------------------------------------------------------------------------------- /public_employer/glyphicons-halflings-regular.f4769f9bdb7466be6508.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RichardLiuLiu/DBproject_Jobster/HEAD/public_employer/glyphicons-halflings-regular.f4769f9bdb7466be6508.eot -------------------------------------------------------------------------------- /public_employer/glyphicons-halflings-regular.fa2772327f55d8198301.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RichardLiuLiu/DBproject_Jobster/HEAD/public_employer/glyphicons-halflings-regular.fa2772327f55d8198301.woff -------------------------------------------------------------------------------- /public_employer/glyphicons-halflings-regular.448c34a56d699c29117a.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RichardLiuLiu/DBproject_Jobster/HEAD/public_employer/glyphicons-halflings-regular.448c34a56d699c29117a.woff2 -------------------------------------------------------------------------------- /client/src/app/components/job-list/job-list.component.css: -------------------------------------------------------------------------------- 1 | .table-item { 2 | font-size: 1.2em; 3 | } 4 | 5 | .table-column-name { 6 | font-size: 1.5em; 7 | } 8 | 9 | .detail-button { 10 | font-size: 0.8em; 11 | } -------------------------------------------------------------------------------- /client/src/app/components/company-list/company-list.component.css: -------------------------------------------------------------------------------- 1 | .table-item { 2 | font-size: 1.2em; 3 | } 4 | 5 | .table-column-name { 6 | font-size: 1.5em; 7 | } 8 | 9 | .detail-button { 10 | font-size: 0.8em; 11 | } -------------------------------------------------------------------------------- /client/src/app/components/friend-list/friend-list.component.css: -------------------------------------------------------------------------------- 1 | .table-item { 2 | font-size: 1.2em; 3 | } 4 | 5 | .table-column-name { 6 | font-size: 1.5em; 7 | } 8 | 9 | .detail-button { 10 | font-size: 0.8em; 11 | } -------------------------------------------------------------------------------- /client/src/app/components/job-detail/job-detail.component.css: -------------------------------------------------------------------------------- 1 | .info-item { 2 | padding-left: 2.0em; 3 | } 4 | 5 | .info-content { 6 | padding-left: 2.0em; 7 | } 8 | 9 | .footer-button { 10 | padding-top: 2.0em; 11 | } -------------------------------------------------------------------------------- /client/src/app/components/student-list/student-list.component.css: -------------------------------------------------------------------------------- 1 | .table-item { 2 | font-size: 1.2em; 3 | } 4 | 5 | .table-column-name { 6 | font-size: 1.5em; 7 | } 8 | 9 | .detail-button { 10 | font-size: 0.8em; 11 | } -------------------------------------------------------------------------------- /employer-client/src/app/components/job-list/job-list.component.css: -------------------------------------------------------------------------------- 1 | .table-item { 2 | font-size: 1.2em; 3 | } 4 | 5 | .table-column-name { 6 | font-size: 1.5em; 7 | } 8 | 9 | .detail-button { 10 | font-size: 0.8em; 11 | } -------------------------------------------------------------------------------- /client/src/app/components/company-detail/company-detail.component.css: -------------------------------------------------------------------------------- 1 | .info-item { 2 | padding-left: 2.0em; 3 | } 4 | 5 | .info-content { 6 | padding-left: 2.0em; 7 | } 8 | 9 | .footer-button { 10 | padding-top: 2.0em; 11 | } -------------------------------------------------------------------------------- /client/src/app/components/following-list/following-list.component.css: -------------------------------------------------------------------------------- 1 | .table-item { 2 | font-size: 1.2em; 3 | } 4 | 5 | .table-column-name { 6 | font-size: 1.5em; 7 | } 8 | 9 | .detail-button { 10 | font-size: 0.8em; 11 | } -------------------------------------------------------------------------------- /client/src/app/components/student-detail/student-detail.component.css: -------------------------------------------------------------------------------- 1 | .info-item { 2 | padding-left: 2.0em; 3 | } 4 | 5 | .info-content { 6 | padding-left: 2.0em; 7 | } 8 | 9 | .footer-button { 10 | padding-top: 2.0em; 11 | } -------------------------------------------------------------------------------- /client/src/app/components/application-list/application-list.component.css: -------------------------------------------------------------------------------- 1 | .table-item { 2 | font-size: 1.2em; 3 | } 4 | 5 | .table-column-name { 6 | font-size: 1.5em; 7 | } 8 | 9 | .detail-button { 10 | font-size: 0.8em; 11 | } -------------------------------------------------------------------------------- /client/src/app/components/company-job-list/company-job-list.component.css: -------------------------------------------------------------------------------- 1 | .table-item { 2 | font-size: 1.2em; 3 | } 4 | 5 | .table-column-name { 6 | font-size: 1.5em; 7 | } 8 | 9 | .detail-button { 10 | font-size: 0.8em; 11 | } -------------------------------------------------------------------------------- /employer-client/src/app/components/application-list/application-list.component.css: -------------------------------------------------------------------------------- 1 | .table-item { 2 | font-size: 1.2em; 3 | } 4 | 5 | .table-column-name { 6 | font-size: 1.5em; 7 | } 8 | 9 | .detail-button { 10 | font-size: 0.8em; 11 | } -------------------------------------------------------------------------------- /employer-client/src/app/components/student-detail/student-detail.component.css: -------------------------------------------------------------------------------- 1 | .info-item { 2 | padding-left: 2.0em; 3 | } 4 | 5 | .info-content { 6 | padding-left: 2.0em; 7 | } 8 | 9 | .footer-button { 10 | padding-top: 2.0em; 11 | } -------------------------------------------------------------------------------- /client/e2e/app.po.ts: -------------------------------------------------------------------------------- 1 | import { browser, by, element } from 'protractor'; 2 | 3 | export class AppPage { 4 | navigateTo() { 5 | return browser.get('/'); 6 | } 7 | 8 | getParagraphText() { 9 | return element(by.css('app-root h1')).getText(); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /client/src/app/components/student-home/student-home.component.css: -------------------------------------------------------------------------------- 1 | .push-col-left { 2 | margin-left: 6em; 3 | margin-top: 2em; 4 | margin-bottom: 2em; 5 | } 6 | 7 | .push-col-right { 8 | margin-right: 6em; 9 | margin-top: 2em; 10 | margin-bottom: 2em; 11 | } -------------------------------------------------------------------------------- /employer-client/e2e/app.po.ts: -------------------------------------------------------------------------------- 1 | import { browser, by, element } from 'protractor'; 2 | 3 | export class AppPage { 4 | navigateTo() { 5 | return browser.get('/'); 6 | } 7 | 8 | getParagraphText() { 9 | return element(by.css('app-root h1')).getText(); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /client/src/tsconfig.app.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../out-tsc/app", 5 | "baseUrl": "./", 6 | "module": "es2015", 7 | "types": [] 8 | }, 9 | "exclude": [ 10 | "test.ts", 11 | "**/*.spec.ts" 12 | ] 13 | } 14 | -------------------------------------------------------------------------------- /employer-client/src/tsconfig.app.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../out-tsc/app", 5 | "baseUrl": "./", 6 | "module": "es2015", 7 | "types": [] 8 | }, 9 | "exclude": [ 10 | "test.ts", 11 | "**/*.spec.ts" 12 | ] 13 | } 14 | -------------------------------------------------------------------------------- /client/.editorconfig: -------------------------------------------------------------------------------- 1 | # Editor configuration, see http://editorconfig.org 2 | root = true 3 | 4 | [*] 5 | charset = utf-8 6 | indent_style = space 7 | indent_size = 2 8 | insert_final_newline = true 9 | trim_trailing_whitespace = true 10 | 11 | [*.md] 12 | max_line_length = off 13 | trim_trailing_whitespace = false 14 | -------------------------------------------------------------------------------- /client/e2e/tsconfig.e2e.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../out-tsc/e2e", 5 | "baseUrl": "./", 6 | "module": "commonjs", 7 | "target": "es5", 8 | "types": [ 9 | "jasmine", 10 | "jasminewd2", 11 | "node" 12 | ] 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /employer-client/.editorconfig: -------------------------------------------------------------------------------- 1 | # Editor configuration, see http://editorconfig.org 2 | root = true 3 | 4 | [*] 5 | charset = utf-8 6 | indent_style = space 7 | indent_size = 2 8 | insert_final_newline = true 9 | trim_trailing_whitespace = true 10 | 11 | [*.md] 12 | max_line_length = off 13 | trim_trailing_whitespace = false 14 | -------------------------------------------------------------------------------- /employer-client/e2e/tsconfig.e2e.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../out-tsc/e2e", 5 | "baseUrl": "./", 6 | "module": "commonjs", 7 | "target": "es5", 8 | "types": [ 9 | "jasmine", 10 | "jasminewd2", 11 | "node" 12 | ] 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /launch.sh: -------------------------------------------------------------------------------- 1 | #! /bin/bash 2 | 3 | fuser -k 80/tcp 4 | fuser -k 3000/tcp 5 | 6 | sudo service mysql start 7 | 8 | cd ./server 9 | npm install 10 | 11 | npm start & 12 | 13 | echo "==============================================" 14 | read -p "PRESS [ANY KEY] TO TERMINATE PROCESSES." PRESSKEY 15 | 16 | fuser -k 80/tcp 17 | fuser -k 3000/tcp 18 | 19 | kill $(jobs -p) -------------------------------------------------------------------------------- /client/e2e/app.e2e-spec.ts: -------------------------------------------------------------------------------- 1 | import { AppPage } from './app.po'; 2 | 3 | describe('client App', () => { 4 | let page: AppPage; 5 | 6 | beforeEach(() => { 7 | page = new AppPage(); 8 | }); 9 | 10 | it('should display welcome message', () => { 11 | page.navigateTo(); 12 | expect(page.getParagraphText()).toEqual('Welcome to app!'); 13 | }); 14 | }); 15 | -------------------------------------------------------------------------------- /client/src/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Jobster 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /employer-client/src/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Jobster 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /employer-client/e2e/app.e2e-spec.ts: -------------------------------------------------------------------------------- 1 | import { AppPage } from './app.po'; 2 | 3 | describe('employer-client App', () => { 4 | let page: AppPage; 5 | 6 | beforeEach(() => { 7 | page = new AppPage(); 8 | }); 9 | 10 | it('should display welcome message', () => { 11 | page.navigateTo(); 12 | expect(page.getParagraphText()).toEqual('Welcome to app!'); 13 | }); 14 | }); 15 | -------------------------------------------------------------------------------- /server/mysqlConnection.js: -------------------------------------------------------------------------------- 1 | const mysql = require("mysql"); 2 | 3 | const db = mysql.createConnection({ 4 | host : 'localhost', 5 | user : 'root', 6 | password : '********', 7 | database : 'jobster', 8 | dateStrings: true, 9 | }); 10 | db.connect((err) => { 11 | if (err) throw err; 12 | console.log('Connected to MySQL.'); 13 | }); 14 | 15 | module.exports = db; 16 | -------------------------------------------------------------------------------- /client/src/tsconfig.spec.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../out-tsc/spec", 5 | "baseUrl": "./", 6 | "module": "commonjs", 7 | "types": [ 8 | "jasmine", 9 | "node" 10 | ] 11 | }, 12 | "files": [ 13 | "test.ts" 14 | ], 15 | "include": [ 16 | "**/*.spec.ts", 17 | "**/*.d.ts" 18 | ] 19 | } 20 | -------------------------------------------------------------------------------- /employer-client/src/tsconfig.spec.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../out-tsc/spec", 5 | "baseUrl": "./", 6 | "module": "commonjs", 7 | "types": [ 8 | "jasmine", 9 | "node" 10 | ] 11 | }, 12 | "files": [ 13 | "test.ts" 14 | ], 15 | "include": [ 16 | "**/*.spec.ts", 17 | "**/*.d.ts" 18 | ] 19 | } 20 | -------------------------------------------------------------------------------- /employer-client/src/app/components/company-home/company-home.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'app-company-home', 5 | templateUrl: './company-home.component.html', 6 | styleUrls: ['./company-home.component.css'] 7 | }) 8 | export class CompanyHomeComponent implements OnInit { 9 | 10 | constructor() { } 11 | 12 | ngOnInit() { 13 | } 14 | 15 | } 16 | -------------------------------------------------------------------------------- /client/src/main.ts: -------------------------------------------------------------------------------- 1 | import { enableProdMode } from '@angular/core'; 2 | import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; 3 | 4 | import { AppModule } from './app/app.module'; 5 | import { environment } from './environments/environment'; 6 | 7 | if (environment.production) { 8 | enableProdMode(); 9 | } 10 | 11 | platformBrowserDynamic().bootstrapModule(AppModule) 12 | .catch(err => console.log(err)); 13 | -------------------------------------------------------------------------------- /client/src/environments/environment.ts: -------------------------------------------------------------------------------- 1 | // The file contents for the current environment will overwrite these during build. 2 | // The build system defaults to the dev environment which uses `environment.ts`, but if you do 3 | // `ng build --env=prod` then `environment.prod.ts` will be used instead. 4 | // The list of which env maps to which file can be found in `.angular-cli.json`. 5 | 6 | export const environment = { 7 | production: false 8 | }; 9 | -------------------------------------------------------------------------------- /employer-client/src/main.ts: -------------------------------------------------------------------------------- 1 | import { enableProdMode } from '@angular/core'; 2 | import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; 3 | 4 | import { AppModule } from './app/app.module'; 5 | import { environment } from './environments/environment'; 6 | 7 | if (environment.production) { 8 | enableProdMode(); 9 | } 10 | 11 | platformBrowserDynamic().bootstrapModule(AppModule) 12 | .catch(err => console.log(err)); 13 | -------------------------------------------------------------------------------- /server/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "server", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "start": "nodemon server.js" 8 | }, 9 | "author": "Yicong Liu", 10 | "license": "ISC", 11 | "dependencies": { 12 | "blob-util": "^1.3.0", 13 | "body-parser": "^1.18.2", 14 | "express": "^4.16.3", 15 | "jsonwebtoken": "^8.2.1", 16 | "mysql": "^2.15.0" 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /employer-client/src/environments/environment.ts: -------------------------------------------------------------------------------- 1 | // The file contents for the current environment will overwrite these during build. 2 | // The build system defaults to the dev environment which uses `environment.ts`, but if you do 3 | // `ng build --env=prod` then `environment.prod.ts` will be used instead. 4 | // The list of which env maps to which file can be found in `.angular-cli.json`. 5 | 6 | export const environment = { 7 | production: false 8 | }; 9 | -------------------------------------------------------------------------------- /client/src/app/components/signup-success/signup-success.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit, Input } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'app-signup-success', 5 | templateUrl: './signup-success.component.html', 6 | styleUrls: ['./signup-success.component.css'] 7 | }) 8 | export class SignupSuccessComponent implements OnInit { 9 | 10 | @Input() sid; 11 | 12 | constructor() { } 13 | 14 | ngOnInit() { 15 | } 16 | 17 | } 18 | -------------------------------------------------------------------------------- /client/src/app/services/job.service.spec.ts: -------------------------------------------------------------------------------- 1 | import { TestBed, inject } from '@angular/core/testing'; 2 | 3 | import { JobService } from './job.service'; 4 | 5 | describe('JobService', () => { 6 | beforeEach(() => { 7 | TestBed.configureTestingModule({ 8 | providers: [JobService] 9 | }); 10 | }); 11 | 12 | it('should be created', inject([JobService], (service: JobService) => { 13 | expect(service).toBeTruthy(); 14 | })); 15 | }); 16 | -------------------------------------------------------------------------------- /client/src/app/services/auth.service.spec.ts: -------------------------------------------------------------------------------- 1 | import { TestBed, inject } from '@angular/core/testing'; 2 | 3 | import { AuthService } from './auth.service'; 4 | 5 | describe('AuthService', () => { 6 | beforeEach(() => { 7 | TestBed.configureTestingModule({ 8 | providers: [AuthService] 9 | }); 10 | }); 11 | 12 | it('should be created', inject([AuthService], (service: AuthService) => { 13 | expect(service).toBeTruthy(); 14 | })); 15 | }); 16 | -------------------------------------------------------------------------------- /employer-client/src/app/services/job.service.spec.ts: -------------------------------------------------------------------------------- 1 | import { TestBed, inject } from '@angular/core/testing'; 2 | 3 | import { JobService } from './job.service'; 4 | 5 | describe('JobService', () => { 6 | beforeEach(() => { 7 | TestBed.configureTestingModule({ 8 | providers: [JobService] 9 | }); 10 | }); 11 | 12 | it('should be created', inject([JobService], (service: JobService) => { 13 | expect(service).toBeTruthy(); 14 | })); 15 | }); 16 | -------------------------------------------------------------------------------- /employer-client/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compileOnSave": false, 3 | "compilerOptions": { 4 | "outDir": "./dist/out-tsc", 5 | "sourceMap": true, 6 | "declaration": false, 7 | "moduleResolution": "node", 8 | "emitDecoratorMetadata": true, 9 | "experimentalDecorators": true, 10 | "target": "es5", 11 | "typeRoots": [ 12 | "node_modules/@types" 13 | ], 14 | "lib": [ 15 | "es2017", 16 | "dom" 17 | ] 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /employer-client/src/app/services/auth.service.spec.ts: -------------------------------------------------------------------------------- 1 | import { TestBed, inject } from '@angular/core/testing'; 2 | 3 | import { AuthService } from './auth.service'; 4 | 5 | describe('AuthService', () => { 6 | beforeEach(() => { 7 | TestBed.configureTestingModule({ 8 | providers: [AuthService] 9 | }); 10 | }); 11 | 12 | it('should be created', inject([AuthService], (service: AuthService) => { 13 | expect(service).toBeTruthy(); 14 | })); 15 | }); 16 | -------------------------------------------------------------------------------- /client/src/app/services/search.service.spec.ts: -------------------------------------------------------------------------------- 1 | import { TestBed, inject } from '@angular/core/testing'; 2 | 3 | import { SearchService } from './search.service'; 4 | 5 | describe('SearchService', () => { 6 | beforeEach(() => { 7 | TestBed.configureTestingModule({ 8 | providers: [SearchService] 9 | }); 10 | }); 11 | 12 | it('should be created', inject([SearchService], (service: SearchService) => { 13 | expect(service).toBeTruthy(); 14 | })); 15 | }); 16 | -------------------------------------------------------------------------------- /employer-client/src/app/components/signup-success/signup-success.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit, Input } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'app-signup-success', 5 | templateUrl: './signup-success.component.html', 6 | styleUrls: ['./signup-success.component.css'] 7 | }) 8 | export class SignupSuccessComponent implements OnInit { 9 | 10 | @Input() cid: string; 11 | 12 | constructor() { } 13 | 14 | ngOnInit() { 15 | } 16 | 17 | } 18 | -------------------------------------------------------------------------------- /client/src/app/services/message.service.spec.ts: -------------------------------------------------------------------------------- 1 | import { TestBed, inject } from '@angular/core/testing'; 2 | 3 | import { MessageService } from './message.service'; 4 | 5 | describe('MessageService', () => { 6 | beforeEach(() => { 7 | TestBed.configureTestingModule({ 8 | providers: [MessageService] 9 | }); 10 | }); 11 | 12 | it('should be created', inject([MessageService], (service: MessageService) => { 13 | expect(service).toBeTruthy(); 14 | })); 15 | }); 16 | -------------------------------------------------------------------------------- /employer-client/src/app/components/new-job-success/new-job-success.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit, Input } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'app-new-job-success', 5 | templateUrl: './new-job-success.component.html', 6 | styleUrls: ['./new-job-success.component.css'] 7 | }) 8 | export class NewJobSuccessComponent implements OnInit { 9 | 10 | @Input() jid: string; 11 | 12 | constructor() { } 13 | 14 | ngOnInit() { 15 | } 16 | 17 | } 18 | -------------------------------------------------------------------------------- /client/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compileOnSave": false, 3 | "compilerOptions": { 4 | "outDir": "./dist/out-tsc", 5 | "sourceMap": true, 6 | "declaration": false, 7 | "moduleResolution": "node", 8 | "emitDecoratorMetadata": true, 9 | "experimentalDecorators": true, 10 | "allowJs": true, 11 | "target": "es5", 12 | "typeRoots": [ 13 | "node_modules/@types" 14 | ], 15 | "lib": [ 16 | "es2017", 17 | "dom" 18 | ] 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /employer-client/src/app/services/search.service.spec.ts: -------------------------------------------------------------------------------- 1 | import { TestBed, inject } from '@angular/core/testing'; 2 | 3 | import { SearchService } from './search.service'; 4 | 5 | describe('SearchService', () => { 6 | beforeEach(() => { 7 | TestBed.configureTestingModule({ 8 | providers: [SearchService] 9 | }); 10 | }); 11 | 12 | it('should be created', inject([SearchService], (service: SearchService) => { 13 | expect(service).toBeTruthy(); 14 | })); 15 | }); 16 | -------------------------------------------------------------------------------- /client/src/app/services/connection.service.spec.ts: -------------------------------------------------------------------------------- 1 | import { TestBed, inject } from '@angular/core/testing'; 2 | 3 | import { ConnectionService } from './connection.service'; 4 | 5 | describe('ConnectionService', () => { 6 | beforeEach(() => { 7 | TestBed.configureTestingModule({ 8 | providers: [ConnectionService] 9 | }); 10 | }); 11 | 12 | it('should be created', inject([ConnectionService], (service: ConnectionService) => { 13 | expect(service).toBeTruthy(); 14 | })); 15 | }); 16 | -------------------------------------------------------------------------------- /client/src/app/app.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | import { Router } from '@angular/router'; 3 | 4 | import { AuthService } from './services/auth.service'; 5 | 6 | @Component({ 7 | selector: 'app-root', 8 | templateUrl: './app.component.html', 9 | styleUrls: ['./app.component.css'] 10 | }) 11 | 12 | export class AppComponent { 13 | 14 | title = 'Jobster-Student'; 15 | 16 | constructor(private router: Router, 17 | private auth: AuthService) { } 18 | 19 | ngOnInit() { 20 | if (!this.auth.isUserAuthenticated()) { 21 | this.router.navigateByUrl('/login'); 22 | } 23 | } 24 | 25 | } 26 | -------------------------------------------------------------------------------- /employer-client/src/app/app.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | import { Router } from '@angular/router'; 3 | 4 | import { AuthService } from './services/auth.service'; 5 | 6 | @Component({ 7 | selector: 'app-root', 8 | templateUrl: './app.component.html', 9 | styleUrls: ['./app.component.css'] 10 | }) 11 | 12 | export class AppComponent { 13 | 14 | title = 'Jobster-Company'; 15 | 16 | constructor(private router: Router, 17 | private auth: AuthService) { } 18 | 19 | ngOnInit() { 20 | if (!this.auth.isUserAuthenticated()) { 21 | this.router.navigateByUrl('/login'); 22 | } 23 | } 24 | 25 | } 26 | -------------------------------------------------------------------------------- /client/src/app/components/new-message-list/new-message-list.component.html: -------------------------------------------------------------------------------- 1 |
2 | 3 |

No New Messages

4 | 5 |
6 |
7 |
8 |
9 | {{message.sname}} wrote: 10 | {{message.mtime}} 11 |
12 |
13 | {{message.content}} 14 |
15 |
16 |
17 | 18 |
19 |
-------------------------------------------------------------------------------- /employer-client/src/app/components/navbar/navbar.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | import { Router } from '@angular/router'; 3 | 4 | import { AuthService } from '../../services/auth.service'; 5 | 6 | @Component({ 7 | selector: 'app-navbar', 8 | templateUrl: './navbar.component.html', 9 | styleUrls: ['./navbar.component.css'] 10 | }) 11 | export class NavbarComponent implements OnInit { 12 | 13 | constructor(private auth: AuthService, 14 | private router: Router,) { } 15 | 16 | ngOnInit() { 17 | } 18 | 19 | logout() { 20 | this.auth.deauthenticateUser(); 21 | window.location.reload(); 22 | } 23 | 24 | } 25 | -------------------------------------------------------------------------------- /client/src/app/components/base/base.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | import { Router } from '@angular/router'; 3 | 4 | import { AuthService } from '../../services/auth.service'; 5 | 6 | @Component({ 7 | selector: 'app-base', 8 | templateUrl: './base.component.html', 9 | styleUrls: ['./base.component.css'] 10 | }) 11 | export class BaseComponent implements OnInit { 12 | 13 | constructor(private router: Router, 14 | private auth: AuthService) { } 15 | 16 | ngOnInit() { 17 | 18 | if (!this.auth.isUserAuthenticated()) { 19 | this.router.navigate(['login']); 20 | } else { 21 | this.router.navigate(['s']); 22 | } 23 | } 24 | 25 | } 26 | -------------------------------------------------------------------------------- /client/src/app/components/login/login.component.css: -------------------------------------------------------------------------------- 1 | .form-signin { 2 | width: 100%; 3 | max-width: 330px; 4 | padding: 15px; 5 | margin: auto; 6 | } 7 | .form-signin .checkbox { 8 | font-weight: 400; 9 | } 10 | .form-signin .form-control { 11 | position: relative; 12 | box-sizing: border-box; 13 | height: auto; 14 | padding: 10px; 15 | font-size: 16px; 16 | } 17 | .form-signin .form-control:focus { 18 | z-index: 2; 19 | } 20 | .form-signin input[type="email"] { 21 | margin-bottom: -1px; 22 | border-bottom-right-radius: 0; 23 | border-bottom-left-radius: 0; 24 | } 25 | .form-signin input[type="password"] { 26 | margin-bottom: 10px; 27 | border-top-left-radius: 0; 28 | border-top-right-radius: 0; 29 | } -------------------------------------------------------------------------------- /client/src/test.ts: -------------------------------------------------------------------------------- 1 | // This file is required by karma.conf.js and loads recursively all the .spec and framework files 2 | 3 | import 'zone.js/dist/zone-testing'; 4 | import { getTestBed } from '@angular/core/testing'; 5 | import { 6 | BrowserDynamicTestingModule, 7 | platformBrowserDynamicTesting 8 | } from '@angular/platform-browser-dynamic/testing'; 9 | 10 | declare const require: any; 11 | 12 | // First, initialize the Angular testing environment. 13 | getTestBed().initTestEnvironment( 14 | BrowserDynamicTestingModule, 15 | platformBrowserDynamicTesting() 16 | ); 17 | // Then we find all the tests. 18 | const context = require.context('./', true, /\.spec\.ts$/); 19 | // And load the modules. 20 | context.keys().map(context); 21 | -------------------------------------------------------------------------------- /employer-client/src/app/components/login/login.component.css: -------------------------------------------------------------------------------- 1 | .form-signin { 2 | width: 100%; 3 | max-width: 330px; 4 | padding: 15px; 5 | margin: auto; 6 | } 7 | .form-signin .checkbox { 8 | font-weight: 400; 9 | } 10 | .form-signin .form-control { 11 | position: relative; 12 | box-sizing: border-box; 13 | height: auto; 14 | padding: 10px; 15 | font-size: 16px; 16 | } 17 | .form-signin .form-control:focus { 18 | z-index: 2; 19 | } 20 | .form-signin input[type="email"] { 21 | margin-bottom: -1px; 22 | border-bottom-right-radius: 0; 23 | border-bottom-left-radius: 0; 24 | } 25 | .form-signin input[type="password"] { 26 | margin-bottom: 10px; 27 | border-top-left-radius: 0; 28 | border-top-right-radius: 0; 29 | } -------------------------------------------------------------------------------- /employer-client/src/test.ts: -------------------------------------------------------------------------------- 1 | // This file is required by karma.conf.js and loads recursively all the .spec and framework files 2 | 3 | import 'zone.js/dist/zone-testing'; 4 | import { getTestBed } from '@angular/core/testing'; 5 | import { 6 | BrowserDynamicTestingModule, 7 | platformBrowserDynamicTesting 8 | } from '@angular/platform-browser-dynamic/testing'; 9 | 10 | declare const require: any; 11 | 12 | // First, initialize the Angular testing environment. 13 | getTestBed().initTestEnvironment( 14 | BrowserDynamicTestingModule, 15 | platformBrowserDynamicTesting() 16 | ); 17 | // Then we find all the tests. 18 | const context = require.context('./', true, /\.spec\.ts$/); 19 | // And load the modules. 20 | context.keys().map(context); 21 | -------------------------------------------------------------------------------- /client/.gitignore: -------------------------------------------------------------------------------- 1 | # See http://help.github.com/ignore-files/ for more about ignoring files. 2 | 3 | # compiled output 4 | /dist 5 | /dist-server 6 | /tmp 7 | /out-tsc 8 | 9 | # dependencies 10 | /node_modules 11 | 12 | # IDEs and editors 13 | /.idea 14 | .project 15 | .classpath 16 | .c9/ 17 | *.launch 18 | .settings/ 19 | *.sublime-workspace 20 | 21 | # IDE - VSCode 22 | .vscode/* 23 | !.vscode/settings.json 24 | !.vscode/tasks.json 25 | !.vscode/launch.json 26 | !.vscode/extensions.json 27 | 28 | # misc 29 | /.sass-cache 30 | /connect.lock 31 | /coverage 32 | /libpeerconnection.log 33 | npm-debug.log 34 | yarn-error.log 35 | testem.log 36 | /typings 37 | 38 | # e2e 39 | /e2e/*.js 40 | /e2e/*.map 41 | 42 | # System Files 43 | .DS_Store 44 | Thumbs.db 45 | -------------------------------------------------------------------------------- /public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Jobster 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /client/src/app/components/base/base.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { async, ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { BaseComponent } from './base.component'; 4 | 5 | describe('BaseComponent', () => { 6 | let component: BaseComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async(() => { 10 | TestBed.configureTestingModule({ 11 | declarations: [ BaseComponent ] 12 | }) 13 | .compileComponents(); 14 | })); 15 | 16 | beforeEach(() => { 17 | fixture = TestBed.createComponent(BaseComponent); 18 | component = fixture.componentInstance; 19 | fixture.detectChanges(); 20 | }); 21 | 22 | it('should create', () => { 23 | expect(component).toBeTruthy(); 24 | }); 25 | }); 26 | -------------------------------------------------------------------------------- /employer-client/.gitignore: -------------------------------------------------------------------------------- 1 | # See http://help.github.com/ignore-files/ for more about ignoring files. 2 | 3 | # compiled output 4 | /dist 5 | /dist-server 6 | /tmp 7 | /out-tsc 8 | 9 | # dependencies 10 | /node_modules 11 | 12 | # IDEs and editors 13 | /.idea 14 | .project 15 | .classpath 16 | .c9/ 17 | *.launch 18 | .settings/ 19 | *.sublime-workspace 20 | 21 | # IDE - VSCode 22 | .vscode/* 23 | !.vscode/settings.json 24 | !.vscode/tasks.json 25 | !.vscode/launch.json 26 | !.vscode/extensions.json 27 | 28 | # misc 29 | /.sass-cache 30 | /connect.lock 31 | /coverage 32 | /libpeerconnection.log 33 | npm-debug.log 34 | yarn-error.log 35 | testem.log 36 | /typings 37 | 38 | # e2e 39 | /e2e/*.js 40 | /e2e/*.map 41 | 42 | # System Files 43 | .DS_Store 44 | Thumbs.db 45 | -------------------------------------------------------------------------------- /public_employer/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Jobster 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /client/src/app/components/login/login.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { async, ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { LoginComponent } from './login.component'; 4 | 5 | describe('LoginComponent', () => { 6 | let component: LoginComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async(() => { 10 | TestBed.configureTestingModule({ 11 | declarations: [ LoginComponent ] 12 | }) 13 | .compileComponents(); 14 | })); 15 | 16 | beforeEach(() => { 17 | fixture = TestBed.createComponent(LoginComponent); 18 | component = fixture.componentInstance; 19 | fixture.detectChanges(); 20 | }); 21 | 22 | it('should create', () => { 23 | expect(component).toBeTruthy(); 24 | }); 25 | }); 26 | -------------------------------------------------------------------------------- /client/src/app/components/navbar/navbar.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { async, ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { NavbarComponent } from './navbar.component'; 4 | 5 | describe('NavbarComponent', () => { 6 | let component: NavbarComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async(() => { 10 | TestBed.configureTestingModule({ 11 | declarations: [ NavbarComponent ] 12 | }) 13 | .compileComponents(); 14 | })); 15 | 16 | beforeEach(() => { 17 | fixture = TestBed.createComponent(NavbarComponent); 18 | component = fixture.componentInstance; 19 | fixture.detectChanges(); 20 | }); 21 | 22 | it('should create', () => { 23 | expect(component).toBeTruthy(); 24 | }); 25 | }); 26 | -------------------------------------------------------------------------------- /client/src/app/components/signup/signup.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { async, ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { SignupComponent } from './signup.component'; 4 | 5 | describe('SignupComponent', () => { 6 | let component: SignupComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async(() => { 10 | TestBed.configureTestingModule({ 11 | declarations: [ SignupComponent ] 12 | }) 13 | .compileComponents(); 14 | })); 15 | 16 | beforeEach(() => { 17 | fixture = TestBed.createComponent(SignupComponent); 18 | component = fixture.componentInstance; 19 | fixture.detectChanges(); 20 | }); 21 | 22 | it('should create', () => { 23 | expect(component).toBeTruthy(); 24 | }); 25 | }); 26 | -------------------------------------------------------------------------------- /employer-client/src/app/components/login/login.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { async, ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { LoginComponent } from './login.component'; 4 | 5 | describe('LoginComponent', () => { 6 | let component: LoginComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async(() => { 10 | TestBed.configureTestingModule({ 11 | declarations: [ LoginComponent ] 12 | }) 13 | .compileComponents(); 14 | })); 15 | 16 | beforeEach(() => { 17 | fixture = TestBed.createComponent(LoginComponent); 18 | component = fixture.componentInstance; 19 | fixture.detectChanges(); 20 | }); 21 | 22 | it('should create', () => { 23 | expect(component).toBeTruthy(); 24 | }); 25 | }); 26 | -------------------------------------------------------------------------------- /client/src/app/components/job-list/job-list.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { async, ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { JobListComponent } from './job-list.component'; 4 | 5 | describe('JobListComponent', () => { 6 | let component: JobListComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async(() => { 10 | TestBed.configureTestingModule({ 11 | declarations: [ JobListComponent ] 12 | }) 13 | .compileComponents(); 14 | })); 15 | 16 | beforeEach(() => { 17 | fixture = TestBed.createComponent(JobListComponent); 18 | component = fixture.componentInstance; 19 | fixture.detectChanges(); 20 | }); 21 | 22 | it('should create', () => { 23 | expect(component).toBeTruthy(); 24 | }); 25 | }); 26 | -------------------------------------------------------------------------------- /employer-client/src/app/components/navbar/navbar.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { async, ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { NavbarComponent } from './navbar.component'; 4 | 5 | describe('NavbarComponent', () => { 6 | let component: NavbarComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async(() => { 10 | TestBed.configureTestingModule({ 11 | declarations: [ NavbarComponent ] 12 | }) 13 | .compileComponents(); 14 | })); 15 | 16 | beforeEach(() => { 17 | fixture = TestBed.createComponent(NavbarComponent); 18 | component = fixture.componentInstance; 19 | fixture.detectChanges(); 20 | }); 21 | 22 | it('should create', () => { 23 | expect(component).toBeTruthy(); 24 | }); 25 | }); 26 | -------------------------------------------------------------------------------- /employer-client/src/app/components/new-job/new-job.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { async, ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { NewJobComponent } from './new-job.component'; 4 | 5 | describe('NewJobComponent', () => { 6 | let component: NewJobComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async(() => { 10 | TestBed.configureTestingModule({ 11 | declarations: [ NewJobComponent ] 12 | }) 13 | .compileComponents(); 14 | })); 15 | 16 | beforeEach(() => { 17 | fixture = TestBed.createComponent(NewJobComponent); 18 | component = fixture.componentInstance; 19 | fixture.detectChanges(); 20 | }); 21 | 22 | it('should create', () => { 23 | expect(component).toBeTruthy(); 24 | }); 25 | }); 26 | -------------------------------------------------------------------------------- /employer-client/src/app/components/signup/signup.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { async, ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { SignupComponent } from './signup.component'; 4 | 5 | describe('SignupComponent', () => { 6 | let component: SignupComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async(() => { 10 | TestBed.configureTestingModule({ 11 | declarations: [ SignupComponent ] 12 | }) 13 | .compileComponents(); 14 | })); 15 | 16 | beforeEach(() => { 17 | fixture = TestBed.createComponent(SignupComponent); 18 | component = fixture.componentInstance; 19 | fixture.detectChanges(); 20 | }); 21 | 22 | it('should create', () => { 23 | expect(component).toBeTruthy(); 24 | }); 25 | }); 26 | -------------------------------------------------------------------------------- /client/src/app/components/signup/signup.component.css: -------------------------------------------------------------------------------- 1 | .form-signup { 2 | width: 100%; 3 | max-width: 330px; 4 | padding: 15px; 5 | margin: auto; 6 | } 7 | .form-signup .checkbox { 8 | font-weight: 400; 9 | } 10 | .form-signup .form-control { 11 | position: relative; 12 | box-sizing: border-box; 13 | height: auto; 14 | padding: 10px; 15 | font-size: 16px; 16 | } 17 | .form-signup .form-control:focus { 18 | z-index: 2; 19 | } 20 | .form-signup input[type="email"] { 21 | margin-bottom: -1px; 22 | border-bottom-right-radius: 0; 23 | border-bottom-left-radius: 0; 24 | } 25 | .form-signup input[type="password"] { 26 | margin-bottom:-1px; 27 | border-top-left-radius: 0; 28 | border-top-right-radius: 0; 29 | } 30 | .form-signup .submit-btn { 31 | margin-top:10px; 32 | } -------------------------------------------------------------------------------- /employer-client/src/app/components/job-list/job-list.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { async, ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { JobListComponent } from './job-list.component'; 4 | 5 | describe('JobListComponent', () => { 6 | let component: JobListComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async(() => { 10 | TestBed.configureTestingModule({ 11 | declarations: [ JobListComponent ] 12 | }) 13 | .compileComponents(); 14 | })); 15 | 16 | beforeEach(() => { 17 | fixture = TestBed.createComponent(JobListComponent); 18 | component = fixture.componentInstance; 19 | fixture.detectChanges(); 20 | }); 21 | 22 | it('should create', () => { 23 | expect(component).toBeTruthy(); 24 | }); 25 | }); 26 | -------------------------------------------------------------------------------- /employer-client/src/app/components/signup/signup.component.css: -------------------------------------------------------------------------------- 1 | .form-signup { 2 | width: 100%; 3 | max-width: 330px; 4 | padding: 15px; 5 | margin: auto; 6 | } 7 | .form-signup .checkbox { 8 | font-weight: 400; 9 | } 10 | .form-signup .form-control { 11 | position: relative; 12 | box-sizing: border-box; 13 | height: auto; 14 | padding: 10px; 15 | font-size: 16px; 16 | } 17 | .form-signup .form-control:focus { 18 | z-index: 2; 19 | } 20 | .form-signup input[type="email"] { 21 | margin-bottom: -1px; 22 | border-bottom-right-radius: 0; 23 | border-bottom-left-radius: 0; 24 | } 25 | .form-signup input[type="password"] { 26 | margin-bottom:-1px; 27 | border-top-left-radius: 0; 28 | border-top-right-radius: 0; 29 | } 30 | .form-signup .submit-btn { 31 | margin-top:10px; 32 | } -------------------------------------------------------------------------------- /client/src/app/components/job-detail/job-detail.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { async, ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { JobDetailComponent } from './job-detail.component'; 4 | 5 | describe('JobDetailComponent', () => { 6 | let component: JobDetailComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async(() => { 10 | TestBed.configureTestingModule({ 11 | declarations: [ JobDetailComponent ] 12 | }) 13 | .compileComponents(); 14 | })); 15 | 16 | beforeEach(() => { 17 | fixture = TestBed.createComponent(JobDetailComponent); 18 | component = fixture.componentInstance; 19 | fixture.detectChanges(); 20 | }); 21 | 22 | it('should create', () => { 23 | expect(component).toBeTruthy(); 24 | }); 25 | }); 26 | -------------------------------------------------------------------------------- /client/src/app/components/friend-list/friend-list.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { async, ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { FriendListComponent } from './friend-list.component'; 4 | 5 | describe('FriendListComponent', () => { 6 | let component: FriendListComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async(() => { 10 | TestBed.configureTestingModule({ 11 | declarations: [ FriendListComponent ] 12 | }) 13 | .compileComponents(); 14 | })); 15 | 16 | beforeEach(() => { 17 | fixture = TestBed.createComponent(FriendListComponent); 18 | component = fixture.componentInstance; 19 | fixture.detectChanges(); 20 | }); 21 | 22 | it('should create', () => { 23 | expect(component).toBeTruthy(); 24 | }); 25 | }); 26 | -------------------------------------------------------------------------------- /employer-client/src/app/components/job-detail/job-detail.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { async, ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { JobDetailComponent } from './job-detail.component'; 4 | 5 | describe('JobDetailComponent', () => { 6 | let component: JobDetailComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async(() => { 10 | TestBed.configureTestingModule({ 11 | declarations: [ JobDetailComponent ] 12 | }) 13 | .compileComponents(); 14 | })); 15 | 16 | beforeEach(() => { 17 | fixture = TestBed.createComponent(JobDetailComponent); 18 | component = fixture.componentInstance; 19 | fixture.detectChanges(); 20 | }); 21 | 22 | it('should create', () => { 23 | expect(component).toBeTruthy(); 24 | }); 25 | }); 26 | -------------------------------------------------------------------------------- /client/src/app/components/company-list/company-list.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { async, ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { CompanyListComponent } from './company-list.component'; 4 | 5 | describe('CompanyListComponent', () => { 6 | let component: CompanyListComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async(() => { 10 | TestBed.configureTestingModule({ 11 | declarations: [ CompanyListComponent ] 12 | }) 13 | .compileComponents(); 14 | })); 15 | 16 | beforeEach(() => { 17 | fixture = TestBed.createComponent(CompanyListComponent); 18 | component = fixture.componentInstance; 19 | fixture.detectChanges(); 20 | }); 21 | 22 | it('should create', () => { 23 | expect(component).toBeTruthy(); 24 | }); 25 | }); 26 | -------------------------------------------------------------------------------- /client/src/app/components/message-list/message-list.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { async, ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { MessageListComponent } from './message-list.component'; 4 | 5 | describe('MessageListComponent', () => { 6 | let component: MessageListComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async(() => { 10 | TestBed.configureTestingModule({ 11 | declarations: [ MessageListComponent ] 12 | }) 13 | .compileComponents(); 14 | })); 15 | 16 | beforeEach(() => { 17 | fixture = TestBed.createComponent(MessageListComponent); 18 | component = fixture.componentInstance; 19 | fixture.detectChanges(); 20 | }); 21 | 22 | it('should create', () => { 23 | expect(component).toBeTruthy(); 24 | }); 25 | }); 26 | -------------------------------------------------------------------------------- /client/src/app/components/student-home/student-home.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { async, ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { StudentHomeComponent } from './student-home.component'; 4 | 5 | describe('StudentHomeComponent', () => { 6 | let component: StudentHomeComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async(() => { 10 | TestBed.configureTestingModule({ 11 | declarations: [ StudentHomeComponent ] 12 | }) 13 | .compileComponents(); 14 | })); 15 | 16 | beforeEach(() => { 17 | fixture = TestBed.createComponent(StudentHomeComponent); 18 | component = fixture.componentInstance; 19 | fixture.detectChanges(); 20 | }); 21 | 22 | it('should create', () => { 23 | expect(component).toBeTruthy(); 24 | }); 25 | }); 26 | -------------------------------------------------------------------------------- /client/src/app/components/student-list/student-list.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { async, ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { StudentListComponent } from './student-list.component'; 4 | 5 | describe('StudentListComponent', () => { 6 | let component: StudentListComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async(() => { 10 | TestBed.configureTestingModule({ 11 | declarations: [ StudentListComponent ] 12 | }) 13 | .compileComponents(); 14 | })); 15 | 16 | beforeEach(() => { 17 | fixture = TestBed.createComponent(StudentListComponent); 18 | component = fixture.componentInstance; 19 | fixture.detectChanges(); 20 | }); 21 | 22 | it('should create', () => { 23 | expect(component).toBeTruthy(); 24 | }); 25 | }); 26 | -------------------------------------------------------------------------------- /employer-client/src/app/components/company-home/company-home.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { async, ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { CompanyHomeComponent } from './company-home.component'; 4 | 5 | describe('CompanyHomeComponent', () => { 6 | let component: CompanyHomeComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async(() => { 10 | TestBed.configureTestingModule({ 11 | declarations: [ CompanyHomeComponent ] 12 | }) 13 | .compileComponents(); 14 | })); 15 | 16 | beforeEach(() => { 17 | fixture = TestBed.createComponent(CompanyHomeComponent); 18 | component = fixture.componentInstance; 19 | fixture.detectChanges(); 20 | }); 21 | 22 | it('should create', () => { 23 | expect(component).toBeTruthy(); 24 | }); 25 | }); 26 | -------------------------------------------------------------------------------- /client/src/app/components/company-detail/company-detail.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { async, ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { CompanyDetailComponent } from './company-detail.component'; 4 | 5 | describe('CompanyDetailComponent', () => { 6 | let component: CompanyDetailComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async(() => { 10 | TestBed.configureTestingModule({ 11 | declarations: [ CompanyDetailComponent ] 12 | }) 13 | .compileComponents(); 14 | })); 15 | 16 | beforeEach(() => { 17 | fixture = TestBed.createComponent(CompanyDetailComponent); 18 | component = fixture.componentInstance; 19 | fixture.detectChanges(); 20 | }); 21 | 22 | it('should create', () => { 23 | expect(component).toBeTruthy(); 24 | }); 25 | }); 26 | -------------------------------------------------------------------------------- /client/src/app/components/following-list/following-list.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { async, ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { FollowingListComponent } from './following-list.component'; 4 | 5 | describe('FollowingListComponent', () => { 6 | let component: FollowingListComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async(() => { 10 | TestBed.configureTestingModule({ 11 | declarations: [ FollowingListComponent ] 12 | }) 13 | .compileComponents(); 14 | })); 15 | 16 | beforeEach(() => { 17 | fixture = TestBed.createComponent(FollowingListComponent); 18 | component = fixture.componentInstance; 19 | fixture.detectChanges(); 20 | }); 21 | 22 | it('should create', () => { 23 | expect(component).toBeTruthy(); 24 | }); 25 | }); 26 | -------------------------------------------------------------------------------- /client/src/app/components/signup-success/signup-success.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { async, ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { SignupSuccessComponent } from './signup-success.component'; 4 | 5 | describe('SignupSuccessComponent', () => { 6 | let component: SignupSuccessComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async(() => { 10 | TestBed.configureTestingModule({ 11 | declarations: [ SignupSuccessComponent ] 12 | }) 13 | .compileComponents(); 14 | })); 15 | 16 | beforeEach(() => { 17 | fixture = TestBed.createComponent(SignupSuccessComponent); 18 | component = fixture.componentInstance; 19 | fixture.detectChanges(); 20 | }); 21 | 22 | it('should create', () => { 23 | expect(component).toBeTruthy(); 24 | }); 25 | }); 26 | -------------------------------------------------------------------------------- /client/src/app/components/student-detail/student-detail.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { async, ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { StudentDetailComponent } from './student-detail.component'; 4 | 5 | describe('StudentDetailComponent', () => { 6 | let component: StudentDetailComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async(() => { 10 | TestBed.configureTestingModule({ 11 | declarations: [ StudentDetailComponent ] 12 | }) 13 | .compileComponents(); 14 | })); 15 | 16 | beforeEach(() => { 17 | fixture = TestBed.createComponent(StudentDetailComponent); 18 | component = fixture.componentInstance; 19 | fixture.detectChanges(); 20 | }); 21 | 22 | it('should create', () => { 23 | expect(component).toBeTruthy(); 24 | }); 25 | }); 26 | -------------------------------------------------------------------------------- /client/protractor.conf.js: -------------------------------------------------------------------------------- 1 | // Protractor configuration file, see link for more information 2 | // https://github.com/angular/protractor/blob/master/lib/config.ts 3 | 4 | const { SpecReporter } = require('jasmine-spec-reporter'); 5 | 6 | exports.config = { 7 | allScriptsTimeout: 11000, 8 | specs: [ 9 | './e2e/**/*.e2e-spec.ts' 10 | ], 11 | capabilities: { 12 | 'browserName': 'chrome' 13 | }, 14 | directConnect: true, 15 | baseUrl: 'http://localhost:4200/', 16 | framework: 'jasmine', 17 | jasmineNodeOpts: { 18 | showColors: true, 19 | defaultTimeoutInterval: 30000, 20 | print: function() {} 21 | }, 22 | onPrepare() { 23 | require('ts-node').register({ 24 | project: 'e2e/tsconfig.e2e.json' 25 | }); 26 | jasmine.getEnv().addReporter(new SpecReporter({ spec: { displayStacktrace: true } })); 27 | } 28 | }; 29 | -------------------------------------------------------------------------------- /client/src/app/components/invitation-list/invitation-list.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { async, ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { InvitationListComponent } from './invitation-list.component'; 4 | 5 | describe('InvitationListComponent', () => { 6 | let component: InvitationListComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async(() => { 10 | TestBed.configureTestingModule({ 11 | declarations: [ InvitationListComponent ] 12 | }) 13 | .compileComponents(); 14 | })); 15 | 16 | beforeEach(() => { 17 | fixture = TestBed.createComponent(InvitationListComponent); 18 | component = fixture.componentInstance; 19 | fixture.detectChanges(); 20 | }); 21 | 22 | it('should create', () => { 23 | expect(component).toBeTruthy(); 24 | }); 25 | }); 26 | -------------------------------------------------------------------------------- /client/src/app/components/student-profile/student-profile.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { async, ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { StudentProfileComponent } from './student-profile.component'; 4 | 5 | describe('StudentProfileComponent', () => { 6 | let component: StudentProfileComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async(() => { 10 | TestBed.configureTestingModule({ 11 | declarations: [ StudentProfileComponent ] 12 | }) 13 | .compileComponents(); 14 | })); 15 | 16 | beforeEach(() => { 17 | fixture = TestBed.createComponent(StudentProfileComponent); 18 | component = fixture.componentInstance; 19 | fixture.detectChanges(); 20 | }); 21 | 22 | it('should create', () => { 23 | expect(component).toBeTruthy(); 24 | }); 25 | }); 26 | -------------------------------------------------------------------------------- /employer-client/src/app/components/signup-success/signup-success.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { async, ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { SignupSuccessComponent } from './signup-success.component'; 4 | 5 | describe('SignupSuccessComponent', () => { 6 | let component: SignupSuccessComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async(() => { 10 | TestBed.configureTestingModule({ 11 | declarations: [ SignupSuccessComponent ] 12 | }) 13 | .compileComponents(); 14 | })); 15 | 16 | beforeEach(() => { 17 | fixture = TestBed.createComponent(SignupSuccessComponent); 18 | component = fixture.componentInstance; 19 | fixture.detectChanges(); 20 | }); 21 | 22 | it('should create', () => { 23 | expect(component).toBeTruthy(); 24 | }); 25 | }); 26 | -------------------------------------------------------------------------------- /employer-client/src/app/components/student-detail/student-detail.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { async, ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { StudentDetailComponent } from './student-detail.component'; 4 | 5 | describe('StudentDetailComponent', () => { 6 | let component: StudentDetailComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async(() => { 10 | TestBed.configureTestingModule({ 11 | declarations: [ StudentDetailComponent ] 12 | }) 13 | .compileComponents(); 14 | })); 15 | 16 | beforeEach(() => { 17 | fixture = TestBed.createComponent(StudentDetailComponent); 18 | component = fixture.componentInstance; 19 | fixture.detectChanges(); 20 | }); 21 | 22 | it('should create', () => { 23 | expect(component).toBeTruthy(); 24 | }); 25 | }); 26 | -------------------------------------------------------------------------------- /client/src/app/components/company-job-list/company-job-list.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { async, ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { CompanyJobListComponent } from './company-job-list.component'; 4 | 5 | describe('CompanyJobListComponent', () => { 6 | let component: CompanyJobListComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async(() => { 10 | TestBed.configureTestingModule({ 11 | declarations: [ CompanyJobListComponent ] 12 | }) 13 | .compileComponents(); 14 | })); 15 | 16 | beforeEach(() => { 17 | fixture = TestBed.createComponent(CompanyJobListComponent); 18 | component = fixture.componentInstance; 19 | fixture.detectChanges(); 20 | }); 21 | 22 | it('should create', () => { 23 | expect(component).toBeTruthy(); 24 | }); 25 | }); 26 | -------------------------------------------------------------------------------- /client/src/app/components/new-message-list/new-message-list.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { async, ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { NewMessageListComponent } from './new-message-list.component'; 4 | 5 | describe('NewMessageListComponent', () => { 6 | let component: NewMessageListComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async(() => { 10 | TestBed.configureTestingModule({ 11 | declarations: [ NewMessageListComponent ] 12 | }) 13 | .compileComponents(); 14 | })); 15 | 16 | beforeEach(() => { 17 | fixture = TestBed.createComponent(NewMessageListComponent); 18 | component = fixture.componentInstance; 19 | fixture.detectChanges(); 20 | }); 21 | 22 | it('should create', () => { 23 | expect(component).toBeTruthy(); 24 | }); 25 | }); 26 | -------------------------------------------------------------------------------- /employer-client/src/app/components/new-job-success/new-job-success.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { async, ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { NewJobSuccessComponent } from './new-job-success.component'; 4 | 5 | describe('NewJobSuccessComponent', () => { 6 | let component: NewJobSuccessComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async(() => { 10 | TestBed.configureTestingModule({ 11 | declarations: [ NewJobSuccessComponent ] 12 | }) 13 | .compileComponents(); 14 | })); 15 | 16 | beforeEach(() => { 17 | fixture = TestBed.createComponent(NewJobSuccessComponent); 18 | component = fixture.componentInstance; 19 | fixture.detectChanges(); 20 | }); 21 | 22 | it('should create', () => { 23 | expect(component).toBeTruthy(); 24 | }); 25 | }); 26 | -------------------------------------------------------------------------------- /client/src/app/components/application-list/application-list.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { async, ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { ApplicationListComponent } from './application-list.component'; 4 | 5 | describe('ApplicationListComponent', () => { 6 | let component: ApplicationListComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async(() => { 10 | TestBed.configureTestingModule({ 11 | declarations: [ ApplicationListComponent ] 12 | }) 13 | .compileComponents(); 14 | })); 15 | 16 | beforeEach(() => { 17 | fixture = TestBed.createComponent(ApplicationListComponent); 18 | component = fixture.componentInstance; 19 | fixture.detectChanges(); 20 | }); 21 | 22 | it('should create', () => { 23 | expect(component).toBeTruthy(); 24 | }); 25 | }); 26 | -------------------------------------------------------------------------------- /client/src/app/components/friend-list-modal/friend-list-modal.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { async, ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { FriendListModalComponent } from './friend-list-modal.component'; 4 | 5 | describe('FriendListModalComponent', () => { 6 | let component: FriendListModalComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async(() => { 10 | TestBed.configureTestingModule({ 11 | declarations: [ FriendListModalComponent ] 12 | }) 13 | .compileComponents(); 14 | })); 15 | 16 | beforeEach(() => { 17 | fixture = TestBed.createComponent(FriendListModalComponent); 18 | component = fixture.componentInstance; 19 | fixture.detectChanges(); 20 | }); 21 | 22 | it('should create', () => { 23 | expect(component).toBeTruthy(); 24 | }); 25 | }); 26 | -------------------------------------------------------------------------------- /employer-client/protractor.conf.js: -------------------------------------------------------------------------------- 1 | // Protractor configuration file, see link for more information 2 | // https://github.com/angular/protractor/blob/master/lib/config.ts 3 | 4 | const { SpecReporter } = require('jasmine-spec-reporter'); 5 | 6 | exports.config = { 7 | allScriptsTimeout: 11000, 8 | specs: [ 9 | './e2e/**/*.e2e-spec.ts' 10 | ], 11 | capabilities: { 12 | 'browserName': 'chrome' 13 | }, 14 | directConnect: true, 15 | baseUrl: 'http://localhost:4200/', 16 | framework: 'jasmine', 17 | jasmineNodeOpts: { 18 | showColors: true, 19 | defaultTimeoutInterval: 30000, 20 | print: function() {} 21 | }, 22 | onPrepare() { 23 | require('ts-node').register({ 24 | project: 'e2e/tsconfig.e2e.json' 25 | }); 26 | jasmine.getEnv().addReporter(new SpecReporter({ spec: { displayStacktrace: true } })); 27 | } 28 | }; 29 | -------------------------------------------------------------------------------- /employer-client/src/app/components/company-profile/company-profile.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { async, ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { CompanyProfileComponent } from './company-profile.component'; 4 | 5 | describe('CompanyProfileComponent', () => { 6 | let component: CompanyProfileComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async(() => { 10 | TestBed.configureTestingModule({ 11 | declarations: [ CompanyProfileComponent ] 12 | }) 13 | .compileComponents(); 14 | })); 15 | 16 | beforeEach(() => { 17 | fixture = TestBed.createComponent(CompanyProfileComponent); 18 | component = fixture.componentInstance; 19 | fixture.detectChanges(); 20 | }); 21 | 22 | it('should create', () => { 23 | expect(component).toBeTruthy(); 24 | }); 25 | }); 26 | -------------------------------------------------------------------------------- /employer-client/src/app/components/application-list/application-list.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { async, ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { ApplicationListComponent } from './application-list.component'; 4 | 5 | describe('ApplicationListComponent', () => { 6 | let component: ApplicationListComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async(() => { 10 | TestBed.configureTestingModule({ 11 | declarations: [ ApplicationListComponent ] 12 | }) 13 | .compileComponents(); 14 | })); 15 | 16 | beforeEach(() => { 17 | fixture = TestBed.createComponent(ApplicationListComponent); 18 | component = fixture.componentInstance; 19 | fixture.detectChanges(); 20 | }); 21 | 22 | it('should create', () => { 23 | expect(component).toBeTruthy(); 24 | }); 25 | }); 26 | -------------------------------------------------------------------------------- /employer-client/src/app/components/push-filter-modal/push-filter-modal.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { async, ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { PushFilterModalComponent } from './push-filter-modal.component'; 4 | 5 | describe('PushFilterModalComponent', () => { 6 | let component: PushFilterModalComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async(() => { 10 | TestBed.configureTestingModule({ 11 | declarations: [ PushFilterModalComponent ] 12 | }) 13 | .compileComponents(); 14 | })); 15 | 16 | beforeEach(() => { 17 | fixture = TestBed.createComponent(PushFilterModalComponent); 18 | component = fixture.componentInstance; 19 | fixture.detectChanges(); 20 | }); 21 | 22 | it('should create', () => { 23 | expect(component).toBeTruthy(); 24 | }); 25 | }); 26 | -------------------------------------------------------------------------------- /client/src/app/components/friend-list/friend-list.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | 3 | import { AuthService } from '../../services/auth.service'; 4 | import { ConnectionService } from '../../services/connection.service'; 5 | 6 | @Component({ 7 | selector: 'app-friend-list', 8 | templateUrl: './friend-list.component.html', 9 | styleUrls: ['./friend-list.component.css'] 10 | }) 11 | export class FriendListComponent implements OnInit { 12 | 13 | sid: string = this.auth.getSid(); 14 | 15 | students: any; 16 | 17 | constructor(private auth: AuthService, 18 | private connectionService: ConnectionService) { } 19 | 20 | ngOnInit() { 21 | this.getFriendList(this.sid); 22 | } 23 | 24 | getFriendList(sid: string) { 25 | this.connectionService.getFriendList(sid) 26 | .then(students => { 27 | this.students = students; 28 | }); 29 | } 30 | 31 | } 32 | -------------------------------------------------------------------------------- /client/src/app/components/signup-success/signup-success.component.html: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /employer-client/src/app/components/new-job-success/new-job-success.component.html: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /employer-client/src/app/components/signup-success/signup-success.component.html: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /client/src/app/components/application-list/application-list.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | 3 | import { AuthService } from '../../services/auth.service'; 4 | import { JobService } from '../../services/job.service'; 5 | 6 | @Component({ 7 | selector: 'app-application-list', 8 | templateUrl: './application-list.component.html', 9 | styleUrls: ['./application-list.component.css'] 10 | }) 11 | export class ApplicationListComponent implements OnInit { 12 | 13 | sid: string = this.auth.getSid(); 14 | 15 | applications: any; 16 | 17 | constructor(private auth: AuthService, 18 | private jobhService: JobService) { } 19 | 20 | ngOnInit() { 21 | this.getApplicationList(this.sid); 22 | } 23 | 24 | getApplicationList(sid: string) { 25 | this.jobhService.getApplicationList(sid) 26 | .then(applications => { 27 | this.applications = applications; 28 | }); 29 | } 30 | 31 | } 32 | -------------------------------------------------------------------------------- /client/src/app/components/following-list/following-list.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | 3 | import { AuthService } from '../../services/auth.service'; 4 | import { ConnectionService } from '../../services/connection.service'; 5 | 6 | @Component({ 7 | selector: 'app-following-list', 8 | templateUrl: './following-list.component.html', 9 | styleUrls: ['./following-list.component.css'] 10 | }) 11 | export class FollowingListComponent implements OnInit { 12 | 13 | sid: string = this.auth.getSid(); 14 | 15 | companies: any; 16 | 17 | constructor(private auth: AuthService, 18 | private connectionService: ConnectionService) { } 19 | 20 | ngOnInit() { 21 | this.getFollowingList(this.sid); 22 | } 23 | 24 | getFollowingList(sid: string) { 25 | this.connectionService.getFollowingList(sid) 26 | .then(companies => { 27 | this.companies = companies; 28 | }); 29 | } 30 | 31 | } 32 | -------------------------------------------------------------------------------- /client/src/app/components/company-list/company-list.component.html: -------------------------------------------------------------------------------- 1 |
2 | 3 |

Search Results

4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 25 | 26 | 27 |
CompanyLocationIndustry
{{company.cname}}{{company.clocation}}{{company.industry}} 20 | 24 |
28 |
29 | -------------------------------------------------------------------------------- /client/src/app/components/following-list/following-list.component.html: -------------------------------------------------------------------------------- 1 |
2 | 3 |

All Followings

4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 25 | 26 | 27 |
CompanyLocationIndustry
{{company.cname}}{{company.clocation}}{{company.industry}} 20 | 24 |
28 |
-------------------------------------------------------------------------------- /client/src/app/components/job-list/job-list.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | import { ActivatedRoute, Params } from '@angular/router'; 3 | 4 | import { AuthService } from '../../services/auth.service'; 5 | import { SearchService } from '../../services/search.service'; 6 | 7 | @Component({ 8 | selector: 'app-job-list', 9 | templateUrl: './job-list.component.html', 10 | styleUrls: ['./job-list.component.css'] 11 | }) 12 | export class JobListComponent implements OnInit { 13 | 14 | jobs: any; 15 | 16 | constructor(private route: ActivatedRoute, 17 | private auth: AuthService, 18 | private searchService: SearchService) { } 19 | 20 | ngOnInit() { 21 | this.route.params.subscribe(params => { 22 | this.getJobSearchList(params['keyword']); 23 | }); 24 | } 25 | 26 | getJobSearchList(keyword: string) { 27 | this.searchService.findJobsByKeyword(keyword) 28 | .then(jobs => { 29 | this.jobs = jobs; 30 | }); 31 | } 32 | 33 | } 34 | -------------------------------------------------------------------------------- /employer-client/src/app/components/job-list/job-list.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | 3 | import { AuthService } from '../../services/auth.service'; 4 | import { JobService } from '../../services/job.service'; 5 | 6 | declare var $: any; 7 | 8 | @Component({ 9 | selector: 'app-job-list', 10 | templateUrl: './job-list.component.html', 11 | styleUrls: ['./job-list.component.css'] 12 | }) 13 | export class JobListComponent implements OnInit { 14 | 15 | cid: string = this.auth.getCid(); 16 | jid: string = ""; 17 | 18 | jobs: any; 19 | 20 | constructor(private auth: AuthService, 21 | private jobService: JobService) { } 22 | 23 | ngOnInit() { 24 | this.getJobList(this.cid); 25 | } 26 | 27 | getJobList(cid: string) { 28 | this.jobService.getJobList(cid) 29 | .then(jobs => { 30 | this.jobs = jobs; 31 | }); 32 | } 33 | 34 | showFilterModal(jid: string) { 35 | this.jid = jid; 36 | $('#push-filter-modal').modal('show'); 37 | } 38 | 39 | } 40 | -------------------------------------------------------------------------------- /client/src/app/components/login/login.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | import { Router } from '@angular/router'; 3 | 4 | import { AuthService } from '../../services/auth.service'; 5 | 6 | @Component({ 7 | selector: 'app-login', 8 | templateUrl: './login.component.html', 9 | styleUrls: ['./login.component.css'] 10 | }) 11 | export class LoginComponent implements OnInit { 12 | 13 | error: string = ""; 14 | 15 | sid: string = ""; 16 | password: string = ""; 17 | 18 | constructor(private router: Router, 19 | private auth: AuthService) { } 20 | 21 | ngOnInit() { 22 | if (this.auth.isUserAuthenticated()) { 23 | this.router.navigateByUrl('/'); 24 | } 25 | } 26 | 27 | submitForm() { 28 | this.auth.logIn(this.sid, this.password).then(res => { 29 | if (res.error) { 30 | this.error = res.error; 31 | } else { 32 | this.auth.authenticateUser(res.token,res.sid); 33 | this.router.navigateByUrl('/'); 34 | } 35 | }); 36 | } 37 | 38 | } 39 | -------------------------------------------------------------------------------- /employer-client/src/app/components/login/login.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | import { Router } from '@angular/router'; 3 | 4 | import { AuthService } from '../../services/auth.service'; 5 | 6 | @Component({ 7 | selector: 'app-login', 8 | templateUrl: './login.component.html', 9 | styleUrls: ['./login.component.css'] 10 | }) 11 | export class LoginComponent implements OnInit { 12 | 13 | error: string = ""; 14 | 15 | cid: string = ""; 16 | password: string = ""; 17 | 18 | constructor(private router: Router, 19 | private auth: AuthService) { } 20 | 21 | ngOnInit() { 22 | if (this.auth.isUserAuthenticated()) { 23 | this.router.navigateByUrl('/'); 24 | } 25 | } 26 | 27 | submitForm() { 28 | this.auth.logIn(this.cid, this.password).then(res => { 29 | if (res.error) { 30 | this.error = res.error; 31 | } else { 32 | this.auth.authenticateUser(res.token,res.cid); 33 | this.router.navigateByUrl('/'); 34 | } 35 | }); 36 | } 37 | 38 | } 39 | -------------------------------------------------------------------------------- /client/src/app/components/new-message-list/new-message-list.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | 3 | import { AuthService } from '../../services/auth.service'; 4 | import { MessageService } from '../../services/message.service'; 5 | 6 | @Component({ 7 | selector: 'app-new-message-list', 8 | templateUrl: './new-message-list.component.html', 9 | styleUrls: ['./new-message-list.component.css'] 10 | }) 11 | export class NewMessageListComponent implements OnInit { 12 | 13 | me: string = this.auth.getSid(); 14 | 15 | messages: any; 16 | flag: boolean = false; 17 | 18 | constructor(private auth: AuthService, 19 | private messageService: MessageService) { } 20 | 21 | ngOnInit() { 22 | this.getNewMessages(this.me); 23 | } 24 | 25 | getNewMessages(me: string) { 26 | this.messageService.getNewMessageList(me) 27 | .then(messages => { 28 | if (messages.length === 0) { 29 | this.flag = true; 30 | } 31 | this.messages = messages; 32 | }); 33 | } 34 | 35 | } 36 | -------------------------------------------------------------------------------- /client/karma.conf.js: -------------------------------------------------------------------------------- 1 | // Karma configuration file, see link for more information 2 | // https://karma-runner.github.io/1.0/config/configuration-file.html 3 | 4 | module.exports = function (config) { 5 | config.set({ 6 | basePath: '', 7 | frameworks: ['jasmine', '@angular/cli'], 8 | plugins: [ 9 | require('karma-jasmine'), 10 | require('karma-chrome-launcher'), 11 | require('karma-jasmine-html-reporter'), 12 | require('karma-coverage-istanbul-reporter'), 13 | require('@angular/cli/plugins/karma') 14 | ], 15 | client:{ 16 | clearContext: false // leave Jasmine Spec Runner output visible in browser 17 | }, 18 | coverageIstanbulReporter: { 19 | reports: [ 'html', 'lcovonly' ], 20 | fixWebpackSourcePaths: true 21 | }, 22 | angularCli: { 23 | environment: 'dev' 24 | }, 25 | reporters: ['progress', 'kjhtml'], 26 | port: 9876, 27 | colors: true, 28 | logLevel: config.LOG_INFO, 29 | autoWatch: true, 30 | browsers: ['Chrome'], 31 | singleRun: false 32 | }); 33 | }; 34 | -------------------------------------------------------------------------------- /employer-client/karma.conf.js: -------------------------------------------------------------------------------- 1 | // Karma configuration file, see link for more information 2 | // https://karma-runner.github.io/1.0/config/configuration-file.html 3 | 4 | module.exports = function (config) { 5 | config.set({ 6 | basePath: '', 7 | frameworks: ['jasmine', '@angular/cli'], 8 | plugins: [ 9 | require('karma-jasmine'), 10 | require('karma-chrome-launcher'), 11 | require('karma-jasmine-html-reporter'), 12 | require('karma-coverage-istanbul-reporter'), 13 | require('@angular/cli/plugins/karma') 14 | ], 15 | client:{ 16 | clearContext: false // leave Jasmine Spec Runner output visible in browser 17 | }, 18 | coverageIstanbulReporter: { 19 | reports: [ 'html', 'lcovonly' ], 20 | fixWebpackSourcePaths: true 21 | }, 22 | angularCli: { 23 | environment: 'dev' 24 | }, 25 | reporters: ['progress', 'kjhtml'], 26 | port: 9876, 27 | colors: true, 28 | logLevel: config.LOG_INFO, 29 | autoWatch: true, 30 | browsers: ['Chrome'], 31 | singleRun: false 32 | }); 33 | }; 34 | -------------------------------------------------------------------------------- /client/src/app/components/application-list/application-list.component.html: -------------------------------------------------------------------------------- 1 |
2 | 3 |

My Applications

4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 27 | 28 | 29 |
Job TitleCompanyApplication TimeStatus
{{application.title}}{{application.cname}}{{application.apptime}}{{application.appstatus}} 22 | 26 |
30 |
-------------------------------------------------------------------------------- /client/src/app/app.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { TestBed, async } from '@angular/core/testing'; 2 | import { AppComponent } from './app.component'; 3 | describe('AppComponent', () => { 4 | beforeEach(async(() => { 5 | TestBed.configureTestingModule({ 6 | declarations: [ 7 | AppComponent 8 | ], 9 | }).compileComponents(); 10 | })); 11 | it('should create the app', async(() => { 12 | const fixture = TestBed.createComponent(AppComponent); 13 | const app = fixture.debugElement.componentInstance; 14 | expect(app).toBeTruthy(); 15 | })); 16 | it(`should have as title 'app'`, async(() => { 17 | const fixture = TestBed.createComponent(AppComponent); 18 | const app = fixture.debugElement.componentInstance; 19 | expect(app.title).toEqual('app'); 20 | })); 21 | it('should render title in a h1 tag', async(() => { 22 | const fixture = TestBed.createComponent(AppComponent); 23 | fixture.detectChanges(); 24 | const compiled = fixture.debugElement.nativeElement; 25 | expect(compiled.querySelector('h1').textContent).toContain('Welcome to app!'); 26 | })); 27 | }); 28 | -------------------------------------------------------------------------------- /client/src/app/components/student-list/student-list.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | import { ActivatedRoute, Params } from '@angular/router'; 3 | 4 | import { AuthService } from '../../services/auth.service'; 5 | import { SearchService } from '../../services/search.service'; 6 | 7 | @Component({ 8 | selector: 'app-student-list', 9 | templateUrl: './student-list.component.html', 10 | styleUrls: ['./student-list.component.css'] 11 | }) 12 | export class StudentListComponent implements OnInit { 13 | 14 | sid: string = this.auth.getSid(); 15 | 16 | students: any; 17 | 18 | constructor(private route: ActivatedRoute, 19 | private auth: AuthService, 20 | private searchService: SearchService) { } 21 | 22 | ngOnInit() { 23 | this.route.params.subscribe(params => { 24 | this.getStudentSearchList(params['keyword']); 25 | }); 26 | } 27 | 28 | getStudentSearchList(keyword: string) { 29 | this.searchService.findStudentsByKeyword(keyword) 30 | .then(students => { 31 | this.students = students; 32 | }); 33 | } 34 | 35 | } 36 | -------------------------------------------------------------------------------- /employer-client/src/app/app.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { TestBed, async } from '@angular/core/testing'; 2 | import { AppComponent } from './app.component'; 3 | describe('AppComponent', () => { 4 | beforeEach(async(() => { 5 | TestBed.configureTestingModule({ 6 | declarations: [ 7 | AppComponent 8 | ], 9 | }).compileComponents(); 10 | })); 11 | it('should create the app', async(() => { 12 | const fixture = TestBed.createComponent(AppComponent); 13 | const app = fixture.debugElement.componentInstance; 14 | expect(app).toBeTruthy(); 15 | })); 16 | it(`should have as title 'app'`, async(() => { 17 | const fixture = TestBed.createComponent(AppComponent); 18 | const app = fixture.debugElement.componentInstance; 19 | expect(app.title).toEqual('app'); 20 | })); 21 | it('should render title in a h1 tag', async(() => { 22 | const fixture = TestBed.createComponent(AppComponent); 23 | fixture.detectChanges(); 24 | const compiled = fixture.debugElement.nativeElement; 25 | expect(compiled.querySelector('h1').textContent).toContain('Welcome to app!'); 26 | })); 27 | }); 28 | -------------------------------------------------------------------------------- /client/README.md: -------------------------------------------------------------------------------- 1 | # Client 2 | 3 | This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 1.7.4. 4 | 5 | ## Development server 6 | 7 | Run `ng serve` for a dev server. Navigate to `http://localhost:4200/`. The app will automatically reload if you change any of the source files. 8 | 9 | ## Code scaffolding 10 | 11 | Run `ng generate component component-name` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module`. 12 | 13 | ## Build 14 | 15 | Run `ng build` to build the project. The build artifacts will be stored in the `dist/` directory. Use the `-prod` flag for a production build. 16 | 17 | ## Running unit tests 18 | 19 | Run `ng test` to execute the unit tests via [Karma](https://karma-runner.github.io). 20 | 21 | ## Running end-to-end tests 22 | 23 | Run `ng e2e` to execute the end-to-end tests via [Protractor](http://www.protractortest.org/). 24 | 25 | ## Further help 26 | 27 | To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI README](https://github.com/angular/angular-cli/blob/master/README.md). 28 | -------------------------------------------------------------------------------- /employer-client/README.md: -------------------------------------------------------------------------------- 1 | # EmployerClient 2 | 3 | This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 1.7.4. 4 | 5 | ## Development server 6 | 7 | Run `ng serve` for a dev server. Navigate to `http://localhost:4200/`. The app will automatically reload if you change any of the source files. 8 | 9 | ## Code scaffolding 10 | 11 | Run `ng generate component component-name` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module`. 12 | 13 | ## Build 14 | 15 | Run `ng build` to build the project. The build artifacts will be stored in the `dist/` directory. Use the `-prod` flag for a production build. 16 | 17 | ## Running unit tests 18 | 19 | Run `ng test` to execute the unit tests via [Karma](https://karma-runner.github.io). 20 | 21 | ## Running end-to-end tests 22 | 23 | Run `ng e2e` to execute the end-to-end tests via [Protractor](http://www.protractortest.org/). 24 | 25 | ## Further help 26 | 27 | To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI README](https://github.com/angular/angular-cli/blob/master/README.md). 28 | -------------------------------------------------------------------------------- /client/src/app/components/company-detail/company-detail.component.html: -------------------------------------------------------------------------------- 1 |
2 | 3 |

{{company.cname}}

4 | 5 |
6 |

Location

7 |

{{company.clocation}}

8 |
9 | 10 |
11 |

Industry

12 |

{{company.industry}}

13 |
14 | 15 | 33 | 34 |
35 | 36 | -------------------------------------------------------------------------------- /client/src/app/components/company-list/company-list.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit} from '@angular/core'; 2 | import { ActivatedRoute, Params } from '@angular/router'; 3 | 4 | import { AuthService } from '../../services/auth.service'; 5 | import { SearchService } from '../../services/search.service'; 6 | import { ConnectionService } from '../../services/connection.service'; 7 | 8 | 9 | @Component({ 10 | selector: 'app-company-list', 11 | templateUrl: './company-list.component.html', 12 | styleUrls: ['./company-list.component.css'] 13 | }) 14 | export class CompanyListComponent implements OnInit { 15 | 16 | companies: any; 17 | 18 | constructor(private route: ActivatedRoute, 19 | private auth: AuthService, 20 | private searchService: SearchService) { } 21 | 22 | ngOnInit() { 23 | this.route.params.subscribe(params => { 24 | this.getCompanySearchList(params['keyword']); 25 | }); 26 | } 27 | 28 | getCompanySearchList(keyword: string) { 29 | this.searchService.findCompaniesByKeyword(keyword) 30 | .then(companies => { 31 | this.companies = companies; 32 | }); 33 | } 34 | 35 | } 36 | -------------------------------------------------------------------------------- /client/src/app/components/login/login.component.html: -------------------------------------------------------------------------------- 1 |
2 | 30 |
-------------------------------------------------------------------------------- /employer-client/src/app/components/login/login.component.html: -------------------------------------------------------------------------------- 1 |
2 | 30 |
-------------------------------------------------------------------------------- /employer-client/src/app/components/push-filter-modal/push-filter-modal.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit, Input } from '@angular/core'; 2 | 3 | import { JobService } from '../../services/job.service'; 4 | 5 | declare var $: any; 6 | 7 | const DEFAULT_FILTER = Object.freeze({ 8 | university: "", 9 | degree: "BS, MS, PhD", 10 | major: "", 11 | gpa: 0, 12 | skill: "", 13 | keyword: "" 14 | }); 15 | 16 | @Component({ 17 | selector: 'app-push-filter-modal', 18 | templateUrl: './push-filter-modal.component.html', 19 | styleUrls: ['./push-filter-modal.component.css'] 20 | }) 21 | export class PushFilterModalComponent implements OnInit { 22 | 23 | @Input() jid: string; 24 | 25 | degrees: string[] = ['BS, MS, PhD', 'MS, PhD', 'PhD']; 26 | 27 | filter = Object.assign({}, DEFAULT_FILTER); 28 | 29 | constructor(private jobService: JobService) { } 30 | 31 | ngOnInit() { 32 | } 33 | 34 | sendJobNotifications(jid: string, filter: any) { 35 | console.log(jid); 36 | console.log(filter); 37 | this.jobService.sendJobNotifications(jid, filter) 38 | .then(res => $('#push-filter-modal').modal('toggle')); 39 | this.filter = Object.assign({}, DEFAULT_FILTER); 40 | } 41 | 42 | } 43 | -------------------------------------------------------------------------------- /client/src/app/components/company-job-list/company-job-list.component.html: -------------------------------------------------------------------------------- 1 |
2 | 3 |

All Posted Jobs

4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 27 | 28 | 29 |
Job TitleLocationSalaryPost Time
{{job.title}}{{job.jlocation}}{{job.salary}}{{job.posttime}} 22 | 26 |
30 | 31 | 37 |
-------------------------------------------------------------------------------- /client/src/app/components/job-list/job-list.component.html: -------------------------------------------------------------------------------- 1 |
2 | 3 |

Search Results

4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 29 | 30 | 31 |
Job TitleCompanyLocationSalaryPost Time
{{job.title}}{{job.cname}}{{job.jlocation}}{{job.salary}}{{job.posttime}} 24 | 28 |
32 |
-------------------------------------------------------------------------------- /client/src/app/components/friend-list-modal/friend-list-modal.component.html: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /client/src/app/components/company-job-list/company-job-list.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | import { Location } from '@angular/common'; 3 | import { ActivatedRoute, Params } from '@angular/router'; 4 | 5 | import { AuthService } from '../../services/auth.service'; 6 | import { SearchService } from '../../services/search.service'; 7 | 8 | @Component({ 9 | selector: 'app-company-job-list', 10 | templateUrl: './company-job-list.component.html', 11 | styleUrls: ['./company-job-list.component.css'] 12 | }) 13 | export class CompanyJobListComponent implements OnInit { 14 | 15 | jobs: any; 16 | cid: string = ""; 17 | 18 | constructor(private _location: Location, 19 | private route: ActivatedRoute, 20 | private auth: AuthService, 21 | private searchService: SearchService) { } 22 | 23 | ngOnInit() { 24 | this.route.params.subscribe(params => { 25 | this.cid = params['cid']; 26 | this.getCompanyJobList(this.cid); 27 | }); 28 | } 29 | 30 | getCompanyJobList(cid: string) { 31 | this.searchService.getJobList(cid) 32 | .then(jobs => { 33 | this.jobs = jobs; 34 | }); 35 | } 36 | 37 | backToLastPage() { 38 | this._location.back(); 39 | } 40 | 41 | } 42 | -------------------------------------------------------------------------------- /employer-client/src/app/components/student-detail/student-detail.component.html: -------------------------------------------------------------------------------- 1 |
2 | 3 |

{{student.sname}}

4 | 5 |
6 |

University

7 |

{{student.university}}

8 |
9 | 10 |
11 |

Degree

12 |

{{student.degree}}

13 |
14 | 15 |
16 |

Major

17 |

{{student.major}}

18 |
19 | 20 |
21 |

Skills

22 |

{{student.skill}}

23 |
24 | 25 |
26 |

GPA

27 |

{{student.gpa}}

28 |
29 | 30 |
31 |

Resume

32 | 35 |
36 | 37 | 43 | 44 |
-------------------------------------------------------------------------------- /employer-client/src/app/components/company-profile/company-profile.component.html: -------------------------------------------------------------------------------- 1 |
2 |

My Profile

3 |
4 |
5 | 6 |
7 | 8 |

{{companyInfo.cid}}

9 |
10 | 11 |
12 | 13 | 15 |
16 | 17 |
18 | 19 | 21 |
22 | 23 |
24 | 25 | 27 |
28 | 29 |
30 |
31 | 32 | 38 |
39 | 40 |
41 |
-------------------------------------------------------------------------------- /client/src/app/components/friend-list-modal/friend-list-modal.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit, Input } from '@angular/core'; 2 | 3 | import { AuthService } from '../../services/auth.service'; 4 | import { ConnectionService } from '../../services/connection.service'; 5 | import { JobService } from '../../services/job.service'; 6 | 7 | declare var $: any; 8 | 9 | @Component({ 10 | selector: 'app-friend-list-modal', 11 | templateUrl: './friend-list-modal.component.html', 12 | styleUrls: ['./friend-list-modal.component.css'] 13 | }) 14 | export class FriendListModalComponent implements OnInit { 15 | 16 | @Input() jid: string; 17 | 18 | sender: string = this.auth.getSid(); 19 | 20 | students: any; 21 | 22 | constructor(private auth: AuthService, 23 | private connectionService: ConnectionService, 24 | private jobService: JobService) { } 25 | 26 | ngOnInit() { 27 | this.getFriendList(this.sender); 28 | } 29 | 30 | getFriendList(sid: string) { 31 | this.connectionService.getFriendList(sid) 32 | .then(students => { 33 | this.students = students; 34 | }); 35 | } 36 | 37 | forwardJob(jid: string, sender: string, receiver: string) { 38 | this.jobService.forwardJob(jid, sender, receiver) 39 | .then(res => $('#friend-list-modal').modal('toggle')); 40 | } 41 | 42 | } 43 | -------------------------------------------------------------------------------- /client/src/app/components/navbar/navbar.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | import { Router } from '@angular/router'; 3 | import { FormControl } from '@angular/forms'; 4 | import { Subscription } from 'rxjs/Subscription'; 5 | 6 | import { AuthService } from '../../services/auth.service'; 7 | import { MessageService } from '../../services/message.service'; 8 | 9 | @Component({ 10 | selector: 'app-navbar', 11 | templateUrl: './navbar.component.html', 12 | styleUrls: ['./navbar.component.css'] 13 | }) 14 | export class NavbarComponent implements OnInit { 15 | 16 | sid: string = this.auth.getSid(); 17 | 18 | searchInput: string = ""; 19 | 20 | subscriptionMessageNum: Subscription; 21 | msg_num: number = 0; 22 | 23 | constructor(private router: Router, 24 | private auth: AuthService, 25 | private messageService: MessageService) { } 26 | 27 | ngOnInit() { 28 | this.getNewMessageNum(this.sid); 29 | } 30 | 31 | ngOnDestory() { 32 | this.subscriptionMessageNum.unsubscribe(); 33 | } 34 | 35 | getNewMessageNum(me: string) { 36 | this.messageService.getNewMessageCount(me) 37 | .subscribe(cnt => { 38 | this.msg_num = cnt; 39 | }); 40 | } 41 | 42 | logout() { 43 | this.auth.deauthenticateUser(); 44 | window.location.reload(); 45 | } 46 | 47 | } 48 | -------------------------------------------------------------------------------- /client/src/app/components/friend-list/friend-list.component.html: -------------------------------------------------------------------------------- 1 |
2 | 3 |

All Connections

4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 30 | 31 | 32 | 33 |
NameUniversityDegreeMajorSkills
{{student.sname}}{{student.university}}{{student.degree}}{{student.major}}{{student.skill}} 25 | 29 |
34 |
-------------------------------------------------------------------------------- /client/src/app/components/student-list/student-list.component.html: -------------------------------------------------------------------------------- 1 |
2 | 3 |

Search Results

4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 30 | 31 | 32 | 33 |
NameUniversityDegreeMajorSkills
{{student.sname}}{{student.university}}{{student.degree}}{{student.major}}{{student.skill}} 25 | 29 |
34 |
-------------------------------------------------------------------------------- /client/src/app/components/signup/signup.component.html: -------------------------------------------------------------------------------- 1 |
2 | 29 |
30 | 31 | -------------------------------------------------------------------------------- /client/src/app/components/invitation-list/invitation-list.component.html: -------------------------------------------------------------------------------- 1 |
2 |

New Invitations

3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 23 | 29 | 30 | 31 | 32 |
NameUniversity
{{invitation.sname}}{{invitation.university}} 18 | 22 | 24 | 28 |
33 |
34 | -------------------------------------------------------------------------------- /server/routes/auth.js: -------------------------------------------------------------------------------- 1 | const express = require('express'); 2 | const router = express.Router(); 3 | 4 | const authService = require('../services/authService'); 5 | 6 | // student login 7 | router.post('/student-login', (req, res) => { 8 | const sid = req.body.sid; 9 | const password = req.body.password; 10 | authService.studentLogin(sid, password).then( 11 | result => res.json(result), 12 | error => res.status(400).send(error)); 13 | }); 14 | 15 | // sign up a student 16 | router.post('/student-signup', (req, res) => { 17 | const name = req.body.name; 18 | const password = req.body.password; 19 | authService.addStudent(name, password).then( 20 | result => res.json(result), 21 | error => res.status(400).send(error)); 22 | }); 23 | 24 | // company login 25 | router.post('/company-login', (req, res) => { 26 | const cid = req.body.cid; 27 | const password = req.body.password; 28 | authService.companyLogin(cid, password).then( 29 | result => res.json(result), 30 | error => res.status(400).send(error)); 31 | }); 32 | 33 | // sign up a company 34 | router.post('/company-signup', (req, res) => { 35 | const name = req.body.name; 36 | const password = req.body.password; 37 | authService.addCompany(name, password).then( 38 | result => res.json(result), 39 | error => res.status(400).send(error)); 40 | }); 41 | 42 | 43 | module.exports = router; -------------------------------------------------------------------------------- /server/server.js: -------------------------------------------------------------------------------- 1 | const express = require('express'); 2 | const app = express(); 3 | 4 | const path = require('path'); 5 | const http = require('http'); 6 | 7 | const bodyParser = require('body-parser') 8 | app.use( bodyParser.json() ); 9 | app.use(bodyParser.urlencoded({ 10 | extended: true 11 | })); 12 | 13 | const auth = require('./routes/auth'); 14 | const connection = require('./routes/connection'); 15 | const info = require('./routes/info'); 16 | const job = require('./routes/job'); 17 | 18 | app.use('/s/api/v1', auth); 19 | app.use('/s/api/v1', connection); 20 | app.use('/s/api/v1', info); 21 | app.use('/s/api/v1', job); 22 | 23 | app.use('/c/api/v1', auth); 24 | app.use('/c/api/v1', connection); 25 | app.use('/c/api/v1', info); 26 | app.use('/c/api/v1', job); 27 | 28 | app.use('/s', express.static(path.join(__dirname, '../public'))); 29 | app.use('/c', express.static(path.join(__dirname, '../public_employer'))); 30 | 31 | const server = http.createServer(app); 32 | server.listen(3000); 33 | server.on('listening', onListening); 34 | 35 | function onListening() { 36 | console.log('App listening on port 3000!') 37 | } 38 | 39 | app.use('/s', (req, res) => { 40 | res.sendFile('index.html', { root: path.join(__dirname, '../public') }); 41 | }); 42 | app.use('/c', (req, res) => { 43 | res.sendFile('index.html', { root: path.join(__dirname, '../public_employer') }); 44 | }); 45 | 46 | app.use('/', (req, res) => { 47 | res.redirect('/s'); 48 | }); 49 | -------------------------------------------------------------------------------- /employer-client/src/app/components/signup/signup.component.html: -------------------------------------------------------------------------------- 1 |
2 | 30 |
31 | 32 | -------------------------------------------------------------------------------- /employer-client/src/app/components/company-profile/company-profile.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | import { Location } from '@angular/common'; 3 | 4 | import { AuthService } from '../../services/auth.service'; 5 | import { SearchService } from '../../services/search.service'; 6 | 7 | @Component({ 8 | selector: 'app-company-profile', 9 | templateUrl: './company-profile.component.html', 10 | styleUrls: ['./company-profile.component.css'] 11 | }) 12 | export class CompanyProfileComponent implements OnInit { 13 | 14 | cid: string = this.auth.getCid(); 15 | 16 | companyInfo = { 17 | cid: "", 18 | cname: "", 19 | clocation: "", 20 | industry: "" 21 | }; 22 | 23 | constructor(private _location: Location, 24 | private auth: AuthService, 25 | private searchService: SearchService) { } 26 | 27 | ngOnInit() { 28 | this.getCompanyProfile(this.cid); 29 | } 30 | 31 | getCompanyProfile(cid: string) { 32 | this.searchService.findCompanyById(cid) 33 | .then(companyInfo => { 34 | this.companyInfo.cid = companyInfo[0]['cid']; 35 | this.companyInfo.cname = companyInfo[0]['cname']; 36 | this.companyInfo.clocation = companyInfo[0]['clocation']; 37 | this.companyInfo.industry = companyInfo[0]['industry']; 38 | }); 39 | } 40 | 41 | updateCompanyProfile(companyInfo: any) { 42 | this.searchService.updateCompanyProfile(companyInfo) 43 | .then(res => window.location.reload()); 44 | } 45 | 46 | } 47 | -------------------------------------------------------------------------------- /client/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "client", 3 | "version": "0.0.0", 4 | "license": "MIT", 5 | "scripts": { 6 | "ng": "ng", 7 | "start": "ng serve", 8 | "build": "ng build --prod", 9 | "test": "ng test", 10 | "lint": "ng lint", 11 | "e2e": "ng e2e" 12 | }, 13 | "private": true, 14 | "dependencies": { 15 | "@angular/animations": "^5.2.0", 16 | "@angular/common": "^5.2.0", 17 | "@angular/compiler": "^5.2.0", 18 | "@angular/core": "^5.2.0", 19 | "@angular/forms": "^5.2.0", 20 | "@angular/http": "^5.2.0", 21 | "@angular/platform-browser": "^5.2.0", 22 | "@angular/platform-browser-dynamic": "^5.2.0", 23 | "@angular/router": "^5.2.0", 24 | "bootstrap": "^3.3.7", 25 | "core-js": "^2.4.1", 26 | "jquery": "^3.3.1", 27 | "rxjs": "^5.5.6", 28 | "zone.js": "^0.8.19" 29 | }, 30 | "devDependencies": { 31 | "@angular/cli": "~1.7.4", 32 | "@angular/compiler-cli": "^5.2.0", 33 | "@angular/language-service": "^5.2.0", 34 | "@types/jasmine": "~2.8.3", 35 | "@types/jasminewd2": "~2.0.2", 36 | "@types/node": "~6.0.60", 37 | "codelyzer": "^4.0.1", 38 | "jasmine-core": "~2.8.0", 39 | "jasmine-spec-reporter": "~4.2.1", 40 | "karma": "~2.0.0", 41 | "karma-chrome-launcher": "~2.2.0", 42 | "karma-coverage-istanbul-reporter": "^1.2.1", 43 | "karma-jasmine": "~1.1.0", 44 | "karma-jasmine-html-reporter": "^0.2.2", 45 | "protractor": "~5.1.2", 46 | "ts-node": "~4.1.0", 47 | "tslint": "~5.9.1", 48 | "typescript": "~2.5.3" 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /employer-client/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "employer-client", 3 | "version": "0.0.0", 4 | "license": "MIT", 5 | "scripts": { 6 | "ng": "ng", 7 | "start": "ng serve", 8 | "build": "ng build --prod", 9 | "test": "ng test", 10 | "lint": "ng lint", 11 | "e2e": "ng e2e" 12 | }, 13 | "private": true, 14 | "dependencies": { 15 | "@angular/animations": "^5.2.0", 16 | "@angular/common": "^5.2.0", 17 | "@angular/compiler": "^5.2.0", 18 | "@angular/core": "^5.2.0", 19 | "@angular/forms": "^5.2.0", 20 | "@angular/http": "^5.2.0", 21 | "@angular/platform-browser": "^5.2.0", 22 | "@angular/platform-browser-dynamic": "^5.2.0", 23 | "@angular/router": "^5.2.0", 24 | "bootstrap": "^3.3.7", 25 | "core-js": "^2.4.1", 26 | "jquery": "^3.3.1", 27 | "rxjs": "^5.5.6", 28 | "zone.js": "^0.8.19" 29 | }, 30 | "devDependencies": { 31 | "@angular/cli": "~1.7.4", 32 | "@angular/compiler-cli": "^5.2.0", 33 | "@angular/language-service": "^5.2.0", 34 | "@types/jasmine": "~2.8.3", 35 | "@types/jasminewd2": "~2.0.2", 36 | "@types/node": "~6.0.60", 37 | "codelyzer": "^4.0.1", 38 | "jasmine-core": "~2.8.0", 39 | "jasmine-spec-reporter": "~4.2.1", 40 | "karma": "~2.0.0", 41 | "karma-chrome-launcher": "~2.2.0", 42 | "karma-coverage-istanbul-reporter": "^1.2.1", 43 | "karma-jasmine": "~1.1.0", 44 | "karma-jasmine-html-reporter": "^0.2.2", 45 | "protractor": "~5.1.2", 46 | "ts-node": "~4.1.0", 47 | "tslint": "~5.9.1", 48 | "typescript": "~2.5.3" 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /client/src/app/components/signup/signup.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | import { Router } from '@angular/router'; 3 | 4 | import { AuthService } from '../../services/auth.service'; 5 | 6 | declare var $: any; 7 | 8 | @Component({ 9 | selector: 'app-signup', 10 | templateUrl: './signup.component.html', 11 | styleUrls: ['./signup.component.css'] 12 | }) 13 | export class SignupComponent implements OnInit { 14 | 15 | error: string = ""; 16 | 17 | sid: string = ""; 18 | sname: string = ""; 19 | password: string = ""; 20 | confirm_password: string = ""; 21 | 22 | constructor(private router: Router, 23 | private auth: AuthService) { } 24 | 25 | ngOnInit() { 26 | } 27 | 28 | submitForm() { 29 | this.error = ""; 30 | this.checkSubmit(); 31 | 32 | if (!this.error) { 33 | this.auth.signUp(this.sname, this.password).then(res => { 34 | if (res.error) { 35 | this.error = res.error; 36 | } else { 37 | this.sid = res.sid; 38 | } 39 | if (!this.error) { 40 | $('#signup-success').modal('show'); 41 | } 42 | }); 43 | } 44 | } 45 | 46 | checkSubmit() { 47 | if (!this.sname || !this.password || !this.confirm_password) { 48 | this.error = "Please fill in all blanks!"; 49 | } else if (this.password.length < 6) { 50 | this.error = "Password should be no less than 6 characters!"; 51 | } else if (this.password !== this.confirm_password) { 52 | this.error = "Passwords don't match!"; 53 | } 54 | } 55 | 56 | } 57 | -------------------------------------------------------------------------------- /employer-client/src/app/components/signup/signup.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | import { Router } from '@angular/router'; 3 | 4 | import { AuthService } from '../../services/auth.service'; 5 | 6 | declare var $: any; 7 | 8 | @Component({ 9 | selector: 'app-signup', 10 | templateUrl: './signup.component.html', 11 | styleUrls: ['./signup.component.css'] 12 | }) 13 | export class SignupComponent implements OnInit { 14 | 15 | error: string = ""; 16 | 17 | cid: string = ""; 18 | cname: string = ""; 19 | password: string = ""; 20 | confirm_password: string = ""; 21 | 22 | constructor(private router: Router, 23 | private auth: AuthService) { } 24 | 25 | ngOnInit() { 26 | } 27 | 28 | submitForm() { 29 | this.error = ""; 30 | this.checkSubmit(); 31 | 32 | if (!this.error) { 33 | this.auth.signUp(this.cname, this.password).then(res => { 34 | if (res.error) { 35 | this.error = res.error; 36 | } else { 37 | this.cid = res.cid; 38 | } 39 | if (!this.error) { 40 | $('#signup-success').modal('show'); 41 | } 42 | }); 43 | } 44 | } 45 | 46 | checkSubmit() { 47 | if (!this.cname || !this.password || !this.confirm_password) { 48 | this.error = "Please fill in all blanks!"; 49 | } else if (this.password.length < 6) { 50 | this.error = "Password should be no less than 6 characters!"; 51 | } else if (this.password !== this.confirm_password) { 52 | this.error = "Passwords don't match!"; 53 | } 54 | } 55 | 56 | } 57 | -------------------------------------------------------------------------------- /employer-client/src/app/components/job-list/job-list.component.html: -------------------------------------------------------------------------------- 1 |
2 | 3 |

All Posted Jobs

4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 29 | 35 | 41 | 42 | 43 |
Job TitleLocationSalaryPost Time
{{job.title}}{{job.jlocation}}{{job.salary}}{{job.posttime}} 24 | 28 | 30 | 34 | 36 | 40 |
44 |
45 | 46 | -------------------------------------------------------------------------------- /client/src/app/components/student-detail/student-detail.component.html: -------------------------------------------------------------------------------- 1 |
2 | 3 |

{{student.sname}}

4 | 5 |
6 |

University

7 |

{{student.university}}

8 |
9 | 10 |
11 |

Degree

12 |

{{student.degree}}

13 |
14 | 15 |
16 |

Major

17 |

{{student.major}}

18 |
19 | 20 |
21 |

Skills

22 |

{{student.skill}}

23 |
24 | 25 |
26 |

GPA

27 |

{{student.gpa}}

28 |
29 | 30 |
31 |

Resume

32 | 35 |
36 | 37 | 51 | 52 |
-------------------------------------------------------------------------------- /client/src/app/components/message-list/message-list.component.html: -------------------------------------------------------------------------------- 1 |
2 |

New Message

3 |
4 | 8 | 12 |
13 |
14 | 15 |
16 | 17 |

No Messages

18 | 19 | 20 |
21 |
22 |
23 |
24 | {{message.sname}} wrote: 25 | {{message.mtime}} 26 |
27 |
28 | {{message.content}} 29 |
30 |
31 |
32 |
33 | 34 |
35 |
36 |
37 |
38 | I wrote: 39 | {{message.mtime}} 40 |
41 |
42 | {{message.content}} 43 |
44 |
45 |
46 |
47 |
48 | 49 |
-------------------------------------------------------------------------------- /client/.angular-cli.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "./node_modules/@angular/cli/lib/config/schema.json", 3 | "project": { 4 | "name": "client" 5 | }, 6 | "apps": [ 7 | { 8 | "root": "src", 9 | "outDir": "../public", 10 | "deployUrl": "/s/", 11 | "assets": [ 12 | "assets", 13 | "favicon.png" 14 | ], 15 | "index": "index.html", 16 | "main": "main.ts", 17 | "polyfills": "polyfills.ts", 18 | "test": "test.ts", 19 | "tsconfig": "tsconfig.app.json", 20 | "testTsconfig": "tsconfig.spec.json", 21 | "prefix": "app", 22 | "styles": [ 23 | "styles.css", 24 | "../node_modules/bootstrap/dist/css/bootstrap.min.css" 25 | ], 26 | "scripts": [ 27 | "../node_modules/jquery/dist/jquery.js", 28 | "../node_modules/bootstrap/dist/js/bootstrap.js" 29 | ], 30 | "environmentSource": "environments/environment.ts", 31 | "environments": { 32 | "dev": "environments/environment.ts", 33 | "prod": "environments/environment.prod.ts" 34 | } 35 | } 36 | ], 37 | "e2e": { 38 | "protractor": { 39 | "config": "./protractor.conf.js" 40 | } 41 | }, 42 | "lint": [ 43 | { 44 | "project": "src/tsconfig.app.json", 45 | "exclude": "**/node_modules/**" 46 | }, 47 | { 48 | "project": "src/tsconfig.spec.json", 49 | "exclude": "**/node_modules/**" 50 | }, 51 | { 52 | "project": "e2e/tsconfig.e2e.json", 53 | "exclude": "**/node_modules/**" 54 | } 55 | ], 56 | "test": { 57 | "karma": { 58 | "config": "./karma.conf.js" 59 | } 60 | }, 61 | "defaults": { 62 | "styleExt": "css", 63 | "component": {} 64 | } 65 | } 66 | -------------------------------------------------------------------------------- /employer-client/.angular-cli.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "./node_modules/@angular/cli/lib/config/schema.json", 3 | "project": { 4 | "name": "employer-client" 5 | }, 6 | "apps": [ 7 | { 8 | "root": "src", 9 | "outDir": "../public_employer", 10 | "deployUrl": "/c/", 11 | "assets": [ 12 | "assets", 13 | "favicon.ico" 14 | ], 15 | "index": "index.html", 16 | "main": "main.ts", 17 | "polyfills": "polyfills.ts", 18 | "test": "test.ts", 19 | "tsconfig": "tsconfig.app.json", 20 | "testTsconfig": "tsconfig.spec.json", 21 | "prefix": "app", 22 | "styles": [ 23 | "styles.css", 24 | "../node_modules/bootstrap/dist/css/bootstrap.min.css" 25 | ], 26 | "scripts": [ 27 | "../node_modules/jquery/dist/jquery.js", 28 | "../node_modules/bootstrap/dist/js/bootstrap.js" 29 | ], 30 | "environmentSource": "environments/environment.ts", 31 | "environments": { 32 | "dev": "environments/environment.ts", 33 | "prod": "environments/environment.prod.ts" 34 | } 35 | } 36 | ], 37 | "e2e": { 38 | "protractor": { 39 | "config": "./protractor.conf.js" 40 | } 41 | }, 42 | "lint": [ 43 | { 44 | "project": "src/tsconfig.app.json", 45 | "exclude": "**/node_modules/**" 46 | }, 47 | { 48 | "project": "src/tsconfig.spec.json", 49 | "exclude": "**/node_modules/**" 50 | }, 51 | { 52 | "project": "e2e/tsconfig.e2e.json", 53 | "exclude": "**/node_modules/**" 54 | } 55 | ], 56 | "test": { 57 | "karma": { 58 | "config": "./karma.conf.js" 59 | } 60 | }, 61 | "defaults": { 62 | "styleExt": "css", 63 | "component": {} 64 | } 65 | } 66 | -------------------------------------------------------------------------------- /employer-client/src/app/components/application-list/application-list.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | import { Location } from '@angular/common'; 3 | import { ActivatedRoute, Params } from '@angular/router'; 4 | 5 | import { AuthService } from '../../services/auth.service'; 6 | import { SearchService } from '../../services/search.service'; 7 | import { JobService } from '../../services/job.service'; 8 | 9 | @Component({ 10 | selector: 'app-application-list', 11 | templateUrl: './application-list.component.html', 12 | styleUrls: ['./application-list.component.css'] 13 | }) 14 | export class ApplicationListComponent implements OnInit { 15 | 16 | status: string[] = ['undecided', 'selected', 'rejected']; 17 | 18 | cid: string = this.auth.getCid(); 19 | jid: string = ""; 20 | 21 | students: any; 22 | 23 | constructor(private _location: Location, 24 | private route: ActivatedRoute, 25 | private auth: AuthService, 26 | private searchService: SearchService, 27 | private jobService: JobService) { } 28 | 29 | ngOnInit() { 30 | this.route.params.subscribe(params => { 31 | this.jid = params['jid']; 32 | this.getApplicationList(this.jid); 33 | }); 34 | } 35 | 36 | getApplicationList(jid: string) { 37 | this.jobService.getApplicationList(jid) 38 | .then(students => { 39 | this.students = students; 40 | }); 41 | } 42 | 43 | handleApplication(jid: string, sid: string, appstatus: string) { 44 | console.log(this.students) 45 | this.jobService.handleApplication(jid, sid, appstatus) 46 | .then(res => window.location.reload()); 47 | } 48 | 49 | backToLastPage() { 50 | this._location.back(); 51 | } 52 | 53 | } 54 | -------------------------------------------------------------------------------- /client/src/app/components/student-home/student-home.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | import { Router } from '@angular/router'; 3 | 4 | import { AuthService } from '../../services/auth.service'; 5 | import { JobService } from '../../services/job.service'; 6 | 7 | @Component({ 8 | selector: 'app-student-home', 9 | templateUrl: './student-home.component.html', 10 | styleUrls: ['./student-home.component.css'] 11 | }) 12 | export class StudentHomeComponent implements OnInit { 13 | 14 | sid: string = this.auth.getSid(); 15 | 16 | notifications: any; 17 | forwards: any; 18 | 19 | constructor(private router: Router, 20 | private auth: AuthService, 21 | private jobService: JobService) { } 22 | 23 | ngOnInit() { 24 | this.getJobNotifications(this.sid); 25 | this.getJobNoForwards(this.sid); 26 | } 27 | 28 | getJobNotifications(sid: string) { 29 | this.jobService.getJobNotifications(sid) 30 | .then(notifications => { 31 | this.notifications = notifications; 32 | }); 33 | } 34 | 35 | getJobNoForwards(sid: string) { 36 | this.jobService.getJobForwards(sid) 37 | .then(forwards => { 38 | this.forwards = forwards; 39 | }); 40 | } 41 | 42 | showNotificationDetail(jid: string, sid: string, time: string) { 43 | this.jobService.updateJobNotificationStatus(jid, sid, time) 44 | .then(res => { 45 | this.router.navigateByUrl('/job-detail/' + jid); 46 | }); 47 | } 48 | 49 | showForwardDetail(jid: string, sender: string, receiver: string, time: string) { 50 | this.jobService.updateJobForwardStatus(jid, sender, receiver, time) 51 | .then(res => { 52 | this.router.navigateByUrl('/job-detail/' + jid); 53 | }); 54 | } 55 | 56 | } 57 | -------------------------------------------------------------------------------- /employer-client/src/app/services/auth.service.ts: -------------------------------------------------------------------------------- 1 | import { Injectable } from '@angular/core'; 2 | import { HttpClient, HttpHeaders, HttpResponse } from '@angular/common/http'; 3 | 4 | 5 | @Injectable() 6 | export class AuthService { 7 | 8 | constructor(private httpClient: HttpClient) { } 9 | 10 | authenticateUser(token: string, cid: string) { 11 | localStorage.setItem('ctoken', token); 12 | localStorage.setItem('cid', cid); 13 | } 14 | 15 | isUserAuthenticated(): boolean { 16 | return localStorage.getItem('ctoken') !== null; 17 | } 18 | 19 | deauthenticateUser() { 20 | localStorage.removeItem('ctoken'); 21 | localStorage.removeItem('cid'); 22 | } 23 | 24 | getToken(): string { 25 | return localStorage.getItem('ctoken'); 26 | } 27 | 28 | getCid(): string { 29 | return localStorage.getItem('cid'); 30 | } 31 | 32 | signUp(cname: string, password: string) { 33 | const body = { 34 | name: cname, 35 | password: password, 36 | }; 37 | const options = { headers: new HttpHeaders({'Connect-Type': 'application/json'}) }; 38 | return this.httpClient.post(`api/v1/company-signup`, body, options) 39 | .toPromise() 40 | .then((res: any) => res) 41 | .catch(this.handleError); 42 | } 43 | 44 | logIn(cid: string, password: string) { 45 | const body = { 46 | cid: cid, 47 | password: password, 48 | }; 49 | const options = { headers: new HttpHeaders({'Connect-Type': 'application/json'}) }; 50 | return this.httpClient.post(`api/v1/company-login`, body, options) 51 | .toPromise() 52 | .then((res: any) => res) 53 | .catch(this.handleError); 54 | } 55 | 56 | private handleError(error: any): Promise { 57 | return Promise.reject(error.body || error); 58 | } 59 | 60 | } -------------------------------------------------------------------------------- /client/src/app/components/job-detail/job-detail.component.html: -------------------------------------------------------------------------------- 1 |
2 | 3 |

{{job.title}}

4 |
5 |
posted on: {{job.posttime}}
6 |
7 | 8 |
9 |

Company

10 |

{{job.cname}}

11 |
12 | 13 |
14 |

Location

15 |

{{job.jlocation}}

16 |
17 | 18 |
19 |

Salary

20 |

{{job.salary}}

21 |
22 | 23 |
24 |

Degree Constraints

25 |

{{job.academicbar}}

26 |
27 | 28 |
29 |

Major Constraints

30 |

{{job.majorbar}}

31 |
32 | 33 |
34 |

Job Description

35 |

{{job.desc}}

36 |
37 | 38 | 55 | 56 |
57 | 58 | -------------------------------------------------------------------------------- /client/src/app/services/auth.service.ts: -------------------------------------------------------------------------------- 1 | import { Injectable } from '@angular/core'; 2 | import { HttpClient, HttpHeaders, HttpResponse } from '@angular/common/http'; 3 | 4 | 5 | @Injectable() 6 | export class AuthService { 7 | 8 | constructor(private httpClient: HttpClient) { 9 | // this.authenticateUser('stoken', 's0001'); 10 | } 11 | 12 | authenticateUser(token: string, sid: string) { 13 | localStorage.setItem('stoken', token); 14 | localStorage.setItem('sid', sid); 15 | } 16 | 17 | isUserAuthenticated(): boolean { 18 | return localStorage.getItem('stoken') !== null; 19 | } 20 | 21 | deauthenticateUser() { 22 | localStorage.removeItem('stoken'); 23 | localStorage.removeItem('sid'); 24 | } 25 | 26 | getToken(): string { 27 | return localStorage.getItem('stoken'); 28 | } 29 | 30 | getSid(): string { 31 | return localStorage.getItem('sid'); 32 | // return 's0001'; 33 | } 34 | 35 | signUp(sname: string, password: string) { 36 | const body = { 37 | name: sname, 38 | password: password, 39 | }; 40 | const options = { headers: new HttpHeaders({'Connect-Type': 'application/json'}) }; 41 | return this.httpClient.post(`api/v1/student-signup`, body, options) 42 | .toPromise() 43 | .then((res: any) => res) 44 | .catch(this.handleError); 45 | } 46 | 47 | logIn(sid: string, password: string) { 48 | const body = { 49 | sid: sid, 50 | password: password, 51 | }; 52 | const options = { headers: new HttpHeaders({'Connect-Type': 'application/json'}) }; 53 | return this.httpClient.post(`api/v1/student-login`, body, options) 54 | .toPromise() 55 | .then((res: any) => res) 56 | .catch(this.handleError); 57 | } 58 | 59 | private handleError(error: any): Promise { 60 | return Promise.reject(error.body || error); 61 | } 62 | 63 | } -------------------------------------------------------------------------------- /client/src/app/components/invitation-list/invitation-list.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | 3 | import { AuthService } from '../../services/auth.service'; 4 | import { ConnectionService } from '../../services/connection.service'; 5 | 6 | @Component({ 7 | selector: 'app-invitation-list', 8 | templateUrl: './invitation-list.component.html', 9 | styleUrls: ['./invitation-list.component.css'] 10 | }) 11 | export class InvitationListComponent implements OnInit { 12 | 13 | receiver: string = this.auth.getSid(); 14 | 15 | invitations: any; 16 | 17 | isFriend: boolean = false; 18 | 19 | constructor(private auth: AuthService, 20 | private connectionService: ConnectionService) { } 21 | 22 | ngOnInit() { 23 | this.getInvitationList(this.receiver); 24 | } 25 | 26 | getInvitationList(sid: string) { 27 | this.connectionService.getInvitationList(sid) 28 | .then(invitations => { 29 | this.invitations = invitations; 30 | }); 31 | } 32 | 33 | checkFriend(sender: string, receiver: string) { 34 | this.connectionService.getFriendList(sender) 35 | .then(friends => { 36 | for (let friend of friends) { 37 | if (friend['sid'] === receiver) { 38 | this.isFriend = true; 39 | break; 40 | } 41 | } 42 | this.isFriend = false; 43 | }); 44 | } 45 | 46 | handleInvitation(sender: string, receiver: string, status: string) { 47 | this.checkFriend(sender, receiver); 48 | console.log(sender); 49 | if (this.isFriend) { 50 | window.alert("You are already connected!"); 51 | this.connectionService.handleFriendRequest(sender, receiver, 'declined') 52 | .then(res => window.location.reload()); 53 | } else { 54 | this.connectionService.handleFriendRequest(sender, receiver, status) 55 | .then(res => window.location.reload()); 56 | } 57 | } 58 | 59 | } 60 | -------------------------------------------------------------------------------- /employer-client/src/app/app.routes.ts: -------------------------------------------------------------------------------- 1 | import { Routes, RouterModule } from '@angular/router'; 2 | 3 | import { LoginComponent } from './components/login/login.component'; 4 | import { SignupComponent } from './components/signup/signup.component'; 5 | import { CompanyProfileComponent } from './components/company-profile/company-profile.component'; 6 | 7 | import { CompanyHomeComponent } from './components/company-home/company-home.component'; 8 | 9 | import { JobListComponent } from './components/job-list/job-list.component'; 10 | import { JobDetailComponent } from './components/job-detail/job-detail.component'; 11 | import { NewJobComponent } from './components/new-job/new-job.component'; 12 | 13 | import { ApplicationListComponent } from './components/application-list/application-list.component'; 14 | import { StudentDetailComponent } from './components/student-detail/student-detail.component'; 15 | 16 | 17 | const routes: Routes = [ 18 | { 19 | path: '', 20 | redirectTo: 'jobs', 21 | pathMatch: 'full' 22 | }, 23 | { 24 | path: 'login', 25 | component: LoginComponent 26 | }, 27 | { 28 | path: 'signup', 29 | component: SignupComponent 30 | }, 31 | { 32 | path: 'profile', 33 | component: CompanyProfileComponent 34 | }, 35 | { 36 | path: 'jobs', 37 | component: JobListComponent 38 | }, 39 | { 40 | path: 'jobs/:jid', 41 | component: JobDetailComponent 42 | }, 43 | { 44 | path: 'new-job', 45 | component: NewJobComponent 46 | }, 47 | { 48 | path: 'applications/:jid', 49 | component: ApplicationListComponent 50 | }, 51 | { 52 | path: 'student-detail/:sid', 53 | component: StudentDetailComponent 54 | }, 55 | { 56 | path: '**', 57 | redirectTo: '' 58 | } 59 | ] 60 | 61 | export const routing = RouterModule.forRoot(routes); -------------------------------------------------------------------------------- /client/src/app/components/message-list/message-list.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | import { ActivatedRoute, Params } from '@angular/router'; 3 | 4 | import { AuthService } from '../../services/auth.service'; 5 | import { MessageService } from '../../services/message.service'; 6 | 7 | @Component({ 8 | selector: 'app-message-list', 9 | templateUrl: './message-list.component.html', 10 | styleUrls: ['./message-list.component.css'] 11 | }) 12 | export class MessageListComponent implements OnInit { 13 | 14 | me: string = this.auth.getSid(); 15 | you: string = ""; 16 | 17 | messages: any; 18 | newMessage: string = ""; 19 | flag: boolean = false; 20 | 21 | constructor(private route: ActivatedRoute, 22 | private auth: AuthService, 23 | private messageService: MessageService) { } 24 | 25 | ngOnInit() { 26 | this.route.params.subscribe(params => { 27 | this.you = params['sid']; 28 | this.getMessages(this.me, this.you); 29 | }); 30 | } 31 | 32 | getMessages(me: string, you: string) { 33 | this.messageService.getMessageList(me, you) 34 | .then(messages => { 35 | if (messages.length === 0) { 36 | this.flag = true; 37 | } 38 | this.messages = messages; 39 | for (let m of this.messages) { 40 | if (m.mstatus === 'unread' && m.fid === me) { 41 | this.updateMessageStatus(m.sid, m.fid, m.mtime); 42 | } 43 | } 44 | }); 45 | } 46 | 47 | sendMessage(me: string, you: string, content: string) { 48 | if (this.newMessage) { 49 | this.messageService.sendMessage(me, you, content) 50 | .then(res => window.location.reload()); 51 | } 52 | } 53 | 54 | updateMessageStatus(sender: string, receiver: string, mtime: string) { 55 | this.messageService.updateMessageStatus(sender, receiver, mtime) 56 | .then(res => console.log('update as read')); 57 | } 58 | 59 | 60 | } 61 | -------------------------------------------------------------------------------- /employer-client/src/app/components/student-detail/student-detail.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | import { Location } from '@angular/common'; 3 | import { ActivatedRoute, Params } from '@angular/router'; 4 | 5 | import { AuthService } from '../../services/auth.service'; 6 | import { SearchService } from '../../services/search.service'; 7 | import { JobService } from '../../services/job.service'; 8 | 9 | @Component({ 10 | selector: 'app-student-detail', 11 | templateUrl: './student-detail.component.html', 12 | styleUrls: ['./student-detail.component.css'] 13 | }) 14 | export class StudentDetailComponent implements OnInit { 15 | 16 | cid: string = this.auth.getCid(); 17 | sid: string = ""; 18 | 19 | studentInfo: any; 20 | resume: any; 21 | 22 | isApplicant: boolean = false; 23 | 24 | constructor(private _location: Location, 25 | private route: ActivatedRoute, 26 | private auth: AuthService, 27 | private searchService: SearchService, 28 | private jobService: JobService) { } 29 | 30 | ngOnInit() { 31 | this.route.params.subscribe(params => { 32 | this.sid = params['sid']; 33 | this.getStudentInfo(this.sid); 34 | this.getResume(this.sid); 35 | this.checkApplicant(this.cid, this.sid); 36 | }); 37 | } 38 | 39 | getStudentInfo(sid: string) { 40 | this.searchService.findStudentById(sid) 41 | .then(studentInfo => { 42 | this.studentInfo = studentInfo; 43 | }); 44 | } 45 | 46 | getResume(sid: string) { 47 | this.searchService.getResumeById(sid).then( 48 | resume => this.resume = resume 49 | ); 50 | } 51 | 52 | checkApplicant(cid: string, sid: string) { 53 | this.jobService.checkApplicant(sid, cid) 54 | .then(res => { 55 | if (res[0].cnt != 0) { 56 | this.isApplicant = true; 57 | } 58 | }); 59 | } 60 | 61 | backToLastPage() { 62 | this._location.back(); 63 | } 64 | 65 | } 66 | -------------------------------------------------------------------------------- /employer-client/src/app/components/new-job/new-job.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | import { Location } from '@angular/common'; 3 | import { ActivatedRoute, Params } from '@angular/router'; 4 | 5 | import { AuthService } from '../../services/auth.service'; 6 | import { JobService } from '../../services/job.service'; 7 | import { SearchService } from '../../services/search.service'; 8 | 9 | declare var $: any; 10 | 11 | const DEFAULT_JOBINFO = Object.freeze({ 12 | cid: "", 13 | jlocation: "", 14 | title: "", 15 | salary: "0", 16 | academicbar: "BS, MS, PhD", 17 | majorbar: "", 18 | desc: "" 19 | }); 20 | 21 | @Component({ 22 | selector: 'app-new-job', 23 | templateUrl: './new-job.component.html', 24 | styleUrls: ['./new-job.component.css'] 25 | }) 26 | export class NewJobComponent implements OnInit { 27 | 28 | error: string = ""; 29 | degrees: string[] = ['BS, MS, PhD', 'MS, PhD', 'PhD']; 30 | 31 | cid: string = this.auth.getCid(); 32 | jid: string = ""; 33 | 34 | // jobInfo = { 35 | // cid: "", 36 | // jlocation: "", 37 | // title: "", 38 | // salary: "", 39 | // academicbar: "", 40 | // majorbar: "", 41 | // desc: "" 42 | // }; 43 | 44 | jobInfo = Object.assign({}, DEFAULT_JOBINFO); 45 | 46 | constructor(private _location: Location, 47 | private route: ActivatedRoute, 48 | private auth: AuthService, 49 | private searchService: SearchService, 50 | private jobService: JobService) { } 51 | 52 | ngOnInit() { 53 | } 54 | 55 | postJob(jobInfo: any) { 56 | jobInfo.cid = this.cid; 57 | this.jobService.postJob(jobInfo) 58 | .then(res => { 59 | if (res.error) { 60 | this.error = res.error; 61 | } else { 62 | this.jid = res.jid; 63 | } 64 | if (!this.error) { 65 | $('#new-job-success').modal('show'); 66 | } 67 | }); 68 | this.jobInfo = Object.assign({}, DEFAULT_JOBINFO); 69 | } 70 | 71 | backToLastPage() { 72 | this._location.back(); 73 | } 74 | 75 | } 76 | -------------------------------------------------------------------------------- /employer-client/src/app/components/new-job/new-job.component.html: -------------------------------------------------------------------------------- 1 |
2 |

New Job

3 |
4 |
5 | 6 |
7 | 8 | 10 |
11 | 12 |
13 | 14 | 16 |
17 | 18 |
19 | 20 | 22 |
23 | 24 |
25 | 26 | 32 |
33 | 34 |
35 | 36 | 38 |
39 | 40 |
41 | 42 | 45 |
46 | 47 |
48 |
49 | 50 | 60 |
61 | 62 |
63 |
64 | 65 | -------------------------------------------------------------------------------- /employer-client/src/app/services/search.service.ts: -------------------------------------------------------------------------------- 1 | import { Injectable } from '@angular/core'; 2 | import { HttpClient, HttpHeaders, HttpResponse } from '@angular/common/http'; 3 | 4 | @Injectable() 5 | export class SearchService { 6 | 7 | constructor(private httpClient: HttpClient) { } 8 | 9 | findCompanyById(cid: string): Promise { 10 | return this.httpClient.get(`api/v1/companies/${cid}`) 11 | .toPromise() 12 | .then((res: any) => res) 13 | .catch(this.handleError); 14 | } 15 | 16 | findStudentById(sid: string): Promise { 17 | return this.httpClient.get(`api/v1/students/${sid}`) 18 | .toPromise() 19 | .then((res: any) => res) 20 | .catch(this.handleError); 21 | } 22 | 23 | findStudentsByKeyword(keyword: string): Promise { 24 | const body = { keyword : keyword }; 25 | const options = { headers: new HttpHeaders({'Connect-Type': 'application/json'}) }; 26 | return this.httpClient.post(`api/v1/students/keywords`, body, options) 27 | .toPromise() 28 | .then((res: any) => res) 29 | .catch(this.handleError); 30 | } 31 | 32 | findJobById(jid: string): Promise { 33 | return this.httpClient.get(`api/v1/jobs/${jid}`) 34 | .toPromise() 35 | .then((res: any) => res) 36 | .catch(this.handleError); 37 | } 38 | 39 | updateCompanyProfile(companyInfo: any): Promise { 40 | const body = { 41 | cid: companyInfo.cid, 42 | cname: companyInfo.cname, 43 | clocation: companyInfo.clocation, 44 | industry: companyInfo.industry 45 | }; 46 | const options = { headers: new HttpHeaders({'Connect-Type': 'application/json'}) }; 47 | return this.httpClient.post(`api/v1/companies`, body, options) 48 | .toPromise() 49 | .then((res: any) => res) 50 | .catch(this.handleError); 51 | } 52 | 53 | getResumeById(sid: string): Promise { 54 | return this.httpClient.get(`api/v1/resumes/${sid}`, {'responseType': 'text'}) 55 | .toPromise() 56 | .then((res: any) => res) 57 | .catch(this.handleError); 58 | } 59 | 60 | private handleError(error: any): Promise { 61 | return Promise.reject(error.body || error); 62 | } 63 | 64 | } 65 | -------------------------------------------------------------------------------- /client/src/app/components/company-detail/company-detail.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | import { Location } from '@angular/common'; 3 | import { ActivatedRoute, Params } from '@angular/router'; 4 | 5 | import { AuthService } from '../../services/auth.service'; 6 | import { SearchService } from '../../services/search.service'; 7 | import { ConnectionService } from '../../services/connection.service'; 8 | 9 | @Component({ 10 | selector: 'app-company-detail', 11 | templateUrl: './company-detail.component.html', 12 | styleUrls: ['./company-detail.component.css'] 13 | }) 14 | export class CompanyDetailComponent implements OnInit { 15 | 16 | sid: string = this.auth.getSid(); 17 | cid: string = ""; 18 | 19 | companyInfo: any; 20 | 21 | isFollowing: boolean = false; 22 | 23 | constructor(private _location: Location, 24 | private route: ActivatedRoute, 25 | private auth: AuthService, 26 | private connectionService: ConnectionService, 27 | private searchService: SearchService) { } 28 | 29 | ngOnInit() { 30 | this.route.params.subscribe(params => { 31 | this.cid = params['cid']; 32 | this.getCompanyInfo(this.cid); 33 | this.checkFollowing(this.sid, this.cid); 34 | }); 35 | } 36 | 37 | getCompanyInfo(cid: string) { 38 | this.searchService.findCompanyById(cid) 39 | .then(companyInfo => { 40 | this.companyInfo = companyInfo; 41 | }); 42 | } 43 | 44 | checkFollowing(sid: string, cid: string) { 45 | this.connectionService.getFollowingList(sid) 46 | .then(followings => { 47 | for (let company of followings) { 48 | if (company['cid'] === cid) { 49 | this.isFollowing = true; 50 | break; 51 | } 52 | } 53 | }); 54 | } 55 | 56 | followCompany(sid: string, cid: string) { 57 | this.connectionService.followCompany(sid, cid) 58 | .then((res) => window.location.reload()); 59 | } 60 | 61 | unfollowCompany(sid: string, cid: string) { 62 | this.connectionService.unfollowCompany(sid, cid) 63 | .then((res) => window.location.reload()); 64 | } 65 | 66 | backToLastPage() { 67 | this._location.back(); 68 | } 69 | 70 | } 71 | -------------------------------------------------------------------------------- /client/src/app/components/student-detail/student-detail.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | import { Location } from '@angular/common'; 3 | import { ActivatedRoute, Params } from '@angular/router'; 4 | 5 | import { AuthService } from '../../services/auth.service'; 6 | import { SearchService } from '../../services/search.service'; 7 | import { ConnectionService } from '../../services/connection.service'; 8 | 9 | @Component({ 10 | selector: 'app-student-detail', 11 | templateUrl: './student-detail.component.html', 12 | styleUrls: ['./student-detail.component.css'] 13 | }) 14 | export class StudentDetailComponent implements OnInit { 15 | 16 | sender: string = this.auth.getSid(); 17 | receiver: string = ""; 18 | 19 | studentInfo: any; 20 | resume: any; 21 | 22 | isFriend: boolean = false; 23 | 24 | constructor(private _location: Location, 25 | private route: ActivatedRoute, 26 | private auth: AuthService, 27 | private connectionService: ConnectionService, 28 | private searchService: SearchService) { } 29 | 30 | ngOnInit() { 31 | this.route.params.subscribe(params => { 32 | this.receiver = params['sid']; 33 | this.getStudentInfo(this.receiver); 34 | this.getResume(this.receiver); 35 | this.checkFriend(this.sender, this.receiver); 36 | }); 37 | } 38 | 39 | getStudentInfo(sid: string) { 40 | this.searchService.findStudentById(sid) 41 | .then(studentInfo => { 42 | this.studentInfo = studentInfo; 43 | }); 44 | } 45 | 46 | getResume(sid: string) { 47 | this.searchService.getResumeById(sid).then( 48 | resume => this.resume = resume 49 | ); 50 | } 51 | 52 | checkFriend(sender: string, receiver: string) { 53 | this.connectionService.getFriendList(sender) 54 | .then(friends => { 55 | for (let friend of friends) { 56 | if (friend['sid'] === receiver) { 57 | this.isFriend = true; 58 | break; 59 | } 60 | } 61 | }); 62 | } 63 | 64 | sendFriendRequest(sender: string, receiver: string) { 65 | this.connectionService.sendFriendRequest(sender, receiver) 66 | .then(res => window.location.reload()); 67 | } 68 | 69 | backToLastPage() { 70 | this._location.back(); 71 | } 72 | 73 | } 74 | -------------------------------------------------------------------------------- /employer-client/src/app/components/application-list/application-list.component.html: -------------------------------------------------------------------------------- 1 |
2 | 3 |

All Applications for Job: {{jid}}

4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 34 | 40 | 46 | 47 | 48 | 49 |
NameUniversityDegreeMajorSkillsStatus
{{student.sname}}{{student.university}}{{student.degree}}{{student.major}}{{student.skill}} 27 | 33 | 35 | 39 | 41 | 45 |
50 | 51 | 57 | 58 |
-------------------------------------------------------------------------------- /employer-client/src/app/components/job-detail/job-detail.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | import { Location } from '@angular/common'; 3 | import { ActivatedRoute, Params, Router } from '@angular/router'; 4 | 5 | import { AuthService } from '../../services/auth.service'; 6 | import { JobService } from '../../services/job.service'; 7 | import { SearchService } from '../../services/search.service'; 8 | 9 | @Component({ 10 | selector: 'app-job-detail', 11 | templateUrl: './job-detail.component.html', 12 | styleUrls: ['./job-detail.component.css'] 13 | }) 14 | export class JobDetailComponent implements OnInit { 15 | 16 | degrees: string[] = ['BS, MS, PhD', 'MS, PhD', 'PhD']; 17 | 18 | cid: string = this.auth.getCid(); 19 | jid: string = ""; 20 | 21 | jobInfo = { 22 | jid: "", 23 | cid: "", 24 | jlocation: "", 25 | title: "", 26 | salary: "", 27 | academicbar: "", 28 | majorbar: "", 29 | desc: "" 30 | }; 31 | 32 | isJobPoster: boolean = false; 33 | 34 | constructor(private _location: Location, 35 | private router: Router, 36 | private route: ActivatedRoute, 37 | private auth: AuthService, 38 | private searchService: SearchService, 39 | private jobService: JobService) { } 40 | 41 | ngOnInit() { 42 | this.route.params.subscribe(params => { 43 | this.jid = params['jid']; 44 | this.getJobInfo(this.jid); 45 | }); 46 | } 47 | 48 | getJobInfo(jid: string) { 49 | this.searchService.findJobById(jid) 50 | .then(jobInfo => { 51 | this.jobInfo.jid = jobInfo[0]['jid']; 52 | this.jobInfo.cid = jobInfo[0]['cid']; 53 | this.jobInfo.jlocation = jobInfo[0]['jlocation']; 54 | this.jobInfo.title = jobInfo[0]['title']; 55 | this.jobInfo.salary = jobInfo[0]['salary']; 56 | this.jobInfo.academicbar = jobInfo[0]['academicbar']; 57 | this.jobInfo.majorbar = jobInfo[0]['majorbar']; 58 | this.jobInfo.desc = jobInfo[0]['desc']; 59 | 60 | if (this.cid === this.jobInfo.cid) { 61 | this.isJobPoster = true; 62 | } 63 | }); 64 | } 65 | 66 | updateJobInfo(jobInfo: any) { 67 | this.jobService.updateJobInfo(jobInfo) 68 | .then(res => window.location.reload()); 69 | } 70 | 71 | backToLastPage() { 72 | this._location.back(); 73 | } 74 | 75 | } 76 | -------------------------------------------------------------------------------- /employer-client/src/app/app.module.ts: -------------------------------------------------------------------------------- 1 | import { BrowserModule } from '@angular/platform-browser'; 2 | import { NgModule } from '@angular/core'; 3 | import { FormsModule } from '@angular/forms'; 4 | import { HttpClientModule } from '@angular/common/http'; 5 | 6 | import { routing } from './app.routes'; 7 | 8 | import { AuthService } from './services/auth.service'; 9 | import { SearchService } from './services/search.service'; 10 | import { JobService } from './services/job.service'; 11 | 12 | 13 | import { AppComponent } from './app.component'; 14 | import { CompanyHomeComponent } from './components/company-home/company-home.component'; 15 | import { SignupComponent } from './components/signup/signup.component'; 16 | import { SignupSuccessComponent } from './components/signup-success/signup-success.component'; 17 | import { LoginComponent } from './components/login/login.component'; 18 | import { NavbarComponent } from './components/navbar/navbar.component'; 19 | import { JobListComponent } from './components/job-list/job-list.component'; 20 | import { JobDetailComponent } from './components/job-detail/job-detail.component'; 21 | import { CompanyProfileComponent } from './components/company-profile/company-profile.component'; 22 | import { ApplicationListComponent } from './components/application-list/application-list.component'; 23 | import { StudentDetailComponent } from './components/student-detail/student-detail.component'; 24 | import { NewJobComponent } from './components/new-job/new-job.component'; 25 | import { NewJobSuccessComponent } from './components/new-job-success/new-job-success.component'; 26 | import { PushFilterModalComponent } from './components/push-filter-modal/push-filter-modal.component'; 27 | 28 | 29 | @NgModule({ 30 | declarations: [ 31 | AppComponent, 32 | CompanyHomeComponent, 33 | SignupComponent, 34 | SignupSuccessComponent, 35 | LoginComponent, 36 | NavbarComponent, 37 | JobListComponent, 38 | JobDetailComponent, 39 | CompanyProfileComponent, 40 | ApplicationListComponent, 41 | StudentDetailComponent, 42 | NewJobComponent, 43 | NewJobSuccessComponent, 44 | PushFilterModalComponent, 45 | ], 46 | imports: [ 47 | BrowserModule, 48 | HttpClientModule, 49 | FormsModule, 50 | routing, 51 | ], 52 | providers: [ 53 | AuthService, 54 | SearchService, 55 | JobService, 56 | ], 57 | bootstrap: [AppComponent] 58 | }) 59 | export class AppModule { } 60 | -------------------------------------------------------------------------------- /client/src/app/components/job-detail/job-detail.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | import { Location } from '@angular/common'; 3 | import { ActivatedRoute, Params } from '@angular/router'; 4 | 5 | import { AuthService } from '../../services/auth.service'; 6 | import { SearchService } from '../../services/search.service'; 7 | import { JobService } from '../../services/job.service'; 8 | 9 | declare var $: any; 10 | 11 | @Component({ 12 | selector: 'app-job-detail', 13 | templateUrl: './job-detail.component.html', 14 | styleUrls: ['./job-detail.component.css'] 15 | }) 16 | export class JobDetailComponent implements OnInit { 17 | 18 | sid: string = this.auth.getSid(); 19 | jid: string = ""; 20 | 21 | jobInfo: any; 22 | 23 | appStatus: string = ""; 24 | hasApplied: boolean = false; 25 | 26 | constructor(private _location: Location, 27 | private route: ActivatedRoute, 28 | private auth: AuthService, 29 | private jobService: JobService, 30 | private searchService: SearchService) { } 31 | 32 | ngOnInit() { 33 | this.route.params.subscribe(params => { 34 | this.jid = params['jid']; 35 | this.getJobInfo(this.jid); 36 | this.checkApplication(this.jid, this.sid); 37 | }); 38 | } 39 | 40 | getJobInfo(jid: string) { 41 | this.searchService.findJobById(jid) 42 | .then(jobInfo => { 43 | this.jobInfo = jobInfo; 44 | }); 45 | } 46 | 47 | checkApplication(jid: string, sid: string) { 48 | this.jobService.getApplicationList(sid) 49 | .then(applications => { 50 | for (let application of applications) { 51 | if (application['jid'] === jid) { 52 | this.hasApplied = true; 53 | this.getApplicationStatus(jid, sid); 54 | break; 55 | } 56 | } 57 | }); 58 | } 59 | 60 | applyForJob(jid: string, sid: string) { 61 | this.jobService.applyForJob(jid, sid) 62 | .then(res => window.location.reload()); 63 | } 64 | 65 | getApplicationStatus(jid: string, sid: string) { 66 | this.jobService.getApplication(jid, sid) 67 | .then(applications => { 68 | for (let application of applications) { 69 | this.appStatus = application['appstatus']; 70 | } 71 | }); 72 | } 73 | 74 | showFriendList(jid: string) { 75 | $('#friend-list-modal').modal('show'); 76 | } 77 | 78 | backToLastPage() { 79 | this._location.back(); 80 | } 81 | 82 | } 83 | -------------------------------------------------------------------------------- /client/src/app/services/message.service.ts: -------------------------------------------------------------------------------- 1 | import { Injectable } from '@angular/core'; 2 | import { HttpClient, HttpHeaders, HttpResponse } from '@angular/common/http'; 3 | import { Observable } from 'rxjs/Rx'; 4 | import { BehaviorSubject } from 'rxjs/BehaviorSubject'; 5 | 6 | @Injectable() 7 | export class MessageService { 8 | 9 | private _cnt = 0; 10 | private _newMessageCount = new BehaviorSubject([]); 11 | 12 | constructor(private httpClient: HttpClient) { } 13 | 14 | getMessageList(sid1: string, sid2: string): Promise { 15 | return this.httpClient.get(`api/v1/messages/${sid1}/${sid2}`) 16 | .toPromise() 17 | .then((res: any) => res) 18 | .catch(this.handleError); 19 | } 20 | 21 | sendMessage(sender: string, receiver: string, content: string): Promise { 22 | const body = { 23 | sender: sender, 24 | receiver: receiver, 25 | content: content 26 | }; 27 | const options = { headers: new HttpHeaders({'Connect-Type': 'application/json'}) }; 28 | return this.httpClient.post(`api/v1/messages`, body, options) 29 | .toPromise() 30 | .then((res: any) => res) 31 | .catch(this.handleError); 32 | } 33 | 34 | updateMessageStatus(sender: string, receiver: string, mtime: string): Promise { 35 | const body = { 36 | sender: sender, 37 | receiver: receiver, 38 | mtime: mtime 39 | }; 40 | const options = { headers: new HttpHeaders({'Connect-Type': 'application/json'}) }; 41 | return this.httpClient.patch(`api/v1/messages`, body, options) 42 | .toPromise() 43 | .then((res: any) => { 44 | this._cnt = this._cnt - 1; 45 | this._newMessageCount.next(this._cnt); 46 | }) 47 | .catch(this.handleError); 48 | } 49 | 50 | getNewMessageList(receiver: string): Promise { 51 | return this.httpClient.get(`api/v1/new-messages/${receiver}`) 52 | .toPromise() 53 | .then((res: any) => res) 54 | .catch(this.handleError); 55 | } 56 | 57 | getNewMessageCount(receiver: string): Observable { 58 | this.httpClient.get(`api/v1/new-messages/${receiver}`) 59 | .toPromise() 60 | .then((res: any) => { 61 | this._cnt = res.length; 62 | this._newMessageCount.next(this._cnt); 63 | }) 64 | .catch(this.handleError); 65 | 66 | return this._newMessageCount.asObservable(); 67 | } 68 | 69 | 70 | private handleError(error: any): Promise { 71 | return Promise.reject(error.body || error); 72 | } 73 | 74 | } 75 | -------------------------------------------------------------------------------- /employer-client/src/app/components/job-detail/job-detail.component.html: -------------------------------------------------------------------------------- 1 |
2 |

Job Detail

3 |
4 |
5 | 6 |
7 | 8 |

{{jobInfo.jid}}

9 |
10 | 11 |
12 | 13 | 15 |
16 | 17 |
18 | 19 | 21 |
22 | 23 |
24 | 25 | 27 |
28 | 29 |
30 | 31 | 37 |
38 | 39 |
40 | 41 | 43 |
44 | 45 |
46 | 47 | 50 |
51 | 52 |
53 |
54 | 55 | 65 |
66 | 67 |
68 |

You are not the poster of this job!

69 | 73 |
74 | 75 |
76 |
-------------------------------------------------------------------------------- /employer-client/src/app/components/navbar/navbar.component.html: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /employer-client/src/app/components/push-filter-modal/push-filter-modal.component.html: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /client/src/app/services/connection.service.ts: -------------------------------------------------------------------------------- 1 | import { Injectable } from '@angular/core'; 2 | import { HttpClient, HttpHeaders, HttpResponse } from '@angular/common/http'; 3 | 4 | @Injectable() 5 | export class ConnectionService { 6 | 7 | constructor(private httpClient: HttpClient) { } 8 | 9 | sendFriendRequest(sender: string, receiver: string): Promise { 10 | const body = { 11 | sender: sender, 12 | receiver: receiver, 13 | status: "awaiting" 14 | }; 15 | const options = { headers: new HttpHeaders({'Connect-Type': 'application/json'}) }; 16 | return this.httpClient.post(`api/v1/invitations`, body, options) 17 | .toPromise() 18 | .then((res: any) => res) 19 | .catch(this.handleError); 20 | } 21 | 22 | handleFriendRequest(sender: string, receiver: string, status: string): Promise { 23 | const body = { 24 | sender: sender, 25 | receiver: receiver, 26 | status: status 27 | }; 28 | const options = { headers: new HttpHeaders({'Connect-Type': 'application/json'}) }; 29 | return this.httpClient.post(`api/v1/invitations`, body, options) 30 | .toPromise() 31 | .then((res: any) => res) 32 | .catch(this.handleError); 33 | } 34 | 35 | followCompany(sid: string, cid: string): Promise { 36 | const body = { 37 | sid: sid, 38 | cid: cid 39 | }; 40 | const options = { headers: new HttpHeaders({'Connect-Type': 'application/json'}) }; 41 | return this.httpClient.post(`api/v1/followings`, body, options) 42 | .toPromise() 43 | .then((res: any) => res) 44 | .catch(this.handleError); 45 | } 46 | 47 | getFriendList(sid: string): Promise { 48 | return this.httpClient.get(`api/v1/friends/${sid}`) 49 | .toPromise() 50 | .then((res: any) => res) 51 | .catch(this.handleError); 52 | } 53 | 54 | getInvitationList(sid: string): Promise { 55 | return this.httpClient.get(`api/v1/invitations/${sid}`) 56 | .toPromise() 57 | .then((res: any) => res) 58 | .catch(this.handleError); 59 | } 60 | 61 | getFollowingList(sid: string): Promise { 62 | return this.httpClient.get(`api/v1/followings/${sid}`) 63 | .toPromise() 64 | .then((res: any) => res) 65 | .catch(this.handleError); 66 | } 67 | 68 | unfollowCompany(sid: string, cid: string): Promise { 69 | const body = { 70 | sid: sid, 71 | cid: cid 72 | }; 73 | const options = { headers: new HttpHeaders({'Connect-Type': 'application/json'}) }; 74 | return this.httpClient.patch(`api/v1/followings`, body, options) 75 | .toPromise() 76 | .then((res: any) => res) 77 | .catch(this.handleError); 78 | } 79 | 80 | 81 | private handleError(error: any): Promise { 82 | return Promise.reject(error.body || error); 83 | } 84 | 85 | } 86 | -------------------------------------------------------------------------------- /client/src/app/components/navbar/navbar.component.html: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /client/src/app/components/student-profile/student-profile.component.html: -------------------------------------------------------------------------------- 1 |
2 |

My Profile

3 |
4 |
5 | 6 |
7 | ID: {{studentInfo.sid}} 8 |
9 | 10 |
11 | 12 | 14 |
15 | 16 |
17 | 18 | 20 |
21 | 22 | 27 | 28 |
29 | 30 | 36 |
37 | 38 |
39 | 40 | 42 |
43 | 44 |
45 | 46 | 48 |
49 | 50 |
51 | 52 | 54 |
55 | 56 | 61 |
62 | 63 | 67 |
68 | 69 |
70 | 71 |
72 | 73 |
74 |
75 | 76 | 86 |
87 | 88 |
89 |
-------------------------------------------------------------------------------- /client/src/app/components/student-profile/student-profile.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | import { Location } from '@angular/common'; 3 | import { HttpClient, HttpHeaders, HttpResponse } from '@angular/common/http'; 4 | 5 | import { AuthService } from '../../services/auth.service'; 6 | import { SearchService } from '../../services/search.service'; 7 | 8 | @Component({ 9 | selector: 'app-student-profile', 10 | templateUrl: './student-profile.component.html', 11 | styleUrls: ['./student-profile.component.css'] 12 | }) 13 | export class StudentProfileComponent implements OnInit { 14 | 15 | degrees: string[] = ['BS', 'MS', 'PhD']; 16 | 17 | sid: string = this.auth.getSid(); 18 | 19 | studentInfo = { 20 | sid: "", 21 | sname: "", 22 | university: "", 23 | degree: "", 24 | major: "", 25 | gpa: "", 26 | skill: "", 27 | resume: "" 28 | }; 29 | 30 | resume: any; 31 | 32 | file: File; 33 | filestring: string; 34 | 35 | constructor(private _location: Location, 36 | private auth: AuthService, 37 | private searchService: SearchService, 38 | private httpClient: HttpClient) { } 39 | 40 | ngOnInit() { 41 | this.getStudentProfile(this.sid); 42 | this.getResume(this.sid); 43 | } 44 | 45 | getStudentProfile(sid: string) { 46 | this.searchService.findStudentById(sid) 47 | .then(studentInfo => { 48 | // this.studentInfo = Object.assign({}, studentInfo[0]); 49 | this.studentInfo.sid = studentInfo[0]['sid']; 50 | this.studentInfo.sname = studentInfo[0]['sname']; 51 | this.studentInfo.university = studentInfo[0]['university']; 52 | this.studentInfo.degree = studentInfo[0]['degree']; 53 | this.studentInfo.major = studentInfo[0]['major']; 54 | this.studentInfo.gpa = studentInfo[0]['gpa']; 55 | this.studentInfo.skill = studentInfo[0]['skill']; 56 | this.studentInfo.resume = studentInfo[0]['resume']; 57 | }); 58 | } 59 | 60 | getFile(event){ 61 | this.file = event.target.files[0]; 62 | var reader = new FileReader(); 63 | reader.onload = this._handleReaderLoaded.bind(this); 64 | reader.readAsBinaryString(this.file); 65 | } 66 | 67 | _handleReaderLoaded(readerEvt) { 68 | var binaryString = readerEvt.target.result; 69 | //this.filestring = btoa(binaryString); // Converting binary string data. 70 | this.filestring = binaryString; // Converting binary string data. 71 | this.updateResume(this.sid, this.filestring); 72 | } 73 | 74 | getResume(sid: string) { 75 | this.searchService.getResumeById(sid).then( 76 | resume => this.resume = resume 77 | ); 78 | } 79 | 80 | updateStudentProfile(studentInfo: any) { 81 | this.searchService.updateStudentProfile(studentInfo) 82 | .then(res => window.location.reload()); 83 | } 84 | 85 | updateResume(sid: string, filestring: string) { 86 | console.log(filestring); 87 | this.searchService.updateResume(sid, filestring) 88 | .then(); 89 | } 90 | 91 | } 92 | -------------------------------------------------------------------------------- /client/src/app/services/job.service.ts: -------------------------------------------------------------------------------- 1 | import { Injectable } from '@angular/core'; 2 | import { HttpClient, HttpHeaders, HttpResponse } from '@angular/common/http'; 3 | import { send } from 'q'; 4 | 5 | @Injectable() 6 | export class JobService { 7 | 8 | constructor(private httpClient: HttpClient) { } 9 | 10 | getApplicationList(sid: string): Promise { 11 | return this.httpClient.get(`api/v1/applications-of-student/${sid}`) 12 | .toPromise() 13 | .then((res: any) => res) 14 | .catch(this.handleError); 15 | } 16 | 17 | getApplication(jid: string, sid: string): Promise { 18 | return this.httpClient.get(`api/v1/applications/${jid}/${sid}`) 19 | .toPromise() 20 | .then((res: any) => res) 21 | .catch(this.handleError); 22 | } 23 | 24 | applyForJob(jid: string, sid: string): Promise { 25 | const body = { 26 | jid: jid, 27 | sid: sid 28 | }; 29 | const options = { headers: new HttpHeaders({'Connect-Type': 'application/json'}) }; 30 | return this.httpClient.post(`api/v1/applications`, body, options) 31 | .toPromise() 32 | .then((res: any) => res) 33 | .catch(this.handleError); 34 | } 35 | 36 | getJobNotifications(sid: string): Promise { 37 | return this.httpClient.get(`api/v1/job-notifications/${sid}`) 38 | .toPromise() 39 | .then((res: any) => res) 40 | .catch(this.handleError); 41 | } 42 | 43 | getJobForwards(sid: string): Promise { 44 | return this.httpClient.get(`api/v1/job-forwards/${sid}`) 45 | .toPromise() 46 | .then((res: any) => res) 47 | .catch(this.handleError); 48 | } 49 | 50 | updateJobNotificationStatus(jid: string, sid: string, jntime: string): Promise { 51 | const body = { 52 | jid: jid, 53 | sid: sid, 54 | jntime: jntime 55 | }; 56 | const options = { headers: new HttpHeaders({'Connect-Type': 'application/json'}) }; 57 | return this.httpClient.patch(`api/v1/job-notifications`, body, options) 58 | .toPromise() 59 | .then((res: any) => res) 60 | .catch(this.handleError); 61 | } 62 | 63 | updateJobForwardStatus(jid: string, sender: string, receiver: string, jftime: string): Promise { 64 | const body = { 65 | jid: jid, 66 | sender: sender, 67 | receiver: receiver, 68 | jftime: jftime 69 | }; 70 | const options = { headers: new HttpHeaders({'Connect-Type': 'application/json'}) }; 71 | return this.httpClient.patch(`api/v1/job-forwards`, body, options) 72 | .toPromise() 73 | .then((res: any) => res) 74 | .catch(this.handleError); 75 | } 76 | 77 | forwardJob(jid: string, sender: string, receiver: string): Promise { 78 | const body = { 79 | jid: jid, 80 | sender: sender, 81 | receiver: receiver 82 | }; 83 | const options = { headers: new HttpHeaders({'Connect-Type': 'application/json'}) }; 84 | return this.httpClient.post(`api/v1/job-forwards`, body, options) 85 | .toPromise() 86 | .then((res: any) => res) 87 | .catch(this.handleError); 88 | } 89 | 90 | private handleError(error: any): Promise { 91 | return Promise.reject(error.body || error); 92 | } 93 | 94 | } 95 | -------------------------------------------------------------------------------- /client/src/polyfills.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * This file includes polyfills needed by Angular and is loaded before the app. 3 | * You can add your own extra polyfills to this file. 4 | * 5 | * This file is divided into 2 sections: 6 | * 1. Browser polyfills. These are applied before loading ZoneJS and are sorted by browsers. 7 | * 2. Application imports. Files imported after ZoneJS that should be loaded before your main 8 | * file. 9 | * 10 | * The current setup is for so-called "evergreen" browsers; the last versions of browsers that 11 | * automatically update themselves. This includes Safari >= 10, Chrome >= 55 (including Opera), 12 | * Edge >= 13 on the desktop, and iOS 10 and Chrome on mobile. 13 | * 14 | * Learn more in https://angular.io/docs/ts/latest/guide/browser-support.html 15 | */ 16 | 17 | /*************************************************************************************************** 18 | * BROWSER POLYFILLS 19 | */ 20 | 21 | /** IE9, IE10 and IE11 requires all of the following polyfills. **/ 22 | // import 'core-js/es6/symbol'; 23 | // import 'core-js/es6/object'; 24 | // import 'core-js/es6/function'; 25 | // import 'core-js/es6/parse-int'; 26 | // import 'core-js/es6/parse-float'; 27 | // import 'core-js/es6/number'; 28 | // import 'core-js/es6/math'; 29 | // import 'core-js/es6/string'; 30 | // import 'core-js/es6/date'; 31 | // import 'core-js/es6/array'; 32 | // import 'core-js/es6/regexp'; 33 | // import 'core-js/es6/map'; 34 | // import 'core-js/es6/weak-map'; 35 | // import 'core-js/es6/set'; 36 | 37 | /** IE10 and IE11 requires the following for NgClass support on SVG elements */ 38 | // import 'classlist.js'; // Run `npm install --save classlist.js`. 39 | 40 | /** IE10 and IE11 requires the following for the Reflect API. */ 41 | // import 'core-js/es6/reflect'; 42 | 43 | 44 | /** Evergreen browsers require these. **/ 45 | // Used for reflect-metadata in JIT. If you use AOT (and only Angular decorators), you can remove. 46 | import 'core-js/es7/reflect'; 47 | 48 | 49 | /** 50 | * Required to support Web Animations `@angular/platform-browser/animations`. 51 | * Needed for: All but Chrome, Firefox and Opera. http://caniuse.com/#feat=web-animation 52 | **/ 53 | // import 'web-animations-js'; // Run `npm install --save web-animations-js`. 54 | 55 | /** 56 | * By default, zone.js will patch all possible macroTask and DomEvents 57 | * user can disable parts of macroTask/DomEvents patch by setting following flags 58 | */ 59 | 60 | // (window as any).__Zone_disable_requestAnimationFrame = true; // disable patch requestAnimationFrame 61 | // (window as any).__Zone_disable_on_property = true; // disable patch onProperty such as onclick 62 | // (window as any).__zone_symbol__BLACK_LISTED_EVENTS = ['scroll', 'mousemove']; // disable patch specified eventNames 63 | 64 | /* 65 | * in IE/Edge developer tools, the addEventListener will also be wrapped by zone.js 66 | * with the following flag, it will bypass `zone.js` patch for IE/Edge 67 | */ 68 | // (window as any).__Zone_enable_cross_context_check = true; 69 | 70 | /*************************************************************************************************** 71 | * Zone JS is required by default for Angular itself. 72 | */ 73 | import 'zone.js/dist/zone'; // Included with Angular CLI. 74 | 75 | 76 | 77 | /*************************************************************************************************** 78 | * APPLICATION IMPORTS 79 | */ 80 | -------------------------------------------------------------------------------- /employer-client/src/polyfills.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * This file includes polyfills needed by Angular and is loaded before the app. 3 | * You can add your own extra polyfills to this file. 4 | * 5 | * This file is divided into 2 sections: 6 | * 1. Browser polyfills. These are applied before loading ZoneJS and are sorted by browsers. 7 | * 2. Application imports. Files imported after ZoneJS that should be loaded before your main 8 | * file. 9 | * 10 | * The current setup is for so-called "evergreen" browsers; the last versions of browsers that 11 | * automatically update themselves. This includes Safari >= 10, Chrome >= 55 (including Opera), 12 | * Edge >= 13 on the desktop, and iOS 10 and Chrome on mobile. 13 | * 14 | * Learn more in https://angular.io/docs/ts/latest/guide/browser-support.html 15 | */ 16 | 17 | /*************************************************************************************************** 18 | * BROWSER POLYFILLS 19 | */ 20 | 21 | /** IE9, IE10 and IE11 requires all of the following polyfills. **/ 22 | // import 'core-js/es6/symbol'; 23 | // import 'core-js/es6/object'; 24 | // import 'core-js/es6/function'; 25 | // import 'core-js/es6/parse-int'; 26 | // import 'core-js/es6/parse-float'; 27 | // import 'core-js/es6/number'; 28 | // import 'core-js/es6/math'; 29 | // import 'core-js/es6/string'; 30 | // import 'core-js/es6/date'; 31 | // import 'core-js/es6/array'; 32 | // import 'core-js/es6/regexp'; 33 | // import 'core-js/es6/map'; 34 | // import 'core-js/es6/weak-map'; 35 | // import 'core-js/es6/set'; 36 | 37 | /** IE10 and IE11 requires the following for NgClass support on SVG elements */ 38 | // import 'classlist.js'; // Run `npm install --save classlist.js`. 39 | 40 | /** IE10 and IE11 requires the following for the Reflect API. */ 41 | // import 'core-js/es6/reflect'; 42 | 43 | 44 | /** Evergreen browsers require these. **/ 45 | // Used for reflect-metadata in JIT. If you use AOT (and only Angular decorators), you can remove. 46 | import 'core-js/es7/reflect'; 47 | 48 | 49 | /** 50 | * Required to support Web Animations `@angular/platform-browser/animations`. 51 | * Needed for: All but Chrome, Firefox and Opera. http://caniuse.com/#feat=web-animation 52 | **/ 53 | // import 'web-animations-js'; // Run `npm install --save web-animations-js`. 54 | 55 | /** 56 | * By default, zone.js will patch all possible macroTask and DomEvents 57 | * user can disable parts of macroTask/DomEvents patch by setting following flags 58 | */ 59 | 60 | // (window as any).__Zone_disable_requestAnimationFrame = true; // disable patch requestAnimationFrame 61 | // (window as any).__Zone_disable_on_property = true; // disable patch onProperty such as onclick 62 | // (window as any).__zone_symbol__BLACK_LISTED_EVENTS = ['scroll', 'mousemove']; // disable patch specified eventNames 63 | 64 | /* 65 | * in IE/Edge developer tools, the addEventListener will also be wrapped by zone.js 66 | * with the following flag, it will bypass `zone.js` patch for IE/Edge 67 | */ 68 | // (window as any).__Zone_enable_cross_context_check = true; 69 | 70 | /*************************************************************************************************** 71 | * Zone JS is required by default for Angular itself. 72 | */ 73 | import 'zone.js/dist/zone'; // Included with Angular CLI. 74 | 75 | 76 | 77 | /*************************************************************************************************** 78 | * APPLICATION IMPORTS 79 | */ 80 | -------------------------------------------------------------------------------- /client/src/app/app.module.ts: -------------------------------------------------------------------------------- 1 | import { BrowserModule } from '@angular/platform-browser'; 2 | import { NgModule } from '@angular/core'; 3 | import { FormsModule } from '@angular/forms'; 4 | import { HttpClientModule } from '@angular/common/http'; 5 | 6 | import { routing } from './app.routes'; 7 | 8 | import { AuthService } from './services/auth.service'; 9 | import { SearchService } from './services/search.service'; 10 | import { ConnectionService } from './services/connection.service'; 11 | import { JobService } from './services/job.service'; 12 | import { MessageService } from './services/message.service'; 13 | 14 | 15 | import { AppComponent } from './app.component'; 16 | import { NavbarComponent } from './components/navbar/navbar.component'; 17 | import { StudentListComponent } from './components/student-list/student-list.component'; 18 | import { CompanyListComponent } from './components/company-list/company-list.component'; 19 | import { StudentHomeComponent } from './components/student-home/student-home.component'; 20 | import { BaseComponent } from './components/base/base.component'; 21 | import { LoginComponent } from './components/login/login.component'; 22 | import { CompanyDetailComponent } from './components/company-detail/company-detail.component'; 23 | import { JobListComponent } from './components/job-list/job-list.component'; 24 | import { StudentDetailComponent } from './components/student-detail/student-detail.component'; 25 | import { InvitationListComponent } from './components/invitation-list/invitation-list.component'; 26 | import { JobDetailComponent } from './components/job-detail/job-detail.component'; 27 | import { ApplicationListComponent } from './components/application-list/application-list.component'; 28 | import { StudentProfileComponent } from './components/student-profile/student-profile.component'; 29 | import { SignupComponent } from './components/signup/signup.component'; 30 | import { SignupSuccessComponent } from './components/signup-success/signup-success.component'; 31 | import { FriendListComponent } from './components/friend-list/friend-list.component'; 32 | import { FollowingListComponent } from './components/following-list/following-list.component'; 33 | import { MessageListComponent } from './components/message-list/message-list.component'; 34 | import { NewMessageListComponent } from './components/new-message-list/new-message-list.component'; 35 | import { FriendListModalComponent } from './components/friend-list-modal/friend-list-modal.component'; 36 | import { CompanyJobListComponent } from './components/company-job-list/company-job-list.component'; 37 | 38 | 39 | @NgModule({ 40 | declarations: [ 41 | AppComponent, 42 | NavbarComponent, 43 | StudentListComponent, 44 | CompanyListComponent, 45 | StudentHomeComponent, 46 | BaseComponent, 47 | LoginComponent, 48 | CompanyDetailComponent, 49 | JobListComponent, 50 | StudentDetailComponent, 51 | InvitationListComponent, 52 | JobDetailComponent, 53 | ApplicationListComponent, 54 | StudentProfileComponent, 55 | SignupComponent, 56 | SignupSuccessComponent, 57 | FriendListComponent, 58 | FollowingListComponent, 59 | MessageListComponent, 60 | NewMessageListComponent, 61 | FriendListModalComponent, 62 | CompanyJobListComponent, 63 | ], 64 | imports: [ 65 | BrowserModule, 66 | HttpClientModule, 67 | FormsModule, 68 | routing, 69 | ], 70 | providers: [ 71 | AuthService, 72 | SearchService, 73 | ConnectionService, 74 | JobService, 75 | MessageService, 76 | ], 77 | bootstrap: [AppComponent] 78 | }) 79 | export class AppModule { } 80 | --------------------------------------------------------------------------------