Skip to content

Commit

Permalink
Merge pull request #8 from Skhuthon/feature/#5
Browse files Browse the repository at this point in the history
✨ [#4]Feat: 지역 테이블 분리
  • Loading branch information
labyrinth30 authored Jun 28, 2024
2 parents c76eb93 + 98fdafa commit 0cfd156
Show file tree
Hide file tree
Showing 26 changed files with 407 additions and 41 deletions.
11 changes: 10 additions & 1 deletion src/app.module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@ import { StoresModule } from './stores/stores.module';
import { ThemesModule } from './stores/themes/themes.module';
import { ThemesModel } from './stores/themes/entity/themes.entity';
import { StoresModel } from './stores/entity/stores.entity';
import { RegionModule } from './region/region.module';
import { RegionModel } from './region/entities/region.entity';

@Module({
imports: [
Expand All @@ -36,7 +38,13 @@ import { StoresModel } from './stores/entity/stores.entity';
username: configService.get<string>(ENV_DB_USERNAME_KEY),
password: configService.get<string>(ENV_DB_PASSWORD_KEY),
database: configService.get<string>(ENV_DB_DATABASE_KEY),
entities: [UsersModel, ReviewsModel, StoresModel, ThemesModel],
entities: [
UsersModel,
ReviewsModel,
StoresModel,
ThemesModel,
RegionModel,
],
synchronize: true,
}),
inject: [ConfigService],
Expand All @@ -47,6 +55,7 @@ import { StoresModel } from './stores/entity/stores.entity';
ReviewsModule,
StoresModule,
ThemesModule,
RegionModule,
],
controllers: [AppController],
providers: [AppService],
Expand Down
22 changes: 0 additions & 22 deletions src/auth/guard/bearer-token.guard.ts
Original file line number Diff line number Diff line change
Expand Up @@ -41,31 +41,9 @@ export class AccessTokenGuard extends BearerTokenGuard {

const req = context.switchToHttp().getRequest();

if (req.isRoutePublic) {
return true;
}

if (req.tokenType !== 'access') {
throw new UnauthorizedException('Access Token이 아닙니다.');
}
return true;
}
}

@Injectable()
export class RefreshTokenGuard extends BearerTokenGuard {
async canActivate(context: ExecutionContext): Promise<boolean> {
await super.canActivate(context);

const req = context.switchToHttp().getRequest();

if (req.isRoutePublic) {
return true;
}

if (req.tokenType !== 'refresh') {
throw new UnauthorizedException('Refresh Token이 아닙니다.');
}
return true;
}
}
File renamed without changes.
File renamed without changes.
File renamed without changes.
5 changes: 5 additions & 0 deletions src/common/validation-message/number-validation-message.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
import { ValidationArguments } from 'class-validator';

export const numberValidationMessage = (args: ValidationArguments) => {
return `${args.property}은 number type으로 입력해주세요.`;
};
5 changes: 5 additions & 0 deletions src/main.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,11 @@ async function bootstrap() {
app.useGlobalPipes(
new ValidationPipe({
transform: true,
transformOptions: {
enableImplicitConversion: true,
},
whitelist: true,
forbidNonWhitelisted: true,
}),
);
app.enableCors({
Expand Down
4 changes: 4 additions & 0 deletions src/region/dto/create-region.dto.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
import { PickType } from '@nestjs/swagger';
import { RegionModel } from '../entities/region.entity';

export class CreateRegionDto extends PickType(RegionModel, ['name']) {}
4 changes: 4 additions & 0 deletions src/region/dto/update-region.dto.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
import { PartialType } from '@nestjs/swagger';
import { CreateRegionDto } from './create-region.dto';

export class UpdateRegionDto extends PartialType(CreateRegionDto) {}
17 changes: 17 additions & 0 deletions src/region/entities/region.entity.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import { BaseModel } from '../../common/entity/base.entity';
import { Column, Entity, OneToMany } from 'typeorm';
import { IsString } from 'class-validator';
import { stringValidationMessage } from '../../common/validation-message/string-validation-message';
import { StoresModel } from '../../stores/entity/stores.entity';

@Entity('region')
export class RegionModel extends BaseModel {
@Column()
@IsString({
message: stringValidationMessage,
})
name: string;

@OneToMany(() => StoresModel, (store) => store.region)
stores: StoresModel[];
}
20 changes: 20 additions & 0 deletions src/region/region.controller.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
import { Test, TestingModule } from '@nestjs/testing';
import { RegionController } from './region.controller';
import { RegionService } from './region.service';

describe('RegionController', () => {
let controller: RegionController;

beforeEach(async () => {
const module: TestingModule = await Test.createTestingModule({
controllers: [RegionController],
providers: [RegionService],
}).compile();

controller = module.get<RegionController>(RegionController);
});

it('should be defined', () => {
expect(controller).toBeDefined();
});
});
34 changes: 34 additions & 0 deletions src/region/region.controller.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
import { Controller, Get, Post, Body, Patch, Param, Delete } from '@nestjs/common';
import { RegionService } from './region.service';
import { CreateRegionDto } from './dto/create-region.dto';
import { UpdateRegionDto } from './dto/update-region.dto';

@Controller('region')
export class RegionController {
constructor(private readonly regionService: RegionService) {}

@Post()
create(@Body() createRegionDto: CreateRegionDto) {
return this.regionService.create(createRegionDto);
}

@Get()
findAll() {
return this.regionService.findAll();
}

@Get(':id')
findOne(@Param('id') id: string) {
return this.regionService.findOne(+id);
}

@Patch(':id')
update(@Param('id') id: string, @Body() updateRegionDto: UpdateRegionDto) {
return this.regionService.update(+id, updateRegionDto);
}

@Delete(':id')
remove(@Param('id') id: string) {
return this.regionService.remove(+id);
}
}
12 changes: 12 additions & 0 deletions src/region/region.module.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import { Module } from '@nestjs/common';
import { RegionService } from './region.service';
import { RegionController } from './region.controller';
import { RegionModel } from './entities/region.entity';
import { TypeOrmModule } from '@nestjs/typeorm';

@Module({
imports: [TypeOrmModule.forFeature([RegionModel])],
controllers: [RegionController],
providers: [RegionService],
})
export class RegionModule {}
18 changes: 18 additions & 0 deletions src/region/region.service.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
import { Test, TestingModule } from '@nestjs/testing';
import { RegionService } from './region.service';

describe('RegionService', () => {
let service: RegionService;

beforeEach(async () => {
const module: TestingModule = await Test.createTestingModule({
providers: [RegionService],
}).compile();

service = module.get<RegionService>(RegionService);
});

it('should be defined', () => {
expect(service).toBeDefined();
});
});
26 changes: 26 additions & 0 deletions src/region/region.service.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
import { Injectable } from '@nestjs/common';
import { CreateRegionDto } from './dto/create-region.dto';
import { UpdateRegionDto } from './dto/update-region.dto';

@Injectable()
export class RegionService {
create(createRegionDto: CreateRegionDto) {
return 'This action adds a new region';
}

findAll() {
return `This action returns all region`;
}

findOne(id: number) {
return `This action returns a #${id} region`;
}

update(id: number, updateRegionDto: UpdateRegionDto) {
return `This action updates a #${id} region`;
}

remove(id: number) {
return `This action removes a #${id} region`;
}
}
2 changes: 1 addition & 1 deletion src/reviews/dto/paginate-reviews.dto.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,4 @@ import { BasePaginationDto } from '../../common/dto/base-pagination.dto';

export class PaginateReviewsDto extends BasePaginationDto {

}
}
4 changes: 4 additions & 0 deletions src/reviews/dto/update-reviews.dto.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
import { CreateReviewsDto } from './create-reviews.dto';
import { PartialType } from '@nestjs/swagger';

export class UpdateReviewsDto extends PartialType(CreateReviewsDto) {}
31 changes: 30 additions & 1 deletion src/reviews/entity/reviews.entity.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
import { Column, Entity, ManyToOne } from 'typeorm';
import { BaseModel } from '../../common/entity/base.entity';
import { UsersModel } from '../../users/entity/users.entity';
import { IsString } from 'class-validator';
import { IsNumber, IsString, Length } from 'class-validator';
import { stringValidationMessage } from '../../common/validation-message/string-validation-message';
import { numberValidationMessage } from '../../common/validation-message/number-validation-message';
import { lengthValidationMessage } from '../../common/validation-message/length-validation-message';

@Entity('reviews')
export class ReviewsModel extends BaseModel {
Expand Down Expand Up @@ -30,20 +32,47 @@ export class ReviewsModel extends BaseModel {
isSuccess: boolean;

@Column()
@IsNumber(
{},
{
message: numberValidationMessage,
},
)
numberOfPeople: number;

@Column()
@IsNumber(
{},
{
message: numberValidationMessage,
},
)
numberOfHintsUsed: number;

@Column()
@IsNumber(
{},
{
message: numberValidationMessage,
},
)
remainingTime: number;

@Column()
@IsNumber(
{},
{
message: numberValidationMessage,
},
)
totalThemeTime: number;

@Column()
@IsString({
message: stringValidationMessage,
})
@Length(1, 500, {
message: lengthValidationMessage,
})
content: string;
}
42 changes: 42 additions & 0 deletions src/reviews/guard/is-review-mine.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
import {
BadRequestException,
CanActivate,
ExecutionContext,
Injectable,
UnauthorizedException,
} from '@nestjs/common';
import { ReviewsService } from '../reviews.service';
import { UsersModel } from '../../users/entity/users.entity';
import { Request } from 'express';

@Injectable()
export class IsReviewMine implements CanActivate {
constructor(private readonly reviewService: ReviewsService) {}
async canActivate(context: ExecutionContext): Promise<boolean> {
const req = context.switchToHttp().getRequest() as Request & {
user: UsersModel;
};

const user = req.user;

if (!user) {
throw new UnauthorizedException('사용자 정보를 가져올 수 없습니다.');
}

// Path Parameter로 reviewId를 받아옵니다.
const reviewId = req.params.reviewId;

if (!reviewId) {
throw new BadRequestException('리뷰Id가 파라미터로 제공되어야합니다.');
}
const result = await this.reviewService.isReviewMine(
user.id,
parseInt(reviewId),
);

if (!result) {
throw new UnauthorizedException('해당 리뷰를 수정할 권한이 없습니다.');
}
return true;
}
}
Loading

0 comments on commit 0cfd156

Please sign in to comment.