From 1db828ead3412165ae7147b09f57b4000d6e8379 Mon Sep 17 00:00:00 2001 From: SeungWon Date: Thu, 25 Apr 2024 12:11:07 -0700 Subject: [PATCH] :sparkles: add all features --- src/likes/entities/likes.entity.ts | 10 ++++++++++ src/likes/likes.controller.ts | 31 ++++++++++++++++++++++++++++-- src/likes/likes.module.ts | 7 +++++-- src/likes/likes.service.ts | 18 ++++++++++++++++- 4 files changed, 61 insertions(+), 5 deletions(-) diff --git a/src/likes/entities/likes.entity.ts b/src/likes/entities/likes.entity.ts index d473a3a43e..825f5083fe 100644 --- a/src/likes/entities/likes.entity.ts +++ b/src/likes/entities/likes.entity.ts @@ -1,3 +1,4 @@ +import { ApiProperty } from '@nestjs/swagger'; import { Exclude } from 'class-transformer'; import { User } from 'src/user/entities/user.entity'; import { @@ -12,12 +13,21 @@ import { @Entity() export class Likes { @PrimaryGeneratedColumn() + @Exclude() id: number; @ManyToOne(() => User, (user) => user.likesList) + @ApiProperty({ + type: () => User, + }) user: User; @Column() + @ApiProperty({ + example: 1, + description: 'Profile ID', + type: 'number', + }) profileId: number; @CreateDateColumn({ type: 'timestamptz' }) diff --git a/src/likes/likes.controller.ts b/src/likes/likes.controller.ts index 3e6a3f53ff..c755a137d0 100644 --- a/src/likes/likes.controller.ts +++ b/src/likes/likes.controller.ts @@ -1,4 +1,31 @@ -import { Controller } from '@nestjs/common'; +import { Controller, Param, Post, UseGuards } from '@nestjs/common'; +import { ApiBearerAuth, ApiParam, ApiResponse } from '@nestjs/swagger'; +import { JwtAuthGuard } from 'src/user/user.guard'; +import { LikesService } from './likes.service'; +import { GetUser } from 'src/user/decorators/GetUser.decorator'; +import { Payload } from 'src/user/dto/jwt-payload.dto'; +import { Likes } from './entities/likes.entity'; @Controller('likes') -export class LikesController {} +@UseGuards(JwtAuthGuard) +@ApiBearerAuth('access-token') +export class LikesController { + constructor(private readonly likesService: LikesService) {} + @Post('/:profileId') + @ApiParam({ + name: 'profileId', + type: 'number', + description: 'Profile ID', + }) + @ApiResponse({ + status: 201, + description: 'Like a profile', + type: Likes, + }) + async likeProfile( + @Param('profileId') profileId: number, + @GetUser() user: Payload, + ): Promise { + return this.likesService.likeProfile(profileId, user.userId); + } +} diff --git a/src/likes/likes.module.ts b/src/likes/likes.module.ts index 8282cf390b..8911b2b2e3 100644 --- a/src/likes/likes.module.ts +++ b/src/likes/likes.module.ts @@ -3,11 +3,14 @@ import { LikesController } from './likes.controller'; import { LikesService } from './likes.service'; import { TypeOrmModule } from '@nestjs/typeorm'; import { Likes } from './entities/likes.entity'; +import { JwtService } from '@nestjs/jwt'; +import { JwtStrategy } from 'src/user/strategies/jwt.strategy'; +import { UserModule } from 'src/user/user.module'; @Module({ - imports: [TypeOrmModule.forFeature([Likes])], + imports: [TypeOrmModule.forFeature([Likes]), UserModule], controllers: [LikesController], - providers: [LikesService], + providers: [LikesService, JwtService, JwtStrategy], exports: [LikesService], }) export class LikesModule {} diff --git a/src/likes/likes.service.ts b/src/likes/likes.service.ts index bb8217a260..ed32ad3b20 100644 --- a/src/likes/likes.service.ts +++ b/src/likes/likes.service.ts @@ -1,13 +1,16 @@ -import { Injectable } from '@nestjs/common'; +import { HttpException, HttpStatus, Injectable } from '@nestjs/common'; import { InjectRepository } from '@nestjs/typeorm'; import { Likes } from './entities/likes.entity'; import { Repository } from 'typeorm'; +import { UserService } from 'src/user/user.service'; +import { User } from 'src/user/entities/user.entity'; @Injectable() export class LikesService { constructor( @InjectRepository(Likes) private readonly likesRepository: Repository, + private readonly userService: UserService, ) {} async getLikedUserIdList(profileId: number): Promise { const likesList = await this.likesRepository.find({ @@ -16,4 +19,17 @@ export class LikesService { }); return likesList.map((like) => like.user.id); } + + async likeProfile(profileId: number, userId: number): Promise { + const user: User = await this.userService.findOneById(userId); + const newLike: Likes = this.likesRepository.create({ + profileId, + user, + }); + try { + return await this.likesRepository.save(newLike); + } catch (error) { + throw new HttpException('Error', HttpStatus.INTERNAL_SERVER_ERROR); + } + } }