Skip to content

Commit 684c459

Browse files
authored
fix/#183 LabDetailResponse 이미지 필드명 수정 및 연구실 저장 BL 개선 (#184)
* fix: LabDetailResponse 이미지 필드명 수정 및 BL 개선 * fix: 리드미 오타 수정 * refactor: 엔티티 필드명 imgFile로 명시 * fix: 컴파일 에러 픽스
1 parent 6bf4d2e commit 684c459

File tree

14 files changed

+77
-28
lines changed

14 files changed

+77
-28
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@
8585
aics-api.src.main.java.kgu.developers.api
8686
├── foo
8787
│ ├── application // 비즈니스 로직
88-
│ │ └── FooFacde.java // CQRS 패턴 적용을 위한 Facade 계층
88+
│ │ └── FooFacade.java // CQRS 패턴 적용을 위한 Facade 계층
8989
│ └── presentation
9090
│ ├── response // 응답 객체
9191
│ │ └── ...

aics-admin/src/main/java/kgu/developers/admin/lab/application/LabAdminFacade.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@ public class LabAdminFacade {
1717
private final LabCommandService labCommandService;
1818
private final LabQueryService labQueryService;
1919

20-
public LabPersistResponse createLab(LabRequest request) {
21-
Long id = labCommandService.createLab(request.name(), request.loc(), request.site(), request.advisor());
20+
public LabPersistResponse createLab(Long fileId, LabRequest request) {
21+
Long id = labCommandService.createLab(fileId, request.name(), request.loc(), request.site(), request.advisor());
2222
return LabPersistResponse.of(id);
2323
}
2424

aics-admin/src/main/java/kgu/developers/admin/lab/presentation/LabAdminController.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import org.springframework.http.ResponseEntity;
44
import org.springframework.web.bind.annotation.PathVariable;
55
import org.springframework.web.bind.annotation.RequestBody;
6+
import org.springframework.web.bind.annotation.RequestParam;
67

78
import io.swagger.v3.oas.annotations.Operation;
89
import io.swagger.v3.oas.annotations.Parameter;
@@ -26,6 +27,10 @@ public interface LabAdminController {
2627
responseCode = "201",
2728
content = @Content(schema = @Schema(implementation = LabPersistResponse.class)))
2829
ResponseEntity<LabPersistResponse> createLab(
30+
@Parameter(
31+
description = "이미지 파일 ID는 URL 쿼리 파라미터 입니다.",
32+
example = "1"
33+
) @Positive @RequestParam(required = false) Long fileId,
2934
@Parameter(
3035
description = "연구실 생성 request 객체 입니다.",
3136
required = true

aics-admin/src/main/java/kgu/developers/admin/lab/presentation/LabAdminControllerImpl.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import org.springframework.web.bind.annotation.PostMapping;
1111
import org.springframework.web.bind.annotation.RequestBody;
1212
import org.springframework.web.bind.annotation.RequestMapping;
13+
import org.springframework.web.bind.annotation.RequestParam;
1314
import org.springframework.web.bind.annotation.RestController;
1415

1516
import io.swagger.v3.oas.annotations.Parameter;
@@ -30,16 +31,17 @@ public class LabAdminControllerImpl implements LabAdminController{
3031
@Override
3132
@PostMapping
3233
public ResponseEntity<LabPersistResponse> createLab(
34+
@Positive @RequestParam(required = false) Long fileId,
3335
@Valid @RequestBody LabRequest request
3436
) {
35-
LabPersistResponse response = labAdminFacade.createLab(request);
37+
LabPersistResponse response = labAdminFacade.createLab(fileId, request);
3638
return ResponseEntity.status(CREATED).body(response);
3739
}
3840

3941
@Override
4042
@PatchMapping("/{id}")
4143
public ResponseEntity<Void> updateLab(
42-
@Parameter(description = "수정할 연구실 id", example = "1", required = true) @PathVariable @Positive Long id,
44+
@PathVariable @Positive Long id,
4345
@Valid @RequestBody LabRequest request
4446
) {
4547
labAdminFacade.updateLab(id, request);
@@ -49,7 +51,7 @@ public ResponseEntity<Void> updateLab(
4951
@Override
5052
@DeleteMapping("/{id}")
5153
public ResponseEntity<Void> deleteLab(
52-
@Parameter(description = "삭제할 연구실의 id", example = "1", required = true) @PathVariable @Positive Long id
54+
@PathVariable @Positive Long id
5355
) {
5456
labAdminFacade.deleteLab(id);
5557
return ResponseEntity.noContent().build();

aics-admin/src/testFixtures/java/lab/application/LabAdminFacadeTest.java

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,28 +13,36 @@
1313
import kgu.developers.admin.lab.application.LabAdminFacade;
1414
import kgu.developers.admin.lab.presentation.request.LabRequest;
1515
import kgu.developers.admin.lab.presentation.response.LabPersistResponse;
16+
import kgu.developers.domain.file.application.query.FileQueryService;
17+
import kgu.developers.domain.file.domain.FileEntity;
1618
import kgu.developers.domain.lab.application.command.LabCommandService;
1719
import kgu.developers.domain.lab.application.query.LabQueryService;
1820
import kgu.developers.domain.lab.domain.Lab;
21+
import mock.repository.FakeFileRepository;
1922
import mock.repository.FakeLabRepository;
2023

2124
public class LabAdminFacadeTest {
2225
private LabAdminFacade labAdminFacade;
2326
private FakeLabRepository fakeLabRepository;
2427

28+
private static final Long TEST_FILE_ID = 1L;
29+
2530
@BeforeEach
2631
public void init() {
32+
FakeFileRepository fakeFileRepository = new FakeFileRepository();
2733
fakeLabRepository = new FakeLabRepository();
2834
labAdminFacade = new LabAdminFacade(
29-
new LabCommandService(fakeLabRepository),
35+
new LabCommandService(new FileQueryService(fakeFileRepository), fakeLabRepository),
3036
new LabQueryService(fakeLabRepository)
3137
);
3238

39+
FileEntity testFile = fakeFileRepository.save(FileEntity.builder().id(TEST_FILE_ID).build());
3340
fakeLabRepository.save(Lab.builder()
3441
.name("Lab A")
3542
.loc("8500")
3643
.site("http://labA.kyonggi.ac.kr")
3744
.advisor("박민준")
45+
.file(testFile)
3846
.build()
3947
);
4048
}
@@ -51,7 +59,7 @@ public void createLab_Success() {
5159
.build();
5260

5361
// when
54-
LabPersistResponse response = labAdminFacade.createLab(request);
62+
LabPersistResponse response = labAdminFacade.createLab(TEST_FILE_ID, request);
5563

5664
// then
5765
Lab lab = fakeLabRepository.findById(response.id()).orElse(null);

aics-api/src/main/java/kgu/developers/api/lab/presentation/response/LabDetailResponse.java

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,19 +22,21 @@ public record LabDetailResponse(
2222
@Schema(description = "연구실 담당교수", example = "박민준", requiredMode = REQUIRED)
2323
String advisor,
2424

25-
@Schema(description = "첨부 파일 정보",
26-
example = "{\"physicalPath\": \"/cloud/file/3/lab-logo-image\"}",
25+
@Schema(description = "연구실 이미지 파일",
26+
example = "{"
27+
+ "\"id\": 1, "
28+
+ "\"physicalPath\": \"/files/lab/20250131/lab-A.png\"}",
2729
requiredMode = NOT_REQUIRED)
28-
FilePathResponse file
30+
FilePathResponse img
2931
) {
3032
public static LabDetailResponse from(Lab lab) {
3133
return LabDetailResponse.builder()
3234
.name(lab.getName())
3335
.loc(lab.getLoc())
3436
.site(lab.getSite())
3537
.advisor(lab.getAdvisor())
36-
.file(lab.getFile() != null ?
37-
FilePathResponse.from(lab.getFile()) : null)
38+
.img(lab.getImgFile() != null ?
39+
FilePathResponse.from(lab.getImgFile()) : null)
3840
.build();
3941
}
4042
}

aics-api/src/main/java/kgu/developers/api/lab/presentation/response/LabListResponse.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,8 @@ public record LabListResponse(
1616
+ "\"loc\": \"8502, 8503\", "
1717
+ "\"site\": \"http://ailab.kyonggi.ac.kr\", "
1818
+ "\"professor\": \"박민준\", "
19-
+ "\"img\": \"/files/lab/LAB-A.png\"}]",
19+
+ "\"img\": {\"id\": 1, \"physicalPath\": \"/files/lab/20250131/lab-A.png\"}"
20+
+ "}]",
2021
requiredMode = REQUIRED)
2122
List<LabDetailResponse> contents
2223
) {

aics-domain/src/main/java/kgu/developers/domain/lab/application/command/LabCommandService.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,21 @@
22

33
import org.springframework.stereotype.Service;
44

5+
import kgu.developers.domain.file.application.query.FileQueryService;
6+
import kgu.developers.domain.file.domain.FileEntity;
57
import kgu.developers.domain.lab.domain.Lab;
68
import kgu.developers.domain.lab.domain.LabRepository;
79
import lombok.RequiredArgsConstructor;
810

911
@Service
1012
@RequiredArgsConstructor
1113
public class LabCommandService {
14+
private final FileQueryService fileQueryService;
1215
private final LabRepository labRepository;
1316

14-
public Long createLab(String name, String location, String site, String advisor) {
15-
Lab lab = Lab.create(name, location, site, advisor);
17+
public Long createLab(Long fileId, String name, String location, String site, String advisor) {
18+
FileEntity labImageFile = fileQueryService.getFileById(fileId);
19+
Lab lab = Lab.create(name, location, site, advisor, labImageFile);
1620
return labRepository.save(lab).getId();
1721
}
1822

aics-domain/src/main/java/kgu/developers/domain/lab/domain/Lab.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,15 +39,16 @@ public class Lab extends BaseTimeEntity {
3939
private String advisor;
4040

4141
@OneToOne
42-
@JoinColumn(name = "file_id")
43-
private FileEntity file;
42+
@JoinColumn(name = "file_id", nullable = false)
43+
private FileEntity imgFile;
4444

45-
public static Lab create(String name, String loc, String site, String advisor) {
45+
public static Lab create(String name, String loc, String site, String advisor, FileEntity file) {
4646
return Lab.builder()
4747
.name(name)
4848
.loc(loc)
4949
.site(site)
5050
.advisor(advisor)
51+
.imgFile(file)
5152
.build();
5253
}
5354

aics-domain/src/testFixtures/java/lab/application/LabCommandServiceTest.java

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,35 +2,42 @@
22

33
import static org.junit.jupiter.api.Assertions.assertEquals;
44

5+
import java.io.File;
56
import java.util.Optional;
67

78
import org.junit.jupiter.api.BeforeEach;
89
import org.junit.jupiter.api.DisplayName;
910
import org.junit.jupiter.api.Test;
1011

12+
import kgu.developers.domain.file.application.query.FileQueryService;
13+
import kgu.developers.domain.file.domain.FileEntity;
1114
import kgu.developers.domain.lab.application.command.LabCommandService;
1215
import kgu.developers.domain.lab.domain.Lab;
16+
import mock.repository.FakeFileRepository;
1317
import mock.repository.FakeLabRepository;
1418

1519
public class LabCommandServiceTest {
1620
private LabCommandService labCommandService;
1721
private FakeLabRepository fakeLabRepository;
1822

1923
private static final Long TARGET_LAB_ID = 2L;
24+
private static final Long TEST_FILE_ID = 1L;
2025

2126
@BeforeEach
2227
public void init() {
2328
initializeLabCommandService();
2429
}
2530

2631
private void initializeLabCommandService() {
32+
FakeFileRepository fakeFileRepository = new FakeFileRepository();
2733
fakeLabRepository = new FakeLabRepository();
28-
labCommandService = new LabCommandService(fakeLabRepository);
34+
labCommandService = new LabCommandService(new FileQueryService(fakeFileRepository), fakeLabRepository);
2935
fakeLabRepository.save(saveTestLab());
3036
}
3137

3238
private static Lab saveTestLab() {
33-
return Lab.create("인공지능 연구실", "8502, 8503", "http://ailab.kyonggi.ac.kr", "김인철");
39+
return Lab.create("인공지능 연구실", "8502, 8503", "http://ailab.kyonggi.ac.kr", "김인철",
40+
FileEntity.builder().id(TEST_FILE_ID).build());
3441
}
3542

3643
@Test
@@ -43,7 +50,7 @@ public void createLab_Success() {
4350
String advisor = "김인철";
4451

4552
// when
46-
Long createdLabId = labCommandService.createLab(name, loc, site, advisor);
53+
Long createdLabId = labCommandService.createLab(TEST_FILE_ID, name, loc, site, advisor);
4754

4855
// then
4956
assertEquals(TARGET_LAB_ID, createdLabId);
@@ -78,7 +85,7 @@ public void deleteLab_Success() {
7885
String site = "http://ailab.kyonggi.ac.kr";
7986
String advisor = "김인철";
8087

81-
Long labIdToDelete = labCommandService.createLab(name, loc, site, advisor);
88+
Long labIdToDelete = labCommandService.createLab(TEST_FILE_ID, name, loc, site, advisor);
8289

8390
// when
8491
labCommandService.deleteLabById(labIdToDelete);

0 commit comments

Comments
 (0)