UserServiceImpl.java

package fr.avenirsesr.portfolio.user.domain.service;

import fr.avenirsesr.portfolio.common.data.domain.model.User;
import fr.avenirsesr.portfolio.common.data.domain.model.enums.EUserCategory;
import fr.avenirsesr.portfolio.common.error.domain.exception.UserNotFoundException;
import fr.avenirsesr.portfolio.file.domain.model.EUserPhotoType;
import fr.avenirsesr.portfolio.file.domain.port.input.UserResourceService;
import fr.avenirsesr.portfolio.user.domain.data.UserPhotosData;
import fr.avenirsesr.portfolio.user.domain.data.UserProfileOverviewData;
import fr.avenirsesr.portfolio.user.domain.model.*;
import fr.avenirsesr.portfolio.user.domain.port.input.StudentService;
import fr.avenirsesr.portfolio.user.domain.port.input.TeacherService;
import fr.avenirsesr.portfolio.user.domain.port.input.UserService;
import fr.avenirsesr.portfolio.user.domain.port.output.repository.UserRepository;
import java.util.UUID;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;

@Slf4j
@AllArgsConstructor
public class UserServiceImpl implements UserService {
  private final UserRepository userRepository;
  private final UserResourceService userResourceService;
  private final TeacherService teacherService;
  private final StudentService studentService;

  @Override
  public User getUser(UUID id) {
    return userRepository
        .findById(id)
        .orElseThrow(
            () -> {
              log.error("User {} not found", id);
              return new UserNotFoundException();
            });
  }

  @Override
  public UserPhotosData getUserPhotos(UUID userId, EUserCategory userCategory) {
    var user = getUser(userId);
    var profile = userResourceService.getUserPhotoUrl(user, userCategory, EUserPhotoType.PROFILE);
    var cover = userResourceService.getUserPhotoUrl(user, userCategory, EUserPhotoType.COVER);

    return new UserPhotosData(
        profile.id(), profile.name(), profile.url(), cover.id(), cover.name(), cover.url());
  }

  @Override
  public UserProfileOverviewData getUserProfileOverviewDTO(
      UUID userId, EUserCategory userCategory) {
    var user = getUser(userId);
    var bio =
        switch (userCategory) {
          case STUDENT -> studentService.getBio(user);
          case TEACHER -> teacherService.getBio(user);
        };

    return new UserProfileOverviewData(
        user.getFirstName(), user.getLastName(), user.getEmail(), bio);
  }

  @Override
  public void updateProfile(
      EUserCategory userCategory,
      User user,
      String firstname,
      String lastname,
      String email,
      String bio) {
    user.setFirstName(firstname);
    user.setLastName(lastname);
    if (firstname == null) {
      throw new IllegalArgumentException("Firstname is null");
    }
    if (lastname == null) {
      throw new IllegalArgumentException("Lastname is null");
    }

    if (email != null) {
      user.setEmail(email);
    }
    userRepository.save(user);

    switch (userCategory) {
      case STUDENT:
        studentService.updateProfile(user, bio);
      case TEACHER:
        teacherService.updateProfile(user, bio);
    }
  }
}