UserController.java

package com.wilzwert.myjobs.infrastructure.api.rest.controller;


import com.wilzwert.myjobs.core.domain.model.user.command.UpdateUserLangCommand;
import com.wilzwert.myjobs.core.domain.model.user.ports.driving.*;
import com.wilzwert.myjobs.infrastructure.api.rest.dto.*;
import com.wilzwert.myjobs.infrastructure.persistence.mongo.mapper.UserMapper;
import com.wilzwert.myjobs.infrastructure.security.service.UserDetailsImpl;
import jakarta.validation.Valid;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.security.core.Authentication;
import org.springframework.web.bind.annotation.*;

/**
 * @author Wilhelm Zwertvaegher
 * TODO : add rate limiting on public endpoints
 */
@RestController
@Slf4j
@RequestMapping("/api/user/me")
public class UserController {

    private final GetUserViewUseCase getUserViewUseCase;

    private final UpdateUserUseCase updateUserUseCase;

    private final UpdateUserLangUseCase updateUserLangUseCase;

    private final DeleteAccountUseCase deleteAccountUseCase;

    private final GetUserSummaryUseCase getUserSummaryUseCase;

    private final UserMapper userMapper;

    public UserController(GetUserViewUseCase getUserViewUseCase, UpdateUserUseCase updateUserUseCase, UpdateUserLangUseCase updateUserLangUseCase, DeleteAccountUseCase deleteAccountUseCase, GetUserSummaryUseCase getUserSummaryUseCase, UserMapper userMapper) {
        this.getUserViewUseCase = getUserViewUseCase;
        this.updateUserUseCase = updateUserUseCase;
        this.updateUserLangUseCase = updateUserLangUseCase;
        this.deleteAccountUseCase = deleteAccountUseCase;
        this.getUserSummaryUseCase = getUserSummaryUseCase;
        this.userMapper = userMapper;
    }

    @DeleteMapping
    @ResponseStatus(HttpStatus.NO_CONTENT)
    public void deleteAccount(Authentication authentication) {
        UserDetailsImpl userDetails = (UserDetailsImpl) authentication.getPrincipal();
        deleteAccountUseCase.deleteAccount(userDetails.getId());
    }

    @GetMapping()
    public UserResponse me(Authentication authentication) {
        UserDetailsImpl userDetails = (UserDetailsImpl) authentication.getPrincipal();
        return userMapper.toResponseFromView(getUserViewUseCase.getUser(userDetails.getId()));
    }

    @PatchMapping()
    public UserResponse update(@RequestBody @Valid UpdateUserRequest updateUserRequest, Authentication authentication) {
        UserDetailsImpl userDetails = (UserDetailsImpl) authentication.getPrincipal();
        return userMapper.toResponse(updateUserUseCase.updateUser(userMapper.toUpdateCommand(updateUserRequest, userDetails.getId())));
    }

    @PutMapping("/lang")
    @ResponseStatus(HttpStatus.OK)
    public void changeLang(@RequestBody @Valid UpdateUserLangRequest updateUserLangRequest, Authentication authentication) {
        UserDetailsImpl userDetails = (UserDetailsImpl) authentication.getPrincipal();
        updateUserLangUseCase.updateUserLang(new UpdateUserLangCommand(updateUserLangRequest.getLang(), userDetails.getId()));
    }

    @GetMapping("/summary")
    @ResponseStatus(HttpStatus.OK)
    public UserSummaryResponse getSummary(Authentication authentication) {
        UserDetailsImpl userDetails = (UserDetailsImpl) authentication.getPrincipal();
        return userMapper.toResponse(getUserSummaryUseCase.getUserSummary(userDetails.getId()));
    }
}