Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand All @@ -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())
Expand Down
5 changes: 0 additions & 5 deletions src/main/java/com/tiki/server/document/entity/Document.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand All @@ -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)
Expand All @@ -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())
Expand Down
Original file line number Diff line number Diff line change
@@ -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;

Expand All @@ -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());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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
Expand Down
Original file line number Diff line number Diff line change
@@ -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(
Expand All @@ -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()
);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand All @@ -31,9 +31,9 @@ public class FileHandlerController implements FileHandlerControllerDocs {
@Override
@ResponseStatus(HttpStatus.OK)
@GetMapping("/upload")
public SuccessResponse<PutObjectPreSignedUrlResponse> getPreSignedUrl(
public SuccessResponse<PreSignedUrlResponse> getPreSignedUrl(
@RequestParam final String fileFormat) {
PutObjectPreSignedUrlResponse response = fileHandlerService.getUploadPreSignedUrl(fileFormat);
PreSignedUrlResponse response = fileHandlerService.getUploadPreSignedUrl(fileFormat);
return SuccessResponse.success(PRESIGNED_URL_GET_SUCCESS.getMessage(), response);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -33,7 +33,7 @@ public interface FileHandlerControllerDocs {
description = "S3 PRESIGNED URL 불러오기 실패",
content = @Content(schema = @Schema(implementation = ErrorResponse.class)))}
)
SuccessResponse<PutObjectPreSignedUrlResponse> getPreSignedUrl(
SuccessResponse<PreSignedUrlResponse> getPreSignedUrl(
@Parameter(
name = "fileFormat",
description = "파일 형식",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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();
}
Expand Down
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -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);
}

Expand Down
13 changes: 6 additions & 7 deletions src/main/java/com/tiki/server/external/util/AwsHandler.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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);
}
Expand Down Expand Up @@ -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;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -113,7 +113,7 @@ private List<Team> getTeams(final List<MemberTeamManager> memberTeamManagers) {

private List<TeamResponse> getTeamResponses(final List<Team> teams) {
return teams.stream()
.map(team -> TeamResponse.createWithIcon(team, awsHandler.getDownloadPreSignedUrl(team.getIconImageUrl())))
.map(team -> TeamResponse.createWithIcon(team, awsHandler.getDownloadPreSignedUrl(team.getIconImageKey())))
.toList();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,5 @@
public class NoteConstants {

public static final int PAGE_SIZE = 10;
public static final String UNKNOWN = "알 수 없음";
}
59 changes: 35 additions & 24 deletions src/main/java/com/tiki/server/note/service/NoteService.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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
Expand All @@ -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) {
Expand Down Expand Up @@ -137,8 +141,8 @@ public NoteListGetServiceResponse getNote(
) {
memberTeamManagerFinder.findByMemberIdAndTeamId(memberId, teamId);
PageRequest pageable = PageRequest.of(INIT_NUM, PAGE_SIZE);
List<Note> noteList = getNotes(createdAt, sortOrder, pageable, teamId);
List<NoteGetResponse> noteGetResponses = noteList.stream()
List<Note> notes = getNotes(createdAt, sortOrder, pageable, teamId);
List<NoteGetResponse> noteGetResponses = notes.stream()
.map(note -> NoteGetResponse.of(note, getMemberName(note.getMemberId(), teamId)))
.toList();
return new NoteListGetServiceResponse(noteGetResponses);
Expand All @@ -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<Document> documentList = getDocumentListMappedByNote(noteId);
List<TimeBlock> timeBlockList = getTimeBlocksMappedByNote(noteId);
List<Document> documents = getDocumentsMappedByNote(noteId);
List<DocumentResponse> responses = documents.stream()
.map(document -> DocumentResponse.of(document, awsHandler.getDownloadPreSignedUrl(document.getFileKey())))
.toList();
List<TimeBlock> 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<Long> documentIds, final long noteId) {
List<Long> existingNoteDocumentIds = ndFinder.findAllByNoteId(noteId).stream()
.map(NDManager::getDocumentId)
.toList();
List<Long> idsToAdd = documentIds.stream()
.filter(id -> !existingNoteDocumentIds.contains(id))
.toList();
List<Long> idsToRemove = existingNoteDocumentIds.stream()
.filter(id -> !documentIds.contains(id))
.toList();
List<Long> idsToAdd = getIdsToAdd(documentIds, existingNoteDocumentIds);
List<Long> idsToRemove = getIdsToRemove(documentIds, existingNoteDocumentIds);
createNoteDocumentManagers(idsToAdd, noteId);
ndDeleter.deleteByNoteIdAndDocumentId(noteId, idsToRemove);
}
Expand All @@ -179,16 +182,24 @@ private void updateNoteTimeBlockManager(final List<Long> timeBlockIds, final lon
List<Long> existingNoteTimeBlockIds = ntbFinder.findAllByNoteId(noteId).stream()
.map(NTBManager::getTimeBlockId)
.toList();
List<Long> idsToAdd = timeBlockIds.stream()
.filter(id -> !existingNoteTimeBlockIds.contains(id))
.toList();
List<Long> idsToRemove = existingNoteTimeBlockIds.stream()
.filter(id -> !timeBlockIds.contains(id))
.toList();
List<Long> idsToAdd = getIdsToAdd(timeBlockIds, existingNoteTimeBlockIds);
List<Long> idsToRemove = getIdsToRemove(timeBlockIds, existingNoteTimeBlockIds);
createNoteTimeBlockManagers(idsToAdd, noteId);
ntbDeleter.deleteByNoteIdAndTimeBlockId(noteId, idsToRemove);
}

private List<Long> getIdsToAdd(final List<Long> ids, final List<Long> managerIds) {
return ids.stream()
.filter(id -> !managerIds.contains(id))
.toList();
}

private List<Long> getIdsToRemove(final List<Long> ids, final List<Long> managerIds) {
return managerIds.stream()
.filter(id -> !ids.contains(id))
.toList();
}

private List<Note> getNotes(final LocalDateTime createdAt, final SortOrder sortOrder, final PageRequest pageable,
final long teamId) {
if (sortOrder == SortOrder.DESC) {
Expand All @@ -198,19 +209,19 @@ private List<Note> getNotes(final LocalDateTime createdAt, final SortOrder sortO
}

private List<TimeBlock> getTimeBlocksMappedByNote(final long noteId) {
List<Long> timblockIdList = ntbFinder.findAllByNoteId(noteId).stream()
List<Long> timeBlockIds = ntbFinder.findAllByNoteId(noteId).stream()
.map(NTBManager::getTimeBlockId)
.toList();
return timblockIdList.stream()
return timeBlockIds.stream()
.map(timeBlockFinder::findById)
.toList();
}

private List<Document> getDocumentListMappedByNote(final long noteId) {
List<Long> documentIdList = ndFinder.findAllByNoteId(noteId).stream()
private List<Document> getDocumentsMappedByNote(final long noteId) {
List<Long> documentIds = ndFinder.findAllByNoteId(noteId).stream()
.map(NDManager::getDocumentId)
.toList();
return documentIdList.stream()
return documentIds.stream()
.map(documentFinder::findById)
.toList();
}
Expand Down
Loading