From ff604905089b5377cb751b25713b7787c82125d0 Mon Sep 17 00:00:00 2001 From: ah9mon Date: Fri, 8 Sep 2023 17:15:18 +0900 Subject: [PATCH 1/3] =?UTF-8?q?Feat:=20Record=20=EB=8F=84=EB=A9=94?= =?UTF-8?q?=EC=9D=B8=20API=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/item/item/api/SubjectItemApi.java | 2 +- .../application/AvatarItemCreateService.java | 2 +- .../application/SubjectItemCreateService.java | 4 +- .../domain/item/item/domain/Item.java | 2 - .../item/dto/AvatarItemCreateRequest.java | 3 +- .../item/dto/SubjectItemCreateRequest.java | 3 +- .../domain/item/stage/dao/StageFindDao.java | 37 ------------- .../domain/item/subject/api/SubjectApi.java | 6 +-- .../domain/item/subject/domain/Subject.java | 3 +- .../item/subject/dto/SubjectResponse.java | 4 +- .../domain/profile/api/ProfileApi.java | 42 +++++++++++++++ .../domain/profile/domain/Profile.java | 4 ++ .../application/RecordCreateService.java | 38 +++++++++++++ .../application/RecordUpdateService.java | 25 +++++++++ .../domain/record/code/RecordCode.java | 35 ++++++++++++ .../domain/record/dao/RecordFindDao.java | 28 ++++++++++ .../domain/record/dao/RecordRepository.java | 8 ++- .../domain/record/domain/Record.java | 43 +++++++++++++++ .../record/dto/RecordCreateRequest.java | 28 ++++++++++ .../record/dto/RecordPostSuccessResponse.java | 17 ++++++ .../domain/record/dto/RecordResponse.java | 18 +++++++ .../record/dto/RecordUpdateRequest.java | 24 +++++++++ .../record/exception/RecordNotFound.java | 9 ++++ .../domain/{item => }/stage/api/StageApi.java | 12 ++--- .../stage/application/StageCreateService.java | 14 +++-- .../stage/application/StageUpdateService.java | 10 ++-- .../{item => }/stage/code/StageCode.java | 2 +- .../domain/stage/dao/StageFindDao.java | 53 +++++++++++++++++++ .../{item => }/stage/dao/StageRepository.java | 4 +- .../domain/{item => }/stage/domain/Stage.java | 21 +++++--- .../stage/dto/StageCreateRequest.java | 12 ++--- .../stage/dto/StagePostSuccessResponse.java | 4 +- .../{item => }/stage/dto/StageResponse.java | 8 +-- .../stage/dto/StageWithRecordResponse.java | 37 +++++++++++++ .../exception/StageNotFoundException.java | 2 +- 35 files changed, 465 insertions(+), 99 deletions(-) delete mode 100644 src/main/java/com/siliconvalley/domain/item/stage/dao/StageFindDao.java create mode 100644 src/main/java/com/siliconvalley/domain/record/application/RecordCreateService.java create mode 100644 src/main/java/com/siliconvalley/domain/record/application/RecordUpdateService.java create mode 100644 src/main/java/com/siliconvalley/domain/record/code/RecordCode.java create mode 100644 src/main/java/com/siliconvalley/domain/record/dao/RecordFindDao.java create mode 100644 src/main/java/com/siliconvalley/domain/record/dto/RecordPostSuccessResponse.java create mode 100644 src/main/java/com/siliconvalley/domain/record/dto/RecordUpdateRequest.java create mode 100644 src/main/java/com/siliconvalley/domain/record/exception/RecordNotFound.java rename src/main/java/com/siliconvalley/domain/{item => }/stage/api/StageApi.java (69%) rename src/main/java/com/siliconvalley/domain/{item => }/stage/application/StageCreateService.java (53%) rename src/main/java/com/siliconvalley/domain/{item => }/stage/application/StageUpdateService.java (73%) rename src/main/java/com/siliconvalley/domain/{item => }/stage/code/StageCode.java (94%) create mode 100644 src/main/java/com/siliconvalley/domain/stage/dao/StageFindDao.java rename src/main/java/com/siliconvalley/domain/{item => }/stage/dao/StageRepository.java (72%) rename src/main/java/com/siliconvalley/domain/{item => }/stage/domain/Stage.java (55%) rename src/main/java/com/siliconvalley/domain/{item => }/stage/dto/StageCreateRequest.java (67%) rename src/main/java/com/siliconvalley/domain/{item => }/stage/dto/StagePostSuccessResponse.java (73%) rename src/main/java/com/siliconvalley/domain/{item => }/stage/dto/StageResponse.java (75%) create mode 100644 src/main/java/com/siliconvalley/domain/stage/dto/StageWithRecordResponse.java rename src/main/java/com/siliconvalley/domain/{item => }/stage/exception/StageNotFoundException.java (81%) diff --git a/src/main/java/com/siliconvalley/domain/item/item/api/SubjectItemApi.java b/src/main/java/com/siliconvalley/domain/item/item/api/SubjectItemApi.java index 090d40a..b249b32 100644 --- a/src/main/java/com/siliconvalley/domain/item/item/api/SubjectItemApi.java +++ b/src/main/java/com/siliconvalley/domain/item/item/api/SubjectItemApi.java @@ -35,7 +35,7 @@ public ResponseEntity getAllSubjectItems(Pageable pageable) { } @GetMapping("/{itemId}") - public ResponseEntity getAvatarItem( + public ResponseEntity getSubjectItem( @PathVariable("itemId") Long itemId ) { return ResponseEntity.status(HttpStatus.OK).body(subjectItemFindDao.getSubjectItemById(itemId)); diff --git a/src/main/java/com/siliconvalley/domain/item/item/application/AvatarItemCreateService.java b/src/main/java/com/siliconvalley/domain/item/item/application/AvatarItemCreateService.java index fea41f2..6b53f09 100644 --- a/src/main/java/com/siliconvalley/domain/item/item/application/AvatarItemCreateService.java +++ b/src/main/java/com/siliconvalley/domain/item/item/application/AvatarItemCreateService.java @@ -22,7 +22,7 @@ public Response createAvatarItem(AvatarItemCreateRequest dto) { Item item = dto.getItem(); // Item과 Avatar 빌드 및 연관관계 매핑 - item.addAvatar(dto.getAvatar()); + item.addAvatar(dto.getAvatar(item)); // Item이 저장될 때 Avatar 자동 저장 itemRepository.save(item); diff --git a/src/main/java/com/siliconvalley/domain/item/item/application/SubjectItemCreateService.java b/src/main/java/com/siliconvalley/domain/item/item/application/SubjectItemCreateService.java index 1814310..f730ee3 100644 --- a/src/main/java/com/siliconvalley/domain/item/item/application/SubjectItemCreateService.java +++ b/src/main/java/com/siliconvalley/domain/item/item/application/SubjectItemCreateService.java @@ -4,8 +4,6 @@ import com.siliconvalley.domain.item.item.dao.ItemRepository; import com.siliconvalley.domain.item.item.domain.Item; import com.siliconvalley.domain.item.item.dto.ItemPostSuccessResponse; -import com.siliconvalley.domain.item.stage.dao.StageRepository; -import com.siliconvalley.domain.item.subject.domain.Subject; import com.siliconvalley.domain.item.item.dto.SubjectItemCreateRequest; import com.siliconvalley.global.common.dto.Response; import lombok.RequiredArgsConstructor; @@ -23,7 +21,7 @@ public Response createSubjectItem(SubjectItemCreateRequest dto) { Item item = dto.getItem(); // Item과 Subject빌드 및 연관관계 매핑 - item.addSubject(dto.getSubject()); + item.addSubject(dto.getSubject(item)); // Item이 저장될 때 Subject 자동 저장 itemRepository.save(item); diff --git a/src/main/java/com/siliconvalley/domain/item/item/domain/Item.java b/src/main/java/com/siliconvalley/domain/item/item/domain/Item.java index a309758..1956ceb 100644 --- a/src/main/java/com/siliconvalley/domain/item/item/domain/Item.java +++ b/src/main/java/com/siliconvalley/domain/item/item/domain/Item.java @@ -37,11 +37,9 @@ public Item(Long itemPrice) { public void addAvatar(Avatar avatar) { this.avatar = avatar; - avatar.setItem(this); // 양방향 관계 설정 } public void addSubject(Subject subject) { this.subject = subject; - subject.setItem(this); // 양방향 관계 설정 } } diff --git a/src/main/java/com/siliconvalley/domain/item/item/dto/AvatarItemCreateRequest.java b/src/main/java/com/siliconvalley/domain/item/item/dto/AvatarItemCreateRequest.java index fb9ea56..f43dba8 100644 --- a/src/main/java/com/siliconvalley/domain/item/item/dto/AvatarItemCreateRequest.java +++ b/src/main/java/com/siliconvalley/domain/item/item/dto/AvatarItemCreateRequest.java @@ -37,10 +37,11 @@ public Item getItem() { .build(); } - public Avatar getAvatar() { + public Avatar getAvatar(Item item) { return Avatar.builder() .avatarName(avatarName) .avatarImage(avatarImage) + .item(item) .build(); } } diff --git a/src/main/java/com/siliconvalley/domain/item/item/dto/SubjectItemCreateRequest.java b/src/main/java/com/siliconvalley/domain/item/item/dto/SubjectItemCreateRequest.java index e3fcdbc..58c78eb 100644 --- a/src/main/java/com/siliconvalley/domain/item/item/dto/SubjectItemCreateRequest.java +++ b/src/main/java/com/siliconvalley/domain/item/item/dto/SubjectItemCreateRequest.java @@ -37,10 +37,11 @@ public Item getItem() { .build(); } - public Subject getSubject() { + public Subject getSubject(Item item) { return Subject.builder() .subjectName(subjectName) .subjectImage(subjectImage) + .item(item) .build(); } } diff --git a/src/main/java/com/siliconvalley/domain/item/stage/dao/StageFindDao.java b/src/main/java/com/siliconvalley/domain/item/stage/dao/StageFindDao.java deleted file mode 100644 index 9ef01ae..0000000 --- a/src/main/java/com/siliconvalley/domain/item/stage/dao/StageFindDao.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.siliconvalley.domain.item.stage.dao; - -import com.siliconvalley.domain.item.stage.domain.Stage; -import com.siliconvalley.domain.item.stage.dto.StageResponse; -import com.siliconvalley.domain.item.stage.exception.StageNotFoundException; -import com.siliconvalley.global.common.code.CommonCode; -import com.siliconvalley.global.common.dto.Response; -import com.siliconvalley.global.common.dto.page.PageResponse; -import lombok.RequiredArgsConstructor; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.Pageable; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.List; -import java.util.Optional; -import java.util.stream.Collectors; - -@Service -@Transactional -@RequiredArgsConstructor -public class StageFindDao { - - private final StageRepository stageRepository; - - public Stage findById(Long stageId) { - Optional stageOptional = stageRepository.findById(stageId); - stageOptional.orElseThrow(() -> new StageNotFoundException(stageId)); - return stageOptional.get(); - } - - public Response getStageList(Pageable pageable) { - Page stageList = stageRepository.findAll(pageable); - List stageSubjectList = stageList.stream().map(stage -> new StageResponse(stage)).collect(Collectors.toList()); - return Response.of(CommonCode.GOOD_REQUEST, new PageResponse(stageSubjectList, stageList)); - } -} diff --git a/src/main/java/com/siliconvalley/domain/item/subject/api/SubjectApi.java b/src/main/java/com/siliconvalley/domain/item/subject/api/SubjectApi.java index 092fab3..c0c6870 100644 --- a/src/main/java/com/siliconvalley/domain/item/subject/api/SubjectApi.java +++ b/src/main/java/com/siliconvalley/domain/item/subject/api/SubjectApi.java @@ -3,9 +3,8 @@ import com.siliconvalley.domain.item.sketch.application.SketchCreateService; import com.siliconvalley.domain.item.sketch.dao.SketchFindDao; import com.siliconvalley.domain.item.sketch.dto.SketchCreateRequest; -import com.siliconvalley.domain.item.stage.application.StageCreateService; -import com.siliconvalley.domain.item.stage.application.StageUpdateService; -import com.siliconvalley.domain.item.stage.dto.StageCreateRequest; +import com.siliconvalley.domain.stage.application.StageCreateService; +import com.siliconvalley.domain.stage.application.StageUpdateService; import lombok.RequiredArgsConstructor; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @@ -20,7 +19,6 @@ public class SubjectApi { private final SketchCreateService sketchCreateService; private final SketchFindDao sketchFindDao; - private final StageCreateService stageCreateService; private final StageUpdateService stageUpdateService; diff --git a/src/main/java/com/siliconvalley/domain/item/subject/domain/Subject.java b/src/main/java/com/siliconvalley/domain/item/subject/domain/Subject.java index 60582cc..d7d5ce2 100644 --- a/src/main/java/com/siliconvalley/domain/item/subject/domain/Subject.java +++ b/src/main/java/com/siliconvalley/domain/item/subject/domain/Subject.java @@ -2,8 +2,7 @@ import com.siliconvalley.domain.item.item.domain.Item; import com.siliconvalley.domain.item.sketch.domain.Sketch; -import com.siliconvalley.domain.item.stage.domain.Stage; -import com.siliconvalley.domain.item.stage.dto.StageCreateRequest; +import com.siliconvalley.domain.stage.domain.Stage; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; diff --git a/src/main/java/com/siliconvalley/domain/item/subject/dto/SubjectResponse.java b/src/main/java/com/siliconvalley/domain/item/subject/dto/SubjectResponse.java index 2117744..b2ff706 100644 --- a/src/main/java/com/siliconvalley/domain/item/subject/dto/SubjectResponse.java +++ b/src/main/java/com/siliconvalley/domain/item/subject/dto/SubjectResponse.java @@ -1,5 +1,6 @@ package com.siliconvalley.domain.item.subject.dto; +import com.querydsl.core.annotations.QueryProjection; import com.siliconvalley.domain.item.subject.domain.Subject; import com.siliconvalley.domain.item.sketch.dto.SketchResponseList; import lombok.AccessLevel; @@ -12,12 +13,11 @@ public class SubjectResponse { private Long id; private String subjectName; private String subjectImage; - private SketchResponseList sketchList; + @QueryProjection public SubjectResponse(Subject subject) { this.id = subject.getId(); this.subjectName = subject.getSubjectName(); this.subjectImage = subject.getSubjectImage(); - this.sketchList = new SketchResponseList(subject.getSketchList()); } } diff --git a/src/main/java/com/siliconvalley/domain/profile/api/ProfileApi.java b/src/main/java/com/siliconvalley/domain/profile/api/ProfileApi.java index 698bc27..5cf6dfd 100644 --- a/src/main/java/com/siliconvalley/domain/profile/api/ProfileApi.java +++ b/src/main/java/com/siliconvalley/domain/profile/api/ProfileApi.java @@ -13,6 +13,11 @@ import com.siliconvalley.domain.profile.dao.ProfileFindDao; import com.siliconvalley.domain.profile.dto.ProfileCreateOrUpdate; import com.siliconvalley.domain.profile.dto.ProfileResponse; +import com.siliconvalley.domain.record.application.RecordCreateService; +import com.siliconvalley.domain.record.application.RecordUpdateService; +import com.siliconvalley.domain.record.dto.RecordCreateRequest; +import com.siliconvalley.domain.record.dto.RecordUpdateRequest; +import com.siliconvalley.domain.stage.dao.StageFindDao; import com.siliconvalley.global.common.code.CommonCode; import com.siliconvalley.global.common.dto.Response; import lombok.RequiredArgsConstructor; @@ -41,6 +46,12 @@ public class ProfileApi { private final CanvasFindDao canvasFindDao; private final CanvasDeleteService canvasDeleteService; + //stage + private final StageFindDao stageFindDao; + // record + private final RecordCreateService recordCreateService; + private final RecordUpdateService recordUpdateService; + /** * * Profile Management @@ -182,4 +193,35 @@ public ResponseEntity deleteCanvas( return ResponseEntity.status(HttpStatus.NO_CONTENT).body(response); } + /** + * + * Record Management + * + * **/ + + @PostMapping("/{profileId}/stages/{stageId}/record") + public ResponseEntity createRecord( + @PathVariable(name = "profileId") Long profileId, + @PathVariable(name = "stageId") Long stageId, + @RequestBody RecordCreateRequest dto + ) { + return ResponseEntity.status(HttpStatus.CREATED).body(recordCreateService.createRecord(profileId, stageId, dto)); + } + + @GetMapping("/{profileId}/stages/records") + public ResponseEntity getAllStageWithRecord( + @PathVariable(name = "profileId") Long profileId, + Pageable pageable + ) { + return ResponseEntity.status(HttpStatus.OK).body(stageFindDao.getAllStageWithRecord(profileId, pageable)); + } + + @PatchMapping("/{profileId}/stages/{stageId}/records/{recordId}") + public ResponseEntity updateRecord( + @PathVariable(name = "recordId") Long recordId, + @RequestBody RecordUpdateRequest dto + ) { + return ResponseEntity.status(HttpStatus.NO_CONTENT).body(recordUpdateService.updateRecord(recordId, dto)); + } + } diff --git a/src/main/java/com/siliconvalley/domain/profile/domain/Profile.java b/src/main/java/com/siliconvalley/domain/profile/domain/Profile.java index c61aa76..eaca87b 100644 --- a/src/main/java/com/siliconvalley/domain/profile/domain/Profile.java +++ b/src/main/java/com/siliconvalley/domain/profile/domain/Profile.java @@ -4,6 +4,7 @@ import com.siliconvalley.domain.member.domain.Member; import com.siliconvalley.domain.point.domain.Point; import com.siliconvalley.domain.post.domain.Post; +import com.siliconvalley.domain.record.domain.Record; import lombok.AccessLevel; import lombok.Builder; import lombok.Getter; @@ -43,6 +44,9 @@ public class Profile { @OneToOne(mappedBy = "profile", orphanRemoval = true, fetch = FetchType.LAZY, cascade = CascadeType.PERSIST) private Point point; + @OneToMany(mappedBy = "profile", orphanRemoval = true, fetch = FetchType.LAZY) + private List recordList; + @Builder public Profile(String profileName, String profileImage,Member member) { this.profileName = profileName; diff --git a/src/main/java/com/siliconvalley/domain/record/application/RecordCreateService.java b/src/main/java/com/siliconvalley/domain/record/application/RecordCreateService.java new file mode 100644 index 0000000..7208a73 --- /dev/null +++ b/src/main/java/com/siliconvalley/domain/record/application/RecordCreateService.java @@ -0,0 +1,38 @@ +package com.siliconvalley.domain.record.application; + +import com.siliconvalley.domain.profile.dao.ProfileFindDao; +import com.siliconvalley.domain.profile.dao.ProfileRepository; +import com.siliconvalley.domain.profile.domain.Profile; +import com.siliconvalley.domain.record.code.RecordCode; +import com.siliconvalley.domain.record.dao.RecordRepository; +import com.siliconvalley.domain.record.domain.Record; +import com.siliconvalley.domain.record.dto.RecordCreateRequest; +import com.siliconvalley.domain.record.dto.RecordPostSuccessResponse; +import com.siliconvalley.domain.stage.dao.StageFindDao; +import com.siliconvalley.domain.stage.dao.StageRepository; +import com.siliconvalley.domain.stage.domain.Stage; +import com.siliconvalley.global.common.dto.Response; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +@Transactional +@RequiredArgsConstructor +public class RecordCreateService { + + private final RecordRepository recordRepository; + private final ProfileFindDao profileFindDao; + private final StageFindDao stageFindDao; + + public Response createRecord(Long profileId, Long stageId,RecordCreateRequest dto) { + Profile profile = profileFindDao.findById(profileId); + Stage stage = stageFindDao.findById(stageId); + Record record = dto.toEntity(profile, stage); + recordRepository.save(record); + return Response.of(RecordCode.CREATE_SUCCESS, new RecordPostSuccessResponse(record)); + } + +} + + diff --git a/src/main/java/com/siliconvalley/domain/record/application/RecordUpdateService.java b/src/main/java/com/siliconvalley/domain/record/application/RecordUpdateService.java new file mode 100644 index 0000000..093ae9f --- /dev/null +++ b/src/main/java/com/siliconvalley/domain/record/application/RecordUpdateService.java @@ -0,0 +1,25 @@ +package com.siliconvalley.domain.record.application; + +import com.siliconvalley.domain.record.code.RecordCode; +import com.siliconvalley.domain.record.dao.RecordFindDao; +import com.siliconvalley.domain.record.domain.Record; +import com.siliconvalley.domain.record.dto.RecordUpdateRequest; +import com.siliconvalley.global.common.dto.Response; +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +@Transactional +@RequiredArgsConstructor +public class RecordUpdateService { + + private final RecordFindDao recordFindDao; + + public Response updateRecord(Long recordId, RecordUpdateRequest dto) { + Record record = recordFindDao.findById(recordId); + record.updateScore(dto.getScore()); + return Response.of(RecordCode.UPDATE_SUCCESS, null); + } +} diff --git a/src/main/java/com/siliconvalley/domain/record/code/RecordCode.java b/src/main/java/com/siliconvalley/domain/record/code/RecordCode.java new file mode 100644 index 0000000..88049db --- /dev/null +++ b/src/main/java/com/siliconvalley/domain/record/code/RecordCode.java @@ -0,0 +1,35 @@ +package com.siliconvalley.domain.record.code; + +import com.siliconvalley.global.common.code.ResponseCode; +import org.springframework.http.HttpStatus; + +public enum RecordCode implements ResponseCode { + + CREATE_SUCCESS(201, "스테이지 기록 생성에 성공했습니다.", HttpStatus.CREATED), + UPDATE_SUCCESS(204, "스테이지 기록 변경에 성공했습니다.", HttpStatus.NO_CONTENT); + + private final int code; + private final String message; + private final HttpStatus httpStatus; + + RecordCode(int code, String message, HttpStatus httpStatus) { + this.code = code; + this.message = message; + this.httpStatus = httpStatus; + } + + @Override + public int getCode() { + return this.code; + } + + @Override + public String getMessage() { + return this.message; + } + + @Override + public HttpStatus getHttpStatus() { + return this.httpStatus; + } +} diff --git a/src/main/java/com/siliconvalley/domain/record/dao/RecordFindDao.java b/src/main/java/com/siliconvalley/domain/record/dao/RecordFindDao.java new file mode 100644 index 0000000..bd2b24f --- /dev/null +++ b/src/main/java/com/siliconvalley/domain/record/dao/RecordFindDao.java @@ -0,0 +1,28 @@ +package com.siliconvalley.domain.record.dao; + +import com.siliconvalley.domain.record.domain.Record; +import com.siliconvalley.domain.record.exception.RecordNotFound; +import com.siliconvalley.global.common.dto.Response; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Optional; + +@Service +@RequiredArgsConstructor +@Transactional +public class RecordFindDao { + + private final RecordRepository recordRepository; + + public Record findById(Long recordId) { + Optional recordOptional = recordRepository.findById(recordId); + recordOptional.orElseThrow(() -> new RecordNotFound(recordId)); + return recordOptional.get(); + } + + public Optional findByProfileIdAndStageId(Long profileId, Long stageId) { + return recordRepository.findByProfileIdAndStageId(profileId, stageId); + } +} diff --git a/src/main/java/com/siliconvalley/domain/record/dao/RecordRepository.java b/src/main/java/com/siliconvalley/domain/record/dao/RecordRepository.java index 084889c..9fbddd7 100644 --- a/src/main/java/com/siliconvalley/domain/record/dao/RecordRepository.java +++ b/src/main/java/com/siliconvalley/domain/record/dao/RecordRepository.java @@ -1,4 +1,10 @@ package com.siliconvalley.domain.record.dao; -public class RecordRepository { +import com.siliconvalley.domain.record.domain.Record; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.Optional; + +public interface RecordRepository extends JpaRepository { + Optional findByProfileIdAndStageId(Long profileId, Long stageId); } diff --git a/src/main/java/com/siliconvalley/domain/record/domain/Record.java b/src/main/java/com/siliconvalley/domain/record/domain/Record.java index 875cf09..e150069 100644 --- a/src/main/java/com/siliconvalley/domain/record/domain/Record.java +++ b/src/main/java/com/siliconvalley/domain/record/domain/Record.java @@ -1,4 +1,47 @@ package com.siliconvalley.domain.record.domain; +import com.siliconvalley.domain.profile.domain.Profile; +import com.siliconvalley.domain.stage.domain.Stage; +import lombok.AccessLevel; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import javax.persistence.*; + +@Entity +@Table(name = "record") +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@Getter public class Record { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "id", updatable = false, nullable = false) + private Long id; + + @Column(name = "score") + private int score; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "stage_id") + private Stage stage; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "profile_id") + private Profile profile; + + @Builder + public Record (int score, Stage stage, Profile profile) { + this.score = score; + this.stage = stage; + this.profile = profile; + } + + public void updateScore(int score) { + this.score = score; + } + + + } diff --git a/src/main/java/com/siliconvalley/domain/record/dto/RecordCreateRequest.java b/src/main/java/com/siliconvalley/domain/record/dto/RecordCreateRequest.java index 2fb004f..da2fba1 100644 --- a/src/main/java/com/siliconvalley/domain/record/dto/RecordCreateRequest.java +++ b/src/main/java/com/siliconvalley/domain/record/dto/RecordCreateRequest.java @@ -1,4 +1,32 @@ package com.siliconvalley.domain.record.dto; +import com.siliconvalley.domain.profile.domain.Profile; +import com.siliconvalley.domain.record.domain.Record; +import com.siliconvalley.domain.stage.domain.Stage; +import lombok.AccessLevel; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import javax.validation.Valid; + +@Getter +@NoArgsConstructor(access = AccessLevel.PRIVATE) public class RecordCreateRequest { + + @Valid + private int score; + + RecordCreateRequest( + @Valid int score + ) { + this.score = score; + } + + public Record toEntity(Profile profile, Stage stage) { + return Record.builder() + .score(score) + .profile(profile) + .stage(stage) + .build(); + } } diff --git a/src/main/java/com/siliconvalley/domain/record/dto/RecordPostSuccessResponse.java b/src/main/java/com/siliconvalley/domain/record/dto/RecordPostSuccessResponse.java new file mode 100644 index 0000000..b29fad3 --- /dev/null +++ b/src/main/java/com/siliconvalley/domain/record/dto/RecordPostSuccessResponse.java @@ -0,0 +1,17 @@ +package com.siliconvalley.domain.record.dto; + +import com.siliconvalley.domain.record.domain.Record; +import lombok.AccessLevel; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class RecordPostSuccessResponse { + + private Long id; + + public RecordPostSuccessResponse(Record record) { + this.id = record.getId(); + } +} diff --git a/src/main/java/com/siliconvalley/domain/record/dto/RecordResponse.java b/src/main/java/com/siliconvalley/domain/record/dto/RecordResponse.java index 57e2d90..c03b3c5 100644 --- a/src/main/java/com/siliconvalley/domain/record/dto/RecordResponse.java +++ b/src/main/java/com/siliconvalley/domain/record/dto/RecordResponse.java @@ -1,4 +1,22 @@ package com.siliconvalley.domain.record.dto; +import com.querydsl.core.annotations.QueryProjection; +import com.siliconvalley.domain.record.domain.Record; +import com.siliconvalley.domain.stage.dto.StageResponse; +import lombok.AccessLevel; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor(access = AccessLevel.PRIVATE) public class RecordResponse { + + private Long id; + private int score; + + @QueryProjection + public RecordResponse(final Record record) { + this.id = record.getId(); + this.score = record.getScore(); + } } diff --git a/src/main/java/com/siliconvalley/domain/record/dto/RecordUpdateRequest.java b/src/main/java/com/siliconvalley/domain/record/dto/RecordUpdateRequest.java new file mode 100644 index 0000000..cc89c1f --- /dev/null +++ b/src/main/java/com/siliconvalley/domain/record/dto/RecordUpdateRequest.java @@ -0,0 +1,24 @@ +package com.siliconvalley.domain.record.dto; + +import com.siliconvalley.domain.profile.domain.Profile; +import com.siliconvalley.domain.record.domain.Record; +import com.siliconvalley.domain.stage.domain.Stage; +import lombok.AccessLevel; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import javax.validation.Valid; + +@Getter +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class RecordUpdateRequest { + + @Valid + private int score; + + RecordUpdateRequest( + @Valid int score + ) { + this.score = score; + } +} diff --git a/src/main/java/com/siliconvalley/domain/record/exception/RecordNotFound.java b/src/main/java/com/siliconvalley/domain/record/exception/RecordNotFound.java new file mode 100644 index 0000000..2211874 --- /dev/null +++ b/src/main/java/com/siliconvalley/domain/record/exception/RecordNotFound.java @@ -0,0 +1,9 @@ +package com.siliconvalley.domain.record.exception; + +import com.siliconvalley.global.error.exception.EntityNotFoundException; + +public class RecordNotFound extends EntityNotFoundException { + public RecordNotFound(Long id) { + super(id + " is not found"); + } +} diff --git a/src/main/java/com/siliconvalley/domain/item/stage/api/StageApi.java b/src/main/java/com/siliconvalley/domain/stage/api/StageApi.java similarity index 69% rename from src/main/java/com/siliconvalley/domain/item/stage/api/StageApi.java rename to src/main/java/com/siliconvalley/domain/stage/api/StageApi.java index 6367d74..d5842c9 100644 --- a/src/main/java/com/siliconvalley/domain/item/stage/api/StageApi.java +++ b/src/main/java/com/siliconvalley/domain/stage/api/StageApi.java @@ -1,9 +1,8 @@ -package com.siliconvalley.domain.item.stage.api; +package com.siliconvalley.domain.stage.api; -import com.siliconvalley.domain.item.stage.application.StageCreateService; -import com.siliconvalley.domain.item.stage.application.StageUpdateService; -import com.siliconvalley.domain.item.stage.dao.StageFindDao; -import com.siliconvalley.domain.item.stage.dto.StageCreateRequest; +import com.siliconvalley.domain.stage.application.StageCreateService; +import com.siliconvalley.domain.stage.dao.StageFindDao; +import com.siliconvalley.domain.stage.dto.StageCreateRequest; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Pageable; import org.springframework.http.HttpStatus; @@ -22,10 +21,9 @@ public class StageApi { @GetMapping() public ResponseEntity getAllStage(Pageable pageable) { - return ResponseEntity.status(HttpStatus.OK).body(stageFindDao.getStageList(pageable)); + return ResponseEntity.status(HttpStatus.OK).body(stageFindDao.getAllStage(pageable)); } - @PostMapping public ResponseEntity createStage( @RequestBody @Valid StageCreateRequest dto) { diff --git a/src/main/java/com/siliconvalley/domain/item/stage/application/StageCreateService.java b/src/main/java/com/siliconvalley/domain/stage/application/StageCreateService.java similarity index 53% rename from src/main/java/com/siliconvalley/domain/item/stage/application/StageCreateService.java rename to src/main/java/com/siliconvalley/domain/stage/application/StageCreateService.java index 31db16b..f66d37c 100644 --- a/src/main/java/com/siliconvalley/domain/item/stage/application/StageCreateService.java +++ b/src/main/java/com/siliconvalley/domain/stage/application/StageCreateService.java @@ -1,12 +1,10 @@ -package com.siliconvalley.domain.item.stage.application; +package com.siliconvalley.domain.stage.application; -import com.siliconvalley.domain.item.stage.code.StageCode; -import com.siliconvalley.domain.item.stage.dao.StageRepository; -import com.siliconvalley.domain.item.stage.domain.Stage; -import com.siliconvalley.domain.item.stage.dto.StageCreateRequest; -import com.siliconvalley.domain.item.stage.dto.StagePostSuccessResponse; -import com.siliconvalley.domain.item.subject.dao.SubjectFindDao; -import com.siliconvalley.domain.item.subject.domain.Subject; +import com.siliconvalley.domain.stage.code.StageCode; +import com.siliconvalley.domain.stage.dao.StageRepository; +import com.siliconvalley.domain.stage.domain.Stage; +import com.siliconvalley.domain.stage.dto.StageCreateRequest; +import com.siliconvalley.domain.stage.dto.StagePostSuccessResponse; import com.siliconvalley.global.common.dto.Response; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; diff --git a/src/main/java/com/siliconvalley/domain/item/stage/application/StageUpdateService.java b/src/main/java/com/siliconvalley/domain/stage/application/StageUpdateService.java similarity index 73% rename from src/main/java/com/siliconvalley/domain/item/stage/application/StageUpdateService.java rename to src/main/java/com/siliconvalley/domain/stage/application/StageUpdateService.java index 803ff62..6f050e5 100644 --- a/src/main/java/com/siliconvalley/domain/item/stage/application/StageUpdateService.java +++ b/src/main/java/com/siliconvalley/domain/stage/application/StageUpdateService.java @@ -1,8 +1,8 @@ -package com.siliconvalley.domain.item.stage.application; +package com.siliconvalley.domain.stage.application; -import com.siliconvalley.domain.item.stage.code.StageCode; -import com.siliconvalley.domain.item.stage.dao.StageFindDao; -import com.siliconvalley.domain.item.stage.domain.Stage; +import com.siliconvalley.domain.stage.code.StageCode; +import com.siliconvalley.domain.stage.dao.StageFindDao; +import com.siliconvalley.domain.stage.domain.Stage; import com.siliconvalley.domain.item.subject.dao.SubjectFindDao; import com.siliconvalley.domain.item.subject.domain.Subject; import com.siliconvalley.global.common.dto.Response; @@ -21,7 +21,7 @@ public class StageUpdateService { public Response updateStage(Long subjectId, Long stageId) { Subject subject = subjectFindDao.findById(subjectId); Stage stage = stageFindDao.findById(stageId); - stage.setSubject(subject); + stage.addSubject(subject); return Response.of(StageCode.UPDATE_SUCCESS, null); } } diff --git a/src/main/java/com/siliconvalley/domain/item/stage/code/StageCode.java b/src/main/java/com/siliconvalley/domain/stage/code/StageCode.java similarity index 94% rename from src/main/java/com/siliconvalley/domain/item/stage/code/StageCode.java rename to src/main/java/com/siliconvalley/domain/stage/code/StageCode.java index dd5e7cc..5961fca 100644 --- a/src/main/java/com/siliconvalley/domain/item/stage/code/StageCode.java +++ b/src/main/java/com/siliconvalley/domain/stage/code/StageCode.java @@ -1,4 +1,4 @@ -package com.siliconvalley.domain.item.stage.code; +package com.siliconvalley.domain.stage.code; import com.siliconvalley.global.common.code.ResponseCode; import org.springframework.http.HttpStatus; diff --git a/src/main/java/com/siliconvalley/domain/stage/dao/StageFindDao.java b/src/main/java/com/siliconvalley/domain/stage/dao/StageFindDao.java new file mode 100644 index 0000000..f68972c --- /dev/null +++ b/src/main/java/com/siliconvalley/domain/stage/dao/StageFindDao.java @@ -0,0 +1,53 @@ +package com.siliconvalley.domain.stage.dao; + +import com.siliconvalley.domain.record.dao.RecordFindDao; +import com.siliconvalley.domain.record.domain.Record; +import com.siliconvalley.domain.stage.domain.Stage; +import com.siliconvalley.domain.stage.dto.StageResponse; +import com.siliconvalley.domain.stage.dto.StageWithRecordResponse; +import com.siliconvalley.domain.stage.exception.StageNotFoundException; +import com.siliconvalley.global.common.code.CommonCode; +import com.siliconvalley.global.common.dto.Response; +import com.siliconvalley.global.common.dto.page.PageResponse; +import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; + +@Service +@Transactional +@RequiredArgsConstructor +public class StageFindDao { + + private final StageRepository stageRepository; + private final RecordFindDao recordFindDao; + + public Stage findById(Long stageId) { + Optional stageOptional = stageRepository.findById(stageId); + stageOptional.orElseThrow(() -> new StageNotFoundException(stageId)); + return stageOptional.get(); + } + + public Response getAllStage(Pageable pageable) { + Page stageList = stageRepository.findAll(pageable); + List stageSubjectList = stageList.stream().map(stage -> new StageResponse(stage)).collect(Collectors.toList()); + return Response.of(CommonCode.GOOD_REQUEST, new PageResponse(stageSubjectList, stageList)); + } + + public Response getAllStageWithRecord(Long profileId, Pageable pageable) { + Page stageList = stageRepository.findAll(pageable); + List stageWithRecordList = stageList.stream() + .map(stage -> { + Optional recordOptional = recordFindDao.findByProfileIdAndStageId(profileId, stage.getId()); + return recordOptional.isPresent() ? new StageWithRecordResponse(stage, recordOptional.get()) : new StageWithRecordResponse(stage); + }) + .collect(Collectors.toList()); + + return Response.of(CommonCode.GOOD_REQUEST, new PageResponse(stageWithRecordList, stageList)); + } +} diff --git a/src/main/java/com/siliconvalley/domain/item/stage/dao/StageRepository.java b/src/main/java/com/siliconvalley/domain/stage/dao/StageRepository.java similarity index 72% rename from src/main/java/com/siliconvalley/domain/item/stage/dao/StageRepository.java rename to src/main/java/com/siliconvalley/domain/stage/dao/StageRepository.java index aa9db8c..5510176 100644 --- a/src/main/java/com/siliconvalley/domain/item/stage/dao/StageRepository.java +++ b/src/main/java/com/siliconvalley/domain/stage/dao/StageRepository.java @@ -1,6 +1,6 @@ -package com.siliconvalley.domain.item.stage.dao; +package com.siliconvalley.domain.stage.dao; -import com.siliconvalley.domain.item.stage.domain.Stage; +import com.siliconvalley.domain.stage.domain.Stage; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; diff --git a/src/main/java/com/siliconvalley/domain/item/stage/domain/Stage.java b/src/main/java/com/siliconvalley/domain/stage/domain/Stage.java similarity index 55% rename from src/main/java/com/siliconvalley/domain/item/stage/domain/Stage.java rename to src/main/java/com/siliconvalley/domain/stage/domain/Stage.java index 6ec92e1..bf6997a 100644 --- a/src/main/java/com/siliconvalley/domain/item/stage/domain/Stage.java +++ b/src/main/java/com/siliconvalley/domain/stage/domain/Stage.java @@ -1,15 +1,18 @@ -package com.siliconvalley.domain.item.stage.domain; +package com.siliconvalley.domain.stage.domain; import com.siliconvalley.domain.item.subject.domain.Subject; +import com.siliconvalley.domain.record.domain.Record; +import lombok.AccessLevel; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; import javax.persistence.*; +import java.util.List; @Entity @Table(name = "stage") -@NoArgsConstructor +@NoArgsConstructor(access = AccessLevel.PROTECTED) @Getter public class Stage { @@ -18,8 +21,8 @@ public class Stage { @Column(name = "id") private Long id; - @Column(name = "stage") - private int stage; + @Column(name = "stage_num") + private int stageNum; @Column(name = "point") private int point; @@ -28,14 +31,16 @@ public class Stage { @JoinColumn(name = "subject_id") private Subject subject; + @OneToMany(mappedBy = "stage", orphanRemoval = true) + private List recordList; + @Builder - public Stage (int stage, int point, Subject subject) { - this.stage = stage; + public Stage (int stageNum, int point) { + this.stageNum = stageNum; this.point = point; - this.subject = subject; } - public void setSubject(Subject subject) { + public void addSubject(Subject subject) { this.subject = subject; } } diff --git a/src/main/java/com/siliconvalley/domain/item/stage/dto/StageCreateRequest.java b/src/main/java/com/siliconvalley/domain/stage/dto/StageCreateRequest.java similarity index 67% rename from src/main/java/com/siliconvalley/domain/item/stage/dto/StageCreateRequest.java rename to src/main/java/com/siliconvalley/domain/stage/dto/StageCreateRequest.java index bb3f2b7..e366cf0 100644 --- a/src/main/java/com/siliconvalley/domain/item/stage/dto/StageCreateRequest.java +++ b/src/main/java/com/siliconvalley/domain/stage/dto/StageCreateRequest.java @@ -1,6 +1,6 @@ -package com.siliconvalley.domain.item.stage.dto; +package com.siliconvalley.domain.stage.dto; -import com.siliconvalley.domain.item.stage.domain.Stage; +import com.siliconvalley.domain.stage.domain.Stage; import lombok.AccessLevel; import lombok.Getter; import lombok.NoArgsConstructor; @@ -12,22 +12,22 @@ public class StageCreateRequest { @Valid - private int stage; + private int stageNum; @Valid private int point; StageCreateRequest( - @Valid int stage, + @Valid int stageNum, @Valid int point ) { - this.stage = stage; + this.stageNum = stageNum; this.point = point; } public Stage toEntity() { return Stage.builder() - .stage(stage) + .stageNum(stageNum) .point(point) .build(); } diff --git a/src/main/java/com/siliconvalley/domain/item/stage/dto/StagePostSuccessResponse.java b/src/main/java/com/siliconvalley/domain/stage/dto/StagePostSuccessResponse.java similarity index 73% rename from src/main/java/com/siliconvalley/domain/item/stage/dto/StagePostSuccessResponse.java rename to src/main/java/com/siliconvalley/domain/stage/dto/StagePostSuccessResponse.java index 9abc2ee..a09e773 100644 --- a/src/main/java/com/siliconvalley/domain/item/stage/dto/StagePostSuccessResponse.java +++ b/src/main/java/com/siliconvalley/domain/stage/dto/StagePostSuccessResponse.java @@ -1,6 +1,6 @@ -package com.siliconvalley.domain.item.stage.dto; +package com.siliconvalley.domain.stage.dto; -import com.siliconvalley.domain.item.stage.domain.Stage; +import com.siliconvalley.domain.stage.domain.Stage; import lombok.AccessLevel; import lombok.Getter; import lombok.NoArgsConstructor; diff --git a/src/main/java/com/siliconvalley/domain/item/stage/dto/StageResponse.java b/src/main/java/com/siliconvalley/domain/stage/dto/StageResponse.java similarity index 75% rename from src/main/java/com/siliconvalley/domain/item/stage/dto/StageResponse.java rename to src/main/java/com/siliconvalley/domain/stage/dto/StageResponse.java index b5a04f3..929c95a 100644 --- a/src/main/java/com/siliconvalley/domain/item/stage/dto/StageResponse.java +++ b/src/main/java/com/siliconvalley/domain/stage/dto/StageResponse.java @@ -1,6 +1,6 @@ -package com.siliconvalley.domain.item.stage.dto; +package com.siliconvalley.domain.stage.dto; -import com.siliconvalley.domain.item.stage.domain.Stage; +import com.siliconvalley.domain.stage.domain.Stage; import com.siliconvalley.domain.item.subject.dto.SubjectResponse; import lombok.AccessLevel; import lombok.Getter; @@ -11,13 +11,13 @@ public class StageResponse { private Long id; - private int stage; + private int stageNum; private int point; private SubjectResponse subject; public StageResponse(final Stage stage) { this.id = stage.getId(); - this.stage = stage.getStage(); + this.stageNum = stage.getStageNum(); this.point = stage.getPoint(); this.subject = new SubjectResponse(stage.getSubject()); } diff --git a/src/main/java/com/siliconvalley/domain/stage/dto/StageWithRecordResponse.java b/src/main/java/com/siliconvalley/domain/stage/dto/StageWithRecordResponse.java new file mode 100644 index 0000000..0aadf66 --- /dev/null +++ b/src/main/java/com/siliconvalley/domain/stage/dto/StageWithRecordResponse.java @@ -0,0 +1,37 @@ +package com.siliconvalley.domain.stage.dto; + +import com.querydsl.core.annotations.QueryProjection; +import com.siliconvalley.domain.item.subject.dto.SubjectResponse; +import com.siliconvalley.domain.record.domain.Record; +import com.siliconvalley.domain.record.dto.RecordResponse; +import com.siliconvalley.domain.stage.domain.Stage; +import lombok.AccessLevel; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class StageWithRecordResponse { + + private Long id; + private int stageNum; + private int point; + private SubjectResponse subject; + private RecordResponse record; + + public StageWithRecordResponse(final Stage stage, final Record record) { + this.id = stage.getId(); + this.stageNum = stage.getStageNum(); + this.point = stage.getPoint(); + this.subject = new SubjectResponse(stage.getSubject()); + this.record = new RecordResponse(record); + } + + public StageWithRecordResponse(final Stage stage) { + this.id = stage.getId(); + this.stageNum = stage.getStageNum(); + this.point = stage.getPoint(); + this.subject = new SubjectResponse(stage.getSubject()); + this.record = null; + } +} diff --git a/src/main/java/com/siliconvalley/domain/item/stage/exception/StageNotFoundException.java b/src/main/java/com/siliconvalley/domain/stage/exception/StageNotFoundException.java similarity index 81% rename from src/main/java/com/siliconvalley/domain/item/stage/exception/StageNotFoundException.java rename to src/main/java/com/siliconvalley/domain/stage/exception/StageNotFoundException.java index 6ee8dfb..b65b38d 100644 --- a/src/main/java/com/siliconvalley/domain/item/stage/exception/StageNotFoundException.java +++ b/src/main/java/com/siliconvalley/domain/stage/exception/StageNotFoundException.java @@ -1,4 +1,4 @@ -package com.siliconvalley.domain.item.stage.exception; +package com.siliconvalley.domain.stage.exception; import com.siliconvalley.global.error.exception.EntityNotFoundException; From 93463b6a810a4ab0d8a3e6b23cac07209c538634 Mon Sep 17 00:00:00 2001 From: ah9mon Date: Fri, 8 Sep 2023 17:18:53 +0900 Subject: [PATCH 2/3] =?UTF-8?q?Fix:=20REST=20API=20URL=20=EA=B7=9C?= =?UTF-8?q?=EC=B9=99=EC=97=90=20=EB=A7=9E=EB=8F=84=EB=A1=9D=20Item=20url?= =?UTF-8?q?=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/item/item/api/AvatarItemApi.java | 7 ---- .../domain/item/item/api/ItemApi.java | 34 +++++++++++++++++++ .../domain/item/item/api/SubjectItemApi.java | 7 ---- .../item/subject/dto/SubjectResponse.java | 1 - .../domain/record/dto/RecordResponse.java | 1 - 5 files changed, 34 insertions(+), 16 deletions(-) create mode 100644 src/main/java/com/siliconvalley/domain/item/item/api/ItemApi.java diff --git a/src/main/java/com/siliconvalley/domain/item/item/api/AvatarItemApi.java b/src/main/java/com/siliconvalley/domain/item/item/api/AvatarItemApi.java index fe89513..c923e3f 100644 --- a/src/main/java/com/siliconvalley/domain/item/item/api/AvatarItemApi.java +++ b/src/main/java/com/siliconvalley/domain/item/item/api/AvatarItemApi.java @@ -28,11 +28,4 @@ public ResponseEntity createAvatarItem(@RequestBody @Valid AvatarItemCreateReque public ResponseEntity getAllAvatarItems(Pageable pageable) { return ResponseEntity.status(HttpStatus.OK).body(avatarItemFindDao.getAvatarItemListByPage(pageable)); } - - @GetMapping("/{itemId}") - public ResponseEntity getAvatarItem( - @PathVariable("itemId") Long itemId - ) { - return ResponseEntity.status(HttpStatus.OK).body(avatarItemFindDao.getAvatarItemById(itemId)); - } } diff --git a/src/main/java/com/siliconvalley/domain/item/item/api/ItemApi.java b/src/main/java/com/siliconvalley/domain/item/item/api/ItemApi.java new file mode 100644 index 0000000..03669ab --- /dev/null +++ b/src/main/java/com/siliconvalley/domain/item/item/api/ItemApi.java @@ -0,0 +1,34 @@ +package com.siliconvalley.domain.item.item.api; + +import com.siliconvalley.domain.item.item.dao.AvatarItemFindDao; +import com.siliconvalley.domain.item.item.dao.SubjectItemFindDao; +import lombok.RequiredArgsConstructor; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/api/items") +@RequiredArgsConstructor +public class ItemApi { + + private final AvatarItemFindDao avatarItemFindDao; + private final SubjectItemFindDao subjectItemFindDao; + + @GetMapping("/{itemId}/avatars") + public ResponseEntity getAvatarItem( + @PathVariable("itemId") Long itemId + ) { + return ResponseEntity.status(HttpStatus.OK).body(avatarItemFindDao.getAvatarItemById(itemId)); + } + + @GetMapping("/{itemId}/subjects") + public ResponseEntity getSubjectItem( + @PathVariable("itemId") Long itemId + ) { + return ResponseEntity.status(HttpStatus.OK).body(subjectItemFindDao.getSubjectItemById(itemId)); + } +} diff --git a/src/main/java/com/siliconvalley/domain/item/item/api/SubjectItemApi.java b/src/main/java/com/siliconvalley/domain/item/item/api/SubjectItemApi.java index b249b32..153e53b 100644 --- a/src/main/java/com/siliconvalley/domain/item/item/api/SubjectItemApi.java +++ b/src/main/java/com/siliconvalley/domain/item/item/api/SubjectItemApi.java @@ -33,11 +33,4 @@ public ResponseEntity createSubjectItem(@RequestBody @Valid SubjectItemCreateReq public ResponseEntity getAllSubjectItems(Pageable pageable) { return ResponseEntity.status(HttpStatus.OK).body(subjectItemFindDao.getSubjectItemListByPage(pageable)); } - - @GetMapping("/{itemId}") - public ResponseEntity getSubjectItem( - @PathVariable("itemId") Long itemId - ) { - return ResponseEntity.status(HttpStatus.OK).body(subjectItemFindDao.getSubjectItemById(itemId)); - } } diff --git a/src/main/java/com/siliconvalley/domain/item/subject/dto/SubjectResponse.java b/src/main/java/com/siliconvalley/domain/item/subject/dto/SubjectResponse.java index b2ff706..d0b83a8 100644 --- a/src/main/java/com/siliconvalley/domain/item/subject/dto/SubjectResponse.java +++ b/src/main/java/com/siliconvalley/domain/item/subject/dto/SubjectResponse.java @@ -14,7 +14,6 @@ public class SubjectResponse { private String subjectName; private String subjectImage; - @QueryProjection public SubjectResponse(Subject subject) { this.id = subject.getId(); this.subjectName = subject.getSubjectName(); diff --git a/src/main/java/com/siliconvalley/domain/record/dto/RecordResponse.java b/src/main/java/com/siliconvalley/domain/record/dto/RecordResponse.java index c03b3c5..8fdb55b 100644 --- a/src/main/java/com/siliconvalley/domain/record/dto/RecordResponse.java +++ b/src/main/java/com/siliconvalley/domain/record/dto/RecordResponse.java @@ -14,7 +14,6 @@ public class RecordResponse { private Long id; private int score; - @QueryProjection public RecordResponse(final Record record) { this.id = record.getId(); this.score = record.getScore(); From 594945afb0bdc542b89eaeb8c1138dcb69817104 Mon Sep 17 00:00:00 2001 From: ah9mon Date: Mon, 11 Sep 2023 13:30:42 +0900 Subject: [PATCH 3/3] =?UTF-8?q?Feat:=20stage=20=EA=B8=B0=EB=A1=9D=20?= =?UTF-8?q?=EC=A1=B0=ED=9A=8C=EC=8B=9C=20=EC=95=84=EC=9D=B4=ED=85=9C=20?= =?UTF-8?q?=EB=B3=B4=EC=9C=A0=20=EC=97=AC=EB=B6=80=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/item/item/api/ItemApi.java | 2 ++ .../item/item/dao/AvatarItemFindDao.java | 12 +++++++++ .../item/item/dao/SubjectItemFindDao.java | 11 ++++++++ .../item/item/dto/AvatarItemResponse.java | 8 ++++++ .../item/item/dto/SubjectItemResponse.java | 8 ++++++ .../domain/item/myitem/dao/MyItemFindDao.java | 10 +++++++ .../item/myitem/dao/MyItemRepository.java | 3 +++ .../domain/profile/api/ProfileApi.java | 26 ++++++++++++++++--- .../domain/stage/dao/StageFindDao.java | 11 ++++++-- .../domain/stage/dto/StageResponse.java | 10 ++++++- .../stage/dto/StageWithRecordResponse.java | 13 +++++----- 11 files changed, 101 insertions(+), 13 deletions(-) diff --git a/src/main/java/com/siliconvalley/domain/item/item/api/ItemApi.java b/src/main/java/com/siliconvalley/domain/item/item/api/ItemApi.java index 03669ab..03a6a5b 100644 --- a/src/main/java/com/siliconvalley/domain/item/item/api/ItemApi.java +++ b/src/main/java/com/siliconvalley/domain/item/item/api/ItemApi.java @@ -31,4 +31,6 @@ public ResponseEntity getSubjectItem( ) { return ResponseEntity.status(HttpStatus.OK).body(subjectItemFindDao.getSubjectItemById(itemId)); } + + } diff --git a/src/main/java/com/siliconvalley/domain/item/item/dao/AvatarItemFindDao.java b/src/main/java/com/siliconvalley/domain/item/item/dao/AvatarItemFindDao.java index 3baec00..f67071f 100644 --- a/src/main/java/com/siliconvalley/domain/item/item/dao/AvatarItemFindDao.java +++ b/src/main/java/com/siliconvalley/domain/item/item/dao/AvatarItemFindDao.java @@ -2,6 +2,8 @@ import com.siliconvalley.domain.item.item.domain.Item; import com.siliconvalley.domain.item.item.dto.AvatarItemResponse; +import com.siliconvalley.domain.item.myitem.dao.MyItemFindDao; +import com.siliconvalley.domain.item.myitem.domain.MyItem; import com.siliconvalley.global.common.code.CommonCode; import com.siliconvalley.global.common.dto.Response; import com.siliconvalley.global.common.dto.page.PageResponse; @@ -20,6 +22,7 @@ public class AvatarItemFindDao { private final ItemRepository itemRepository; private final ItemFindDao itemFindDao; + private final MyItemFindDao myItemFindDao; public Response getAvatarItemListByPage(Pageable pageable) { Page itemPage = itemRepository.findAllByAvatarIsNotNull(pageable); @@ -27,6 +30,15 @@ public Response getAvatarItemListByPage(Pageable pageable) { return Response.of(CommonCode.GOOD_REQUEST,new PageResponse(itemResponseList,itemPage)); } + public Response getAvatarItemListByPage(Long profileId, Pageable pageable) { + Page itemPage = itemRepository.findAllByAvatarIsNotNull(pageable); + List itemResponseList = itemPage.map(item -> { + boolean hasItem = myItemFindDao.checkHasItem(profileId, "avatar", item); + return new AvatarItemResponse(item, hasItem); + }).getContent(); + return Response.of(CommonCode.GOOD_REQUEST,new PageResponse(itemResponseList,itemPage)); + } + public Response getAvatarItemById(Long itemId) { Item item = itemFindDao.findById(itemId); return Response.of(CommonCode.GOOD_REQUEST, new AvatarItemResponse(item)); diff --git a/src/main/java/com/siliconvalley/domain/item/item/dao/SubjectItemFindDao.java b/src/main/java/com/siliconvalley/domain/item/item/dao/SubjectItemFindDao.java index f2b6aaa..8ab31c4 100644 --- a/src/main/java/com/siliconvalley/domain/item/item/dao/SubjectItemFindDao.java +++ b/src/main/java/com/siliconvalley/domain/item/item/dao/SubjectItemFindDao.java @@ -2,6 +2,8 @@ import com.siliconvalley.domain.item.item.domain.Item; import com.siliconvalley.domain.item.item.dto.SubjectItemResponse; +import com.siliconvalley.domain.item.myitem.dao.MyItemFindDao; +import com.siliconvalley.domain.item.myitem.domain.MyItem; import com.siliconvalley.global.common.code.CommonCode; import com.siliconvalley.global.common.dto.Response; import com.siliconvalley.global.common.dto.page.PageResponse; @@ -20,12 +22,21 @@ public class SubjectItemFindDao { private final ItemRepository itemRepository; private final ItemFindDao itemFindDao; + private final MyItemFindDao myItemFindDao; public Response getSubjectItemListByPage(Pageable pageable) { Page itemPage = itemRepository.findAllBySubjectIsNotNull(pageable); List itemResponseList = itemPage.map(item -> new SubjectItemResponse(item)).getContent(); return Response.of(CommonCode.GOOD_REQUEST, new PageResponse(itemResponseList, itemPage)); } + public Response getSubjectItemListByPage(Long profileId, Pageable pageable) { + Page itemPage = itemRepository.findAllBySubjectIsNotNull(pageable); + List itemResponseList = itemPage.map(item -> { + boolean hasItem = myItemFindDao.checkHasItem(profileId, "subject", item); + return new SubjectItemResponse(item, hasItem); + }).getContent(); + return Response.of(CommonCode.GOOD_REQUEST, new PageResponse(itemResponseList, itemPage)); + } public Response getSubjectItemById(Long itemId) { Item item = itemFindDao.findById(itemId); diff --git a/src/main/java/com/siliconvalley/domain/item/item/dto/AvatarItemResponse.java b/src/main/java/com/siliconvalley/domain/item/item/dto/AvatarItemResponse.java index bc00696..359b8d1 100644 --- a/src/main/java/com/siliconvalley/domain/item/item/dto/AvatarItemResponse.java +++ b/src/main/java/com/siliconvalley/domain/item/item/dto/AvatarItemResponse.java @@ -12,6 +12,7 @@ public class AvatarItemResponse { private Long id; private Long itemPrice; + private boolean hasItem; private AvatarResponse avatarResponse; public AvatarItemResponse(final Item item) { @@ -19,4 +20,11 @@ public AvatarItemResponse(final Item item) { this.itemPrice = item.getItemPrice(); this.avatarResponse = new AvatarResponse(item.getAvatar()); } + + public AvatarItemResponse(final Item item, final boolean hasItem) { + this.id = item.getId(); + this.itemPrice = item.getItemPrice(); + this.hasItem = hasItem; + this.avatarResponse = new AvatarResponse(item.getAvatar()); + } } diff --git a/src/main/java/com/siliconvalley/domain/item/item/dto/SubjectItemResponse.java b/src/main/java/com/siliconvalley/domain/item/item/dto/SubjectItemResponse.java index 08d0644..89df09f 100644 --- a/src/main/java/com/siliconvalley/domain/item/item/dto/SubjectItemResponse.java +++ b/src/main/java/com/siliconvalley/domain/item/item/dto/SubjectItemResponse.java @@ -12,6 +12,7 @@ public class SubjectItemResponse { private Long id; private Long itemPrice; + private boolean hasItem; private SubjectResponse subject; public SubjectItemResponse(final Item item) { @@ -19,4 +20,11 @@ public SubjectItemResponse(final Item item) { this.itemPrice = item.getItemPrice(); this.subject = new SubjectResponse(item.getSubject()); } + + public SubjectItemResponse(final Item item, final boolean hasItem) { + this.id = item.getId(); + this.itemPrice = item.getItemPrice(); + this.hasItem = hasItem; + this.subject = new SubjectResponse(item.getSubject()); + } } diff --git a/src/main/java/com/siliconvalley/domain/item/myitem/dao/MyItemFindDao.java b/src/main/java/com/siliconvalley/domain/item/myitem/dao/MyItemFindDao.java index 0b4bc99..cccb569 100644 --- a/src/main/java/com/siliconvalley/domain/item/myitem/dao/MyItemFindDao.java +++ b/src/main/java/com/siliconvalley/domain/item/myitem/dao/MyItemFindDao.java @@ -1,5 +1,6 @@ package com.siliconvalley.domain.item.myitem.dao; +import com.siliconvalley.domain.item.item.domain.Item; import com.siliconvalley.domain.item.myitem.domain.MyItem; import com.siliconvalley.domain.item.myitem.dto.MyAvatarItemResponse; import com.siliconvalley.domain.item.myitem.dto.MySubjectItemResponse; @@ -12,6 +13,7 @@ import java.util.ArrayList; import java.util.List; +import java.util.Objects; @Service @Transactional @@ -32,4 +34,12 @@ public PageResponse getMyItemListByPage(Long profileId, Pageable pageable, Strin return new PageResponse(myItemResponseList, myItemPage); } + public boolean checkHasItem(Long profileId, String category, Item item) { + List myItemList = myItemRepository.findByProfileIdAndItemType(profileId, category); + boolean hasItem = false; + for (MyItem myItem : myItemList) { + if (Objects.equals(myItem.getItem(), item)) hasItem = true; + } + return hasItem; + } } diff --git a/src/main/java/com/siliconvalley/domain/item/myitem/dao/MyItemRepository.java b/src/main/java/com/siliconvalley/domain/item/myitem/dao/MyItemRepository.java index b76de67..1646ef1 100644 --- a/src/main/java/com/siliconvalley/domain/item/myitem/dao/MyItemRepository.java +++ b/src/main/java/com/siliconvalley/domain/item/myitem/dao/MyItemRepository.java @@ -5,6 +5,9 @@ import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; +import java.util.List; + public interface MyItemRepository extends JpaRepository { Page findByProfileIdAndItemType(Long profileId, String itemType, Pageable pageable); + List findByProfileIdAndItemType(Long profileId, String itemType); } diff --git a/src/main/java/com/siliconvalley/domain/profile/api/ProfileApi.java b/src/main/java/com/siliconvalley/domain/profile/api/ProfileApi.java index 5cf6dfd..d02d037 100644 --- a/src/main/java/com/siliconvalley/domain/profile/api/ProfileApi.java +++ b/src/main/java/com/siliconvalley/domain/profile/api/ProfileApi.java @@ -2,6 +2,9 @@ import com.siliconvalley.domain.canvas.dao.CanvasFindDao; import com.siliconvalley.domain.canvas.service.CanvasDeleteService; +import com.siliconvalley.domain.item.item.dao.AvatarItemFindDao; +import com.siliconvalley.domain.item.item.dao.ItemFindDao; +import com.siliconvalley.domain.item.item.dao.SubjectItemFindDao; import com.siliconvalley.domain.item.myitem.application.MyItemCreateService; import com.siliconvalley.domain.item.myitem.code.MyItemCode; import com.siliconvalley.domain.item.myitem.dao.MyItemFindDao; @@ -45,6 +48,9 @@ public class ProfileApi { private final ProfilePostingService profilePostingService; private final CanvasFindDao canvasFindDao; private final CanvasDeleteService canvasDeleteService; + //item + private final SubjectItemFindDao subjectItemFindDao; + private final AvatarItemFindDao avatarItemFindDao; //stage private final StageFindDao stageFindDao; @@ -91,12 +97,12 @@ public ResponseEntity deleteProfile( /** * - * MyItem Management + * Item Management * * **/ - @GetMapping("/{profileId}/items") - public ResponseEntity getItemsOfProfile( + @GetMapping("/{profileId}/my-items") + public ResponseEntity getMyItemsOfProfile( @PathVariable("profileId") Long profileId, @RequestParam(value = "category", required = false) String category, Pageable pageable @@ -104,6 +110,20 @@ public ResponseEntity getItemsOfProfile( Response response = Response.of(CommonCode.GOOD_REQUEST, myItemFindDao.getMyItemListByPage(profileId, pageable, category)); return new ResponseEntity(response, HttpStatus.OK); } + @GetMapping("/{profileId}/items/subjects") + public ResponseEntity getAllSubjectItemsOfShop( + @PathVariable("profileId") Long profileId, + Pageable pageable + ) { + return ResponseEntity.status(HttpStatus.OK).body(subjectItemFindDao.getSubjectItemListByPage(profileId, pageable)); + } + @GetMapping("/{profileId}/items/avatars") + public ResponseEntity getAllAvatarItemsOfShop( + @PathVariable("profileId") Long profileId, + Pageable pageable + ) { + return ResponseEntity.status(HttpStatus.OK).body(avatarItemFindDao.getAvatarItemListByPage(profileId, pageable)); + } @PostMapping("/{profileId}/items/{itemId}") public ResponseEntity purchaseSubjectItem( diff --git a/src/main/java/com/siliconvalley/domain/stage/dao/StageFindDao.java b/src/main/java/com/siliconvalley/domain/stage/dao/StageFindDao.java index f68972c..8261309 100644 --- a/src/main/java/com/siliconvalley/domain/stage/dao/StageFindDao.java +++ b/src/main/java/com/siliconvalley/domain/stage/dao/StageFindDao.java @@ -1,5 +1,7 @@ package com.siliconvalley.domain.stage.dao; +import com.siliconvalley.domain.item.myitem.dao.MyItemFindDao; +import com.siliconvalley.domain.item.subject.domain.Subject; import com.siliconvalley.domain.record.dao.RecordFindDao; import com.siliconvalley.domain.record.domain.Record; import com.siliconvalley.domain.stage.domain.Stage; @@ -26,6 +28,7 @@ public class StageFindDao { private final StageRepository stageRepository; private final RecordFindDao recordFindDao; + private final MyItemFindDao myItemFindDao; public Stage findById(Long stageId) { Optional stageOptional = stageRepository.findById(stageId); @@ -35,7 +38,10 @@ public Stage findById(Long stageId) { public Response getAllStage(Pageable pageable) { Page stageList = stageRepository.findAll(pageable); - List stageSubjectList = stageList.stream().map(stage -> new StageResponse(stage)).collect(Collectors.toList()); + List stageSubjectList = stageList.stream() + .map(stage -> (stage.getSubject() == null) ? new StageResponse(stage) : new StageResponse(stage, stage.getSubject())) + .collect(Collectors.toList()); + return Response.of(CommonCode.GOOD_REQUEST, new PageResponse(stageSubjectList, stageList)); } @@ -43,8 +49,9 @@ public Response getAllStageWithRecord(Long profileId, Pageable pageable) { Page stageList = stageRepository.findAll(pageable); List stageWithRecordList = stageList.stream() .map(stage -> { + boolean hasItem = myItemFindDao.checkHasItem(profileId, "subject", stage.getSubject().getItem()); Optional recordOptional = recordFindDao.findByProfileIdAndStageId(profileId, stage.getId()); - return recordOptional.isPresent() ? new StageWithRecordResponse(stage, recordOptional.get()) : new StageWithRecordResponse(stage); + return recordOptional.isPresent() ? new StageWithRecordResponse(stage, recordOptional.get(), hasItem) : new StageWithRecordResponse(stage, hasItem); }) .collect(Collectors.toList()); diff --git a/src/main/java/com/siliconvalley/domain/stage/dto/StageResponse.java b/src/main/java/com/siliconvalley/domain/stage/dto/StageResponse.java index 929c95a..44ca147 100644 --- a/src/main/java/com/siliconvalley/domain/stage/dto/StageResponse.java +++ b/src/main/java/com/siliconvalley/domain/stage/dto/StageResponse.java @@ -1,5 +1,6 @@ package com.siliconvalley.domain.stage.dto; +import com.siliconvalley.domain.item.subject.domain.Subject; import com.siliconvalley.domain.stage.domain.Stage; import com.siliconvalley.domain.item.subject.dto.SubjectResponse; import lombok.AccessLevel; @@ -15,10 +16,17 @@ public class StageResponse { private int point; private SubjectResponse subject; + public StageResponse(final Stage stage, final Subject subject) { + this.id = stage.getId(); + this.stageNum = stage.getStageNum(); + this.point = stage.getPoint(); + this.subject = new SubjectResponse(subject); + } + public StageResponse(final Stage stage) { this.id = stage.getId(); this.stageNum = stage.getStageNum(); this.point = stage.getPoint(); - this.subject = new SubjectResponse(stage.getSubject()); + this.subject = null; } } diff --git a/src/main/java/com/siliconvalley/domain/stage/dto/StageWithRecordResponse.java b/src/main/java/com/siliconvalley/domain/stage/dto/StageWithRecordResponse.java index 0aadf66..29c5416 100644 --- a/src/main/java/com/siliconvalley/domain/stage/dto/StageWithRecordResponse.java +++ b/src/main/java/com/siliconvalley/domain/stage/dto/StageWithRecordResponse.java @@ -1,7 +1,6 @@ package com.siliconvalley.domain.stage.dto; -import com.querydsl.core.annotations.QueryProjection; -import com.siliconvalley.domain.item.subject.dto.SubjectResponse; +import com.siliconvalley.domain.item.item.dto.SubjectItemResponse; import com.siliconvalley.domain.record.domain.Record; import com.siliconvalley.domain.record.dto.RecordResponse; import com.siliconvalley.domain.stage.domain.Stage; @@ -16,22 +15,22 @@ public class StageWithRecordResponse { private Long id; private int stageNum; private int point; - private SubjectResponse subject; + private SubjectItemResponse subjectItem; private RecordResponse record; - public StageWithRecordResponse(final Stage stage, final Record record) { + public StageWithRecordResponse(final Stage stage, final Record record, final boolean hasItem) { this.id = stage.getId(); this.stageNum = stage.getStageNum(); this.point = stage.getPoint(); - this.subject = new SubjectResponse(stage.getSubject()); + this.subjectItem = new SubjectItemResponse(stage.getSubject().getItem(), hasItem); this.record = new RecordResponse(record); } - public StageWithRecordResponse(final Stage stage) { + public StageWithRecordResponse(final Stage stage, final boolean hasItem) { this.id = stage.getId(); this.stageNum = stage.getStageNum(); this.point = stage.getPoint(); - this.subject = new SubjectResponse(stage.getSubject()); + this.subjectItem = new SubjectItemResponse(stage.getSubject().getItem(), hasItem); this.record = null; } }