diff --git a/src/main/java/back/activitymanager/dto/activity/ActivityDto.java b/src/main/java/back/activitymanager/dto/activity/ActivityDto.java index df48b53..6b228c5 100644 --- a/src/main/java/back/activitymanager/dto/activity/ActivityDto.java +++ b/src/main/java/back/activitymanager/dto/activity/ActivityDto.java @@ -1,7 +1,8 @@ package back.activitymanager.dto.activity; -import back.activitymanager.dto.user.UserWithoutRolesDto; +import back.activitymanager.dto.user.UserResponseDto; import java.time.LocalDateTime; +import java.util.ArrayList; import java.util.List; import lombok.Data; @@ -29,7 +30,7 @@ public class ActivityDto { private LocalDateTime localDateTime; - private UserWithoutRolesDto author; + private UserResponseDto author; - private List participants; + private List participants = new ArrayList<>(); } diff --git a/src/main/java/back/activitymanager/dto/user/UserWithoutRolesDto.java b/src/main/java/back/activitymanager/dto/user/UserWithoutRolesDto.java deleted file mode 100644 index cd2cc8c..0000000 --- a/src/main/java/back/activitymanager/dto/user/UserWithoutRolesDto.java +++ /dev/null @@ -1,13 +0,0 @@ -package back.activitymanager.dto.user; - -import lombok.Data; - -@Data -public class UserWithoutRolesDto { - private Long id; - private String email; - private String firstName; - private String lastName; - private String phoneNumber; - -} diff --git a/src/main/java/back/activitymanager/mapper/ActivityMapper.java b/src/main/java/back/activitymanager/mapper/ActivityMapper.java index 2804954..3a4c20b 100644 --- a/src/main/java/back/activitymanager/mapper/ActivityMapper.java +++ b/src/main/java/back/activitymanager/mapper/ActivityMapper.java @@ -9,7 +9,7 @@ import org.mapstruct.Mapping; import org.mapstruct.MappingTarget; -@Mapper(config = MapperConfig.class) +@Mapper(config = MapperConfig.class, uses = {UserMapper.class}) public interface ActivityMapper { @Mapping(target = "currentNumberOfPeople", ignore = true) diff --git a/src/main/java/back/activitymanager/mapper/DropboxHelper.java b/src/main/java/back/activitymanager/mapper/DropboxHelper.java new file mode 100644 index 0000000..1cbb8b7 --- /dev/null +++ b/src/main/java/back/activitymanager/mapper/DropboxHelper.java @@ -0,0 +1,26 @@ +package back.activitymanager.mapper; + +import back.activitymanager.service.DropboxService; +import org.mapstruct.Named; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Component +public class DropboxHelper { + + private final DropboxService dropboxService; + + @Autowired + public DropboxHelper(DropboxService dropboxService) { + this.dropboxService = dropboxService; + } + + @Named("resolvePhotoLink") + public String resolvePhotoLink(String path) { + if (path == null) { + return ""; + } + + return dropboxService.getPhotoLink(path); + } +} diff --git a/src/main/java/back/activitymanager/mapper/UserMapper.java b/src/main/java/back/activitymanager/mapper/UserMapper.java index 6ac5f4b..40a27fa 100644 --- a/src/main/java/back/activitymanager/mapper/UserMapper.java +++ b/src/main/java/back/activitymanager/mapper/UserMapper.java @@ -12,8 +12,10 @@ import org.mapstruct.Mapping; import org.mapstruct.MappingTarget; -@Mapper(config = MapperConfig.class) +@Mapper(config = MapperConfig.class, uses = DropboxHelper.class) public interface UserMapper { + + @Mapping(target = "photoPath", source = "photoPath", qualifiedByName = "resolvePhotoLink") UserResponseDto toDto(User user); User toModel(UserRegistrationRequestDto userRegistrationRequestDto); diff --git a/src/main/java/back/activitymanager/repository/ActivityRepository.java b/src/main/java/back/activitymanager/repository/ActivityRepository.java index 0c9219d..0a16aee 100644 --- a/src/main/java/back/activitymanager/repository/ActivityRepository.java +++ b/src/main/java/back/activitymanager/repository/ActivityRepository.java @@ -12,13 +12,18 @@ public interface ActivityRepository extends JpaRepository { boolean existsByAuthor(User principal); - @EntityGraph - @Query("SELECT a FROM Activity a WHERE a.isDeleted = false AND a.localDateTime > current_timestamp") + @EntityGraph(attributePaths = {"participants", "author"}) + @Query("SELECT a FROM Activity a WHERE a.isDeleted = false " + + "AND a.localDateTime > current_timestamp") Optional findById(Long id); - @Query("SELECT a FROM Activity a WHERE a.isDeleted = false AND a.localDateTime > current_timestamp") + @EntityGraph(attributePaths = {"participants", "author"}) + @Query("SELECT a FROM Activity a WHERE a.isDeleted = false " + + "AND a.localDateTime > current_timestamp") Page findByAuthorEmail(Pageable pageable, String email); - @Query("SELECT a FROM Activity a WHERE a.isDeleted = false AND a.localDateTime > current_timestamp") + @EntityGraph(attributePaths = {"participants", "author"}) + @Query("SELECT a FROM Activity a WHERE a.isDeleted = false " + + "AND a.localDateTime > current_timestamp") Page findByParticipantsEmail(Pageable pageable, String name); } diff --git a/src/main/java/back/activitymanager/service/UserService.java b/src/main/java/back/activitymanager/service/UserService.java index 884950f..1f9ce1f 100644 --- a/src/main/java/back/activitymanager/service/UserService.java +++ b/src/main/java/back/activitymanager/service/UserService.java @@ -9,6 +9,9 @@ import org.springframework.security.core.Authentication; public interface UserService { + + String DEFAULT_PHOTO_PATH = "default"; + UserResponseDto register(UserRegistrationRequestDto userRegistrationRequestDto) throws RegistrationException; diff --git a/src/main/java/back/activitymanager/service/impl/DropboxServiceImpl.java b/src/main/java/back/activitymanager/service/impl/DropboxServiceImpl.java index a0a8676..dfc4bd1 100644 --- a/src/main/java/back/activitymanager/service/impl/DropboxServiceImpl.java +++ b/src/main/java/back/activitymanager/service/impl/DropboxServiceImpl.java @@ -2,6 +2,7 @@ import back.activitymanager.exception.DropboxProcessException; import back.activitymanager.service.DropboxService; +import back.activitymanager.service.UserService; import com.dropbox.core.DbxException; import com.dropbox.core.v2.DbxClientV2; import com.dropbox.core.v2.files.GetTemporaryLinkResult; @@ -27,7 +28,7 @@ public String uploadPhoto(MultipartFile file) { try (InputStream in = file.getInputStream()) { client.files().uploadBuilder(path).uploadAndFinish(in); - return path; // зберігаємо шлях (НЕ лінк!) + return path; } catch (Exception e) { throw new RuntimeException("Failed to upload photo", e); } @@ -35,6 +36,11 @@ public String uploadPhoto(MultipartFile file) { @Override public String getPhotoLink(String path) { + + if (UserService.DEFAULT_PHOTO_PATH.equals(path)) { + return ""; + } + try { GetTemporaryLinkResult result = client.files().getTemporaryLink(path); return result.getLink(); diff --git a/src/main/java/back/activitymanager/service/impl/UserServiceImpl.java b/src/main/java/back/activitymanager/service/impl/UserServiceImpl.java index dae5c82..a10ddf4 100644 --- a/src/main/java/back/activitymanager/service/impl/UserServiceImpl.java +++ b/src/main/java/back/activitymanager/service/impl/UserServiceImpl.java @@ -28,7 +28,6 @@ @Transactional @RequiredArgsConstructor public class UserServiceImpl implements UserService { - private static final String DEFAULT_PHOTO_PATH = "default"; private final UserRepository userRepository; private final UserMapper userMapper; private final PasswordEncoder passwordEncoder; @@ -49,7 +48,7 @@ public UserResponseDto register(UserRegistrationRequestDto request) { @Override public UserResponseDto getMyUserInfo(Authentication authentication) { User user = (User) authentication.getPrincipal(); - return mapUserToDtoWithPhoto(user); + return userMapper.toDto(user); } @Override @@ -63,7 +62,7 @@ public UserResponseDto updateUser(Authentication authentication, } user = userRepository.save(user); - return mapUserToDtoWithPhoto(user); + return userMapper.toDto(user); } @Override @@ -111,17 +110,6 @@ private UserResponseDto buildAndSaveUserWithPhoto(UserRegistrationRequestDto req "Role is not found: ROLE_USER")); user.setRoles(Set.of(role)); - return mapUserToDtoWithPhoto(userRepository.save(user)); - } - - private UserResponseDto mapUserToDtoWithPhoto(User user) { - UserResponseDto dto = userMapper.toDto(user); - if (user.getPhotoPath() != null - && !user.getPhotoPath().equals(DEFAULT_PHOTO_PATH)) { - dto.setPhotoPath(dropboxService.getPhotoLink(user.getPhotoPath())); - } else { - dto.setPhotoPath(""); - } - return dto; + return userMapper.toDto(userRepository.save(user)); } } diff --git a/src/main/resources/db/changelog/changes/10-update-users-photo-path.yaml b/src/main/resources/db/changelog/changes/10-update-users-photo-path.yaml new file mode 100644 index 0000000..5d78916 --- /dev/null +++ b/src/main/resources/db/changelog/changes/10-update-users-photo-path.yaml @@ -0,0 +1,12 @@ +databaseChangeLog: + - changeSet: + id: 10-update-users-photo-path + author: andriy + changes: + - update: + tableName: users + columns: + - column: + name: photo_path + value: "default" + where: "id in (1, 2)" diff --git a/src/main/resources/db/changelog/db.changelog-master.yaml b/src/main/resources/db/changelog/db.changelog-master.yaml index 129ba79..5236486 100644 --- a/src/main/resources/db/changelog/db.changelog-master.yaml +++ b/src/main/resources/db/changelog/db.changelog-master.yaml @@ -17,3 +17,5 @@ databaseChangeLog: file: db/changelog/changes/08-insert-users-roles.yaml - include: file: db/changelog/changes/09-add-column-to-activities.yaml + - include: + file: db/changelog/changes/10-update-users-photo-path.yaml