Skip to content

Commit 9e56411

Browse files
authored
Merge pull request #73 from Leets-Official/feat/#70/post,notice-파일-업로드-수정
Feat #73 post,notice, receipt 파일 업로드 수정
2 parents 327a913 + e600e46 commit 9e56411

35 files changed

+339
-127
lines changed

src/main/java/leets/weeth/domain/account/application/dto/ReceiptDTO.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
package leets.weeth.domain.account.application.dto;
22

3+
import jakarta.validation.Valid;
34
import jakarta.validation.constraints.NotNull;
5+
import leets.weeth.domain.file.application.dto.request.FileSaveRequest;
6+
import leets.weeth.domain.file.application.dto.response.FileResponse;
47

58
import java.time.LocalDate;
69
import java.util.List;
@@ -12,13 +15,14 @@ public record Response(
1215
String description,
1316
Integer amount,
1417
LocalDate date,
15-
List<String> images
18+
List<FileResponse> fileUrls
1619
) {}
1720

1821
public record Save(
1922
String description,
2023
@NotNull Integer amount,
2124
@NotNull LocalDate date,
22-
@NotNull Integer cardinal
25+
@NotNull Integer cardinal,
26+
@Valid List<@NotNull FileSaveRequest> files
2327
) {}
2428
}

src/main/java/leets/weeth/domain/account/application/mapper/ReceiptMapper.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import leets.weeth.domain.account.application.dto.ReceiptDTO;
44
import leets.weeth.domain.account.domain.entity.Account;
55
import leets.weeth.domain.account.domain.entity.Receipt;
6+
import leets.weeth.domain.file.application.dto.response.FileResponse;
67
import org.mapstruct.Mapper;
78
import org.mapstruct.Mapping;
89
import org.mapstruct.MappingConstants;
@@ -15,8 +16,10 @@ public interface ReceiptMapper {
1516

1617
List<ReceiptDTO.Response> to(List<Receipt> account);
1718

19+
ReceiptDTO.Response to(Receipt receipt, List<FileResponse> fileUrls);
20+
1821
@Mapping(target = "id", ignore = true)
1922
@Mapping(target = "description", source = "dto.description")
2023
@Mapping(target = "account", source = "account")
21-
Receipt from(ReceiptDTO.Save dto, List<String> images, Account account);
24+
Receipt from(ReceiptDTO.Save dto, Account account);
2225
}

src/main/java/leets/weeth/domain/account/application/usecase/AccountUseCaseImpl.java

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,16 @@
22

33
import leets.weeth.domain.account.application.dto.AccountDTO;
44
import leets.weeth.domain.account.application.dto.ReceiptDTO;
5+
import leets.weeth.domain.account.application.exception.AccountExistsException;
56
import leets.weeth.domain.account.application.mapper.AccountMapper;
67
import leets.weeth.domain.account.application.mapper.ReceiptMapper;
78
import leets.weeth.domain.account.domain.entity.Account;
9+
import leets.weeth.domain.account.domain.entity.Receipt;
810
import leets.weeth.domain.account.domain.service.AccountGetService;
911
import leets.weeth.domain.account.domain.service.AccountSaveService;
10-
import leets.weeth.domain.account.application.exception.AccountExistsException;
12+
import leets.weeth.domain.file.application.dto.response.FileResponse;
13+
import leets.weeth.domain.file.application.mapper.FileMapper;
14+
import leets.weeth.domain.file.domain.service.FileGetService;
1115
import lombok.RequiredArgsConstructor;
1216
import org.springframework.stereotype.Service;
1317

@@ -19,14 +23,20 @@ public class AccountUseCaseImpl implements AccountUseCase {
1923

2024
private final AccountGetService accountGetService;
2125
private final AccountSaveService accountSaveService;
26+
private final FileGetService fileGetService;
2227
private final AccountMapper accountMapper;
2328
private final ReceiptMapper receiptMapper;
29+
private final FileMapper fileMapper;
2430

2531
@Override
2632
public AccountDTO.Response find(Integer cardinal) {
2733
Account account = accountGetService.find(cardinal);
28-
List<ReceiptDTO.Response> receipts = receiptMapper.to(account.getReceipts());
29-
return accountMapper.to(account, receipts);
34+
List<Receipt> receipts = account.getReceipts();
35+
List<ReceiptDTO.Response> response = receipts.stream()
36+
.map(receipt -> receiptMapper.to(receipt, getFiles(receipt.getId())))
37+
.toList();
38+
39+
return accountMapper.to(account, response);
3040
}
3141

3242
@Override
@@ -36,7 +46,13 @@ public void save(AccountDTO.Save dto) {
3646
}
3747

3848
private void validate(AccountDTO.Save dto) {
39-
if(accountGetService.validate(dto.cardinal()))
49+
if (accountGetService.validate(dto.cardinal()))
4050
throw new AccountExistsException();
4151
}
52+
53+
private List<FileResponse> getFiles(Long receiptId) {
54+
return fileGetService.findAllByReceipt(receiptId).stream()
55+
.map(fileMapper::toFileResponse)
56+
.toList();
57+
}
4258
}

src/main/java/leets/weeth/domain/account/application/usecase/ReceiptUseCase.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
import java.util.List;
77

88
public interface ReceiptUseCase {
9-
void save(ReceiptDTO.Save dto, List<MultipartFile> images);
9+
void save(ReceiptDTO.Save dto);
1010

1111
void delete(Long id);
1212
}

src/main/java/leets/weeth/domain/account/application/usecase/ReceiptUseCaseImpl.java

Lines changed: 27 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,11 @@
99
import leets.weeth.domain.account.domain.service.ReceiptDeleteService;
1010
import leets.weeth.domain.account.domain.service.ReceiptGetService;
1111
import leets.weeth.domain.account.domain.service.ReceiptSaveService;
12+
import leets.weeth.domain.file.application.mapper.FileMapper;
13+
import leets.weeth.domain.file.domain.entity.File;
14+
import leets.weeth.domain.file.domain.service.FileDeleteService;
15+
import leets.weeth.domain.file.domain.service.FileGetService;
16+
import leets.weeth.domain.file.domain.service.FileSaveService;
1217
import leets.weeth.domain.file.service.S3Service;
1318
import lombok.RequiredArgsConstructor;
1419
import org.springframework.stereotype.Service;
@@ -20,25 +25,39 @@
2025
@RequiredArgsConstructor
2126
public class ReceiptUseCaseImpl implements ReceiptUseCase {
2227

28+
private final ReceiptGetService receiptGetService;
2329
private final ReceiptDeleteService receiptDeleteService;
2430
private final ReceiptSaveService receiptSaveService;
25-
private final S3Service s3Service;
26-
private final ReceiptMapper mapper;
2731
private final AccountGetService accountGetService;
28-
private final ReceiptGetService receiptGetService;
2932

30-
@Override @Transactional
31-
public void save(ReceiptDTO.Save dto, List<MultipartFile> files) {
32-
List<String> images = s3Service.uploadFiles(files);
33+
private final FileGetService fileGetService;
34+
private final FileSaveService fileSaveService;
35+
private final FileDeleteService fileDeleteService;
36+
37+
private final ReceiptMapper mapper;
38+
private final FileMapper fileMapper;
39+
40+
41+
@Override
42+
@Transactional
43+
public void save(ReceiptDTO.Save dto) {
3344
Account account = accountGetService.find(dto.cardinal());
34-
Receipt receipt = receiptSaveService.save(mapper.from(dto, images, account));
45+
Receipt receipt = receiptSaveService.save(mapper.from(dto, account));
3546
account.spend(receipt);
47+
48+
List<File> files = fileMapper.toFileList(dto.files(), receipt);
49+
fileSaveService.save(files);
3650
}
3751

38-
@Override @Transactional
52+
@Override
53+
@Transactional
3954
public void delete(Long id) {
4055
Receipt receipt = receiptGetService.find(id);
56+
List<File> fileList = fileGetService.findAllByReceipt(id);
57+
4158
receipt.getAccount().cancel(receipt);
59+
60+
fileDeleteService.delete(fileList);
4261
receiptDeleteService.delete(receipt);
4362
}
4463
}

src/main/java/leets/weeth/domain/account/presentation/ReceiptAdminController.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,10 @@ public class ReceiptAdminController {
2424

2525
private final ReceiptUseCase receiptUseCase;
2626

27-
@PostMapping(consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
27+
@PostMapping
2828
@Operation(summary="회비 사용 내역 기입")
29-
public CommonResponse<Void> save(@RequestPart @Valid ReceiptDTO.Save dto, @RequestPart(required = false) List<MultipartFile> images) {
30-
receiptUseCase.save(dto, images);
29+
public CommonResponse<Void> save(@RequestBody @Valid ReceiptDTO.Save dto) {
30+
receiptUseCase.save(dto);
3131
return CommonResponse.createSuccess(RECEIPT_SAVE_SUCCESS.getMessage());
3232
}
3333

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
11
package leets.weeth.domain.board.application.dto;
22

3+
import jakarta.validation.Valid;
34
import jakarta.validation.constraints.NotNull;
45
import leets.weeth.domain.comment.application.dto.CommentDTO;
6+
import leets.weeth.domain.file.application.dto.request.FileSaveRequest;
7+
import leets.weeth.domain.file.application.dto.request.FileUpdateRequest;
8+
import leets.weeth.domain.file.application.dto.response.FileResponse;
59
import lombok.Builder;
610

711
import java.time.LocalDateTime;
@@ -12,14 +16,18 @@ public class NoticeDTO {
1216
@Builder
1317
public record Save(
1418
@NotNull String title,
15-
@NotNull String content
16-
){}
19+
@NotNull String content,
20+
@Valid List<@NotNull FileSaveRequest> files
21+
) {
22+
}
1723

1824
@Builder
1925
public record Update(
2026
@NotNull String title,
21-
@NotNull String content
22-
){}
27+
@NotNull String content,
28+
@Valid List<@NotNull FileSaveRequest> files
29+
) {
30+
}
2331

2432
@Builder
2533
public record Response(
@@ -29,9 +37,10 @@ public record Response(
2937
String content,
3038
LocalDateTime time,//modifiedAt
3139
Integer commentCount,
32-
List<String> fileUrls,
33-
List<CommentDTO.Response> comments
34-
){}
40+
List<CommentDTO.Response> comments,
41+
List<FileResponse> fileUrls
42+
) {
43+
}
3544

3645
@Builder
3746
public record ResponseAll(
@@ -41,6 +50,7 @@ public record ResponseAll(
4150
String content,
4251
LocalDateTime time,//modifiedAt
4352
Integer commentCount
44-
){}
53+
) {
54+
}
4555

4656
}

src/main/java/leets/weeth/domain/board/application/dto/PostDTO.java

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
11
package leets.weeth.domain.board.application.dto;
22

3+
import jakarta.validation.Valid;
34
import jakarta.validation.constraints.NotNull;
45
import leets.weeth.domain.comment.application.dto.CommentDTO;
6+
import leets.weeth.domain.file.application.dto.request.FileSaveRequest;
7+
import leets.weeth.domain.file.application.dto.request.FileUpdateRequest;
8+
import leets.weeth.domain.file.application.dto.response.FileResponse;
59
import lombok.Builder;
610

711
import java.time.LocalDateTime;
@@ -12,13 +16,15 @@ public class PostDTO {
1216
@Builder
1317
public record Save(
1418
@NotNull String title,
15-
@NotNull String content
19+
@NotNull String content,
20+
@Valid List<@NotNull FileSaveRequest> files
1621
){}
1722

1823
@Builder
1924
public record Update(
2025
@NotNull String title,
21-
@NotNull String content
26+
@NotNull String content,
27+
@Valid List<@NotNull FileSaveRequest> files
2228
){}
2329

2430
@Builder
@@ -29,8 +35,8 @@ public record Response(
2935
String content,
3036
LocalDateTime time,//modifiedAt
3137
Integer commentCount,
32-
List<String> fileUrls,
33-
List<CommentDTO.Response> comments
38+
List<CommentDTO.Response> comments,
39+
List<FileResponse> fileUrls
3440
){}
3541

3642
@Builder

src/main/java/leets/weeth/domain/board/application/mapper/NoticeMapper.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
import leets.weeth.domain.comment.application.dto.CommentDTO;
66
import leets.weeth.domain.comment.application.mapper.CommentMapper;
77
import leets.weeth.domain.comment.domain.entity.Comment;
8+
import leets.weeth.domain.file.application.dto.response.FileResponse;
9+
import leets.weeth.domain.file.domain.entity.File;
810
import leets.weeth.domain.user.domain.entity.User;
911
import org.mapstruct.*;
1012

@@ -19,7 +21,7 @@ public interface NoticeMapper {
1921
@Mapping(target = "id", ignore = true),
2022
@Mapping(target = "user", source = "user")
2123
})
22-
Notice fromNoticeDto(NoticeDTO.Save dto, List<String> fileUrls, User user);
24+
Notice fromNoticeDto(NoticeDTO.Save dto, User user);
2325

2426
@Mappings({
2527
@Mapping(target = "name", source = "user.name"),
@@ -28,11 +30,11 @@ public interface NoticeMapper {
2830
NoticeDTO.ResponseAll toAll(Notice notice);
2931

3032
@Mappings({
31-
@Mapping(target = "name", source = "user.name"),
33+
@Mapping(target = "name", source = "notice.user.name"),
3234
@Mapping(target = "comments", expression = "java(filterParentComments(notice.getComments()))"),
33-
@Mapping(target = "time", source = "modifiedAt")
35+
@Mapping(target = "time", source = "notice.modifiedAt")
3436
})
35-
NoticeDTO.Response toNoticeDto(Notice notice);
37+
NoticeDTO.Response toNoticeDto(Notice notice, List<FileResponse> fileUrls);
3638

3739
default List<CommentDTO.Response> filterParentComments(List<Comment> comments) {
3840
if (comments == null || comments.isEmpty()) {

src/main/java/leets/weeth/domain/board/application/mapper/PostMapper.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import leets.weeth.domain.comment.application.dto.CommentDTO;
66
import leets.weeth.domain.comment.application.mapper.CommentMapper;
77
import leets.weeth.domain.comment.domain.entity.Comment;
8+
import leets.weeth.domain.file.application.dto.response.FileResponse;
89
import leets.weeth.domain.user.domain.entity.User;
910
import org.mapstruct.*;
1011

@@ -19,7 +20,7 @@ public interface PostMapper {
1920
@Mapping(target = "id", ignore = true),
2021
@Mapping(target = "user", source = "user")
2122
})
22-
Post fromPostDto(PostDTO.Save dto, List<String> fileUrls, User user);
23+
Post fromPostDto(PostDTO.Save dto, User user);
2324

2425
@Mappings({
2526
@Mapping(target = "name", source = "user.name"),
@@ -28,11 +29,11 @@ public interface PostMapper {
2829
PostDTO.ResponseAll toAll(Post post);
2930

3031
@Mappings({
31-
@Mapping(target = "name", source = "user.name"),
32+
@Mapping(target = "name", source = "post.user.name"),
3233
@Mapping(target = "comments", expression = "java(filterParentComments(post.getComments()))"),
33-
@Mapping(target = "time", source = "modifiedAt")
34+
@Mapping(target = "time", source = "post.modifiedAt")
3435
})
35-
PostDTO.Response toPostDto(Post post);
36+
PostDTO.Response toPostDto(Post post, List<FileResponse> fileUrls);
3637

3738
default List<CommentDTO.Response> filterParentComments(List<Comment> comments) {
3839
if (comments == null || comments.isEmpty()) {

0 commit comments

Comments
 (0)