Skip to content

Commit aa7b558

Browse files
committed
✨ Add endpoints for liking and unliking webtoons; implement retrieval of liked webtoons
1 parent 5686e5d commit aa7b558

File tree

2 files changed

+62
-3
lines changed

2 files changed

+62
-3
lines changed

src/modules/users/users.controller.ts

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,11 @@
1-
import {Body, Controller, Delete, Get, HttpCode, Param, Post, UseGuards} from "@nestjs/common";
1+
import {Body, Controller, Delete, Get, HttpCode, HttpStatus, Param, Post, UseGuards} from "@nestjs/common";
22
import {UserEntity} from "./models/entities/user.entity";
33
import {LoginPayload} from "./models/payloads/login.payload";
44
import {User} from "./decorators/user.decorator";
55
import {LoginDto} from "./models/dto/login.dto";
66
import {ApiBearerAuth} from "@nestjs/swagger";
77
import {UsersService} from "./users.service";
88
import {AuthGuard} from "@nestjs/passport";
9-
import {HttpStatusCode} from "axios";
109
import {EpisodeProgressionDto} from "./models/dto/episode-progression.dto";
1110

1211
@Controller("user")
@@ -64,7 +63,7 @@ export class UsersController{
6463
}
6564

6665
@Delete("progression")
67-
@HttpCode(HttpStatusCode.NoContent)
66+
@HttpCode(HttpStatus.NO_CONTENT)
6867
@UseGuards(AuthGuard("jwt"))
6968
@ApiBearerAuth()
7069
async deleteAllProgressions(@User() user: UserEntity): Promise<void>{
@@ -84,4 +83,27 @@ export class UsersController{
8483
async deleteEpisodeProgression(@User() user: UserEntity, @Param("episode_id") episodeId: number): Promise<void>{
8584
await this.usersService.deleteEpisodeProgression(user, episodeId);
8685
}
86+
87+
@Get("likes/webtoons")
88+
@UseGuards(AuthGuard("jwt"))
89+
@ApiBearerAuth()
90+
async getLikedWebtoons(@User() user: UserEntity): Promise<number[]>{
91+
return await this.usersService.getLikedWebtoons(user);
92+
}
93+
94+
@Post("likes/webtoon/:webtoon_id")
95+
@HttpCode(HttpStatus.NO_CONTENT)
96+
@UseGuards(AuthGuard("jwt"))
97+
@ApiBearerAuth()
98+
async likeWebtoon(@User() user: UserEntity, @Param("webtoon_id") webtoonId: number): Promise<void>{
99+
await this.usersService.likeWebtoon(user, webtoonId);
100+
}
101+
102+
@Delete("likes/webtoon/:webtoon_id")
103+
@HttpCode(HttpStatus.NO_CONTENT)
104+
@UseGuards(AuthGuard("jwt"))
105+
@ApiBearerAuth()
106+
async unlikeWebtoon(@User() user: UserEntity, @Param("webtoon_id") webtoonId: number): Promise<void>{
107+
await this.usersService.unlikeWebtoon(user, webtoonId);
108+
}
87109
}

src/modules/users/users.service.ts

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -202,4 +202,41 @@ export class UsersService{
202202
},
203203
});
204204
}
205+
206+
async getLikedWebtoons(user: UserEntity): Promise<number[]>{
207+
const likedWebtoons = await this.prismaService.webtoonLikes.findMany({
208+
where: {
209+
user_id: user.id,
210+
},
211+
select: {
212+
webtoon_id: true,
213+
},
214+
});
215+
return likedWebtoons.map(likedWebtoon => likedWebtoon.webtoon_id);
216+
}
217+
218+
async likeWebtoon(user: UserEntity, webtoonId: number): Promise<void>{
219+
await this.prismaService.webtoonLikes.upsert({
220+
where: {
221+
user_id_webtoon_id: {
222+
user_id: user.id,
223+
webtoon_id: webtoonId,
224+
},
225+
},
226+
create: {
227+
user_id: user.id,
228+
webtoon_id: webtoonId,
229+
},
230+
update: {},
231+
});
232+
}
233+
234+
async unlikeWebtoon(user: UserEntity, webtoonId: number): Promise<void>{
235+
await this.prismaService.webtoonLikes.deleteMany({
236+
where: {
237+
user_id: user.id,
238+
webtoon_id: webtoonId,
239+
},
240+
});
241+
}
205242
}

0 commit comments

Comments
 (0)