- Added automated onboarding dialog for new users to pick genres, eras, and content types. - Enhanced "Add Movie" functionality to support folder-per-movie structure with Year and IMDb ID. - Improved ui.js with custom dialogs for Onboarding, Rating, and Adding Movies. - Fixed API accessibility by using standard [Authorize] attributes. - Added "Mark Viewed" and "Sync" actions to the UI. Co-authored-by: devitq <118541411+devitq@users.noreply.github.com>
53 lines
2.5 KiB
Kotlin
53 lines
2.5 KiB
Kotlin
package com.project.movienight.adapters.web
|
|
|
|
import com.project.movienight.adapters.web.dto.request.RecommendationOnboardingRequest
|
|
import com.project.movienight.adapters.web.dto.response.RecommendationOnboardingResponse
|
|
import com.project.movienight.application.ports.input.CompleteRecommendationOnboardingCommand
|
|
import com.project.movienight.application.ports.input.CompleteRecommendationOnboardingUseCase
|
|
import com.project.movienight.domain.model.ContentType
|
|
import com.project.movienight.domain.model.RecommendationStyle
|
|
import org.springframework.web.bind.annotation.PathVariable
|
|
import org.springframework.web.bind.annotation.PostMapping
|
|
import org.springframework.web.bind.annotation.RequestBody
|
|
import org.springframework.web.bind.annotation.RequestMapping
|
|
import org.springframework.web.bind.annotation.RestController
|
|
import java.util.Locale
|
|
import java.util.UUID
|
|
|
|
@RestController
|
|
@RequestMapping("/api/users/{userId}/recommendation-onboarding")
|
|
class RecommendationOnboardingController(
|
|
private val completeRecommendationOnboardingUseCase: CompleteRecommendationOnboardingUseCase,
|
|
) {
|
|
@PostMapping
|
|
fun complete(
|
|
@PathVariable userId: UUID,
|
|
@RequestBody request: RecommendationOnboardingRequest,
|
|
): RecommendationOnboardingResponse =
|
|
RecommendationOnboardingResponse.fromApplication(
|
|
completeRecommendationOnboardingUseCase.complete(
|
|
CompleteRecommendationOnboardingCommand(
|
|
userId = userId,
|
|
weightedGenres = request.weightedGenres,
|
|
plotTypes = request.plotTypes,
|
|
eras = request.eras,
|
|
castAndDirectors = request.castAndDirectors,
|
|
moods = request.moods,
|
|
contentTypes = request.contentTypes.mapNotNull(::parseContentType),
|
|
likedFilmIds = request.likedFilmIds,
|
|
dislikedFilmIds = request.dislikedFilmIds,
|
|
libraryFilmIds = request.libraryFilmIds,
|
|
watchedFilmIds = request.watchedFilmIds,
|
|
recommendationStyle = parseRecommendationStyle(request.recommendationStyle),
|
|
),
|
|
),
|
|
)
|
|
|
|
private fun parseContentType(value: String): ContentType? =
|
|
runCatching { ContentType.valueOf(value.uppercase(Locale.getDefault())) }.getOrNull()
|
|
|
|
private fun parseRecommendationStyle(value: String): RecommendationStyle =
|
|
runCatching { RecommendationStyle.valueOf(value.uppercase(Locale.getDefault())) }
|
|
.getOrDefault(RecommendationStyle.BALANCED)
|
|
}
|