UserAdditionalDataController.java

package cl.tica.portfolio.recipeapi.auth.controllers;

import cl.tica.portfolio.recipeapi.application.models.ExceptionWrappingError;
import cl.tica.portfolio.recipeapi.auth.dto.request.AdditionalDataRequest;
import cl.tica.portfolio.recipeapi.auth.dto.response.UpdatedUserResponse;
import cl.tica.portfolio.recipeapi.auth.dto.response.UserConfirmationResponse;
import cl.tica.portfolio.recipeapi.auth.entities.User;
import cl.tica.portfolio.recipeapi.auth.entities.UserAdditionalData;
import cl.tica.portfolio.recipeapi.auth.enums.GenderType;
import cl.tica.portfolio.recipeapi.auth.services.UserAdditionalDataService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.media.Content;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.Valid;
import org.springframework.http.ResponseEntity;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@Tag(name = "Additional Data User Controller")
@RestController
@RequestMapping("/v1/user")
public class UserAdditionalDataController {
    private final UserAdditionalDataService userAdditionalDataService;

    public UserAdditionalDataController(UserAdditionalDataService userAdditionalDataService) {
        this.userAdditionalDataService = userAdditionalDataService;
    }

    @Operation(summary = "Add Additional user data information.")
    @ApiResponse(responseCode = "200", content = @Content(mediaType = "application/json", schema =
    @Schema(implementation = UserConfirmationResponse.class)))
    @ApiResponse(responseCode = "401", content = @Content(mediaType = "application/json", schema =
    @Schema(implementation = ExceptionWrappingError.class)))
    @PutMapping("/additional-data")
    public ResponseEntity<UpdatedUserResponse> updateUserAdditionalData(
            @Valid @RequestBody AdditionalDataRequest request) {
        Authentication auth = SecurityContextHolder.getContext().getAuthentication();

        User user = userAdditionalDataService.findUserByUsername(auth.getName());
        UserAdditionalData userAdditionalData = user.getUserData();
        userAdditionalData.setName(request.name());
        userAdditionalData.setLastname(request.lastname());
        userAdditionalData.setGender(GenderType.valueOf(request.gender().toUpperCase()));
        user.setUserData(userAdditionalData);

        User userSaved = userAdditionalDataService.updateUserData(user);

        return ResponseEntity.ok(new UpdatedUserResponse(
                userSaved.getUsername(),
                userSaved.getEmail(),
                userSaved.getRoles(),
                userSaved.getUserData()
        ));
    }
}