From b41671b456be4d6cc9775e78eab90236a98dc054 Mon Sep 17 00:00:00 2001 From: ananyar807 Date: Tue, 26 Sep 2023 19:04:57 -0400 Subject: [PATCH 1/4] worked on getUser method and user parameters --- apps/backend/src/users/user.entity.ts | 2 +- apps/backend/src/users/users.controller.ts | 10 ++++++ apps/backend/src/users/users.service.ts | 42 ++++++++++++++++++++-- apps/backend/src/users/utils.ts | 14 ++++++++ 4 files changed, 65 insertions(+), 3 deletions(-) create mode 100644 apps/backend/src/users/utils.ts diff --git a/apps/backend/src/users/user.entity.ts b/apps/backend/src/users/user.entity.ts index 4353cc4..f451c4f 100644 --- a/apps/backend/src/users/user.entity.ts +++ b/apps/backend/src/users/user.entity.ts @@ -18,7 +18,7 @@ export class User { email: string; @Column() - profilePicture: string; + profilePicture: string | null; @Column() linkedin: string | null; diff --git a/apps/backend/src/users/users.controller.ts b/apps/backend/src/users/users.controller.ts index 3b11315..0f5aa9e 100644 --- a/apps/backend/src/users/users.controller.ts +++ b/apps/backend/src/users/users.controller.ts @@ -1,3 +1,4 @@ +<<<<<<< HEAD import { DefaultValuePipe, ParseBoolPipe, @@ -5,6 +6,9 @@ import { Controller, Get, } from '@nestjs/common'; +======= +import { Controller, Get, Param } from '@nestjs/common'; +>>>>>>> 99f1095 (worked on getUser method and user parameters) import { UsersService } from './users.service'; @@ -19,4 +23,10 @@ export class UsersController { ) { return this.usersService.findAll(getAllMembers); } + + //TODO get method + @Get('/:userId') + getUser(@Param('userId') userId: string) { + return this.usersService.findOne(parseInt(userId)); + } } diff --git a/apps/backend/src/users/users.service.ts b/apps/backend/src/users/users.service.ts index 00a0e58..dd7a4d1 100644 --- a/apps/backend/src/users/users.service.ts +++ b/apps/backend/src/users/users.service.ts @@ -1,10 +1,15 @@ -import { UnauthorizedException, Injectable } from '@nestjs/common'; +import { + BadRequestException, + UnauthorizedException, + Injectable, +} from '@nestjs/common'; import { InjectRepository } from '@nestjs/typeorm'; +import { ObjectId } from 'mongodb'; import { MongoRepository } from 'typeorm'; import { User } from './user.entity'; import { Status } from './types'; -import { ObjectId } from 'mongodb'; +import { getCurrentUser } from './utils'; @Injectable() export class UsersService { @@ -41,4 +46,37 @@ export class UsersService { return users; } + + async findOne(userId: number) { + const user = await this.usersRepository.findOneBy({ id: userId }); + + if (!user) { + throw new BadRequestException('User not found'); + } + + const currentUser = getCurrentUser(); + + const currentStatus = currentUser.status; + const targetStatus = user.status; + switch (currentStatus) { + case Status.RECRUITER: + if (targetStatus === Status.ADMIN) { + throw new BadRequestException('User not found'); + } + break; + case Status.APPLICANT: + if (currentUser.id !== user.id) { + throw new BadRequestException('User not found'); + } + break; + case Status.MEMBER: + case Status.ALUMNI: + if (currentUser.status === Status.APPLICANT) { + throw new BadRequestException('User not found'); + } + break; + } + + return user; + } } diff --git a/apps/backend/src/users/utils.ts b/apps/backend/src/users/utils.ts new file mode 100644 index 0000000..7f730f7 --- /dev/null +++ b/apps/backend/src/users/utils.ts @@ -0,0 +1,14 @@ +import { Status } from './types'; +import { User } from './user.entity'; + +export const getCurrentUser = () => { + const user = new User(); + + user.id = 1; + user.firstName = 'Current'; + user.lastName = 'User'; + user.email = 'user.current@northeastern.edu'; + user.status = Status.MEMBER; + + return user; +}; From 465e126312e55c4cb518b81bd629f17c482e0adb Mon Sep 17 00:00:00 2001 From: Kenny Jung Date: Wed, 4 Oct 2023 10:25:55 +0900 Subject: [PATCH 2/4] Clean up code --- apps/backend/src/app/app.module.ts | 2 +- apps/backend/src/users/user.entity.ts | 7 ++++--- apps/backend/src/users/users.controller.ts | 11 ++++------- apps/backend/src/users/users.service.ts | 15 ++------------ apps/backend/src/users/utils.ts | 23 +++++++++++----------- 5 files changed, 23 insertions(+), 35 deletions(-) diff --git a/apps/backend/src/app/app.module.ts b/apps/backend/src/app/app.module.ts index 77876a4..4b83f9c 100644 --- a/apps/backend/src/app/app.module.ts +++ b/apps/backend/src/app/app.module.ts @@ -10,7 +10,7 @@ import { PluralNamingStrategy } from '../strategies/plural-naming.strategy'; imports: [ TypeOrmModule.forRoot({ type: 'mongodb', - host: 'localhost', + host: '127.0.0.1', port: 27017, database: 'c4cOpsTest', // username: 'root', diff --git a/apps/backend/src/users/user.entity.ts b/apps/backend/src/users/user.entity.ts index f451c4f..07013c6 100644 --- a/apps/backend/src/users/user.entity.ts +++ b/apps/backend/src/users/user.entity.ts @@ -1,9 +1,10 @@ -import { Entity, Column, ObjectIdColumn, ObjectId } from 'typeorm'; +import { Entity, Column } from 'typeorm'; import { Status } from './types'; + @Entity() export class User { - @ObjectIdColumn() // https://github.com/typeorm/typeorm/issues/1584 - userId: ObjectId; + @Column({ primary: true }) + userId: number; @Column() status: Status; diff --git a/apps/backend/src/users/users.controller.ts b/apps/backend/src/users/users.controller.ts index 0f5aa9e..8ece4d0 100644 --- a/apps/backend/src/users/users.controller.ts +++ b/apps/backend/src/users/users.controller.ts @@ -1,14 +1,12 @@ -<<<<<<< HEAD import { DefaultValuePipe, ParseBoolPipe, + ParseIntPipe, Query, Controller, Get, + Param, } from '@nestjs/common'; -======= -import { Controller, Get, Param } from '@nestjs/common'; ->>>>>>> 99f1095 (worked on getUser method and user parameters) import { UsersService } from './users.service'; @@ -24,9 +22,8 @@ export class UsersController { return this.usersService.findAll(getAllMembers); } - //TODO get method @Get('/:userId') - getUser(@Param('userId') userId: string) { - return this.usersService.findOne(parseInt(userId)); + getUser(@Param('userId', ParseIntPipe) userId: number) { + return this.usersService.findOne(userId); } } diff --git a/apps/backend/src/users/users.service.ts b/apps/backend/src/users/users.service.ts index dd7a4d1..3d1a1af 100644 --- a/apps/backend/src/users/users.service.ts +++ b/apps/backend/src/users/users.service.ts @@ -21,18 +21,7 @@ export class UsersService { async findAll(getAllMembers: boolean): Promise { if (!getAllMembers) return []; - const exampleUser: User = { - userId: new ObjectId('a0f3efa0f3efa0f3efa0f3ef'), - status: Status.ADMIN, - firstName: 'jimmy', - lastName: 'jimmy2', - email: 'jimmy.jimmy2@mail.com', - profilePicture: null, - linkedin: null, - github: null, - team: null, - role: null, - }; + const exampleUser = getCurrentUser(); if (exampleUser.status == Status.APPLICANT) { throw new UnauthorizedException(); @@ -65,7 +54,7 @@ export class UsersService { } break; case Status.APPLICANT: - if (currentUser.id !== user.id) { + if (currentUser.userId !== user.userId) { throw new BadRequestException('User not found'); } break; diff --git a/apps/backend/src/users/utils.ts b/apps/backend/src/users/utils.ts index 7f730f7..05edd0f 100644 --- a/apps/backend/src/users/utils.ts +++ b/apps/backend/src/users/utils.ts @@ -1,14 +1,15 @@ import { Status } from './types'; import { User } from './user.entity'; -export const getCurrentUser = () => { - const user = new User(); - - user.id = 1; - user.firstName = 'Current'; - user.lastName = 'User'; - user.email = 'user.current@northeastern.edu'; - user.status = Status.MEMBER; - - return user; -}; +export const getCurrentUser = (): User => ({ + userId: 1, + status: Status.ADMIN, + firstName: 'jimmy', + lastName: 'jimmy2', + email: 'jimmy.jimmy2@mail.com', + profilePicture: null, + linkedin: null, + github: null, + team: null, + role: null, +}); From 083355e64818e90d81d419f1f18748284f5d9f3b Mon Sep 17 00:00:00 2001 From: ananyar807 Date: Thu, 12 Oct 2023 21:46:03 -0400 Subject: [PATCH 3/4] updated code based on reviews --- apps/backend/src/users/user.entity.ts | 3 +++ apps/backend/src/users/users.service.ts | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/apps/backend/src/users/user.entity.ts b/apps/backend/src/users/user.entity.ts index 07013c6..97f107d 100644 --- a/apps/backend/src/users/user.entity.ts +++ b/apps/backend/src/users/user.entity.ts @@ -1,3 +1,4 @@ +import { IsEmail, IsUrl } from 'class-validator'; import { Entity, Column } from 'typeorm'; import { Status } from './types'; @@ -16,12 +17,14 @@ export class User { lastName: string; @Column() + @IsEmail() email: string; @Column() profilePicture: string | null; @Column() + @IsUrl() linkedin: string | null; @Column() diff --git a/apps/backend/src/users/users.service.ts b/apps/backend/src/users/users.service.ts index 3d1a1af..f2c9fe0 100644 --- a/apps/backend/src/users/users.service.ts +++ b/apps/backend/src/users/users.service.ts @@ -37,7 +37,7 @@ export class UsersService { } async findOne(userId: number) { - const user = await this.usersRepository.findOneBy({ id: userId }); + const user = await this.usersRepository.findOneBy({ userId }); if (!user) { throw new BadRequestException('User not found'); From 53ab6556a22ca22c3279ea144ba713d9b088373a Mon Sep 17 00:00:00 2001 From: ananyar807 Date: Mon, 16 Oct 2023 16:40:36 -0400 Subject: [PATCH 4/4] fixed switch statement --- apps/backend/src/users/users.service.ts | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/apps/backend/src/users/users.service.ts b/apps/backend/src/users/users.service.ts index f2c9fe0..bfd3f17 100644 --- a/apps/backend/src/users/users.service.ts +++ b/apps/backend/src/users/users.service.ts @@ -48,22 +48,22 @@ export class UsersService { const currentStatus = currentUser.status; const targetStatus = user.status; switch (currentStatus) { + //admin can access all users + case Status.ADMIN: + break; + //recruiter can access applicant, and themselves case Status.RECRUITER: - if (targetStatus === Status.ADMIN) { + if (targetStatus == Status.APPLICANT) { + break; + } else if (currentUser.userId !== user.userId) { throw new BadRequestException('User not found'); } break; - case Status.APPLICANT: + //everyone else can only access themselves + default: if (currentUser.userId !== user.userId) { throw new BadRequestException('User not found'); } - break; - case Status.MEMBER: - case Status.ALUMNI: - if (currentUser.status === Status.APPLICANT) { - throw new BadRequestException('User not found'); - } - break; } return user;