diff --git a/src/main/java/com/tiki/server/document/dto/request/DocumentCreateRequest.java b/src/main/java/com/tiki/server/document/dto/request/DocumentCreateRequest.java index 53a7f24a..2fec66dc 100644 --- a/src/main/java/com/tiki/server/document/dto/request/DocumentCreateRequest.java +++ b/src/main/java/com/tiki/server/document/dto/request/DocumentCreateRequest.java @@ -6,8 +6,6 @@ public record DocumentCreateRequest( @Schema(description = "파일 이름", example = "tiki.jpg") @NotNull String fileName, - @Schema(description = "파일 url", example = "https://.../tiki.jpg") - @NotNull String fileUrl, @Schema(description = "파일 key", example = "....jpg") @NotNull String fileKey, @Schema(description = "파일 용량 (단위 : byte)", example = "123") diff --git a/src/main/java/com/tiki/server/document/entity/DeletedDocument.java b/src/main/java/com/tiki/server/document/entity/DeletedDocument.java index d50d5a38..e7e56e4b 100644 --- a/src/main/java/com/tiki/server/document/entity/DeletedDocument.java +++ b/src/main/java/com/tiki/server/document/entity/DeletedDocument.java @@ -30,9 +30,6 @@ public class DeletedDocument extends BaseTime { @Column(nullable = false) private String fileName; - @Column(nullable = false) - private String fileUrl; - @Column(nullable = false) private String fileKey; @@ -45,7 +42,6 @@ public class DeletedDocument extends BaseTime { public static DeletedDocument of(final Document document) { return DeletedDocument.builder() .fileName(document.getFileName()) - .fileUrl(document.getFileUrl()) .fileKey(document.getFileKey()) .teamId(document.getTeamId()) .capacity(document.getCapacity()) diff --git a/src/main/java/com/tiki/server/document/entity/Document.java b/src/main/java/com/tiki/server/document/entity/Document.java index dd5389f8..07ff732b 100644 --- a/src/main/java/com/tiki/server/document/entity/Document.java +++ b/src/main/java/com/tiki/server/document/entity/Document.java @@ -31,9 +31,6 @@ public class Document extends BaseTime { @Column(nullable = false) private String fileName; - @Column(nullable = false) - private String fileUrl; - @Column(nullable = false) private String fileKey; @@ -48,7 +45,6 @@ public class Document extends BaseTime { public static Document of(final DocumentCreateRequest request, final long teamId, final Long folderId) { return Document.builder() .fileName(request.fileName()) - .fileUrl(request.fileUrl()) .capacity(request.capacity()) .fileKey(request.fileKey()) .teamId(teamId) @@ -59,7 +55,6 @@ public static Document of(final DocumentCreateRequest request, final long teamId public static Document restore(final DeletedDocument deletedDocument) { return Document.builder() .fileName(deletedDocument.getFileName()) - .fileUrl(deletedDocument.getFileUrl()) .capacity(deletedDocument.getCapacity()) .fileKey(deletedDocument.getFileKey()) .teamId(deletedDocument.getTeamId()) diff --git a/src/main/java/com/tiki/server/document/service/dto/response/DocumentTagGetServiceResponse.java b/src/main/java/com/tiki/server/document/service/dto/response/DocumentTagGetServiceResponse.java index bbbe4332..caa7e3bb 100644 --- a/src/main/java/com/tiki/server/document/service/dto/response/DocumentTagGetServiceResponse.java +++ b/src/main/java/com/tiki/server/document/service/dto/response/DocumentTagGetServiceResponse.java @@ -1,6 +1,6 @@ package com.tiki.server.document.service.dto.response; -import com.tiki.server.document.entity.Document; +import com.tiki.server.document.dto.response.DocumentResponse; import jakarta.validation.constraints.NotNull; @@ -11,11 +11,11 @@ public record DocumentTagGetServiceResponse( @NotNull long capacity ) { - public static DocumentTagGetServiceResponse from(final Document document) { + public static DocumentTagGetServiceResponse from(final DocumentResponse document) { return new DocumentTagGetServiceResponse( - document.getId(), - document.getFileName(), - document.getFileUrl(), - document.getCapacity()); + document.documentId(), + document.name(), + document.url(), + document.capacity()); } } \ No newline at end of file diff --git a/src/main/java/com/tiki/server/email/teaminvitation/service/TeamInvitationService.java b/src/main/java/com/tiki/server/email/teaminvitation/service/TeamInvitationService.java index 6226eb27..0594e10b 100644 --- a/src/main/java/com/tiki/server/email/teaminvitation/service/TeamInvitationService.java +++ b/src/main/java/com/tiki/server/email/teaminvitation/service/TeamInvitationService.java @@ -7,12 +7,14 @@ import com.tiki.server.email.teaminvitation.entity.TeamInvitation; import com.tiki.server.email.teaminvitation.service.dto.TeamInvitationEmailsGetResponse; import com.tiki.server.email.teaminvitation.service.dto.TeamInvitationInformGetResponse; +import com.tiki.server.external.util.AwsHandler; import com.tiki.server.member.adapter.MemberFinder; import com.tiki.server.member.entity.Member; import com.tiki.server.memberteammanager.adapter.MemberTeamManagerFinder; import com.tiki.server.memberteammanager.adapter.MemberTeamManagerSaver; import com.tiki.server.memberteammanager.entity.MemberTeamManager; import com.tiki.server.team.adapter.TeamFinder; +import com.tiki.server.team.dto.response.TeamResponse; import com.tiki.server.team.entity.Team; import com.tiki.server.team.exception.TeamException; import lombok.RequiredArgsConstructor; @@ -35,11 +37,13 @@ public class TeamInvitationService { private final MemberTeamManagerSaver memberTeamManagerSaver; private final TeamFinder teamFinder; private final MemberFinder memberFinder; + private final AwsHandler awsHandler; public TeamInvitationInformGetResponse getInvitationInform(final long invitationId) { TeamInvitation invitation = teamInvitationFinder.findByInvitationId(invitationId); Team team = teamFinder.findById(invitation.getTeamId()); - return TeamInvitationInformGetResponse.of(invitation, team); + TeamResponse response = TeamResponse.createWithIcon(team, awsHandler.getDownloadPreSignedUrl(team.getIconImageKey())); + return TeamInvitationInformGetResponse.of(invitation, response); } @Transactional diff --git a/src/main/java/com/tiki/server/email/teaminvitation/service/dto/TeamInvitationInformGetResponse.java b/src/main/java/com/tiki/server/email/teaminvitation/service/dto/TeamInvitationInformGetResponse.java index efb38bc3..497da7de 100644 --- a/src/main/java/com/tiki/server/email/teaminvitation/service/dto/TeamInvitationInformGetResponse.java +++ b/src/main/java/com/tiki/server/email/teaminvitation/service/dto/TeamInvitationInformGetResponse.java @@ -1,7 +1,7 @@ package com.tiki.server.email.teaminvitation.service.dto; import com.tiki.server.email.teaminvitation.entity.TeamInvitation; -import com.tiki.server.team.entity.Team; +import com.tiki.server.team.dto.response.TeamResponse; import jakarta.validation.constraints.NotNull; public record TeamInvitationInformGetResponse( @@ -13,13 +13,13 @@ public record TeamInvitationInformGetResponse( public static TeamInvitationInformGetResponse of( final TeamInvitation invitation, - final Team team + final TeamResponse team ) { return new TeamInvitationInformGetResponse( invitation.getSender(), - team.getName(), - team.getIconImageUrl(), - team.getId() + team.name(), + team.iconImageUrl(), + team.teamId() ); } } 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 f2293a30..78281252 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.PutObjectPreSignedUrlResponse; +import com.tiki.server.external.dto.response.PreSignedUrlResponse; 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) { - PutObjectPreSignedUrlResponse response = fileHandlerService.getUploadPreSignedUrl(fileFormat); + PreSignedUrlResponse 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 20da8e8a..c6c1e387 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.PutObjectPreSignedUrlResponse; +import com.tiki.server.external.dto.response.PreSignedUrlResponse; 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/PutObjectPreSignedUrlResponse.java b/src/main/java/com/tiki/server/external/dto/response/PreSignedUrlResponse.java similarity index 51% rename from src/main/java/com/tiki/server/external/dto/response/PutObjectPreSignedUrlResponse.java rename to src/main/java/com/tiki/server/external/dto/response/PreSignedUrlResponse.java index 4ce4abde..db82b2b2 100644 --- a/src/main/java/com/tiki/server/external/dto/response/PutObjectPreSignedUrlResponse.java +++ b/src/main/java/com/tiki/server/external/dto/response/PreSignedUrlResponse.java @@ -6,14 +6,14 @@ import lombok.Builder; @Builder(access = PRIVATE) -public record PutObjectPreSignedUrlResponse( - @NotNull String fileName, +public record PreSignedUrlResponse( + @NotNull String fileKey, @NotNull String url ) { - public static PutObjectPreSignedUrlResponse of(final String fileName, final String url) { - return PutObjectPreSignedUrlResponse.builder() - .fileName(fileName) + public static PreSignedUrlResponse of(final String fileKey, final String url) { + return PreSignedUrlResponse.builder() + .fileKey(fileKey) .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 f93abd31..ab227dbc 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.PutObjectPreSignedUrlResponse; +import com.tiki.server.external.dto.response.PreSignedUrlResponse; 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 PutObjectPreSignedUrlResponse getUploadPreSignedUrl(final String fileFormat) { + public PreSignedUrlResponse 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 200bdcb4..3a6f1c67 100644 --- a/src/main/java/com/tiki/server/external/util/AwsHandler.java +++ b/src/main/java/com/tiki/server/external/util/AwsHandler.java @@ -12,7 +12,7 @@ import org.springframework.stereotype.Component; import com.tiki.server.external.config.AWSConfig; -import com.tiki.server.external.dto.response.PutObjectPreSignedUrlResponse; +import com.tiki.server.external.dto.response.PreSignedUrlResponse; import com.tiki.server.external.exception.ExternalException; import lombok.RequiredArgsConstructor; @@ -33,15 +33,14 @@ public class AwsHandler { @Value("${aws-property.bucket}") private String bucket; - public PutObjectPreSignedUrlResponse getUploadPreSignedUrl(final String fileFormat) { + public PreSignedUrlResponse getUploadPreSignedUrl(final String fileFormat) { try { - String fileName = generateFileName(fileFormat); - String key = FILE_SAVE_PREFIX + fileName; + String key = generateFileKey(fileFormat); S3Presigner preSigner = awsConfig.getS3PreSigner(); PutObjectRequest putObjectRequest = createPutObjectRequest(key); PutObjectPresignRequest putObjectPresignRequest = createPutObjectPresignRequest(putObjectRequest); String url = preSigner.presignPutObject(putObjectPresignRequest).url().toString(); - return PutObjectPreSignedUrlResponse.of(fileName, url); + return PreSignedUrlResponse.of(key, url); } catch (RuntimeException e) { throw new ExternalException(PRESIGNED_URL_GET_ERROR); } @@ -99,7 +98,7 @@ private GetObjectPresignRequest createGetObjectPresignRequest(final GetObjectReq .build(); } - private String generateFileName(final String fileFormat) { - return UUID.randomUUID() + FILE_DELIMITER + fileFormat; + private String generateFileKey(final String fileFormat) { + return FILE_SAVE_PREFIX + UUID.randomUUID() + FILE_DELIMITER + fileFormat; } } 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 17f10de2..9bced052 100644 --- a/src/main/java/com/tiki/server/member/service/MemberService.java +++ b/src/main/java/com/tiki/server/member/service/MemberService.java @@ -113,7 +113,7 @@ private List getTeams(final List memberTeamManagers) { private List getTeamResponses(final List teams) { return teams.stream() - .map(team -> TeamResponse.createWithIcon(team, awsHandler.getDownloadPreSignedUrl(team.getIconImageUrl()))) + .map(team -> TeamResponse.createWithIcon(team, awsHandler.getDownloadPreSignedUrl(team.getIconImageKey()))) .toList(); } diff --git a/src/main/java/com/tiki/server/note/constants/NoteConstants.java b/src/main/java/com/tiki/server/note/constants/NoteConstants.java index 0b199f08..c0fc22e3 100644 --- a/src/main/java/com/tiki/server/note/constants/NoteConstants.java +++ b/src/main/java/com/tiki/server/note/constants/NoteConstants.java @@ -3,4 +3,5 @@ public class NoteConstants { public static final int PAGE_SIZE = 10; + public static final String UNKNOWN = "알 수 없음"; } diff --git a/src/main/java/com/tiki/server/note/service/NoteService.java b/src/main/java/com/tiki/server/note/service/NoteService.java index 8b5c46ce..8829150b 100644 --- a/src/main/java/com/tiki/server/note/service/NoteService.java +++ b/src/main/java/com/tiki/server/note/service/NoteService.java @@ -3,7 +3,9 @@ import com.tiki.server.common.entity.SortOrder; import com.tiki.server.common.util.ContentEncoder; 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.external.util.AwsHandler; import com.tiki.server.memberteammanager.adapter.MemberTeamManagerFinder; import com.tiki.server.note.adapter.NoteDeleter; import com.tiki.server.note.adapter.NoteFinder; @@ -35,6 +37,7 @@ import static com.tiki.server.common.constants.Constants.INIT_NUM; import static com.tiki.server.note.constants.NoteConstants.PAGE_SIZE; +import static com.tiki.server.note.constants.NoteConstants.UNKNOWN; @Service @RequiredArgsConstructor @@ -52,6 +55,7 @@ public class NoteService { private final NDDeleter ndDeleter; private final TimeBlockFinder timeBlockFinder; private final DocumentFinder documentFinder; + private final AwsHandler awsHandler; @Transactional public NoteCreateServiceResponse createNoteFree(final NoteFreeCreateServiceRequest request) { @@ -137,8 +141,8 @@ public NoteListGetServiceResponse getNote( ) { memberTeamManagerFinder.findByMemberIdAndTeamId(memberId, teamId); PageRequest pageable = PageRequest.of(INIT_NUM, PAGE_SIZE); - List noteList = getNotes(createdAt, sortOrder, pageable, teamId); - List noteGetResponses = noteList.stream() + List notes = getNotes(createdAt, sortOrder, pageable, teamId); + List noteGetResponses = notes.stream() .map(note -> NoteGetResponse.of(note, getMemberName(note.getMemberId(), teamId))) .toList(); return new NoteListGetServiceResponse(noteGetResponses); @@ -147,30 +151,29 @@ public NoteListGetServiceResponse getNote( public NoteDetailGetServiceResponse getNoteDetail(final long teamId, final long memberId, final long noteId) { memberTeamManagerFinder.findByMemberIdAndTeamId(memberId, teamId); Note note = noteFinder.findById(noteId); - List documentList = getDocumentListMappedByNote(noteId); - List timeBlockList = getTimeBlocksMappedByNote(noteId); + List documents = getDocumentsMappedByNote(noteId); + List responses = documents.stream() + .map(document -> DocumentResponse.of(document, awsHandler.getDownloadPreSignedUrl(document.getFileKey()))) + .toList(); + List timeBlocks = getTimeBlocksMappedByNote(noteId); String memberName = getMemberName(note.getMemberId(), teamId); return note.getNoteType() == NoteType.FREE - ? NoteFreeDetailGetServiceResponse.of(note, memberName, documentList, timeBlockList) - : NoteTemplateDetailGetServiceResponse.of(note, memberName, documentList, timeBlockList); + ? NoteFreeDetailGetServiceResponse.of(note, memberName, responses, timeBlocks) + : NoteTemplateDetailGetServiceResponse.of(note, memberName, responses, timeBlocks); } private String getMemberName(final Long noteMemberId, final long teamId) { return Optional.ofNullable(noteMemberId) .map(id -> memberTeamManagerFinder.findByMemberIdAndTeamId(id, teamId).getName()) - .orElse("알 수 없음"); + .orElse(UNKNOWN); } private void updateNoteDocumentManager(final List documentIds, final long noteId) { List existingNoteDocumentIds = ndFinder.findAllByNoteId(noteId).stream() .map(NDManager::getDocumentId) .toList(); - List idsToAdd = documentIds.stream() - .filter(id -> !existingNoteDocumentIds.contains(id)) - .toList(); - List idsToRemove = existingNoteDocumentIds.stream() - .filter(id -> !documentIds.contains(id)) - .toList(); + List idsToAdd = getIdsToAdd(documentIds, existingNoteDocumentIds); + List idsToRemove = getIdsToRemove(documentIds, existingNoteDocumentIds); createNoteDocumentManagers(idsToAdd, noteId); ndDeleter.deleteByNoteIdAndDocumentId(noteId, idsToRemove); } @@ -179,16 +182,24 @@ private void updateNoteTimeBlockManager(final List timeBlockIds, final lon List existingNoteTimeBlockIds = ntbFinder.findAllByNoteId(noteId).stream() .map(NTBManager::getTimeBlockId) .toList(); - List idsToAdd = timeBlockIds.stream() - .filter(id -> !existingNoteTimeBlockIds.contains(id)) - .toList(); - List idsToRemove = existingNoteTimeBlockIds.stream() - .filter(id -> !timeBlockIds.contains(id)) - .toList(); + List idsToAdd = getIdsToAdd(timeBlockIds, existingNoteTimeBlockIds); + List idsToRemove = getIdsToRemove(timeBlockIds, existingNoteTimeBlockIds); createNoteTimeBlockManagers(idsToAdd, noteId); ntbDeleter.deleteByNoteIdAndTimeBlockId(noteId, idsToRemove); } + private List getIdsToAdd(final List ids, final List managerIds) { + return ids.stream() + .filter(id -> !managerIds.contains(id)) + .toList(); + } + + private List getIdsToRemove(final List ids, final List managerIds) { + return managerIds.stream() + .filter(id -> !ids.contains(id)) + .toList(); + } + private List getNotes(final LocalDateTime createdAt, final SortOrder sortOrder, final PageRequest pageable, final long teamId) { if (sortOrder == SortOrder.DESC) { @@ -198,19 +209,19 @@ private List getNotes(final LocalDateTime createdAt, final SortOrder sortO } private List getTimeBlocksMappedByNote(final long noteId) { - List timblockIdList = ntbFinder.findAllByNoteId(noteId).stream() + List timeBlockIds = ntbFinder.findAllByNoteId(noteId).stream() .map(NTBManager::getTimeBlockId) .toList(); - return timblockIdList.stream() + return timeBlockIds.stream() .map(timeBlockFinder::findById) .toList(); } - private List getDocumentListMappedByNote(final long noteId) { - List documentIdList = ndFinder.findAllByNoteId(noteId).stream() + private List getDocumentsMappedByNote(final long noteId) { + List documentIds = ndFinder.findAllByNoteId(noteId).stream() .map(NDManager::getDocumentId) .toList(); - return documentIdList.stream() + return documentIds.stream() .map(documentFinder::findById) .toList(); } diff --git a/src/main/java/com/tiki/server/note/service/dto/response/NoteFreeDetailGetServiceResponse.java b/src/main/java/com/tiki/server/note/service/dto/response/NoteFreeDetailGetServiceResponse.java index 2266832f..b564b3e8 100644 --- a/src/main/java/com/tiki/server/note/service/dto/response/NoteFreeDetailGetServiceResponse.java +++ b/src/main/java/com/tiki/server/note/service/dto/response/NoteFreeDetailGetServiceResponse.java @@ -1,6 +1,7 @@ package com.tiki.server.note.service.dto.response; import com.tiki.server.common.util.ContentDecoder; +import com.tiki.server.document.dto.response.DocumentResponse; import com.tiki.server.document.entity.Document; import com.tiki.server.document.service.dto.response.DocumentTagGetServiceResponse; import com.tiki.server.note.entity.Note; @@ -29,8 +30,8 @@ public record NoteFreeDetailGetServiceResponse( public static NoteFreeDetailGetServiceResponse of( final Note note, final String author, - final List documentList, - final List timeBlockList + final List documents, + final List timeBlocks ) { return new NoteFreeDetailGetServiceResponse( note.getId(), @@ -41,8 +42,8 @@ public static NoteFreeDetailGetServiceResponse of( note.getEndDate(), note.isComplete(), ContentDecoder.decodeNoteFree(note.getContents()), - documentList.stream().map(DocumentTagGetServiceResponse::from).toList(), - timeBlockList.stream().map(TimeBlockTagServiceResponse::from).toList() + documents.stream().map(DocumentTagGetServiceResponse::from).toList(), + timeBlocks.stream().map(TimeBlockTagServiceResponse::from).toList() ); } } diff --git a/src/main/java/com/tiki/server/note/service/dto/response/NoteTemplateDetailGetServiceResponse.java b/src/main/java/com/tiki/server/note/service/dto/response/NoteTemplateDetailGetServiceResponse.java index 7f252024..cffd0f1a 100644 --- a/src/main/java/com/tiki/server/note/service/dto/response/NoteTemplateDetailGetServiceResponse.java +++ b/src/main/java/com/tiki/server/note/service/dto/response/NoteTemplateDetailGetServiceResponse.java @@ -1,6 +1,7 @@ package com.tiki.server.note.service.dto.response; import com.tiki.server.common.util.ContentDecoder; +import com.tiki.server.document.dto.response.DocumentResponse; import com.tiki.server.document.entity.Document; import com.tiki.server.document.service.dto.response.DocumentTagGetServiceResponse; import com.tiki.server.note.entity.Note; @@ -32,8 +33,8 @@ public record NoteTemplateDetailGetServiceResponse( public static NoteTemplateDetailGetServiceResponse of( final Note note, final String author, - final List documentList, - final List timeBlockList + final List documents, + final List timeBlocks ) { List contents = ContentDecoder.decodeNoteTemplate(note.getContents()); return new NoteTemplateDetailGetServiceResponse( @@ -48,8 +49,8 @@ public static NoteTemplateDetailGetServiceResponse of( contents.get(1), contents.get(2), contents.get(3), - documentList.stream().map(DocumentTagGetServiceResponse::from).toList(), - timeBlockList.stream().map(TimeBlockTagServiceResponse::from).toList() + documents.stream().map(DocumentTagGetServiceResponse::from).toList(), + timeBlocks.stream().map(TimeBlockTagServiceResponse::from).toList() ); } } diff --git a/src/main/java/com/tiki/server/team/constants/TeamConstants.java b/src/main/java/com/tiki/server/team/constants/TeamConstants.java new file mode 100644 index 00000000..bd1a440c --- /dev/null +++ b/src/main/java/com/tiki/server/team/constants/TeamConstants.java @@ -0,0 +1,6 @@ +package com.tiki.server.team.constants; + +public class TeamConstants { + + public static final int MAX_TEAM_NUMBER = 8; +} diff --git a/src/main/java/com/tiki/server/team/controller/TeamController.java b/src/main/java/com/tiki/server/team/controller/TeamController.java index f163f0a9..d28fcbe6 100644 --- a/src/main/java/com/tiki/server/team/controller/TeamController.java +++ b/src/main/java/com/tiki/server/team/controller/TeamController.java @@ -17,7 +17,9 @@ import com.tiki.server.team.dto.response.TeamsGetResponse; import org.springframework.http.HttpStatus; -import com.tiki.server.team.service.dto.response.TeamInformGetResponse; + +import com.tiki.server.team.dto.response.TeamInformGetResponse; + import org.springframework.web.bind.annotation.*; import com.tiki.server.common.dto.SuccessResponse; @@ -33,93 +35,93 @@ @RequestMapping("api/v1/teams") public class TeamController implements TeamControllerDocs { - private final TeamService teamService; - - @Override - @ResponseStatus(HttpStatus.CREATED) - @PostMapping - public SuccessResponse createTeam( - final Principal principal, - @RequestBody final TeamCreateRequest request - ) { - long memberId = Long.parseLong(principal.getName()); - TeamCreateResponse response = teamService.createTeam(memberId, request); - return SuccessResponse.success(SUCCESS_CREATE_TEAM.getMessage(), response); - } - - @Override - @ResponseStatus(HttpStatus.OK) - @GetMapping - public SuccessResponse getAllTeams(final Principal principal) { - long memberId = Long.parseLong(principal.getName()); - TeamsGetResponse response = teamService.getAllTeams(memberId); - return SuccessResponse.success(SUCCESS_GET_TEAMS.getMessage(), response); - } - - @Override - @ResponseStatus(HttpStatus.OK) - @GetMapping("/{teamId}/inform") - public SuccessResponse getTeamName( - @PathVariable final long teamId - ) { - TeamInformGetResponse response = teamService.getTeamInform(teamId); - return SuccessResponse.success(SUCCESS_GET_TEAM_INFORM.getMessage(), response); - } - - @Override - @ResponseStatus(HttpStatus.OK) - @GetMapping("/category") - public SuccessResponse getCategories() { - CategoriesGetResponse response = teamService.getCategories(); - return SuccessResponse.success(SUCCESS_GET_CATEGORIES.getMessage(), response); - } - - @Override - @ResponseStatus(HttpStatus.NO_CONTENT) - @DeleteMapping("/{teamId}") - public void deleteTeam( - final Principal principal, - @PathVariable final long teamId - ) { - long memberId = Long.parseLong(principal.getName()); - teamService.deleteTeam(memberId, teamId); - } - - @Override - @ResponseStatus(HttpStatus.OK) - @PatchMapping("/{teamId}/inform") - public SuccessResponse updateTeamInform( - final Principal principal, - @PathVariable final long teamId, - @RequestBody final TeamInformUpdateRequest request - ) { - long memberId = Long.parseLong(principal.getName()); - teamService.updateTeamInform(TeamInformUpdateServiceRequest.from(request,memberId,teamId)); - return SuccessResponse.success(SUCCESS_UPDATE_TEAM_NAME.getMessage()); - } - - @Override - @ResponseStatus(HttpStatus.OK) - @PatchMapping("/{teamId}/member/{targetId}/admin") - public SuccessResponse alterAdmin( - final Principal principal, - @PathVariable final long teamId, - @PathVariable final long targetId - ) { - long memberId = Long.parseLong(principal.getName()); - teamService.alterAdmin(memberId, teamId, targetId); - return SuccessResponse.success(SUCCESS_ALTER_AUTHORITY.getMessage()); - } - - @Override - @ResponseStatus(HttpStatus.OK) - @GetMapping("/{teamId}/capacity") - public SuccessResponse getCapacityInfo( - final Principal principal, - @PathVariable final long teamId - ) { - long memberId = Long.parseLong(principal.getName()); - UsageGetResponse response = teamService.getCapacityInfo(memberId, teamId); - return SuccessResponse.success(SUCCESS_GET_CAPACITY_INFO.getMessage(), response); - } + private final TeamService teamService; + + @Override + @ResponseStatus(HttpStatus.CREATED) + @PostMapping + public SuccessResponse createTeam( + final Principal principal, + @RequestBody final TeamCreateRequest request + ) { + long memberId = Long.parseLong(principal.getName()); + TeamCreateResponse response = teamService.createTeam(memberId, request); + return SuccessResponse.success(SUCCESS_CREATE_TEAM.getMessage(), response); + } + + @Override + @ResponseStatus(HttpStatus.OK) + @GetMapping + public SuccessResponse getAllTeams(final Principal principal) { + long memberId = Long.parseLong(principal.getName()); + TeamsGetResponse response = teamService.getAllTeams(memberId); + return SuccessResponse.success(SUCCESS_GET_TEAMS.getMessage(), response); + } + + @Override + @ResponseStatus(HttpStatus.OK) + @GetMapping("/{teamId}/inform") + public SuccessResponse getTeamName( + @PathVariable final long teamId + ) { + TeamInformGetResponse response = teamService.getTeamInform(teamId); + return SuccessResponse.success(SUCCESS_GET_TEAM_INFORM.getMessage(), response); + } + + @Override + @ResponseStatus(HttpStatus.OK) + @GetMapping("/category") + public SuccessResponse getCategories() { + CategoriesGetResponse response = teamService.getCategories(); + return SuccessResponse.success(SUCCESS_GET_CATEGORIES.getMessage(), response); + } + + @Override + @ResponseStatus(HttpStatus.NO_CONTENT) + @DeleteMapping("/{teamId}") + public void deleteTeam( + final Principal principal, + @PathVariable final long teamId + ) { + long memberId = Long.parseLong(principal.getName()); + teamService.deleteTeam(memberId, teamId); + } + + @Override + @ResponseStatus(HttpStatus.OK) + @PatchMapping("/{teamId}/inform") + public SuccessResponse updateTeamInform( + final Principal principal, + @PathVariable final long teamId, + @RequestBody final TeamInformUpdateRequest request + ) { + long memberId = Long.parseLong(principal.getName()); + teamService.updateTeamInform(TeamInformUpdateServiceRequest.of(request, memberId, teamId)); + return SuccessResponse.success(SUCCESS_UPDATE_TEAM_NAME.getMessage()); + } + + @Override + @ResponseStatus(HttpStatus.OK) + @PatchMapping("/{teamId}/member/{targetId}/admin") + public SuccessResponse alterAdmin( + final Principal principal, + @PathVariable final long teamId, + @PathVariable final long targetId + ) { + long memberId = Long.parseLong(principal.getName()); + teamService.alterAdmin(memberId, teamId, targetId); + return SuccessResponse.success(SUCCESS_ALTER_AUTHORITY.getMessage()); + } + + @Override + @ResponseStatus(HttpStatus.OK) + @GetMapping("/{teamId}/capacity") + public SuccessResponse getCapacityInfo( + final Principal principal, + @PathVariable final long teamId + ) { + long memberId = Long.parseLong(principal.getName()); + UsageGetResponse response = teamService.getCapacityInfo(memberId, teamId); + return SuccessResponse.success(SUCCESS_GET_CAPACITY_INFO.getMessage(), response); + } } diff --git a/src/main/java/com/tiki/server/team/controller/docs/TeamControllerDocs.java b/src/main/java/com/tiki/server/team/controller/docs/TeamControllerDocs.java index 6fd42d92..58a786e3 100644 --- a/src/main/java/com/tiki/server/team/controller/docs/TeamControllerDocs.java +++ b/src/main/java/com/tiki/server/team/controller/docs/TeamControllerDocs.java @@ -3,16 +3,14 @@ import java.security.Principal; import com.tiki.server.team.dto.request.TeamInformUpdateRequest; -import com.tiki.server.team.dto.request.TeamInformUpdateServiceRequest; import com.tiki.server.team.dto.response.UsageGetResponse; import com.tiki.server.team.dto.response.CategoriesGetResponse; import com.tiki.server.team.dto.response.TeamsGetResponse; -import com.tiki.server.team.service.dto.response.TeamInformGetResponse; +import com.tiki.server.team.dto.response.TeamInformGetResponse; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestBody; -import com.tiki.server.common.dto.ErrorResponse; import com.tiki.server.common.dto.SuccessResponse; import com.tiki.server.team.dto.request.TeamCreateRequest; import com.tiki.server.team.dto.response.TeamCreateResponse; @@ -20,8 +18,6 @@ import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.enums.ParameterIn; -import io.swagger.v3.oas.annotations.media.Content; -import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.tags.Tag; diff --git a/src/main/java/com/tiki/server/team/dto/request/TeamCreateRequest.java b/src/main/java/com/tiki/server/team/dto/request/TeamCreateRequest.java index ec6ab45d..fda5527f 100644 --- a/src/main/java/com/tiki/server/team/dto/request/TeamCreateRequest.java +++ b/src/main/java/com/tiki/server/team/dto/request/TeamCreateRequest.java @@ -8,13 +8,13 @@ public record TeamCreateRequest( @NotNull String name, @NotNull Category category, - @NotNull String iconImageUrl + @NotNull String iconImageKey ) { - public TeamCreateRequest(final String name, final Category category, final String iconImageUrl) { + public TeamCreateRequest(final String name, final Category category, final String iconImageKey) { Validator.validText(name); Validator.validateLength(name, 30); this.name = name; this.category = category; - this.iconImageUrl = iconImageUrl; + this.iconImageKey = iconImageKey; } } diff --git a/src/main/java/com/tiki/server/team/dto/request/TeamInformUpdateServiceRequest.java b/src/main/java/com/tiki/server/team/dto/request/TeamInformUpdateServiceRequest.java index dea104ca..4c8d3154 100644 --- a/src/main/java/com/tiki/server/team/dto/request/TeamInformUpdateServiceRequest.java +++ b/src/main/java/com/tiki/server/team/dto/request/TeamInformUpdateServiceRequest.java @@ -8,7 +8,11 @@ public record TeamInformUpdateServiceRequest( @NotNull String teamName, @NotNull String teamIconUrl ) { - public static TeamInformUpdateServiceRequest from(final TeamInformUpdateRequest request, final long memberId, final long teamId) { + public static TeamInformUpdateServiceRequest of( + final TeamInformUpdateRequest request, + final long memberId, + final long teamId + ) { return new TeamInformUpdateServiceRequest( memberId, teamId, diff --git a/src/main/java/com/tiki/server/team/dto/response/TeamInformGetResponse.java b/src/main/java/com/tiki/server/team/dto/response/TeamInformGetResponse.java new file mode 100644 index 00000000..6584761c --- /dev/null +++ b/src/main/java/com/tiki/server/team/dto/response/TeamInformGetResponse.java @@ -0,0 +1,29 @@ +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.Team; + +import jakarta.validation.constraints.NotNull; +import lombok.Builder; + +import java.time.LocalDate; + +@Builder(access = PRIVATE) +public record TeamInformGetResponse( + @NotNull String name, + @NotNull University university, + @NotNull String iconImageUrl, + @NotNull LocalDate namingUpdatedAt +) { + + public static TeamInformGetResponse of(final Team team, final String iconImageUrl) { + return TeamInformGetResponse.builder() + .name(team.getName()) + .university(team.getUniv()) + .iconImageUrl(iconImageUrl) + .namingUpdatedAt(team.getNamingUpdatedAt()) + .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 76775445..1deaf6bf 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 @@ -1,7 +1,5 @@ package com.tiki.server.team.dto.response; -import com.tiki.server.team.entity.Team; - import jakarta.validation.constraints.NotNull; import lombok.Builder; diff --git a/src/main/java/com/tiki/server/team/entity/Team.java b/src/main/java/com/tiki/server/team/entity/Team.java index 89733e5a..e5424f3e 100644 --- a/src/main/java/com/tiki/server/team/entity/Team.java +++ b/src/main/java/com/tiki/server/team/entity/Team.java @@ -61,9 +61,9 @@ public class Team extends BaseTime { @Column(nullable = false) private long usage; - private String imageUrl; + private String imageKey; - private String iconImageUrl; + private String iconImageKey; private LocalDate namingUpdatedAt; @@ -75,17 +75,17 @@ public static Team of(final TeamCreateRequest request, final University univ) { .univ(univ) .subscribe(BASIC) .usage(INIT_NUM) - .iconImageUrl(request.iconImageUrl()) + .iconImageKey(request.iconImageKey()) .namingUpdatedAt(LocalDate.now()) .build(); } - public void updateInform(final String name, final String iconImageUrl) { + public void updateInform(final String name, final String iconImageKey) { if (!name.equals(this.name)) { updateTeamName(name); } - if(!iconImageUrl.equals(this.iconImageUrl)){ - updateIconImageUrl(iconImageUrl); + if(!iconImageKey.equals(this.iconImageKey)){ + updateIconImageKey(iconImageKey); } } @@ -97,16 +97,16 @@ private void updateTeamName(final String name) { this.namingUpdatedAt = LocalDate.now(); } - public void updateIconImageUrl(final String url) { - this.iconImageUrl = url; + public void updateIconImageKey(final String key) { + this.iconImageKey = key; } public boolean isDefaultImage() { - return this.iconImageUrl.isBlank(); + return this.iconImageKey.isBlank(); } - public boolean isSameIconUrl(final String iconImageUrl) { - return this.iconImageUrl.equals(iconImageUrl); + public boolean isSameIconImageKey(final String iconImageKey) { + return this.iconImageKey.equals(iconImageKey); } public void addUsage(final long capacity) { 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 6c2bb3a7..6c75abfc 100644 --- a/src/main/java/com/tiki/server/team/service/TeamService.java +++ b/src/main/java/com/tiki/server/team/service/TeamService.java @@ -1,6 +1,7 @@ package com.tiki.server.team.service; import static com.tiki.server.common.entity.Position.ADMIN; +import static com.tiki.server.team.constants.TeamConstants.MAX_TEAM_NUMBER; import static com.tiki.server.team.message.ErrorCode.EXCEED_TEAM_NUMBER; import com.tiki.server.team.dto.response.TeamResponse; @@ -27,7 +28,7 @@ import com.tiki.server.team.dto.response.TeamsGetResponse; import com.tiki.server.team.dto.response.UsageGetResponse; -import com.tiki.server.team.service.dto.response.TeamInformGetResponse; +import com.tiki.server.team.dto.response.TeamInformGetResponse; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -107,7 +108,9 @@ public void deleteTeam(final long memberId, final long teamId) { } public TeamInformGetResponse getTeamInform(final long teamId) { - return TeamInformGetResponse.from(teamFinder.findById(teamId)); + Team team = teamFinder.findById(teamId); + String iconImageUrl = awsHandler.getDownloadPreSignedUrl(team.getIconImageKey()); + return TeamInformGetResponse.of(team, iconImageUrl); } @Transactional @@ -115,7 +118,7 @@ public void updateTeamInform(final TeamInformUpdateServiceRequest request) { checkIsAdmin(request.memberId(), request.teamId()); Team team = teamFinder.findById(request.teamId()); team.updateInform(request.teamName(), request.teamIconUrl()); - updateIconUrlS3(team, request.teamIconUrl()); + updateIconImageKey(team, request.teamIconUrl()); } @Transactional @@ -140,7 +143,7 @@ private Team createTeam(final TeamCreateRequest request, final University univ) private List getTeamResponses(final List teams) { return teams.stream() - .map(team -> TeamResponse.createWithImage(team, awsHandler.getDownloadPreSignedUrl(team.getImageUrl()))) + .map(team -> TeamResponse.createWithImage(team, awsHandler.getDownloadPreSignedUrl(team.getImageKey()))) .toList(); } @@ -148,9 +151,9 @@ private MemberTeamManager createMemberTeamManager(final Member member, final Tea return MemberTeamManager.of(member, team, position); } - private void updateIconUrlS3(final Team team, final String iconUrl) { - if (!team.isDefaultImage() && !team.isSameIconUrl(iconUrl)) { - awsHandler.deleteFile(team.getIconImageUrl()); + private void updateIconImageKey(final Team team, final String iconImageKey) { + if (!team.isDefaultImage() && !team.isSameIconImageKey(iconImageKey)) { + awsHandler.deleteFile(team.getIconImageKey()); } } @@ -180,7 +183,7 @@ private void deleteTimeBlocks(final long teamId) { private void checkTeamNumber(final long memberId) { List joinedTeams = memberTeamManagerFinder.findAllByMemberIdOrderByCreatedAt( memberId); - if (joinedTeams.size() > 8) { + if (joinedTeams.size() > MAX_TEAM_NUMBER) { throw new TeamException(EXCEED_TEAM_NUMBER); } } diff --git a/src/main/java/com/tiki/server/team/service/dto/response/TeamInformGetResponse.java b/src/main/java/com/tiki/server/team/service/dto/response/TeamInformGetResponse.java deleted file mode 100644 index 14811941..00000000 --- a/src/main/java/com/tiki/server/team/service/dto/response/TeamInformGetResponse.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.tiki.server.team.service.dto.response; - -import com.tiki.server.common.entity.University; -import com.tiki.server.team.entity.Team; -import jakarta.validation.constraints.NotNull; - -import java.time.LocalDate; - -public record TeamInformGetResponse( - @NotNull String teamName, - @NotNull University university, - @NotNull String teamIconUrl, - @NotNull LocalDate namingUpdatedAt - ) { - - public static TeamInformGetResponse from(final Team team) { - return new TeamInformGetResponse(team.getName(),team.getUniv(), team.getIconImageUrl(),team.getNamingUpdatedAt()); - } -}