diff --git a/aics-admin/src/main/java/kgu/developers/admin/file/application/FileAdminFacade.java b/aics-admin/src/main/java/kgu/developers/admin/file/application/FileAdminFacade.java index 2285fce4..4febde28 100644 --- a/aics-admin/src/main/java/kgu/developers/admin/file/application/FileAdminFacade.java +++ b/aics-admin/src/main/java/kgu/developers/admin/file/application/FileAdminFacade.java @@ -6,8 +6,8 @@ import kgu.developers.domain.file.application.response.FilePathResponse; import kgu.developers.domain.file.application.command.FileCommandService; import kgu.developers.domain.file.domain.FileDomain; -import kgu.developers.domain.file.domain.FileEntity; -import kgu.developers.domain.file.infrastructure.FileStorageService; +import kgu.developers.domain.file.domain.FileModel; +import kgu.developers.domain.file.infrastructure.repository.FileStorageService; import lombok.RequiredArgsConstructor; @Component @@ -18,7 +18,7 @@ public class FileAdminFacade { public FilePathResponse saveFile(MultipartFile file, FileDomain fileDomain) { String storedPath = fileStorageService.store(file, fileDomain); - FileEntity savedFile = fileCommandService.saveFile(file, storedPath); + FileModel savedFile = fileCommandService.saveFile(file, storedPath); return FilePathResponse.from(savedFile); } } diff --git a/aics-admin/src/testFixtures/java/carousel/application/CarouselAdminFacadeTest.java b/aics-admin/src/testFixtures/java/carousel/application/CarouselAdminFacadeTest.java index a278bc9a..940acb3d 100644 --- a/aics-admin/src/testFixtures/java/carousel/application/CarouselAdminFacadeTest.java +++ b/aics-admin/src/testFixtures/java/carousel/application/CarouselAdminFacadeTest.java @@ -16,7 +16,7 @@ import kgu.developers.domain.carousel.domain.Carousel; import kgu.developers.domain.carousel.exception.CarouselNotFoundException; import kgu.developers.domain.file.application.query.FileQueryService; -import kgu.developers.domain.file.domain.FileEntity; +import kgu.developers.domain.file.domain.FileModel; import mock.repository.FakeCarouselRepository; import mock.repository.FakeFileRepository; @@ -48,7 +48,7 @@ private void initializeCarouselAdminFacade() { private static void saveTestFile(FakeFileRepository fakeFileRepository) { fakeFileRepository.save( - FileEntity.create( + FileModel.create( "경기대학교 AI컴퓨터공학부 메인 이미지", "/files/carousel/main_image.jpg", 1234L, diff --git a/aics-admin/src/testFixtures/java/lab/application/LabAdminFacadeTest.java b/aics-admin/src/testFixtures/java/lab/application/LabAdminFacadeTest.java index acd0c34a..3b7f5660 100644 --- a/aics-admin/src/testFixtures/java/lab/application/LabAdminFacadeTest.java +++ b/aics-admin/src/testFixtures/java/lab/application/LabAdminFacadeTest.java @@ -14,7 +14,6 @@ import kgu.developers.admin.lab.presentation.request.LabCreateRequest; import kgu.developers.admin.lab.presentation.request.LabUpdateRequest; import kgu.developers.admin.lab.presentation.response.LabPersistResponse; -import kgu.developers.domain.file.domain.FileEntity; import kgu.developers.domain.lab.application.command.LabCommandService; import kgu.developers.domain.lab.application.query.LabQueryService; import kgu.developers.domain.lab.domain.Lab; @@ -36,7 +35,6 @@ public void init() { new LabQueryService(fakeLabRepository) ); - fakeFileRepository.save(FileEntity.builder().id(TEST_FILE_ID).build()); fakeLabRepository.save(Lab.builder() .name("Lab A") .loc("8500") diff --git a/aics-api/src/main/java/kgu/developers/api/club/presentation/response/ClubDetailResponse.java b/aics-api/src/main/java/kgu/developers/api/club/presentation/response/ClubDetailResponse.java index c20562d4..365f1b6b 100644 --- a/aics-api/src/main/java/kgu/developers/api/club/presentation/response/ClubDetailResponse.java +++ b/aics-api/src/main/java/kgu/developers/api/club/presentation/response/ClubDetailResponse.java @@ -6,7 +6,6 @@ import io.swagger.v3.oas.annotations.media.Schema; import kgu.developers.domain.club.domain.Club; import kgu.developers.domain.file.application.response.FilePathResponse; -import kgu.developers.domain.file.domain.FileEntity; import lombok.Builder; @Builder diff --git a/aics-api/src/main/java/kgu/developers/api/club/presentation/response/ClubListResponse.java b/aics-api/src/main/java/kgu/developers/api/club/presentation/response/ClubListResponse.java index 20318158..d4c8aef0 100644 --- a/aics-api/src/main/java/kgu/developers/api/club/presentation/response/ClubListResponse.java +++ b/aics-api/src/main/java/kgu/developers/api/club/presentation/response/ClubListResponse.java @@ -5,7 +5,6 @@ import io.swagger.v3.oas.annotations.media.Schema; import kgu.developers.domain.club.domain.Club; -import kgu.developers.domain.file.domain.FileEntity; import lombok.Builder; import static io.swagger.v3.oas.annotations.media.Schema.RequiredMode.REQUIRED; diff --git a/aics-api/src/testFixtures/java/carousel/application/CarouselFacadeTest.java b/aics-api/src/testFixtures/java/carousel/application/CarouselFacadeTest.java index 02b9896b..caf9ac8d 100644 --- a/aics-api/src/testFixtures/java/carousel/application/CarouselFacadeTest.java +++ b/aics-api/src/testFixtures/java/carousel/application/CarouselFacadeTest.java @@ -11,7 +11,6 @@ import kgu.developers.domain.carousel.application.query.CarouselQueryService; import kgu.developers.domain.carousel.domain.Carousel; import kgu.developers.domain.file.application.query.FileQueryService; -import kgu.developers.domain.file.domain.FileEntity; import mock.repository.FakeCarouselRepository; import mock.repository.FakeFileRepository; diff --git a/aics-api/src/testFixtures/java/lab/application/LabFacadeTest.java b/aics-api/src/testFixtures/java/lab/application/LabFacadeTest.java index f4af16c6..03385eab 100644 --- a/aics-api/src/testFixtures/java/lab/application/LabFacadeTest.java +++ b/aics-api/src/testFixtures/java/lab/application/LabFacadeTest.java @@ -5,7 +5,6 @@ import java.util.List; import kgu.developers.domain.file.application.query.FileQueryService; -import kgu.developers.domain.file.domain.FileEntity; import mock.repository.FakeFileRepository; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; @@ -31,8 +30,6 @@ public void init() { new LabQueryService(fakeLabRepository),new FileQueryService(fakeFileRepository) ); - fakeFileRepository.save(FileEntity.builder().id(TEST_FILE_ID).build()); - fakeLabRepository.save( Lab.create( "인공지능 연구실", diff --git a/aics-domain/src/main/java/kgu/developers/domain/carousel/application/command/CarouselCommandService.java b/aics-domain/src/main/java/kgu/developers/domain/carousel/application/command/CarouselCommandService.java index 3f193337..f6e9baf3 100644 --- a/aics-domain/src/main/java/kgu/developers/domain/carousel/application/command/CarouselCommandService.java +++ b/aics-domain/src/main/java/kgu/developers/domain/carousel/application/command/CarouselCommandService.java @@ -6,7 +6,8 @@ import kgu.developers.domain.carousel.domain.Carousel; import kgu.developers.domain.carousel.domain.CarouselRepository; import kgu.developers.domain.file.application.query.FileQueryService; -import kgu.developers.domain.file.domain.FileEntity; +import kgu.developers.domain.file.domain.FileModel; +import kgu.developers.domain.file.exception.FileIdRequiredException; import lombok.RequiredArgsConstructor; @Service @@ -16,7 +17,8 @@ public class CarouselCommandService { private final CarouselRepository carouselRepository; public Long createCarousel(Long fileId, String text, String link) { - FileEntity file = fileQueryService.getFileById(fileId); + if (fileId == null) throw new FileIdRequiredException(); + FileModel file = fileQueryService.getFileById(fileId); Carousel carousel = Carousel.create(text, link, file.getId()); return carouselRepository.save(carousel).getId(); } diff --git a/aics-domain/src/main/java/kgu/developers/domain/carousel/domain/Carousel.java b/aics-domain/src/main/java/kgu/developers/domain/carousel/domain/Carousel.java index c0cb88eb..a6ff8c99 100644 --- a/aics-domain/src/main/java/kgu/developers/domain/carousel/domain/Carousel.java +++ b/aics-domain/src/main/java/kgu/developers/domain/carousel/domain/Carousel.java @@ -1,43 +1,35 @@ package kgu.developers.domain.carousel.domain; -import static jakarta.persistence.GenerationType.IDENTITY; -import static lombok.AccessLevel.PROTECTED; - -import jakarta.persistence.Column; -import jakarta.persistence.Entity; -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.Id; -import kgu.developers.common.domain.BaseTimeEntity; +import java.time.LocalDateTime; + import lombok.AllArgsConstructor; -import lombok.Builder; import lombok.Getter; -import lombok.NoArgsConstructor; -@Entity @Getter -@Builder @AllArgsConstructor -@NoArgsConstructor(access = PROTECTED) -public class Carousel extends BaseTimeEntity { - @Id - @GeneratedValue(strategy = IDENTITY) - private Long id; - - @Column(nullable = false) +public class Carousel { + private final Long id; private String text; - - @Column(nullable = false) private String link; - - @Column(nullable = false) private Long fileId; - - public static Carousel create(String text, String link, Long fileId) { - return Carousel.builder() - .text(text) - .link(link) - .fileId(fileId) - .build(); + private LocalDateTime createdAt; + private LocalDateTime updatedAt; + private LocalDateTime deletedAt; + + public static Carousel create( + String text, + String link, + Long fileId + ) { + return new Carousel( + null, + text, + link, + fileId, + LocalDateTime.now(), + LocalDateTime.now(), + null + ); } public void updateText(String text) { @@ -53,3 +45,4 @@ public void updateFileId(Long fileId) { } } + diff --git a/aics-domain/src/main/java/kgu/developers/domain/carousel/infrastructure/CarouselRepositoryImpl.java b/aics-domain/src/main/java/kgu/developers/domain/carousel/infrastructure/CarouselRepositoryImpl.java index 10b5a726..1725c966 100644 --- a/aics-domain/src/main/java/kgu/developers/domain/carousel/infrastructure/CarouselRepositoryImpl.java +++ b/aics-domain/src/main/java/kgu/developers/domain/carousel/infrastructure/CarouselRepositoryImpl.java @@ -7,6 +7,7 @@ import kgu.developers.domain.carousel.domain.Carousel; import kgu.developers.domain.carousel.domain.CarouselRepository; +import kgu.developers.domain.carousel.infrastructure.entity.CarouselJpaEntity; import lombok.RequiredArgsConstructor; @Repository @@ -16,7 +17,9 @@ public class CarouselRepositoryImpl implements CarouselRepository { @Override public Carousel save(Carousel carousel) { - return jpaCarouselRepository.save(carousel); + return jpaCarouselRepository.save( + CarouselJpaEntity.toEntity(carousel) + ).toDomain(); } @Override @@ -26,11 +29,15 @@ public void deleteById(Long id) { @Override public List findAllByFileIsNotNullOrderByCreatedAtDesc() { - return jpaCarouselRepository.findAllByFileIdIsNotNullOrderByCreatedAtDesc(); + return jpaCarouselRepository.findAllByFileIdIsNotNullOrderByCreatedAtDesc() + .stream() + .map(CarouselJpaEntity::toDomain) + .toList(); } @Override public Optional findById(Long id) { - return jpaCarouselRepository.findById(id); + return jpaCarouselRepository.findById(id) + .map(CarouselJpaEntity::toDomain); } } diff --git a/aics-domain/src/main/java/kgu/developers/domain/carousel/infrastructure/JpaCarouselRepository.java b/aics-domain/src/main/java/kgu/developers/domain/carousel/infrastructure/JpaCarouselRepository.java index 3692285d..5d9681f6 100644 --- a/aics-domain/src/main/java/kgu/developers/domain/carousel/infrastructure/JpaCarouselRepository.java +++ b/aics-domain/src/main/java/kgu/developers/domain/carousel/infrastructure/JpaCarouselRepository.java @@ -4,8 +4,8 @@ import org.springframework.data.jpa.repository.JpaRepository; -import kgu.developers.domain.carousel.domain.Carousel; +import kgu.developers.domain.carousel.infrastructure.entity.CarouselJpaEntity; -public interface JpaCarouselRepository extends JpaRepository { - List findAllByFileIdIsNotNullOrderByCreatedAtDesc(); +public interface JpaCarouselRepository extends JpaRepository { + List findAllByFileIdIsNotNullOrderByCreatedAtDesc(); } diff --git a/aics-domain/src/main/java/kgu/developers/domain/carousel/infrastructure/entity/CarouselJpaEntity.java b/aics-domain/src/main/java/kgu/developers/domain/carousel/infrastructure/entity/CarouselJpaEntity.java new file mode 100644 index 00000000..078b0051 --- /dev/null +++ b/aics-domain/src/main/java/kgu/developers/domain/carousel/infrastructure/entity/CarouselJpaEntity.java @@ -0,0 +1,58 @@ +package kgu.developers.domain.carousel.infrastructure.entity; + +import static jakarta.persistence.GenerationType.IDENTITY; +import static lombok.AccessLevel.PROTECTED; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.Id; +import jakarta.persistence.Table; +import kgu.developers.common.domain.BaseTimeEntity; +import kgu.developers.domain.carousel.domain.Carousel; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Entity +@Getter +@Builder +@Table(name = "carousel") +@AllArgsConstructor +@NoArgsConstructor(access = PROTECTED) +public class CarouselJpaEntity extends BaseTimeEntity { + @Id + @GeneratedValue(strategy = IDENTITY) + private Long id; + + @Column(nullable = false) + private String text; + + @Column(nullable = false) + private String link; + + @Column(nullable = false) + private Long fileId; + + public static CarouselJpaEntity toEntity(Carousel carousel) { + return CarouselJpaEntity.builder() + .id(carousel.getId()) + .text(carousel.getText()) + .link(carousel.getLink()) + .fileId(carousel.getFileId()) + .build(); + } + + public Carousel toDomain() { + return new Carousel( + this.id, + this.text, + this.link, + this.fileId, + this.getCreatedAt(), + this.getUpdatedAt(), + this.getDeletedAt() + ); + } +} diff --git a/aics-domain/src/main/java/kgu/developers/domain/club/domain/Club.java b/aics-domain/src/main/java/kgu/developers/domain/club/domain/Club.java index 8a934fc7..7de4f971 100644 --- a/aics-domain/src/main/java/kgu/developers/domain/club/domain/Club.java +++ b/aics-domain/src/main/java/kgu/developers/domain/club/domain/Club.java @@ -7,10 +7,7 @@ import jakarta.persistence.Entity; import jakarta.persistence.GeneratedValue; import jakarta.persistence.Id; -import jakarta.persistence.JoinColumn; -import jakarta.persistence.OneToOne; import kgu.developers.common.domain.BaseTimeEntity; -import kgu.developers.domain.file.domain.FileEntity; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; diff --git a/aics-domain/src/main/java/kgu/developers/domain/file/application/command/FileCommandService.java b/aics-domain/src/main/java/kgu/developers/domain/file/application/command/FileCommandService.java index aeb2452f..d8ac719f 100644 --- a/aics-domain/src/main/java/kgu/developers/domain/file/application/command/FileCommandService.java +++ b/aics-domain/src/main/java/kgu/developers/domain/file/application/command/FileCommandService.java @@ -3,7 +3,7 @@ import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; -import kgu.developers.domain.file.domain.FileEntity; +import kgu.developers.domain.file.domain.FileModel; import kgu.developers.domain.file.domain.FileRepository; import lombok.RequiredArgsConstructor; @@ -12,8 +12,8 @@ public class FileCommandService { private final FileRepository fileRepository; - public FileEntity saveFile(MultipartFile file, String storedPath) { - FileEntity fileEntity = FileEntity.create(file.getOriginalFilename(), storedPath, file.getSize(), + public FileModel saveFile(MultipartFile file, String storedPath) { + FileModel fileEntity = FileModel.create(file.getOriginalFilename(), storedPath, file.getSize(), file.getContentType()); return fileRepository.save(fileEntity); } diff --git a/aics-domain/src/main/java/kgu/developers/domain/file/application/query/FileQueryService.java b/aics-domain/src/main/java/kgu/developers/domain/file/application/query/FileQueryService.java index b195f023..6aafd2e0 100644 --- a/aics-domain/src/main/java/kgu/developers/domain/file/application/query/FileQueryService.java +++ b/aics-domain/src/main/java/kgu/developers/domain/file/application/query/FileQueryService.java @@ -1,6 +1,6 @@ package kgu.developers.domain.file.application.query; -import kgu.developers.domain.file.domain.FileEntity; +import kgu.developers.domain.file.domain.FileModel; import kgu.developers.domain.file.domain.FileRepository; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -14,14 +14,14 @@ public class FileQueryService { private final FileRepository fileRepository; - public FileEntity getFileById(Long id) { + public FileModel getFileById(Long id) { return fileRepository.findById(id).orElse(null); } public Map findPhysicalPathMapByIds(List ids) { return fileRepository.findAllByIds(ids) .stream() - .collect(Collectors.toMap(FileEntity::getId, FileEntity::getPhysicalPath)); + .collect(Collectors.toMap(FileModel::getId, FileModel::getPhysicalPath)); } public String getFilePhysicalPath(Long id) { diff --git a/aics-domain/src/main/java/kgu/developers/domain/file/application/response/FilePathResponse.java b/aics-domain/src/main/java/kgu/developers/domain/file/application/response/FilePathResponse.java index 903a253b..828a999e 100644 --- a/aics-domain/src/main/java/kgu/developers/domain/file/application/response/FilePathResponse.java +++ b/aics-domain/src/main/java/kgu/developers/domain/file/application/response/FilePathResponse.java @@ -3,7 +3,7 @@ import static io.swagger.v3.oas.annotations.media.Schema.RequiredMode.REQUIRED; import io.swagger.v3.oas.annotations.media.Schema; -import kgu.developers.domain.file.domain.FileEntity; +import kgu.developers.domain.file.domain.FileModel; import kgu.developers.globalutils.encryption.AesUtil; import lombok.Builder; @@ -15,7 +15,7 @@ public record FilePathResponse( @Schema(description = "파일 경로", example = "/files/2025-curriculum", requiredMode = REQUIRED) String physicalPath ) { - public static FilePathResponse from(FileEntity fileEntity) { + public static FilePathResponse from(FileModel fileEntity) { String decryptedPath = AesUtil.decrypt(fileEntity.getPhysicalPath()); return FilePathResponse.builder() .id(fileEntity.getId()) diff --git a/aics-domain/src/main/java/kgu/developers/domain/file/domain/FileEntity.java b/aics-domain/src/main/java/kgu/developers/domain/file/domain/FileEntity.java deleted file mode 100644 index d61deebe..00000000 --- a/aics-domain/src/main/java/kgu/developers/domain/file/domain/FileEntity.java +++ /dev/null @@ -1,61 +0,0 @@ -package kgu.developers.domain.file.domain; - -import static jakarta.persistence.GenerationType.IDENTITY; -import static lombok.AccessLevel.PROTECTED; - -import jakarta.persistence.Column; -import jakarta.persistence.Entity; -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.Id; -import kgu.developers.common.domain.BaseTimeEntity; -import kgu.developers.globalutils.encryption.AesUtil; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; - -@Entity -@Getter -@Builder -@AllArgsConstructor -@NoArgsConstructor(access = PROTECTED) -public class FileEntity extends BaseTimeEntity { - @Id - @GeneratedValue(strategy = IDENTITY) - private Long id; - - @Column(nullable = false) - private String logicalName; - - @Column(nullable = false, unique = true) - private String physicalPath; - - @Column(nullable = false) - private String fileSize; - - @Column(nullable = false) - private String extension; - - private static final long KB = 1024L; - private static final long MB = KB * 1024; - private static final long GB = MB * 1024; - - public static FileEntity create(String logicalName, String physicalPath, Long fileSize, String extension) { - String readableFileSize = convertToReadableFileSize(fileSize); - String encryptedLogicalName = AesUtil.encrypt(logicalName); - String encryptedPhysicalPath = AesUtil.encrypt(physicalPath); - return FileEntity.builder() - .logicalName(encryptedLogicalName) - .physicalPath(encryptedPhysicalPath) - .fileSize(readableFileSize) - .extension(extension) - .build(); - } - - private static String convertToReadableFileSize(long sizeInBytes) { - if (sizeInBytes < KB) return sizeInBytes + " Bytes"; - else if (sizeInBytes < MB) return String.format("%.2f KB", sizeInBytes / (double) KB); - else if (sizeInBytes < GB) return String.format("%.2f MB", sizeInBytes / (double) MB); - else return String.format("%.2f GB", sizeInBytes / (double) GB); - } -} diff --git a/aics-domain/src/main/java/kgu/developers/domain/file/domain/FileModel.java b/aics-domain/src/main/java/kgu/developers/domain/file/domain/FileModel.java new file mode 100644 index 00000000..71718dd3 --- /dev/null +++ b/aics-domain/src/main/java/kgu/developers/domain/file/domain/FileModel.java @@ -0,0 +1,47 @@ +package kgu.developers.domain.file.domain; + +import java.time.LocalDateTime; + +import kgu.developers.globalutils.encryption.AesUtil; +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public class FileModel { + private final Long id; + private String logicalName; + private String physicalPath; + private String fileSize; + private String extension; + private LocalDateTime createdAt; + private LocalDateTime updatedAt; + private LocalDateTime deletedAt; + + private static final long KB = 1024L; + private static final long MB = KB * 1024; + private static final long GB = MB * 1024; + + public static FileModel create(String logicalName, String physicalPath, long sizeInBytes, String extension) { + String readableFileSize = convertToReadableFileSize(sizeInBytes); + String encryptedLogicalName = AesUtil.encrypt(logicalName); + String encryptedPhysicalPath = AesUtil.encrypt(physicalPath); + return new FileModel( + null, + encryptedLogicalName, + encryptedPhysicalPath, + readableFileSize, + extension, + LocalDateTime.now(), + LocalDateTime.now(), + null + ); + } + + private static String convertToReadableFileSize(long sizeInBytes) { + if (sizeInBytes < KB) return sizeInBytes + " Bytes"; + else if (sizeInBytes < MB) return String.format("%.2f KB", sizeInBytes / (double) KB); + else if (sizeInBytes < GB) return String.format("%.2f MB", sizeInBytes / (double) MB); + else return String.format("%.2f GB", sizeInBytes / (double) GB); + } +} diff --git a/aics-domain/src/main/java/kgu/developers/domain/file/domain/FileRepository.java b/aics-domain/src/main/java/kgu/developers/domain/file/domain/FileRepository.java index 7e1df0e2..a09ce37a 100644 --- a/aics-domain/src/main/java/kgu/developers/domain/file/domain/FileRepository.java +++ b/aics-domain/src/main/java/kgu/developers/domain/file/domain/FileRepository.java @@ -4,8 +4,8 @@ import java.util.Optional; public interface FileRepository { - FileEntity save(FileEntity fileEntity); - Optional findById(Long id); - List findAllByIds(List ids); + FileModel save(FileModel fileEntity); + Optional findById(Long id); + List findAllByIds(List ids); Optional findPhysicalPathById(Long id); } diff --git a/aics-domain/src/main/java/kgu/developers/domain/file/exception/FileDomainExceptionCode.java b/aics-domain/src/main/java/kgu/developers/domain/file/exception/FileDomainExceptionCode.java index 0b4ca6e9..4e8daaf1 100644 --- a/aics-domain/src/main/java/kgu/developers/domain/file/exception/FileDomainExceptionCode.java +++ b/aics-domain/src/main/java/kgu/developers/domain/file/exception/FileDomainExceptionCode.java @@ -15,7 +15,8 @@ public enum FileDomainExceptionCode implements ExceptionCode { FILE_STORE_FAILED(BAD_REQUEST, "파일 저장에 실패하였습니다."), FILE_PATH_INVALID(BAD_REQUEST, "파일 경로가 올바르지 않습니다."), NOT_SUPPORTED_FILE_EXTENSION(BAD_REQUEST, "지원하지 않는 파일 확장자입니다."), - FILE_NOT_FOUND(NOT_FOUND, "파일을 찾을 수 없습니다.") + FILE_NOT_FOUND(NOT_FOUND, "파일을 찾을 수 없습니다."), + FILE_ID_REQUIRED(BAD_REQUEST, "파일 ID는 필수입니다.") ; private final HttpStatus status; diff --git a/aics-domain/src/main/java/kgu/developers/domain/file/exception/FileIdRequiredException.java b/aics-domain/src/main/java/kgu/developers/domain/file/exception/FileIdRequiredException.java new file mode 100644 index 00000000..e99778fd --- /dev/null +++ b/aics-domain/src/main/java/kgu/developers/domain/file/exception/FileIdRequiredException.java @@ -0,0 +1,11 @@ +package kgu.developers.domain.file.exception; + +import static kgu.developers.domain.file.exception.FileDomainExceptionCode.FILE_ID_REQUIRED; + +import kgu.developers.common.exception.CustomException; + +public class FileIdRequiredException extends CustomException { + public FileIdRequiredException() { + super(FILE_ID_REQUIRED); + } +} diff --git a/aics-domain/src/main/java/kgu/developers/domain/file/infrastructure/FileRepositoryImpl.java b/aics-domain/src/main/java/kgu/developers/domain/file/infrastructure/FileRepositoryImpl.java deleted file mode 100644 index b2d4006e..00000000 --- a/aics-domain/src/main/java/kgu/developers/domain/file/infrastructure/FileRepositoryImpl.java +++ /dev/null @@ -1,36 +0,0 @@ -package kgu.developers.domain.file.infrastructure; - -import java.util.List; -import java.util.Optional; - -import kgu.developers.domain.file.domain.FileEntity; -import kgu.developers.domain.file.domain.FileRepository; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Repository; - -@Repository -@RequiredArgsConstructor -public class FileRepositoryImpl implements FileRepository { - private final JpaFileRepository jpaFileRepository; - private final QueryFileRepository queryFileRepository; - - @Override - public FileEntity save(FileEntity fileEntity) { - return jpaFileRepository.save(fileEntity); - } - - @Override - public Optional findById(Long id) { - return jpaFileRepository.findById(id); - } - - @Override - public List findAllByIds(List ids) { - return jpaFileRepository.findAllById(ids); - } - - @Override - public Optional findPhysicalPathById(Long id) { - return queryFileRepository.findPhysicalPathById(id); - } -} diff --git a/aics-domain/src/main/java/kgu/developers/domain/file/infrastructure/JpaFileRepository.java b/aics-domain/src/main/java/kgu/developers/domain/file/infrastructure/JpaFileRepository.java deleted file mode 100644 index 25afbdb8..00000000 --- a/aics-domain/src/main/java/kgu/developers/domain/file/infrastructure/JpaFileRepository.java +++ /dev/null @@ -1,7 +0,0 @@ -package kgu.developers.domain.file.infrastructure; - -import kgu.developers.domain.file.domain.FileEntity; -import org.springframework.data.jpa.repository.JpaRepository; - -public interface JpaFileRepository extends JpaRepository { -} diff --git a/aics-domain/src/main/java/kgu/developers/domain/file/infrastructure/entity/FileJpaEntity.java b/aics-domain/src/main/java/kgu/developers/domain/file/infrastructure/entity/FileJpaEntity.java new file mode 100644 index 00000000..d314be89 --- /dev/null +++ b/aics-domain/src/main/java/kgu/developers/domain/file/infrastructure/entity/FileJpaEntity.java @@ -0,0 +1,64 @@ +package kgu.developers.domain.file.infrastructure.entity; + +import static jakarta.persistence.GenerationType.IDENTITY; +import static lombok.AccessLevel.PROTECTED; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.Id; +import jakarta.persistence.Table; +import kgu.developers.common.domain.BaseTimeEntity; +import kgu.developers.domain.file.domain.FileModel; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Entity +@Getter +@Builder +@Table(name = "file_entity") +@AllArgsConstructor +@NoArgsConstructor(access = PROTECTED) +public class FileJpaEntity extends BaseTimeEntity { + @Id + @GeneratedValue(strategy = IDENTITY) + private Long id; + + @Column(nullable = false) + private String logicalName; + + @Column(nullable = false, unique = true) + private String physicalPath; + + @Column(nullable = false) + private String fileSize; + + @Column(nullable = false) + private String extension; + + public static FileJpaEntity toEntity(FileModel file) { + return FileJpaEntity.builder() + .id(file.getId()) + .logicalName(file.getLogicalName()) + .physicalPath(file.getPhysicalPath()) + .fileSize(file.getFileSize()) + .extension(file.getExtension()) + .build(); + } + + public FileModel toDomain() { + return new FileModel( + this.id, + this.logicalName, + this.physicalPath, + this.fileSize, + this.extension, + this.getCreatedAt(), + this.getUpdatedAt(), + this.getDeletedAt() + ); + } +} + diff --git a/aics-domain/src/main/java/kgu/developers/domain/file/infrastructure/FilePathProperties.java b/aics-domain/src/main/java/kgu/developers/domain/file/infrastructure/properties/FilePathProperties.java similarity index 87% rename from aics-domain/src/main/java/kgu/developers/domain/file/infrastructure/FilePathProperties.java rename to aics-domain/src/main/java/kgu/developers/domain/file/infrastructure/properties/FilePathProperties.java index 62bb59d7..f2795e43 100644 --- a/aics-domain/src/main/java/kgu/developers/domain/file/infrastructure/FilePathProperties.java +++ b/aics-domain/src/main/java/kgu/developers/domain/file/infrastructure/properties/FilePathProperties.java @@ -1,4 +1,4 @@ -package kgu.developers.domain.file.infrastructure; +package kgu.developers.domain.file.infrastructure.properties; import java.util.Set; diff --git a/aics-domain/src/main/java/kgu/developers/domain/file/infrastructure/repository/FileRepositoryImpl.java b/aics-domain/src/main/java/kgu/developers/domain/file/infrastructure/repository/FileRepositoryImpl.java new file mode 100644 index 00000000..e2bb319f --- /dev/null +++ b/aics-domain/src/main/java/kgu/developers/domain/file/infrastructure/repository/FileRepositoryImpl.java @@ -0,0 +1,44 @@ +package kgu.developers.domain.file.infrastructure.repository; + +import java.util.List; +import java.util.Optional; + +import kgu.developers.domain.file.domain.FileModel; +import kgu.developers.domain.file.domain.FileRepository; +import kgu.developers.domain.file.infrastructure.entity.FileJpaEntity; +import lombok.RequiredArgsConstructor; + +import org.springframework.stereotype.Repository; + +@Repository +@RequiredArgsConstructor +public class FileRepositoryImpl implements FileRepository { + private final JpaFileRepository jpaFileRepository; + private final QueryFileRepository queryFileRepository; + + @Override + public FileModel save(FileModel file) { + return jpaFileRepository.save( + FileJpaEntity.toEntity(file) + ).toDomain(); + } + + @Override + public Optional findById(Long id) { + return jpaFileRepository.findById(id) + .map(FileJpaEntity::toDomain); + } + + @Override + public List findAllByIds(List ids) { + return jpaFileRepository.findAllById(ids) + .stream() + .map(FileJpaEntity::toDomain) + .toList(); + } + + @Override + public Optional findPhysicalPathById(Long id) { + return queryFileRepository.findPhysicalPathById(id); + } +} diff --git a/aics-domain/src/main/java/kgu/developers/domain/file/infrastructure/FileStorageService.java b/aics-domain/src/main/java/kgu/developers/domain/file/infrastructure/repository/FileStorageService.java similarity index 84% rename from aics-domain/src/main/java/kgu/developers/domain/file/infrastructure/FileStorageService.java rename to aics-domain/src/main/java/kgu/developers/domain/file/infrastructure/repository/FileStorageService.java index fe9a6565..e7485d1a 100644 --- a/aics-domain/src/main/java/kgu/developers/domain/file/infrastructure/FileStorageService.java +++ b/aics-domain/src/main/java/kgu/developers/domain/file/infrastructure/repository/FileStorageService.java @@ -1,4 +1,4 @@ -package kgu.developers.domain.file.infrastructure; +package kgu.developers.domain.file.infrastructure.repository; import org.springframework.core.io.Resource; import org.springframework.web.multipart.MultipartFile; diff --git a/aics-domain/src/main/java/kgu/developers/domain/file/infrastructure/FileStorageServiceImpl.java b/aics-domain/src/main/java/kgu/developers/domain/file/infrastructure/repository/FileStorageServiceImpl.java similarity index 95% rename from aics-domain/src/main/java/kgu/developers/domain/file/infrastructure/FileStorageServiceImpl.java rename to aics-domain/src/main/java/kgu/developers/domain/file/infrastructure/repository/FileStorageServiceImpl.java index 8e4dd94e..9bcda31e 100644 --- a/aics-domain/src/main/java/kgu/developers/domain/file/infrastructure/FileStorageServiceImpl.java +++ b/aics-domain/src/main/java/kgu/developers/domain/file/infrastructure/repository/FileStorageServiceImpl.java @@ -1,4 +1,4 @@ -package kgu.developers.domain.file.infrastructure; +package kgu.developers.domain.file.infrastructure.repository; import static java.nio.file.StandardCopyOption.*; @@ -25,6 +25,8 @@ import kgu.developers.domain.file.exception.FilePathInvalidException; import kgu.developers.domain.file.exception.FileStoreFailedException; import kgu.developers.domain.file.exception.NotSupportedFileExtensionException; +import kgu.developers.domain.file.infrastructure.properties.FilePathProperties; +import kgu.developers.domain.file.infrastructure.ImageResizingService; @Service public class FileStorageServiceImpl implements FileStorageService { diff --git a/aics-domain/src/main/java/kgu/developers/domain/file/infrastructure/repository/JpaFileRepository.java b/aics-domain/src/main/java/kgu/developers/domain/file/infrastructure/repository/JpaFileRepository.java new file mode 100644 index 00000000..803738a1 --- /dev/null +++ b/aics-domain/src/main/java/kgu/developers/domain/file/infrastructure/repository/JpaFileRepository.java @@ -0,0 +1,8 @@ +package kgu.developers.domain.file.infrastructure.repository; + +import org.springframework.data.jpa.repository.JpaRepository; + +import kgu.developers.domain.file.infrastructure.entity.FileJpaEntity; + +public interface JpaFileRepository extends JpaRepository { +} diff --git a/aics-domain/src/main/java/kgu/developers/domain/file/infrastructure/QueryFileRepository.java b/aics-domain/src/main/java/kgu/developers/domain/file/infrastructure/repository/QueryFileRepository.java similarity index 62% rename from aics-domain/src/main/java/kgu/developers/domain/file/infrastructure/QueryFileRepository.java rename to aics-domain/src/main/java/kgu/developers/domain/file/infrastructure/repository/QueryFileRepository.java index c042fe79..56c0c3ee 100644 --- a/aics-domain/src/main/java/kgu/developers/domain/file/infrastructure/QueryFileRepository.java +++ b/aics-domain/src/main/java/kgu/developers/domain/file/infrastructure/repository/QueryFileRepository.java @@ -1,6 +1,6 @@ -package kgu.developers.domain.file.infrastructure; +package kgu.developers.domain.file.infrastructure.repository; -import static kgu.developers.domain.file.domain.QFileEntity.fileEntity; +import static kgu.developers.domain.file.infrastructure.entity.QFileJpaEntity.fileJpaEntity; import java.util.Optional; @@ -18,9 +18,9 @@ public class QueryFileRepository { public Optional findPhysicalPathById(Long id) { return Optional.ofNullable(id) .map(i -> queryFactory - .select(fileEntity.physicalPath) - .from(fileEntity) - .where(fileEntity.id.eq(i)) + .select(fileJpaEntity.physicalPath) + .from(fileJpaEntity) + .where(fileJpaEntity.id.eq(i)) .fetchOne() ); } diff --git a/aics-domain/src/main/java/kgu/developers/domain/post/application/query/PostQueryService.java b/aics-domain/src/main/java/kgu/developers/domain/post/application/query/PostQueryService.java index 27c83667..fa71fb97 100644 --- a/aics-domain/src/main/java/kgu/developers/domain/post/application/query/PostQueryService.java +++ b/aics-domain/src/main/java/kgu/developers/domain/post/application/query/PostQueryService.java @@ -3,7 +3,7 @@ import java.time.LocalDateTime; import java.util.List; -import kgu.developers.domain.file.domain.FileEntity; +import kgu.developers.domain.file.domain.FileModel; import kgu.developers.domain.file.domain.FileRepository; import kgu.developers.domain.user.domain.User; import kgu.developers.domain.user.domain.UserRepository; @@ -41,7 +41,7 @@ public PostDetailResponse getPostByIdWithPrevAndNext(Post post) { Post prevPost = postRepository.findByPrevPost(postId, timestamp, category).orElse(null); Post nextPost = postRepository.findByNextPost(postId, timestamp, category).orElse(null); - FileEntity file = fileRepository.findById(post.getFileId()).orElse(null); + FileModel file = fileRepository.findById(post.getFileId()).orElse(null); User author = userRepository.findById(post.getAuthorId()).orElse(null); PostTitleResponse prevPostResponse = PostTitleResponse.from(prevPost); PostTitleResponse nextPostResponse = PostTitleResponse.from(nextPost); diff --git a/aics-domain/src/main/java/kgu/developers/domain/post/application/response/PostDetailResponse.java b/aics-domain/src/main/java/kgu/developers/domain/post/application/response/PostDetailResponse.java index 9ed4003d..41828c43 100644 --- a/aics-domain/src/main/java/kgu/developers/domain/post/application/response/PostDetailResponse.java +++ b/aics-domain/src/main/java/kgu/developers/domain/post/application/response/PostDetailResponse.java @@ -5,8 +5,9 @@ import java.time.format.DateTimeFormatter; -import kgu.developers.domain.file.domain.FileEntity; +import kgu.developers.domain.file.domain.FileModel; import kgu.developers.domain.user.domain.User; + import org.springframework.format.annotation.DateTimeFormat; import io.swagger.v3.oas.annotations.media.Schema; @@ -67,7 +68,13 @@ public record PostDetailResponse( PostTitleResponse nextPost ) { - public static PostDetailResponse from(Post post, User author, FileEntity file, PostTitleResponse prevPost, PostTitleResponse nextPost) { + public static PostDetailResponse from( + Post post, + User author, + FileModel file, + PostTitleResponse prevPost, + PostTitleResponse nextPost + ) { DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"); return PostDetailResponse.builder() .postId(post.getId()) diff --git a/aics-domain/src/testFixtures/java/carousel/application/CarouselCommandServiceTest.java b/aics-domain/src/testFixtures/java/carousel/application/CarouselCommandServiceTest.java index df6a012d..5516fd38 100644 --- a/aics-domain/src/testFixtures/java/carousel/application/CarouselCommandServiceTest.java +++ b/aics-domain/src/testFixtures/java/carousel/application/CarouselCommandServiceTest.java @@ -10,7 +10,7 @@ import kgu.developers.domain.carousel.application.command.CarouselCommandService; import kgu.developers.domain.carousel.domain.Carousel; import kgu.developers.domain.file.application.query.FileQueryService; -import kgu.developers.domain.file.domain.FileEntity; +import kgu.developers.domain.file.domain.FileModel; import mock.repository.FakeCarouselRepository; import mock.repository.FakeFileRepository; @@ -36,7 +36,7 @@ private void initializeCarouselCommandService() { private static void saveTestFile(FakeFileRepository fakeFileRepository) { fakeFileRepository.save( - FileEntity.create( + FileModel.create( "경기대학교 AI컴퓨터공학부 메인 이미지", "/files/carousel/main_image.jpg", 1234L, @@ -62,7 +62,11 @@ public void createCarousel_success() { @Test @DisplayName("upateCarousel은 캐러셀을 수정한다.") public void updateCarousel_success() { - Carousel carousel = Carousel.builder().build(); + Carousel carousel = Carousel.create( + "oldText", + "https://www.old.kgu.ac.kr/", + TEST_FILE_ID + ); String link = "https://www.new.kgu.ac.kr/"; String text = "newText"; diff --git a/aics-domain/src/testFixtures/java/carousel/application/CarouselQueryServiceTest.java b/aics-domain/src/testFixtures/java/carousel/application/CarouselQueryServiceTest.java index 8382fa18..4d8a8b83 100644 --- a/aics-domain/src/testFixtures/java/carousel/application/CarouselQueryServiceTest.java +++ b/aics-domain/src/testFixtures/java/carousel/application/CarouselQueryServiceTest.java @@ -10,7 +10,6 @@ import kgu.developers.domain.carousel.application.query.CarouselQueryService; import kgu.developers.domain.carousel.domain.Carousel; -import kgu.developers.domain.file.domain.FileEntity; import mock.repository.FakeCarouselRepository; public class CarouselQueryServiceTest { diff --git a/aics-domain/src/testFixtures/java/carousel/domain/CarouselDomainTest.java b/aics-domain/src/testFixtures/java/carousel/domain/CarouselDomainTest.java index cc81beef..7fdbde1c 100644 --- a/aics-domain/src/testFixtures/java/carousel/domain/CarouselDomainTest.java +++ b/aics-domain/src/testFixtures/java/carousel/domain/CarouselDomainTest.java @@ -7,7 +7,6 @@ import org.junit.jupiter.api.Test; import kgu.developers.domain.carousel.domain.Carousel; -import kgu.developers.domain.file.domain.FileEntity; public class CarouselDomainTest { private static final String TARGET_CAROUSEL_TEXT = "컴퓨터공학부 대표 이미지"; @@ -19,7 +18,11 @@ public class CarouselDomainTest { public void createCarousel_success() { //given //when - Carousel createdCarousel = Carousel.create(TARGET_CAROUSEL_TEXT, TARGET_CAROUSEL_LINK, FAKE_FILE_ID); + Carousel createdCarousel = Carousel.create( + TARGET_CAROUSEL_TEXT, + TARGET_CAROUSEL_LINK, + FAKE_FILE_ID + ); //then assertNotNull(createdCarousel); @@ -31,7 +34,11 @@ public void createCarousel_success() { @DisplayName("updateText는 text를 수정한다.") public void updateText_success() { // given - Carousel carousel = Carousel.builder().build(); + Carousel carousel = Carousel.create( + TARGET_CAROUSEL_TEXT, + TARGET_CAROUSEL_LINK, + FAKE_FILE_ID + ); String text = "text"; // when @@ -45,7 +52,11 @@ public void updateText_success() { @DisplayName("updateLink는 link를 수정한다.") public void updateLink_success() { // given - Carousel carousel = Carousel.builder().build(); + Carousel carousel = Carousel.create( + TARGET_CAROUSEL_TEXT, + TARGET_CAROUSEL_LINK, + FAKE_FILE_ID + ); String link = "link"; // when @@ -54,18 +65,4 @@ public void updateLink_success() { // then assertEquals(link, carousel.getLink()); } - - @Test - @DisplayName("updateFile은 file를 수정한다.") - public void updateFile_success() { - // given - Carousel carousel = Carousel.builder().build(); - FileEntity file = FileEntity.builder().build(); - - // when - carousel.updateFileId(file.getId()); - - // then - assertEquals(file.getId(), carousel.getFileId()); - } } diff --git a/aics-domain/src/testFixtures/java/lab/application/LabCommandServiceTest.java b/aics-domain/src/testFixtures/java/lab/application/LabCommandServiceTest.java index 382edbb5..b089a6a4 100644 --- a/aics-domain/src/testFixtures/java/lab/application/LabCommandServiceTest.java +++ b/aics-domain/src/testFixtures/java/lab/application/LabCommandServiceTest.java @@ -9,10 +9,8 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; -import kgu.developers.domain.file.domain.FileEntity; import kgu.developers.domain.lab.application.command.LabCommandService; import kgu.developers.domain.lab.domain.Lab; -import mock.repository.FakeFileRepository; import mock.repository.FakeLabRepository; public class LabCommandServiceTest { @@ -28,10 +26,8 @@ public void init() { } private void initializeLabCommandService() { - FakeFileRepository fakeFileRepository = new FakeFileRepository(); fakeLabRepository = new FakeLabRepository(); labCommandService = new LabCommandService(fakeLabRepository); - fakeFileRepository.save(FileEntity.builder().id(1L).build()); fakeLabRepository.save(saveTestLab()); } diff --git a/aics-domain/src/testFixtures/java/lab/application/LabQueryServiceTest.java b/aics-domain/src/testFixtures/java/lab/application/LabQueryServiceTest.java index 8b555c9b..9a5f41cc 100644 --- a/aics-domain/src/testFixtures/java/lab/application/LabQueryServiceTest.java +++ b/aics-domain/src/testFixtures/java/lab/application/LabQueryServiceTest.java @@ -9,7 +9,6 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; -import kgu.developers.domain.file.domain.FileEntity; import kgu.developers.domain.lab.application.query.LabQueryService; import kgu.developers.domain.lab.domain.Lab; import kgu.developers.domain.lab.exception.LabNotFoundException; diff --git a/aics-domain/src/testFixtures/java/lab/domain/LabDomainTest.java b/aics-domain/src/testFixtures/java/lab/domain/LabDomainTest.java index d108e924..a8dc35a5 100644 --- a/aics-domain/src/testFixtures/java/lab/domain/LabDomainTest.java +++ b/aics-domain/src/testFixtures/java/lab/domain/LabDomainTest.java @@ -7,7 +7,6 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; -import kgu.developers.domain.file.domain.FileEntity; import kgu.developers.domain.lab.domain.Lab; public class LabDomainTest { diff --git a/aics-domain/src/testFixtures/java/mock/repository/FakeCarouselRepository.java b/aics-domain/src/testFixtures/java/mock/repository/FakeCarouselRepository.java index b111d999..919a6d6e 100644 --- a/aics-domain/src/testFixtures/java/mock/repository/FakeCarouselRepository.java +++ b/aics-domain/src/testFixtures/java/mock/repository/FakeCarouselRepository.java @@ -17,14 +17,15 @@ public class FakeCarouselRepository implements CarouselRepository { @Override public Carousel save(Carousel carousel) { - Carousel savedCarousel = Carousel.builder() - .id(sequence.getAndIncrement()) - .text(carousel.getText()) - .link(carousel.getLink()) - .fileId(carousel.getFileId()) - .build(); - - TestEntityUtils.setCreatedAt(savedCarousel, LocalDateTime.now()); + Carousel savedCarousel = new Carousel( + sequence.getAndIncrement(), + carousel.getText(), + carousel.getLink(), + carousel.getFileId(), + LocalDateTime.now(), + LocalDateTime.now(), + null + ); data.add(savedCarousel); return savedCarousel; diff --git a/aics-domain/src/testFixtures/java/mock/repository/FakeFileRepository.java b/aics-domain/src/testFixtures/java/mock/repository/FakeFileRepository.java index efea6fde..e9cd2fca 100644 --- a/aics-domain/src/testFixtures/java/mock/repository/FakeFileRepository.java +++ b/aics-domain/src/testFixtures/java/mock/repository/FakeFileRepository.java @@ -3,38 +3,41 @@ import java.util.*; import java.util.concurrent.atomic.AtomicLong; -import kgu.developers.domain.file.domain.FileEntity; +import kgu.developers.domain.file.domain.FileModel; import kgu.developers.domain.file.domain.FileRepository; +import kgu.developers.domain.file.infrastructure.entity.FileJpaEntity; public class FakeFileRepository implements FileRepository { - private final List data = Collections.synchronizedList(new ArrayList<>()); + private final List data = Collections.synchronizedList(new ArrayList<>()); private final AtomicLong sequence = new AtomicLong(1); @Override - public FileEntity save(FileEntity fileEntity) { - FileEntity newFileEntity = FileEntity.builder() + public FileModel save(FileModel file) { + FileJpaEntity newFileJpaEntity = FileJpaEntity.builder() .id(sequence.getAndIncrement()) - .logicalName(fileEntity.getLogicalName()) - .physicalPath(fileEntity.getPhysicalPath()) - .fileSize(fileEntity.getFileSize()) - .extension(fileEntity.getExtension()) + .logicalName(file.getLogicalName()) + .physicalPath(file.getPhysicalPath()) + .fileSize(file.getFileSize()) + .extension(file.getExtension()) .build(); - data.add(newFileEntity); - return newFileEntity; + data.add(newFileJpaEntity); + return newFileJpaEntity.toDomain(); } @Override - public Optional findById(Long id) { + public Optional findById(Long id) { return data.stream() .filter(fileEntity -> fileEntity.getId().equals(id)) + .map(FileJpaEntity::toDomain) .findFirst(); } @Override - public List findAllByIds(List ids) { + public List findAllByIds(List ids) { return data.stream() .filter(file -> ids.contains(file.getId())) + .map(FileJpaEntity::toDomain) .toList(); } @@ -42,7 +45,7 @@ public List findAllByIds(List ids) { public Optional findPhysicalPathById(Long id) { return data.stream() .filter(fileEntity -> fileEntity.getId().equals(id)) - .map(FileEntity::getPhysicalPath) + .map(FileJpaEntity::getPhysicalPath) .findFirst(); } }