Skip to content

Commit 77ad0b5

Browse files
committed
✨ Added rating, favourite delete requests ✨
1 parent 0a321ea commit 77ad0b5

File tree

5 files changed

+132
-23
lines changed

5 files changed

+132
-23
lines changed

src/main/kotlin/club/anifox/backend/controller/users/UsersAnimeController.kt

Lines changed: 22 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import jakarta.validation.constraints.Max
1212
import jakarta.validation.constraints.Min
1313
import org.springframework.security.access.prepost.PreAuthorize
1414
import org.springframework.web.bind.annotation.CrossOrigin
15+
import org.springframework.web.bind.annotation.DeleteMapping
1516
import org.springframework.web.bind.annotation.GetMapping
1617
import org.springframework.web.bind.annotation.PathVariable
1718
import org.springframework.web.bind.annotation.PostMapping
@@ -41,7 +42,15 @@ class UsersAnimeController(
4142
episodesWatched: Int?,
4243
response: HttpServletResponse,
4344
) {
44-
userService.addToFavoritesAnime(token, url, status, episodesWatched, response)
45+
userService.addToFavorites(token, url, status, episodesWatched, response)
46+
}
47+
48+
@DeleteMapping("{url}/favourite")
49+
fun deleteFavoriteAnime(
50+
@RequestHeader(value = "Authorization") token: String,
51+
@PathVariable url: String,
52+
) {
53+
userService.deleteFavorite(token, url)
4554
}
4655

4756
@GetMapping("favourite/{status}")
@@ -57,7 +66,7 @@ class UsersAnimeController(
5766
@Max(500)
5867
Int,
5968
): List<AnimeLight> {
60-
return userService.getFavoritesAnimeByStatus(token, status, page, limit)
69+
return userService.getFavoritesByStatus(token, status, page, limit)
6170
}
6271

6372
@GetMapping("recommendations")
@@ -96,7 +105,7 @@ class UsersAnimeController(
96105
}
97106

98107
@GetMapping("recently")
99-
fun getRecentlyAnime(
108+
fun getRecently(
100109
@RequestParam(defaultValue = "0", name = "page") page:
101110
@Min(0)
102111
@Max(500)
@@ -108,20 +117,24 @@ class UsersAnimeController(
108117
@RequestHeader(value = "Authorization") token: String,
109118
response: HttpServletResponse,
110119
): List<AnimeLight> {
111-
return userService.getRecentlyAnimeAll(token, page, limit)
120+
return userService.getRecently(token, page, limit)
112121
}
113122

114123
@PutMapping("{url}/rating")
115124
fun setAnimeRating(
116125
@RequestHeader(value = "Authorization") token: String,
117126
@PathVariable url: String,
118-
@RequestParam(required = true)
119-
rating:
120-
@Min(0)
121-
@Max(10)
122-
Int,
127+
@RequestParam @Min(0) @Max(10) rating: Int,
123128
response: HttpServletResponse,
124129
) {
125130
userService.addRating(token, url, rating, response)
126131
}
132+
133+
@DeleteMapping("{url}/rating")
134+
fun deleteAnimeRating(
135+
@RequestHeader(value = "Authorization") token: String,
136+
@PathVariable url: String,
137+
) {
138+
userService.deleteRating(token, url)
139+
}
127140
}

src/main/kotlin/club/anifox/backend/domain/repository/user/UserRepository.kt

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,21 +13,21 @@ interface UserRepository {
1313
response: HttpServletResponse,
1414
)
1515

16-
fun getRecentlyAnimeAll(
16+
fun getRecently(
1717
token: String,
1818
page: Int,
1919
limit: Int,
2020
): List<AnimeLight>
2121

22-
fun addToFavoritesAnime(
22+
fun addToFavorites(
2323
token: String,
2424
url: String,
2525
status: StatusFavourite,
2626
episodesWatched: Int?,
2727
response: HttpServletResponse,
2828
)
2929

30-
fun getFavoritesAnimeByStatus(
30+
fun getFavoritesByStatus(
3131
token: String,
3232
status: StatusFavourite,
3333
page: Int,
@@ -52,4 +52,7 @@ interface UserRepository {
5252
episodeNumber: Int,
5353
progress: AnimeEpisodeProgressRequest,
5454
)
55+
56+
fun deleteFavorite(token: String, url: String)
57+
fun deleteRating(token: String, url: String)
5558
}

src/main/kotlin/club/anifox/backend/service/user/UserService.kt

Lines changed: 63 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,22 @@ class UserService(
2222
rating: Int,
2323
response: HttpServletResponse,
2424
) {
25-
animeRatingComponent.addRating(token = token, url = url, rating = rating, response = response)
25+
animeRatingComponent.addRating(
26+
token = token,
27+
url = url,
28+
rating = rating,
29+
response = response,
30+
)
31+
}
32+
33+
override fun deleteRating(
34+
token: String,
35+
url: String,
36+
) {
37+
animeRatingComponent.deleteRating(
38+
token = token,
39+
url = url,
40+
)
2641
}
2742

2843
override fun changeEpisodeProgress(
@@ -31,49 +46,87 @@ class UserService(
3146
episodeNumber: Int,
3247
progress: AnimeEpisodeProgressRequest,
3348
) {
34-
userAnimeInteractionsComponent.changeEpisodeProgress(token, url, episodeNumber, progress)
49+
userAnimeInteractionsComponent.changeEpisodeProgress(
50+
token = token,
51+
url = url,
52+
episodeNumber = episodeNumber,
53+
progress = progress,
54+
)
3555
}
3656

37-
override fun getRecentlyAnimeAll(
57+
override fun getRecently(
3858
token: String,
3959
page: Int,
4060
limit: Int,
4161
): List<AnimeLight> {
42-
return userAnimeInteractionsComponent.getRecentlyAnimeList(token = token, page = page, limit = limit)
62+
return userAnimeInteractionsComponent.getRecentlyAnimeList(
63+
token = token,
64+
page = page,
65+
limit = limit,
66+
)
4367
}
4468

4569
override fun updatePreferredGenres(
4670
token: String,
4771
genres: List<String>,
4872
response: HttpServletResponse,
4973
) {
50-
return userAnimeInteractionsComponent.updatePreferredGenres(token = token, genres = genres, response = response)
74+
return userAnimeInteractionsComponent.updatePreferredGenres(
75+
token = token,
76+
genres = genres,
77+
response = response,
78+
)
5179
}
5280

5381
override fun getRecommendations(
5482
token: String,
5583
page: Int,
5684
limit: Int,
5785
): List<AnimeLight> {
58-
return userAnimeInteractionsComponent.getRecommendations(token = token, page = page, limit = limit)
86+
return userAnimeInteractionsComponent.getRecommendations(
87+
token = token,
88+
page = page,
89+
limit = limit,
90+
)
5991
}
6092

61-
override fun addToFavoritesAnime(
93+
override fun addToFavorites(
6294
token: String,
6395
url: String,
6496
status: StatusFavourite,
6597
episodesWatched: Int?,
6698
response: HttpServletResponse,
6799
) {
68-
animeFavoriteStatusService.addToFavorites(token = token, url = url, status = status, episodesWatched = episodesWatched, response = response)
100+
animeFavoriteStatusService.addToFavorites(
101+
token = token,
102+
url = url,
103+
status = status,
104+
episodesWatched = episodesWatched,
105+
response = response,
106+
)
107+
}
108+
109+
override fun deleteFavorite(
110+
token: String,
111+
url: String,
112+
) {
113+
animeFavoriteStatusService.deleteFavorite(
114+
token = token,
115+
url = url,
116+
)
69117
}
70118

71-
override fun getFavoritesAnimeByStatus(
119+
override fun getFavoritesByStatus(
72120
token: String,
73121
status: StatusFavourite,
74122
page: Int,
75123
limit: Int,
76124
): List<AnimeLight> {
77-
return animeFavoriteStatusService.getFavoritesByStatus(token = token, status = status, page = page, limit = limit)
125+
return animeFavoriteStatusService.getFavoritesByStatus(
126+
token = token,
127+
status = status,
128+
page = page,
129+
limit = limit,
130+
)
78131
}
79132
}

src/main/kotlin/club/anifox/backend/service/user/component/favourite/AnimeFavoriteStatusComponent.kt

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,26 @@ class AnimeFavoriteStatusComponent(
7474
}
7575
}
7676

77+
@Transactional
78+
fun deleteFavorite(
79+
token: String,
80+
url: String,
81+
) {
82+
val user = userUtils.checkUser(token)
83+
val anime = animeUtils.checkAnime(url)
84+
val existingFavorite = userFavoriteAnimeRepository.findByUserAndAnime(user, anime)
85+
86+
if (existingFavorite.isPresent) {
87+
val existFavorite = existingFavorite.get()
88+
89+
updateStatusWithRetry(anime, existFavorite.status, null)
90+
userFavoriteAnimeRepository.delete(existFavorite)
91+
userFavoriteAnimeRepository.flush()
92+
} else {
93+
throw NotFoundException("favourite not found")
94+
}
95+
}
96+
7797
fun getFavoritesByStatus(
7898
token: String,
7999
status: StatusFavourite,
@@ -89,7 +109,7 @@ class AnimeFavoriteStatusComponent(
89109

90110
return favoriteAnime.takeIf { it.isNotEmpty() }
91111
?.map { it.anime.toAnimeLight() }
92-
?: throw NotFoundException("The user has no favourite anime")
112+
?: throw NotFoundException("favourite not found")
93113
}
94114

95115
@Transactional

src/main/kotlin/club/anifox/backend/service/user/component/rating/AnimeRatingComponent.kt

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package club.anifox.backend.service.user.component.rating
22

3+
import club.anifox.backend.domain.exception.common.NotFoundException
34
import club.anifox.backend.jpa.entity.anime.AnimeRatingDistributionTable
45
import club.anifox.backend.jpa.entity.anime.AnimeRatingTable
56
import club.anifox.backend.jpa.entity.anime.AnimeTable
@@ -70,6 +71,25 @@ class AnimeRatingComponent(
7071
}
7172
}
7273

74+
@Transactional
75+
fun deleteRating(
76+
token: String,
77+
url: String,
78+
) {
79+
val user = userUtils.checkUser(token)
80+
val anime = animeUtils.checkAnime(url)
81+
val existingRating = userRatingRepository.findByUserAndAnime(user, anime)
82+
83+
if (existingRating.isPresent) {
84+
val existRating = existingRating.get()
85+
updateRatingWithRetry(anime, existRating.rating, null)
86+
userRatingRepository.delete(existRating)
87+
userRatingRepository.flush()
88+
} else {
89+
throw NotFoundException("rating not found")
90+
}
91+
}
92+
7393
@Transactional
7494
protected fun processAnimeRatingUpdate(
7595
user: UserTable,

0 commit comments

Comments
 (0)