diff --git a/src/main/java/com/tiki/server/document/dto/response/DeletedDocumentResponse.java b/src/main/java/com/tiki/server/document/dto/response/DeletedDocumentResponse.java new file mode 100644 index 00000000..01c8ed84 --- /dev/null +++ b/src/main/java/com/tiki/server/document/dto/response/DeletedDocumentResponse.java @@ -0,0 +1,30 @@ +package com.tiki.server.document.dto.response; + +import static lombok.AccessLevel.PRIVATE; + +import java.time.LocalDateTime; + +import com.tiki.server.document.entity.DeletedDocument; + +import jakarta.validation.constraints.NotNull; +import lombok.Builder; + +@Builder(access = PRIVATE) +public record DeletedDocumentResponse( + @NotNull long documentId, + @NotNull String name, + @NotNull String url, + @NotNull long capacity, + @NotNull LocalDateTime createdTime +) { + + public static DeletedDocumentResponse of(final DeletedDocument document, final String url) { + return DeletedDocumentResponse.builder() + .documentId(document.getId()) + .name(document.getFileName()) + .url(url) + .capacity(document.getCapacity()) + .createdTime(document.getCreatedAt()) + .build(); + } +} diff --git a/src/main/java/com/tiki/server/document/dto/response/DeletedDocumentsGetResponse.java b/src/main/java/com/tiki/server/document/dto/response/DeletedDocumentsGetResponse.java index 0ae4d9c1..12341db5 100644 --- a/src/main/java/com/tiki/server/document/dto/response/DeletedDocumentsGetResponse.java +++ b/src/main/java/com/tiki/server/document/dto/response/DeletedDocumentsGetResponse.java @@ -4,8 +4,6 @@ import java.util.List; -import com.tiki.server.document.entity.DeletedDocument; - import jakarta.validation.constraints.NotNull; import lombok.Builder; @@ -14,7 +12,7 @@ public record DeletedDocumentsGetResponse( @NotNull List deletedDocuments ) { - public static DeletedDocumentsGetResponse from(final List deletedDocuments) { + public static DeletedDocumentsGetResponse from(final List deletedDocuments) { return DeletedDocumentsGetResponse.builder() .deletedDocuments(deletedDocuments.stream().map(DeletedDocumentGetResponse::from).toList()) .build(); @@ -28,12 +26,12 @@ private record DeletedDocumentGetResponse( @NotNull long capacity ) { - private static DeletedDocumentGetResponse from(final DeletedDocument deletedDocument) { + private static DeletedDocumentGetResponse from(final DeletedDocumentResponse deletedDocument) { return DeletedDocumentGetResponse.builder() - .documentId(deletedDocument.getId()) - .name(deletedDocument.getFileName()) - .url(deletedDocument.getFileUrl()) - .capacity(deletedDocument.getCapacity()) + .documentId(deletedDocument.documentId()) + .name(deletedDocument.name()) + .url(deletedDocument.url()) + .capacity(deletedDocument.capacity()) .build(); } } diff --git a/src/main/java/com/tiki/server/document/dto/response/DocumentResponse.java b/src/main/java/com/tiki/server/document/dto/response/DocumentResponse.java new file mode 100644 index 00000000..a8986e26 --- /dev/null +++ b/src/main/java/com/tiki/server/document/dto/response/DocumentResponse.java @@ -0,0 +1,30 @@ +package com.tiki.server.document.dto.response; + +import static lombok.AccessLevel.PRIVATE; + +import java.time.LocalDateTime; + +import com.tiki.server.document.entity.Document; + +import jakarta.validation.constraints.NotNull; +import lombok.Builder; + +@Builder(access = PRIVATE) +public record DocumentResponse( + @NotNull long documentId, + @NotNull String name, + @NotNull String url, + @NotNull long capacity, + @NotNull LocalDateTime createdTime +) { + + public static DocumentResponse of(final Document document, final String url) { + return DocumentResponse.builder() + .documentId(document.getId()) + .name(document.getFileName()) + .url(url) + .capacity(document.getCapacity()) + .createdTime(document.getCreatedAt()) + .build(); + } +} diff --git a/src/main/java/com/tiki/server/document/dto/response/DocumentsGetResponse.java b/src/main/java/com/tiki/server/document/dto/response/DocumentsGetResponse.java index 3ba22bc3..28828487 100644 --- a/src/main/java/com/tiki/server/document/dto/response/DocumentsGetResponse.java +++ b/src/main/java/com/tiki/server/document/dto/response/DocumentsGetResponse.java @@ -15,7 +15,7 @@ public record DocumentsGetResponse( @NotNull List documents ) { - public static DocumentsGetResponse from(final List documents) { + public static DocumentsGetResponse from(final List documents) { return DocumentsGetResponse.builder() .documents(documents.stream().map(DocumentInfoGetResponse::from).toList()) .build(); @@ -30,13 +30,13 @@ private record DocumentInfoGetResponse( @NotNull LocalDateTime createdTime ) { - public static DocumentInfoGetResponse from(final Document document) { + public static DocumentInfoGetResponse from(final DocumentResponse document) { return DocumentInfoGetResponse.builder() - .documentId(document.getId()) - .name(document.getFileName()) - .url(document.getFileUrl()) - .capacity(document.getCapacity()) - .createdTime(document.getCreatedAt()) + .documentId(document.documentId()) + .name(document.name()) + .url(document.url()) + .capacity(document.capacity()) + .createdTime(document.createdTime()) .build(); } } diff --git a/src/main/java/com/tiki/server/document/service/DocumentService.java b/src/main/java/com/tiki/server/document/service/DocumentService.java index 20d62b9d..a75b2827 100644 --- a/src/main/java/com/tiki/server/document/service/DocumentService.java +++ b/src/main/java/com/tiki/server/document/service/DocumentService.java @@ -14,7 +14,9 @@ import com.tiki.server.document.adapter.DocumentSaver; import com.tiki.server.document.dto.request.DocumentCreateRequest; import com.tiki.server.document.dto.request.DocumentsCreateRequest; +import com.tiki.server.document.dto.response.DeletedDocumentResponse; import com.tiki.server.document.dto.response.DeletedDocumentsGetResponse; +import com.tiki.server.document.dto.response.DocumentResponse; import com.tiki.server.document.dto.response.DocumentsCreateResponse; import com.tiki.server.document.dto.response.DocumentsGetResponse; import com.tiki.server.document.entity.DeletedDocument; @@ -53,7 +55,8 @@ public DocumentsGetResponse getAllDocuments(final long memberId, final long team Position accessiblePosition = Position.getAccessiblePosition(type); memberTeamManager.checkMemberAccessible(accessiblePosition); List documents = documentFinder.findAllByTeamId(teamId); - return DocumentsGetResponse.from(documents); + List responses = getDocumentResponses(documents); + return DocumentsGetResponse.from(responses); } @Transactional @@ -69,7 +72,8 @@ public DocumentsCreateResponse createDocuments(final long memberId, final long t public DocumentsGetResponse get(final long memberId, final long teamId, final Long folderId) { memberTeamManagerFinder.findByMemberIdAndTeamId(memberId, teamId); List documents = documentFinder.findByTeamIdAndFolderId(teamId, folderId); - return DocumentsGetResponse.from(documents); + List responses = getDocumentResponses(documents); + return DocumentsGetResponse.from(responses); } @Transactional @@ -102,7 +106,14 @@ public void restore(final long memberId, final long teamId, final List doc public DeletedDocumentsGetResponse getTrash(final long memberId, final long teamId) { memberTeamManagerFinder.findByMemberIdAndTeamId(memberId, teamId); List deletedDocuments = deletedDocumentAdapter.get(teamId); - return DeletedDocumentsGetResponse.from(deletedDocuments); + List responses = getDeletedDocumentResponses(deletedDocuments); + return DeletedDocumentsGetResponse.from(responses); + } + + private List getDocumentResponses(final List documents) { + return documents.stream() + .map(document -> DocumentResponse.of(document, awsHandler.getDownloadPreSignedUrl(document.getFileKey()))) + .toList(); } private void validateFolder(final Long folderId, final long teamId) { @@ -141,4 +152,10 @@ private void restoreTeamUsage(final long teamId, final List del Team team = teamFinder.findById(teamId); team.restoreUsage(deletedDocuments.stream().mapToLong(DeletedDocument::getCapacity).sum()); } + + private List getDeletedDocumentResponses(final List deletedDocuments) { + return deletedDocuments.stream() + .map(document -> DeletedDocumentResponse.of(document, awsHandler.getDownloadPreSignedUrl(document.getFileKey()))) + .toList(); + } } diff --git a/src/main/java/com/tiki/server/drive/dto/DriveGetResponse.java b/src/main/java/com/tiki/server/drive/dto/DriveGetResponse.java index dc31f3c0..d791494f 100644 --- a/src/main/java/com/tiki/server/drive/dto/DriveGetResponse.java +++ b/src/main/java/com/tiki/server/drive/dto/DriveGetResponse.java @@ -5,7 +5,7 @@ import java.time.LocalDateTime; import java.util.List; -import com.tiki.server.document.entity.Document; +import com.tiki.server.document.dto.response.DocumentResponse; import com.tiki.server.folder.entity.Folder; import jakarta.validation.constraints.NotNull; @@ -17,7 +17,7 @@ public record DriveGetResponse( @NotNull List folders ) { - public static DriveGetResponse of(final List documents, final List folders) { + public static DriveGetResponse of(final List documents, final List folders) { return DriveGetResponse.builder() .documents(documents.stream().map(DocumentGetResponse::from).toList()) .folders(folders.stream().map(FolderGetResponse::from).toList()) @@ -34,13 +34,13 @@ private record DocumentGetResponse( @NotNull String type ) { - public static DocumentGetResponse from(final Document document) { + public static DocumentGetResponse from(final DocumentResponse document) { return DocumentGetResponse.builder() - .documentId(document.getId()) - .name(document.getFileName()) - .url(document.getFileUrl()) - .capacity(document.getCapacity()) - .createdTime(document.getCreatedAt()) + .documentId(document.documentId()) + .name(document.name()) + .url(document.url()) + .capacity(document.capacity()) + .createdTime(document.createdTime()) .type("document") .build(); } diff --git a/src/main/java/com/tiki/server/drive/service/DriveService.java b/src/main/java/com/tiki/server/drive/service/DriveService.java index c195375b..4a0c13c3 100644 --- a/src/main/java/com/tiki/server/drive/service/DriveService.java +++ b/src/main/java/com/tiki/server/drive/service/DriveService.java @@ -8,8 +8,10 @@ import org.springframework.transaction.annotation.Transactional; import com.tiki.server.document.adapter.DocumentFinder; +import com.tiki.server.document.dto.response.DocumentResponse; import com.tiki.server.document.entity.Document; import com.tiki.server.drive.dto.DriveGetResponse; +import com.tiki.server.external.util.AwsHandler; import com.tiki.server.folder.adapter.FolderFinder; import com.tiki.server.folder.entity.Folder; import com.tiki.server.memberteammanager.adapter.MemberTeamManagerFinder; @@ -24,6 +26,7 @@ public class DriveService { private final MemberTeamManagerFinder memberTeamManagerFinder; private final DocumentFinder documentFinder; private final FolderFinder folderFinder; + private final AwsHandler awsHandler; public DriveGetResponse getDrive(final long memberId, final long teamId, final Long folderId) { memberTeamManagerFinder.findByMemberIdAndTeamId(memberId, teamId); @@ -31,7 +34,8 @@ public DriveGetResponse getDrive(final long memberId, final long teamId, final L Folder folder = getFolder(teamId, folderId); String path = getChildFolderPath(folder); List folders = folderFinder.findByTeamIdAndPath(teamId, path); - return DriveGetResponse.of(documents, folders); + List responses = getDocumentResponses(documents); + return DriveGetResponse.of(responses, folders); } private Folder getFolder(final long teamId, final Long folderId) { @@ -49,4 +53,10 @@ private String getChildFolderPath(final Folder folder) { } return folder.getChildPath(); } + + private List getDocumentResponses(final List documents) { + return documents.stream() + .map(document -> DocumentResponse.of(document, awsHandler.getDownloadPreSignedUrl(document.getFileKey()))) + .toList(); + } } diff --git a/src/main/java/com/tiki/server/external/controller/FileHandlerController.java b/src/main/java/com/tiki/server/external/controller/FileHandlerController.java index 78281252..f2293a30 100644 --- a/src/main/java/com/tiki/server/external/controller/FileHandlerController.java +++ b/src/main/java/com/tiki/server/external/controller/FileHandlerController.java @@ -17,7 +17,7 @@ import com.tiki.server.common.dto.SuccessResponse; import com.tiki.server.external.controller.docs.FileHandlerControllerDocs; import com.tiki.server.external.dto.request.S3DeleteRequest; -import com.tiki.server.external.dto.response.PreSignedUrlResponse; +import com.tiki.server.external.dto.response.PutObjectPreSignedUrlResponse; import lombok.RequiredArgsConstructor; @@ -31,9 +31,9 @@ public class FileHandlerController implements FileHandlerControllerDocs { @Override @ResponseStatus(HttpStatus.OK) @GetMapping("/upload") - public SuccessResponse getPreSignedUrl( + public SuccessResponse getPreSignedUrl( @RequestParam final String fileFormat) { - PreSignedUrlResponse response = fileHandlerService.getUploadPreSignedUrl(fileFormat); + PutObjectPreSignedUrlResponse response = fileHandlerService.getUploadPreSignedUrl(fileFormat); return SuccessResponse.success(PRESIGNED_URL_GET_SUCCESS.getMessage(), response); } diff --git a/src/main/java/com/tiki/server/external/controller/docs/FileHandlerControllerDocs.java b/src/main/java/com/tiki/server/external/controller/docs/FileHandlerControllerDocs.java index c6c1e387..20da8e8a 100644 --- a/src/main/java/com/tiki/server/external/controller/docs/FileHandlerControllerDocs.java +++ b/src/main/java/com/tiki/server/external/controller/docs/FileHandlerControllerDocs.java @@ -6,7 +6,7 @@ import com.tiki.server.common.dto.ErrorResponse; import com.tiki.server.common.dto.SuccessResponse; import com.tiki.server.external.dto.request.S3DeleteRequest; -import com.tiki.server.external.dto.response.PreSignedUrlResponse; +import com.tiki.server.external.dto.response.PutObjectPreSignedUrlResponse; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; @@ -33,7 +33,7 @@ public interface FileHandlerControllerDocs { description = "S3 PRESIGNED URL 불러오기 실패", content = @Content(schema = @Schema(implementation = ErrorResponse.class)))} ) - SuccessResponse getPreSignedUrl( + SuccessResponse getPreSignedUrl( @Parameter( name = "fileFormat", description = "파일 형식", diff --git a/src/main/java/com/tiki/server/external/dto/response/PreSignedUrlResponse.java b/src/main/java/com/tiki/server/external/dto/response/PutObjectPreSignedUrlResponse.java similarity index 61% rename from src/main/java/com/tiki/server/external/dto/response/PreSignedUrlResponse.java rename to src/main/java/com/tiki/server/external/dto/response/PutObjectPreSignedUrlResponse.java index 8cc6c9ef..4ce4abde 100644 --- a/src/main/java/com/tiki/server/external/dto/response/PreSignedUrlResponse.java +++ b/src/main/java/com/tiki/server/external/dto/response/PutObjectPreSignedUrlResponse.java @@ -6,13 +6,13 @@ import lombok.Builder; @Builder(access = PRIVATE) -public record PreSignedUrlResponse( +public record PutObjectPreSignedUrlResponse( @NotNull String fileName, @NotNull String url ) { - public static PreSignedUrlResponse of(final String fileName, final String url) { - return PreSignedUrlResponse.builder() + public static PutObjectPreSignedUrlResponse of(final String fileName, final String url) { + return PutObjectPreSignedUrlResponse.builder() .fileName(fileName) .url(url) .build(); diff --git a/src/main/java/com/tiki/server/external/service/FileHandlerService.java b/src/main/java/com/tiki/server/external/service/FileHandlerService.java index ab227dbc..f93abd31 100644 --- a/src/main/java/com/tiki/server/external/service/FileHandlerService.java +++ b/src/main/java/com/tiki/server/external/service/FileHandlerService.java @@ -1,7 +1,7 @@ package com.tiki.server.external.service; import com.tiki.server.external.dto.request.S3DeleteRequest; -import com.tiki.server.external.dto.response.PreSignedUrlResponse; +import com.tiki.server.external.dto.response.PutObjectPreSignedUrlResponse; import com.tiki.server.external.util.AwsHandler; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -12,7 +12,7 @@ public class FileHandlerService { private final AwsHandler awsHandler; - public PreSignedUrlResponse getUploadPreSignedUrl(final String fileFormat) { + public PutObjectPreSignedUrlResponse getUploadPreSignedUrl(final String fileFormat) { return awsHandler.getUploadPreSignedUrl(fileFormat); } diff --git a/src/main/java/com/tiki/server/external/util/AwsHandler.java b/src/main/java/com/tiki/server/external/util/AwsHandler.java index 8033fc30..200bdcb4 100644 --- a/src/main/java/com/tiki/server/external/util/AwsHandler.java +++ b/src/main/java/com/tiki/server/external/util/AwsHandler.java @@ -12,14 +12,16 @@ import org.springframework.stereotype.Component; import com.tiki.server.external.config.AWSConfig; -import com.tiki.server.external.dto.response.PreSignedUrlResponse; +import com.tiki.server.external.dto.response.PutObjectPreSignedUrlResponse; import com.tiki.server.external.exception.ExternalException; import lombok.RequiredArgsConstructor; import software.amazon.awssdk.services.s3.S3Client; import software.amazon.awssdk.services.s3.model.DeleteObjectRequest; +import software.amazon.awssdk.services.s3.model.GetObjectRequest; import software.amazon.awssdk.services.s3.model.PutObjectRequest; import software.amazon.awssdk.services.s3.presigner.S3Presigner; +import software.amazon.awssdk.services.s3.presigner.model.GetObjectPresignRequest; import software.amazon.awssdk.services.s3.presigner.model.PutObjectPresignRequest; @Component @@ -31,7 +33,7 @@ public class AwsHandler { @Value("${aws-property.bucket}") private String bucket; - public PreSignedUrlResponse getUploadPreSignedUrl(final String fileFormat) { + public PutObjectPreSignedUrlResponse getUploadPreSignedUrl(final String fileFormat) { try { String fileName = generateFileName(fileFormat); String key = FILE_SAVE_PREFIX + fileName; @@ -39,7 +41,18 @@ public PreSignedUrlResponse getUploadPreSignedUrl(final String fileFormat) { PutObjectRequest putObjectRequest = createPutObjectRequest(key); PutObjectPresignRequest putObjectPresignRequest = createPutObjectPresignRequest(putObjectRequest); String url = preSigner.presignPutObject(putObjectPresignRequest).url().toString(); - return PreSignedUrlResponse.of(fileName, url); + return PutObjectPreSignedUrlResponse.of(fileName, url); + } catch (RuntimeException e) { + throw new ExternalException(PRESIGNED_URL_GET_ERROR); + } + } + + public String getDownloadPreSignedUrl(final String fileKey) { + try { + S3Presigner preSigner = awsConfig.getS3PreSigner(); + GetObjectRequest getObjectRequest = createGetObjectRequest(fileKey); + GetObjectPresignRequest getObjectPresignRequest = createGetObjectPresignRequest(getObjectRequest); + return preSigner.presignGetObject(getObjectPresignRequest).url().toString(); } catch (RuntimeException e) { throw new ExternalException(PRESIGNED_URL_GET_ERROR); } @@ -72,6 +85,20 @@ private PutObjectPresignRequest createPutObjectPresignRequest(final PutObjectReq .build(); } + private GetObjectRequest createGetObjectRequest(final String key) { + return GetObjectRequest.builder() + .bucket(bucket) + .key(key) + .build(); + } + + private GetObjectPresignRequest createGetObjectPresignRequest(final GetObjectRequest getObjectRequest) { + return GetObjectPresignRequest.builder() + .signatureDuration(Duration.ofMinutes(PRE_SIGNED_URL_EXPIRE_MINUTE)) + .getObjectRequest(getObjectRequest) + .build(); + } + private String generateFileName(final String fileFormat) { return UUID.randomUUID() + FILE_DELIMITER + fileFormat; } diff --git a/src/main/java/com/tiki/server/member/dto/response/BelongTeamsGetResponse.java b/src/main/java/com/tiki/server/member/dto/response/BelongTeamsGetResponse.java index 76c83efc..a66bb8ca 100644 --- a/src/main/java/com/tiki/server/member/dto/response/BelongTeamsGetResponse.java +++ b/src/main/java/com/tiki/server/member/dto/response/BelongTeamsGetResponse.java @@ -1,6 +1,6 @@ package com.tiki.server.member.dto.response; -import com.tiki.server.team.entity.Team; +import com.tiki.server.team.dto.response.TeamResponse; import jakarta.validation.constraints.NotNull; import lombok.Builder; @@ -14,7 +14,7 @@ public record BelongTeamsGetResponse( @NotNull List belongTeamGetResponses ) { - public static BelongTeamsGetResponse from(final List teams) { + public static BelongTeamsGetResponse from(final List teams) { return BelongTeamsGetResponse.builder() .belongTeamGetResponses(teams.stream().map(BelongTeamGetResponse::from).toList()) .build(); @@ -26,11 +26,11 @@ public record BelongTeamGetResponse( @NotNull String name, @NotNull String iconImageUrl ) { - public static BelongTeamGetResponse from(final Team team) { + public static BelongTeamGetResponse from(final TeamResponse team) { return BelongTeamGetResponse.builder() - .id(team.getId()) - .name(team.getName()) - .iconImageUrl(team.getIconImageUrl()) + .id(team.teamId()) + .name(team.name()) + .iconImageUrl(team.iconImageUrl()) .build(); } } diff --git a/src/main/java/com/tiki/server/member/service/MemberService.java b/src/main/java/com/tiki/server/member/service/MemberService.java index 379b0e8a..bb3a12bb 100644 --- a/src/main/java/com/tiki/server/member/service/MemberService.java +++ b/src/main/java/com/tiki/server/member/service/MemberService.java @@ -1,5 +1,6 @@ package com.tiki.server.member.service; +import com.tiki.server.external.util.AwsHandler; import com.tiki.server.member.adapter.MemberDeleter; import com.tiki.server.member.adapter.MemberFinder; import com.tiki.server.member.adapter.MemberSaver; @@ -16,6 +17,7 @@ import com.tiki.server.note.adapter.NoteFinder; import com.tiki.server.note.entity.Note; import com.tiki.server.team.adapter.TeamFinder; +import com.tiki.server.team.dto.response.TeamResponse; import com.tiki.server.team.entity.Team; import org.springframework.security.crypto.password.PasswordEncoder; @@ -43,6 +45,7 @@ public class MemberService { private final NoteFinder noteFinder; private final MemberTeamManagerFinder memberTeamManagerFinder; private final MemberTeamManagerDeleter memberTeamManagerDeleter; + private final AwsHandler awsHandler; @Transactional public void signUp(final MemberProfileCreateRequest request) { @@ -57,7 +60,8 @@ public BelongTeamsGetResponse findBelongTeams(final long memberId) { List memberTeamManagers = memberTeamManagerFinder.findAllByMemberIdOrderByCreatedAt( memberId); List teams = getTeams(memberTeamManagers); - return BelongTeamsGetResponse.from(teams); + List responses = getTeamResponses(teams); + return BelongTeamsGetResponse.from(responses); } public MemberInfoGetResponse getMemberInfo(final long memberId) { @@ -108,6 +112,12 @@ private List getTeams(final List memberTeamManagers) { .toList(); } + private List getTeamResponses(final List teams) { + return teams.stream() + .map(team -> TeamResponse.createWithIcon(team, awsHandler.getDownloadPreSignedUrl(team.getIconImageUrl()))) + .toList(); + } + private void checkPasswordFormat(final String password) { if (!(password != null && !password.contains(" ") && Pattern.matches(PASSWORD_PATTERN, password))) { throw new MemberException(INVALID_PASSWORD); diff --git a/src/main/java/com/tiki/server/team/dto/response/TeamGetResponse.java b/src/main/java/com/tiki/server/team/dto/response/TeamGetResponse.java index 4d6b37f3..872e063f 100644 --- a/src/main/java/com/tiki/server/team/dto/response/TeamGetResponse.java +++ b/src/main/java/com/tiki/server/team/dto/response/TeamGetResponse.java @@ -18,15 +18,15 @@ public record TeamGetResponse( @NotNull String overview, @NotNull String imageUrl ) { - public static TeamGetResponse from(final Team team) { + + public static TeamGetResponse from(final TeamResponse team) { return TeamGetResponse.builder() - .teamId(team.getId()) - .name(team.getName()) - .overview(team.getOverview()) - .category(team.getCategory()) - .univ(team.getUniv()) - .imageUrl(team.getImageUrl()) + .teamId(team.teamId()) + .name(team.name()) + .overview(team.overview()) + .category(team.category()) + .univ(team.univ()) + .imageUrl(team.imageUrl()) .build(); } - } diff --git a/src/main/java/com/tiki/server/team/dto/response/TeamResponse.java b/src/main/java/com/tiki/server/team/dto/response/TeamResponse.java new file mode 100644 index 00000000..21d960d2 --- /dev/null +++ b/src/main/java/com/tiki/server/team/dto/response/TeamResponse.java @@ -0,0 +1,46 @@ +package com.tiki.server.team.dto.response; + +import static lombok.AccessLevel.PRIVATE; + +import com.tiki.server.common.entity.University; +import com.tiki.server.team.entity.Category; +import com.tiki.server.team.entity.Team; + +import jakarta.validation.constraints.NotNull; +import lombok.Builder; + +@Builder(access = PRIVATE) +public record TeamResponse( + @NotNull long teamId, + @NotNull String name, + @NotNull Category category, + @NotNull University univ, + @NotNull String overview, + @NotNull String imageUrl, + @NotNull String iconImageUrl +) { + + public static TeamResponse createWithImage(final Team team, final String url) { + return TeamResponse.builder() + .teamId(team.getId()) + .name(team.getName()) + .overview(team.getOverview()) + .category(team.getCategory()) + .univ(team.getUniv()) + .imageUrl(url) + .iconImageUrl(null) + .build(); + } + + public static TeamResponse createWithIcon(final Team team, final String url) { + return TeamResponse.builder() + .teamId(team.getId()) + .name(team.getName()) + .overview(team.getOverview()) + .category(team.getCategory()) + .univ(team.getUniv()) + .imageUrl(null) + .iconImageUrl(url) + .build(); + } +} diff --git a/src/main/java/com/tiki/server/team/dto/response/TeamsGetResponse.java b/src/main/java/com/tiki/server/team/dto/response/TeamsGetResponse.java index b685083b..76775445 100644 --- a/src/main/java/com/tiki/server/team/dto/response/TeamsGetResponse.java +++ b/src/main/java/com/tiki/server/team/dto/response/TeamsGetResponse.java @@ -13,7 +13,7 @@ public record TeamsGetResponse( @NotNull List teams ) { - public static TeamsGetResponse from(final List teams) { + public static TeamsGetResponse from(final List teams) { return TeamsGetResponse.builder() .teams(teams.stream().map(TeamGetResponse::from).toList()) .build(); diff --git a/src/main/java/com/tiki/server/team/service/TeamService.java b/src/main/java/com/tiki/server/team/service/TeamService.java index e9244215..6c2bb3a7 100644 --- a/src/main/java/com/tiki/server/team/service/TeamService.java +++ b/src/main/java/com/tiki/server/team/service/TeamService.java @@ -3,6 +3,7 @@ import static com.tiki.server.common.entity.Position.ADMIN; import static com.tiki.server.team.message.ErrorCode.EXCEED_TEAM_NUMBER; +import com.tiki.server.team.dto.response.TeamResponse; import com.tiki.server.team.exception.TeamException; import java.util.List; @@ -83,8 +84,9 @@ public TeamCreateResponse createTeam(final long memberId, final TeamCreateReques public TeamsGetResponse getAllTeams(final long memberId) { Member member = memberFinder.findById(memberId); University univ = member.getUniv(); - List team = teamFinder.findAllByUniv(univ); - return TeamsGetResponse.from(team); + List teams = teamFinder.findAllByUniv(univ); + List responses = getTeamResponses(teams); + return TeamsGetResponse.from(responses); } public CategoriesGetResponse getCategories() { @@ -108,10 +110,6 @@ public TeamInformGetResponse getTeamInform(final long teamId) { return TeamInformGetResponse.from(teamFinder.findById(teamId)); } - private Team createTeam(final TeamCreateRequest request, final University univ) { - return Team.of(request, univ); - } - @Transactional public void updateTeamInform(final TeamInformUpdateServiceRequest request) { checkIsAdmin(request.memberId(), request.teamId()); @@ -136,6 +134,16 @@ public UsageGetResponse getCapacityInfo(final long memberId, final long teamId) return UsageGetResponse.of(capacity, usage); } + private Team createTeam(final TeamCreateRequest request, final University univ) { + return Team.of(request, univ); + } + + private List getTeamResponses(final List teams) { + return teams.stream() + .map(team -> TeamResponse.createWithImage(team, awsHandler.getDownloadPreSignedUrl(team.getImageUrl()))) + .toList(); + } + private MemberTeamManager createMemberTeamManager(final Member member, final Team team, final Position position) { return MemberTeamManager.of(member, team, position); } diff --git a/src/main/java/com/tiki/server/timeblock/service/TimeBlockService.java b/src/main/java/com/tiki/server/timeblock/service/TimeBlockService.java index 792cd482..981287c2 100644 --- a/src/main/java/com/tiki/server/timeblock/service/TimeBlockService.java +++ b/src/main/java/com/tiki/server/timeblock/service/TimeBlockService.java @@ -1,5 +1,7 @@ package com.tiki.server.timeblock.service; +import com.tiki.server.document.dto.response.DocumentResponse; +import com.tiki.server.external.util.AwsHandler; import com.tiki.server.notetimeblockmanager.adapter.NTBDeleter; import com.tiki.server.timeblock.dto.request.TimeBlockUpdateRequest; import com.tiki.server.timeblock.service.dto.response.AllTimeBlockServiceResponse; @@ -49,6 +51,7 @@ public class TimeBlockService { private final NTBFinder ntbFinder; private final NoteFinder noteFinder; private final NTBDeleter ntbDeleter; + private final AwsHandler awsHandler; @Transactional public TimeBlockCreateResponse createTimeBlock( @@ -178,7 +181,8 @@ private List getDocumentsInfo(final TimeBlock timeBlock) { private DocumentTagInfo getDocumentTagInfo(final DTBManager dtbManager) { Document document = documentFinder.findById(dtbManager.getDocumentId()); - return DocumentTagInfo.of(document, dtbManager); + DocumentResponse response = DocumentResponse.of(document, awsHandler.getDownloadPreSignedUrl(document.getFileKey())); + return DocumentTagInfo.of(response, dtbManager); } private List getNotes(final long timeBlockId) { diff --git a/src/main/java/com/tiki/server/timeblock/service/dto/DocumentTagInfo.java b/src/main/java/com/tiki/server/timeblock/service/dto/DocumentTagInfo.java index c4274edb..6a474f55 100644 --- a/src/main/java/com/tiki/server/timeblock/service/dto/DocumentTagInfo.java +++ b/src/main/java/com/tiki/server/timeblock/service/dto/DocumentTagInfo.java @@ -2,7 +2,7 @@ import static lombok.AccessLevel.PRIVATE; -import com.tiki.server.document.entity.Document; +import com.tiki.server.document.dto.response.DocumentResponse; import com.tiki.server.documenttimeblockmanager.entity.DTBManager; import jakarta.validation.constraints.NotNull; @@ -17,12 +17,12 @@ public record DocumentTagInfo( @NotNull long tagId ) { - public static DocumentTagInfo of(final Document document, final DTBManager dtbManager) { + public static DocumentTagInfo of(final DocumentResponse document, final DTBManager dtbManager) { return DocumentTagInfo.builder() - .documentId(document.getId()) - .fileName(document.getFileName()) - .fileUrl(document.getFileUrl()) - .capacity(document.getCapacity()) + .documentId(document.documentId()) + .fileName(document.name()) + .fileUrl(document.url()) + .capacity(document.capacity()) .tagId(dtbManager.getId()) .build(); }