package com.pollex.pam.service.mapper; import com.pollex.pam.domain.Authority; import com.pollex.pam.domain.User; import com.pollex.pam.service.dto.AdminUserDTO; import com.pollex.pam.service.dto.UserDTO; import java.util.*; import java.util.stream.Collectors; import org.mapstruct.BeanMapping; import org.mapstruct.Mapping; import org.mapstruct.Named; import org.springframework.stereotype.Service; /** * Mapper for the entity {@link User} and its DTO called {@link UserDTO}. * * Normal mappers are generated using MapStruct, this one is hand-coded as MapStruct * support is still in beta, and requires a manual step with an IDE. */ @Service public class UserMapper { public List usersToUserDTOs(List users) { return users.stream().filter(Objects::nonNull).map(this::userToUserDTO).collect(Collectors.toList()); } public UserDTO userToUserDTO(User user) { return new UserDTO(user); } public List usersToAdminUserDTOs(List users) { return users.stream().filter(Objects::nonNull).map(this::userToAdminUserDTO).collect(Collectors.toList()); } public AdminUserDTO userToAdminUserDTO(User user) { return new AdminUserDTO(user); } public List userDTOsToUsers(List userDTOs) { return userDTOs.stream().filter(Objects::nonNull).map(this::userDTOToUser).collect(Collectors.toList()); } public User userDTOToUser(AdminUserDTO userDTO) { if (userDTO == null) { return null; } else { User user = new User(); user.setId(userDTO.getId()); user.setLogin(userDTO.getLogin()); user.setFirstName(userDTO.getFirstName()); user.setLastName(userDTO.getLastName()); user.setEmail(userDTO.getEmail()); user.setImageUrl(userDTO.getImageUrl()); user.setActivated(userDTO.isActivated()); user.setLangKey(userDTO.getLangKey()); Set authorities = this.authoritiesFromStrings(userDTO.getAuthorities()); user.setAuthorities(authorities); return user; } } private Set authoritiesFromStrings(Set authoritiesAsString) { Set authorities = new HashSet<>(); if (authoritiesAsString != null) { authorities = authoritiesAsString .stream() .map(string -> { Authority auth = new Authority(); auth.setName(string); return auth; }) .collect(Collectors.toSet()); } return authorities; } public User userFromId(Long id) { if (id == null) { return null; } User user = new User(); user.setId(id); return user; } @Named("id") @BeanMapping(ignoreByDefault = true) @Mapping(target = "id", source = "id") public UserDTO toDtoId(User user) { if (user == null) { return null; } UserDTO userDto = new UserDTO(); userDto.setId(user.getId()); return userDto; } @Named("idSet") @BeanMapping(ignoreByDefault = true) @Mapping(target = "id", source = "id") public Set toDtoIdSet(Set users) { if (users == null) { return Collections.emptySet(); } Set userSet = new HashSet<>(); for (User userEntity : users) { userSet.add(this.toDtoId(userEntity)); } return userSet; } @Named("login") @BeanMapping(ignoreByDefault = true) @Mapping(target = "id", source = "id") @Mapping(target = "login", source = "login") public UserDTO toDtoLogin(User user) { if (user == null) { return null; } UserDTO userDto = new UserDTO(); userDto.setId(user.getId()); userDto.setLogin(user.getLogin()); return userDto; } @Named("loginSet") @BeanMapping(ignoreByDefault = true) @Mapping(target = "id", source = "id") @Mapping(target = "login", source = "login") public Set toDtoLoginSet(Set users) { if (users == null) { return Collections.emptySet(); } Set userSet = new HashSet<>(); for (User userEntity : users) { userSet.add(this.toDtoLogin(userEntity)); } return userSet; } }