UserServiceImpl.java
package fr.avenirsesr.portfolio.api.domain.service;
import fr.avenirsesr.portfolio.api.domain.exception.BadImageSizeException;
import fr.avenirsesr.portfolio.api.domain.exception.BadImageTypeException;
import fr.avenirsesr.portfolio.api.domain.exception.UserNotFoundException;
import fr.avenirsesr.portfolio.api.domain.model.Student;
import fr.avenirsesr.portfolio.api.domain.model.User;
import fr.avenirsesr.portfolio.api.domain.port.input.UserService;
import fr.avenirsesr.portfolio.api.domain.port.output.repository.RessourceRepository;
import fr.avenirsesr.portfolio.api.domain.port.output.repository.UserRepository;
import java.io.IOException;
import java.util.UUID;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
@Slf4j
@AllArgsConstructor
@Service
public class UserServiceImpl implements UserService {
public static final long MAX_SIZE = 10 * 1024 * 1024; // 10 Mo
private final UserRepository userRepository;
private final RessourceRepository ressourceRepository;
@Override
public User getProfile(UUID id) {
return getUser(id);
}
@Override
public void updateProfile(UUID id, String firstname, String lastname, String email, String bio) {
User user = getUser(id);
if (firstname != null) {
user.setFirstName(firstname);
}
if (lastname != null) {
user.setLastName(lastname);
}
if (email != null) {
user.setEmail(email);
}
userRepository.save(user);
if (bio != null) {
Student student = user.toStudent();
student.setBio(bio);
userRepository.save(student);
}
}
@Override
public void updateProfilePicture(UUID id, MultipartFile photoFile) throws IOException {
User user = getUser(id);
checkImageFormat(photoFile);
String profilePicturePath = ressourceRepository.storeStudentProfilePicture(id, photoFile);
Student student = user.toStudent();
student.setProfilePicture(profilePicturePath);
userRepository.save(student);
}
@Override
public void updateCoverPicture(UUID id, MultipartFile coverFile) throws IOException {
User user = getUser(id);
checkImageFormat(coverFile);
String coverPicturePath = ressourceRepository.storeStudentCoverPicture(id, coverFile);
Student student = user.toStudent();
student.setCoverPicture(coverPicturePath);
userRepository.save(student);
}
private User getUser(UUID id) {
var user = userRepository.findById(id);
if (user.isEmpty()) {
log.error("User {} not found", id);
throw new UserNotFoundException();
}
return user.get();
}
private void checkImageFormat(MultipartFile file) {
String contentType = file.getContentType();
long contentSize = file.getSize();
if (!contentType.equals(MediaType.IMAGE_JPEG_VALUE)
&& !contentType.equals(MediaType.IMAGE_PNG_VALUE)) {
throw new BadImageTypeException();
}
if (contentSize > MAX_SIZE) {
throw new BadImageSizeException();
}
}
}