Skip to content

Commit ee0c5b6

Browse files
authored
Merge pull request #84 from Open-Webtoon-Reader/feature/user-likes
2 parents 21ed4ac + fa9d29c commit ee0c5b6

File tree

5 files changed

+91
-6
lines changed

5 files changed

+91
-6
lines changed
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
-- CreateTable
2+
CREATE TABLE "webtoon_likes" (
3+
"user_id" TEXT NOT NULL,
4+
"webtoon_id" INTEGER NOT NULL,
5+
6+
CONSTRAINT "webtoon_likes_pkey" PRIMARY KEY ("user_id","webtoon_id")
7+
);
8+
9+
-- AddForeignKey
10+
ALTER TABLE "webtoon_likes" ADD CONSTRAINT "webtoon_likes_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE CASCADE;
11+
12+
-- AddForeignKey
13+
ALTER TABLE "webtoon_likes" ADD CONSTRAINT "webtoon_likes_webtoon_id_fkey" FOREIGN KEY ("webtoon_id") REFERENCES "webtoons"("id") ON DELETE CASCADE ON UPDATE CASCADE;
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
# Please do not edit this file manually
22
# It should be added in your version-control system (e.g., Git)
3-
provider = "postgresql"
3+
provider = "postgresql"

prisma/schema.prisma

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,22 @@ model Users {
2323
admin Boolean @default(false)
2424
avatar_id Int? @unique
2525
avatar Images? @relation(fields: [avatar_id], references: [id])
26-
episode_progerssions EpisodeProgressions[]
26+
episode_progressions EpisodeProgressions[]
27+
webtoon_likes WebtoonLikes[]
2728
2829
@@map("users")
2930
}
3031

32+
model WebtoonLikes {
33+
user_id String
34+
user Users @relation(fields: [user_id], references: [id], onDelete: Cascade)
35+
webtoon_id Int
36+
webtoon Webtoons @relation(fields: [webtoon_id], references: [id], onDelete: Cascade)
37+
38+
@@id([user_id, webtoon_id])
39+
@@map("webtoon_likes")
40+
}
41+
3142
model EpisodeProgressions {
3243
user_id String
3344
user Users @relation(fields: [user_id], references: [id], onDelete: Cascade)
@@ -98,6 +109,7 @@ model Webtoons {
98109
updated_at DateTime @default(now()) @updatedAt
99110
genres WebtoonGenres[]
100111
episodes Episodes[]
112+
webtoon_likes WebtoonLikes[]
101113
102114
@@unique([title, author, language])
103115
@@map("webtoons")
@@ -113,7 +125,7 @@ model Episodes {
113125
thumbnail Images @relation(fields: [thumbnail_id], references: [id])
114126
created_at DateTime @default(now())
115127
episode_images EpisodeImages[]
116-
episode_progerssions EpisodeProgressions[]
128+
episode_progressions EpisodeProgressions[]
117129
118130
@@unique([webtoon_id, number])
119131
@@map("episodes")

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: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -202,4 +202,42 @@ 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+
// Create a new like if it doesn't exist, or do nothing if it does
220+
await this.prismaService.webtoonLikes.upsert({
221+
where: {
222+
user_id_webtoon_id: {
223+
user_id: user.id,
224+
webtoon_id: webtoonId,
225+
},
226+
},
227+
create: {
228+
user_id: user.id,
229+
webtoon_id: webtoonId,
230+
},
231+
update: {},
232+
});
233+
}
234+
235+
async unlikeWebtoon(user: UserEntity, webtoonId: number): Promise<void>{
236+
await this.prismaService.webtoonLikes.deleteMany({
237+
where: {
238+
user_id: user.id,
239+
webtoon_id: webtoonId,
240+
},
241+
});
242+
}
205243
}

0 commit comments

Comments
 (0)