1+ package controllers
2+
3+ import javax .inject .{Inject , Singleton }
4+ import play .api .mvc ._
5+ import play .api .libs .json ._
6+ import services .UserProfileService
7+ import models .entities .UserProfile
8+
9+ import scala .concurrent .{ExecutionContext , Future }
10+
11+ @ Singleton
12+ class UserProfileController @ Inject ()(
13+ val controllerComponents : ControllerComponents ,
14+ userProfileService : UserProfileService ,
15+ authenticatedAction : AuthenticatedActionWithUser
16+ )(implicit ec : ExecutionContext ) extends BaseController {
17+
18+ implicit val userProfileWrites : OWrites [UserProfile ] = Json .writes[UserProfile ]
19+
20+ // Request DTO for partial updates
21+ private case class UpdateUserProfileRequest (userLanguage : Option [String ], themeMode : Option [String ])
22+ private object UpdateUserProfileRequest {
23+ implicit val reads : Reads [UpdateUserProfileRequest ] = Json .reads[UpdateUserProfileRequest ]
24+ }
25+
26+ def getUserProfile : Action [AnyContent ] = authenticatedAction.async { request =>
27+ userProfileService.getUserProfile(request.userToken.userId).map {
28+ case Some (profile) => Ok (Json .toJson(profile))
29+ case None => NotFound
30+ }
31+ }
32+
33+ def updateProfile : Action [JsValue ] = authenticatedAction.async(parse.json) { request =>
34+ request.body.validate[UpdateUserProfileRequest ].fold(
35+ errors => Future .successful(BadRequest (JsError .toJson(errors))),
36+ dto => {
37+ userProfileService.getUserProfile(request.userToken.userId).flatMap {
38+ case None => Future .successful(NotFound )
39+ case Some (existing) =>
40+ val updated = existing.copy(
41+ userLanguage = dto.userLanguage.getOrElse(existing.userLanguage),
42+ themeMode = dto.themeMode.getOrElse(existing.themeMode),
43+ updatedAt = java.time.LocalDateTime .now()
44+ )
45+ userProfileService.updateProfile(updated).map {
46+ case Some (profile) => Ok (Json .toJson(profile))
47+ case None => InternalServerError (Json .obj(" error" -> " Failed to update profile" ))
48+ }
49+ }
50+ }
51+ )
52+ }
53+ }
0 commit comments