Skip to content

Commit 8aa218a

Browse files
committed
✨ Add episode progression DTO and payload; implement progression management routes
1 parent 150b034 commit 8aa218a

File tree

5 files changed

+100
-17
lines changed

5 files changed

+100
-17
lines changed

src/modules/misc/misc.service.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import axios, {AxiosInstance} from "axios";
33
import {Injectable} from "@nestjs/common";
44
import {createHash, randomBytes} from "crypto";
55
import * as JSZip from "jszip";
6-
import sharp from "sharp";
6+
import * as sharp from "sharp";
77
import * as fs from "fs";
88

99
@Injectable()
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import {IsInt, IsNotEmpty} from "class-validator";
2+
3+
export class EpisodeProgressionDto{
4+
@IsInt()
5+
@IsNotEmpty()
6+
progression: number;
7+
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
export class EpisodeProgressionPayload{
2+
episodeId: number;
3+
progression: number;
4+
}

src/modules/users/users.controller.ts

Lines changed: 28 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
1-
import {Body, Controller, Get, Param, Post, UseGuards} from "@nestjs/common";
1+
import {Body, Controller, Delete, Get, HttpCode, 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";
10+
import {EpisodeProgressionDto} from "./models/dto/episode-progression.dto";
911

1012
@Controller("user")
1113
export class UsersController{
@@ -54,10 +56,32 @@ export class UsersController{
5456
return await this.usersService.getEpisodeProgression(user, episodeId);
5557
}
5658

57-
@Post("progression/:episode_id")
59+
@Post("progression/episode/:episode_id")
5860
@UseGuards(AuthGuard("jwt"))
5961
@ApiBearerAuth()
60-
async setEpisodeProgression(@User() user: UserEntity, @Param("episode_id") episodeId: number, @Body("progression") progression: number): Promise<void>{
61-
await this.usersService.setEpisodeProgression(user, episodeId, progression);
62+
async setEpisodeProgression(@User() user: UserEntity, @Param("episode_id") episodeId: number, @Body() progression: EpisodeProgressionDto): Promise<void>{
63+
await this.usersService.setEpisodeProgression(user, episodeId, progression.progression);
64+
}
65+
66+
@Delete("progression")
67+
@HttpCode(HttpStatusCode.NoContent)
68+
@UseGuards(AuthGuard("jwt"))
69+
@ApiBearerAuth()
70+
async deleteAllProgressions(@User() user: UserEntity): Promise<void>{
71+
await this.usersService.deleteAllProgressions(user);
72+
}
73+
74+
@Delete("progression/webtoon/:webtoon_id")
75+
@UseGuards(AuthGuard("jwt"))
76+
@ApiBearerAuth()
77+
async deleteWebtoonProgression(@User() user: UserEntity, @Param("webtoon_id") webtoonId: number): Promise<void>{
78+
await this.usersService.deleteWebtoonProgression(user, webtoonId);
79+
}
80+
81+
@Delete("progression/episode/:episode_id")
82+
@UseGuards(AuthGuard("jwt"))
83+
@ApiBearerAuth()
84+
async deleteEpisodeProgression(@User() user: UserEntity, @Param("episode_id") episodeId: number): Promise<void>{
85+
await this.usersService.deleteEpisodeProgression(user, episodeId);
6286
}
6387
}

src/modules/users/users.service.ts

Lines changed: 60 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import {PrismaService} from "../misc/prisma.service";
66
import {MiscService} from "../misc/misc.service";
77
import {EpisodeProgressions, Images, Users} from "@prisma/client";
88
import {JwtService} from "@nestjs/jwt";
9+
import {EpisodeProgressionPayload} from "./models/payloads/episode-progression.payload";
910

1011
@Injectable()
1112
export class UsersService{
@@ -109,11 +110,24 @@ export class UsersService{
109110
};
110111
}
111112

112-
async getWebtoonProgression(user: UserEntity, webtoonId: number){
113-
// TODO
113+
async getWebtoonProgression(user: UserEntity, webtoonId: number): Promise<EpisodeProgressionPayload[]>{
114+
const episodeProgressions: EpisodeProgressions[] = await this.prismaService.episodeProgressions.findMany({
115+
where: {
116+
user_id: user.id,
117+
episode: {
118+
webtoon_id: webtoonId,
119+
},
120+
},
121+
});
122+
if(!episodeProgressions.length)
123+
return [];
124+
return episodeProgressions.map((episodeProgression: EpisodeProgressions): EpisodeProgressionPayload => ({
125+
episodeId: episodeProgression.episode_id,
126+
progression: episodeProgression.progression,
127+
}));
114128
}
115129

116-
async getEpisodeProgression(user: UserEntity, episodeId: number): Promise<number>{
130+
async getEpisodeProgression(user: UserEntity, episodeId: number): Promise<EpisodeProgressionPayload>{
117131
const episodeProgression: EpisodeProgressions = await this.prismaService.episodeProgressions.findUnique({
118132
where: {
119133
user_id_episode_id: {
@@ -124,34 +138,68 @@ export class UsersService{
124138
});
125139
if(!episodeProgression)
126140
throw new NotFoundException("Episode progression not found");
127-
return episodeProgression.progression;
141+
return {
142+
episodeId,
143+
progression: episodeProgression.progression,
144+
} as EpisodeProgressionPayload;
128145
}
129146

130147
async setEpisodeProgression(user: UserEntity, episodeId: number, progression: number){
131-
const episodeProgression: EpisodeProgressions = await this.prismaService.episodeProgressions.findUnique({
148+
const episodeProgression: EpisodeProgressions | undefined = await this.prismaService.episodeProgressions.findUnique({
132149
where: {
133150
user_id_episode_id: {
134151
user_id: user.id,
135152
episode_id: episodeId,
136153
},
137154
},
138155
});
139-
if(!episodeProgression)
140-
throw new NotFoundException("Episode progression not found");
141156
if(progression < 0)
142157
throw new BadRequestException("Invalid progression");
143-
if(progression < episodeProgression.progression)
158+
if(progression < (episodeProgression?.progression || 0))
144159
throw new BadRequestException("New progression must be greater than existing one");
145-
await this.prismaService.episodeProgressions.update({
160+
await this.prismaService.episodeProgressions.upsert({
146161
where: {
147162
user_id_episode_id: {
148-
user_id: episodeProgression.user_id,
149-
episode_id: episodeProgression.episode_id,
163+
user_id: user.id,
164+
episode_id: episodeId,
150165
},
151166
},
152-
data: {
167+
create: {
168+
user_id: user.id,
169+
episode_id: episodeId,
153170
progression,
154171
},
172+
update: {
173+
progression,
174+
},
175+
});
176+
}
177+
178+
async deleteAllProgressions(user: UserEntity){
179+
await this.prismaService.episodeProgressions.deleteMany({
180+
where: {
181+
user_id: user.id,
182+
},
183+
});
184+
}
185+
186+
async deleteWebtoonProgression(user: UserEntity, webtoonId: number){
187+
await this.prismaService.episodeProgressions.deleteMany({
188+
where: {
189+
user_id: user.id,
190+
episode: {
191+
webtoon_id: webtoonId,
192+
},
193+
},
194+
});
195+
}
196+
197+
async deleteEpisodeProgression(user: UserEntity, episodeId: number){
198+
await this.prismaService.episodeProgressions.deleteMany({
199+
where: {
200+
user_id: user.id,
201+
episode_id: episodeId,
202+
},
155203
});
156204
}
157205
}

0 commit comments

Comments
 (0)