UserServiceImpl.java

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

import fr.avenirsesr.portfolio.file.domain.model.EUserPhotoType;
import fr.avenirsesr.portfolio.file.domain.port.input.UserResourceService;
import fr.avenirsesr.portfolio.user.domain.exception.UserNotFoundException;
import fr.avenirsesr.portfolio.user.domain.model.Student;
import fr.avenirsesr.portfolio.user.domain.model.Teacher;
import fr.avenirsesr.portfolio.user.domain.model.User;
import fr.avenirsesr.portfolio.user.domain.model.UserPhotos;
import fr.avenirsesr.portfolio.user.domain.model.enums.EUserCategory;
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;

  @Override
  public User getUser(UUID id) {
    var user = userRepository.findById(id);

    if (user.isEmpty()) {
      log.error("User {} not found", id);
      throw new UserNotFoundException();
    }

    return user.get();
  }

  @Override
  public UserPhotos getUserPhotos(UUID userId, EUserCategory userCategory) {
    var user = getUser(userId);
    var profileUrl =
        userResourceService.getUserPhotoUrl(user, userCategory, EUserPhotoType.PROFILE);
    var coverUrl = userResourceService.getUserPhotoUrl(user, userCategory, EUserPhotoType.COVER);

    return new UserPhotos(profileUrl, coverUrl);
  }

  @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("Firstname is null");
    }

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

    switch (userCategory) {
      case STUDENT:
        {
          Student student = user.toStudent();
          if (bio != null) {
            student.setBio(bio);
          }
          userRepository.save(student);
        }
      case TEACHER:
        {
          Teacher teacher = user.toTeacher();
          if (bio != null) {
            teacher.setBio(bio);
          }
          userRepository.save(teacher);
        }
    }
  }
}