From 7458c2c33be133670092bd8e2a7b3fc33d307910 Mon Sep 17 00:00:00 2001 From: myqewr Date: Sat, 5 Apr 2025 21:17:56 +0900 Subject: [PATCH] [feat] : Add "Get Diary Info" API MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - diary 목록 조회 - diary 상세 조회 --- server/src/docs/asciidoc/index.adoc | 45 ++++ .../controller/GreenroomController.java | 13 ++ .../dto/out/DiaryListResponseDto.java | 45 ++++ .../greenroom/dto/out/DiaryResponseDto.java | 15 +- .../dto/out/GreenroomCalendarResponseDto.java | 8 +- .../api/domain/greenroom/entity/Diary.java | 4 +- .../greenroom/repository/DiaryRepository.java | 13 +- .../greenroom/service/DiaryService.java | 20 +- .../greenroom/service/GreenroomService.java | 19 ++ .../response/enums/ResponseCodeEnum.java | 1 + .../server/api/GreenroomIntegrationTest.java | 218 +++++++++++++++++- 11 files changed, 386 insertions(+), 15 deletions(-) create mode 100644 server/src/main/java/com/greenroom/server/api/domain/greenroom/dto/out/DiaryListResponseDto.java diff --git a/server/src/docs/asciidoc/index.adoc b/server/src/docs/asciidoc/index.adoc index 399404e..9f185f0 100644 --- a/server/src/docs/asciidoc/index.adoc +++ b/server/src/docs/asciidoc/index.adoc @@ -1113,4 +1113,49 @@ include::{snippets}/api/greenroom/diary/post/3/http-response.adoc[] 실패 3. include::{snippets}/api/greenroom/diary/post/4/http-response.adoc[] +=== **16. 연도-월 별 작성된 일기 조회** +특정 연도-월에 작성된 모든 일기 목록을 조회함. + +==== Request +include::{snippets}/api/greenroom/diaries/1/http-request.adoc[] + +==== Request Headers +include::{snippets}/api/greenroom/diaries/1/request-headers.adoc[] + +==== Request Query Parameter Fields +include::{snippets}/api/greenroom/diaries/1/query-parameters.adoc[] + +==== 성공 Response +include::{snippets}/api/greenroom/diaries/1/http-response.adoc[] + +==== Response Body Fields +include::{snippets}/api/greenroom/diaries/1/response-fields.adoc[] + + +=== **17. 일기 상세 조회** + +특정 일기에 대한 상세 정보를 조회함. + +==== Request +include::{snippets}/api/greenroom/diaries/specific/1/http-request.adoc[] + +==== Request Headers +include::{snippets}/api/greenroom/diaries/specific/1/request-headers.adoc[] + +==== Request Path Parameter Fields +include::{snippets}/api/greenroom/diaries/specific/1/path-parameters.adoc[] + +==== 성공 Response +include::{snippets}/api/greenroom/diaries/specific/1/http-response.adoc[] + +==== Response Body Fields +include::{snippets}/api/greenroom/diaries/specific/1/response-fields.adoc[] + +==== 실패 Response + +실패1. +include::{snippets}/api/greenroom/diaries/specific/2/http-response.adoc[] + +실패2. +include::{snippets}/api/greenroom/diaries/specific/3/http-response.adoc[] diff --git a/server/src/main/java/com/greenroom/server/api/domain/greenroom/controller/GreenroomController.java b/server/src/main/java/com/greenroom/server/api/domain/greenroom/controller/GreenroomController.java index c064661..84bcfa9 100644 --- a/server/src/main/java/com/greenroom/server/api/domain/greenroom/controller/GreenroomController.java +++ b/server/src/main/java/com/greenroom/server/api/domain/greenroom/controller/GreenroomController.java @@ -2,6 +2,7 @@ import com.greenroom.server.api.domain.greenroom.dto.in.*; import com.greenroom.server.api.domain.greenroom.dto.out.PointAndLevelUpResponseDto; +import com.greenroom.server.api.domain.greenroom.service.DiaryService; import com.greenroom.server.api.domain.greenroom.service.GreenroomService; import com.greenroom.server.api.global.response.enums.ResponseCodeEnum; import com.greenroom.server.api.global.response.ApiResponse; @@ -16,6 +17,7 @@ import org.springframework.web.multipart.MultipartFile; import java.time.LocalDate; +import java.time.YearMonth; import java.util.List; @RestController @@ -24,6 +26,7 @@ public class GreenroomController { private final GreenroomService greenroomService; + private final DiaryService diaryService; @GetMapping("/info") public ResponseEntity getUserGreenroomInfo(@AuthenticationPrincipal User user){ @@ -108,4 +111,14 @@ public ResponseEntity getCalender(@AuthenticationPrincipal User use public ResponseEntity createDiary(@AuthenticationPrincipal User user, @Valid @RequestPart(value = "data") DiaryCreationRequestDto request, @RequestPart(value = "imageFile",required = false) MultipartFile imageFile){ return ResponseEntity.status(HttpStatus.CREATED).body(ApiResponse.success(ResponseCodeEnum.CREATED,greenroomService.createDiary(user.getUsername(),request,imageFile))); } + + @GetMapping("/diaries") + public ResponseEntity getAllDiaries(@AuthenticationPrincipal User user, @RequestParam(value = "date")YearMonth date){ + return ResponseEntity.ok(ApiResponse.success(ResponseCodeEnum.SUCCESS,greenroomService.getAllDiaries(user.getUsername(),date))); + } + + @GetMapping("/diaries/{diary_id}") + public ResponseEntity getDiaryById(@AuthenticationPrincipal User user ,@PathVariable(value = "diary_id") Long diaryId){ + return ResponseEntity.ok(ApiResponse.success(ResponseCodeEnum.SUCCESS,diaryService.getSpecificDiary(diaryId, user.getUsername()))); + } } diff --git a/server/src/main/java/com/greenroom/server/api/domain/greenroom/dto/out/DiaryListResponseDto.java b/server/src/main/java/com/greenroom/server/api/domain/greenroom/dto/out/DiaryListResponseDto.java new file mode 100644 index 0000000..5df083a --- /dev/null +++ b/server/src/main/java/com/greenroom/server/api/domain/greenroom/dto/out/DiaryListResponseDto.java @@ -0,0 +1,45 @@ +package com.greenroom.server.api.domain.greenroom.dto.out; + + +import com.greenroom.server.api.domain.greenroom.entity.Diary; +import com.greenroom.server.api.global.config.PropertiesHolder; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.LocalTime; +import java.time.format.TextStyle; +import java.util.List; +import java.util.Locale; + +public record DiaryListResponseDto(List diaryList) { + public static DiaryListResponseDto of(List diaryList){ + return new DiaryListResponseDto(diaryList); + } + + public record DateAndDiaryList(DateInfo dateInfo, List diaryInfo){ + public static DateAndDiaryList of(DateInfo dateInfo, List diaryInfo){ + return new DateAndDiaryList(dateInfo,diaryInfo); + } + } + + public record DateInfo(Integer year, Integer month, Integer date, String day){ + public static DateInfo from(LocalDate date){ + return new DateInfo(date.getYear(),date.getMonthValue(),date.getDayOfMonth(),date.getDayOfWeek().getDisplayName(TextStyle.SHORT, Locale.KOREAN)); + } + } + + public record DiaryInfo(Long diaryId, Long greenroomId, String greenroomName, String title, String content, String imageUrl, LocalDateTime dateTime){ + public static DiaryInfo from(Diary diary){ + + String imageUrl = null; + if(diary.getDiaryPictureUrl()!=null){imageUrl= PropertiesHolder.CDN_PATH+"/"+ diary.getDiaryPictureUrl();} + + + LocalTime time = LocalTime.of(diary.getCreateDate().getHour(),diary.getCreateDate().getMinute()); + LocalDateTime diaryDateTime = LocalDateTime.of(diary.getDate(),time); + + return new DiaryInfo(diary.getDiaryId(),diary.getGreenRoom().getGreenroomId(),diary.getGreenRoom().getName(), diary.getTitle(), diary.getContent(),imageUrl,diaryDateTime); + } + } + +} diff --git a/server/src/main/java/com/greenroom/server/api/domain/greenroom/dto/out/DiaryResponseDto.java b/server/src/main/java/com/greenroom/server/api/domain/greenroom/dto/out/DiaryResponseDto.java index 13dc6ba..eb66f28 100644 --- a/server/src/main/java/com/greenroom/server/api/domain/greenroom/dto/out/DiaryResponseDto.java +++ b/server/src/main/java/com/greenroom/server/api/domain/greenroom/dto/out/DiaryResponseDto.java @@ -5,6 +5,8 @@ import lombok.Data; import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.LocalTime; @Data public class DiaryResponseDto { @@ -14,12 +16,17 @@ public class DiaryResponseDto { private final String title; private final String content; private final String imageUrl; - private final String date; + private final LocalDateTime dateTime; public static DiaryResponseDto from(Diary diary){ String imageUrl =null; - if(diary.getDiaryPictureUrl()!=null){imageUrl = PropertiesHolder.CDN_PATH+"/"+diary.getDiaryPictureUrl(); - } - return new DiaryResponseDto(diary.getGreenRoom().getGreenroomId(),diary.getGreenRoom().getName(), diary.getDiaryId(), diary.getTitle(), diary.getContent(), imageUrl, diary.getDate().toString()); + + if(diary.getDiaryPictureUrl()!=null){imageUrl = PropertiesHolder.CDN_PATH+"/"+diary.getDiaryPictureUrl();} + + LocalDateTime createTime = diary.getCreateDate()==null?LocalDateTime.now():diary.getCreateDate(); + LocalTime time = LocalTime.of(createTime.getHour(),createTime.getMinute()); + LocalDateTime diaryDateTime = LocalDateTime.of(diary.getDate(),time); + + return new DiaryResponseDto(diary.getGreenRoom().getGreenroomId(),diary.getGreenRoom().getName(), diary.getDiaryId(), diary.getTitle(), diary.getContent(), imageUrl, diaryDateTime); } } diff --git a/server/src/main/java/com/greenroom/server/api/domain/greenroom/dto/out/GreenroomCalendarResponseDto.java b/server/src/main/java/com/greenroom/server/api/domain/greenroom/dto/out/GreenroomCalendarResponseDto.java index d6dfd00..0db2aed 100644 --- a/server/src/main/java/com/greenroom/server/api/domain/greenroom/dto/out/GreenroomCalendarResponseDto.java +++ b/server/src/main/java/com/greenroom/server/api/domain/greenroom/dto/out/GreenroomCalendarResponseDto.java @@ -4,6 +4,8 @@ import com.greenroom.server.api.global.config.PropertiesHolder; import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.LocalTime; import java.time.format.TextStyle; import java.util.List; import java.util.Locale; @@ -40,10 +42,12 @@ public static TodoInfo from(TodoLog todoLog){ return new TodoInfo(activity.getActivityId(),activity.getActivityName(),null,true); } } - public record DiaryInfo(Long diaryId, String title, String body, String imageUrl){ + public record DiaryInfo(Long diaryId, Long greenroomId, String greenroomName, String title, String body, String imageUrl, LocalDateTime dateTime){ public static DiaryInfo from(Diary diary){ String imageUrl = diary.getDiaryPictureUrl()==null?null:PropertiesHolder.CDN_PATH+"/"+diary.getDiaryPictureUrl(); - return new DiaryInfo(diary.getDiaryId(),diary.getTitle(),diary.getContent(),imageUrl); + LocalTime time = LocalTime.of(diary.getCreateDate().getHour(),diary.getCreateDate().getMinute()); + LocalDateTime diaryDateTime = LocalDateTime.of(diary.getDate(),time); + return new DiaryInfo(diary.getDiaryId(),diary.getGreenRoom().getGreenroomId(),diary.getGreenRoom().getName(),diary.getTitle(),diary.getContent(),imageUrl,diaryDateTime); } } } diff --git a/server/src/main/java/com/greenroom/server/api/domain/greenroom/entity/Diary.java b/server/src/main/java/com/greenroom/server/api/domain/greenroom/entity/Diary.java index a3ec8a3..16427b6 100644 --- a/server/src/main/java/com/greenroom/server/api/domain/greenroom/entity/Diary.java +++ b/server/src/main/java/com/greenroom/server/api/domain/greenroom/entity/Diary.java @@ -44,6 +44,8 @@ public static Diary createDiary(String title, String content, GreenRoom greenRoo return Diary.builder().title(title).content(content).greenRoom(greenRoom).diaryPictureUrl(diaryPictureUrl).date(date).build(); } - + public void updateCreateDate(LocalDateTime createDate){ + this.createDate = createDate; + } } diff --git a/server/src/main/java/com/greenroom/server/api/domain/greenroom/repository/DiaryRepository.java b/server/src/main/java/com/greenroom/server/api/domain/greenroom/repository/DiaryRepository.java index a0575d7..3655eeb 100644 --- a/server/src/main/java/com/greenroom/server/api/domain/greenroom/repository/DiaryRepository.java +++ b/server/src/main/java/com/greenroom/server/api/domain/greenroom/repository/DiaryRepository.java @@ -4,6 +4,8 @@ import com.greenroom.server.api.domain.greenroom.entity.Diary; import com.greenroom.server.api.domain.greenroom.entity.GreenRoom; import com.greenroom.server.api.domain.greenroom.entity.TodoLog; +import com.greenroom.server.api.domain.user.entity.User; +import org.springframework.data.jpa.repository.EntityGraph; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Modifying; import org.springframework.data.jpa.repository.Query; @@ -13,6 +15,7 @@ import java.time.LocalDate; import java.util.Collection; import java.util.List; +import java.util.Optional; @Repository public interface DiaryRepository extends JpaRepository { @@ -28,7 +31,13 @@ public interface DiaryRepository extends JpaRepository { void deleteAllByGreenRoom(GreenRoom greenRoom); - @Query("select d from Diary d where FUNCTION('DATE', d.createDate)=:date And d.greenRoom.greenroomId in :greenRooms ") - List findByCreateDateAndGreenRoomIn(@Param("date")LocalDate date, @Param("greenRooms") List greenRoom); + @Query("select d from Diary d where FUNCTION('DATE', d.date)=:date And d.greenRoom.greenroomId in :greenRooms ") + List findByDateAndGreenRoomIn(@Param("date")LocalDate date, @Param("greenRooms") List greenRoom); + @EntityGraph(attributePaths = {"greenRoom"}) + @Query("select d from Diary d where d.greenRoom.user =:user and FUNCTION('YEAR', d.date) = :year AND FUNCTION('MONTH', d.date) = :month") + List findByUserAndDate(@Param(value = "user") User user,@Param(value = "year")Integer year, @Param(value ="month")Integer month); + + @EntityGraph(attributePaths = {"greenRoom", "greenRoom.user"}) + Optional findByDiaryId(Long id); } diff --git a/server/src/main/java/com/greenroom/server/api/domain/greenroom/service/DiaryService.java b/server/src/main/java/com/greenroom/server/api/domain/greenroom/service/DiaryService.java index 412f083..c438dad 100644 --- a/server/src/main/java/com/greenroom/server/api/domain/greenroom/service/DiaryService.java +++ b/server/src/main/java/com/greenroom/server/api/domain/greenroom/service/DiaryService.java @@ -2,9 +2,11 @@ import com.amazonaws.util.StringUtils; import com.greenroom.server.api.domain.greenroom.dto.in.DiaryCreationRequestDto; +import com.greenroom.server.api.domain.greenroom.dto.out.DiaryResponseDto; import com.greenroom.server.api.domain.greenroom.entity.Diary; import com.greenroom.server.api.domain.greenroom.entity.GreenRoom; import com.greenroom.server.api.domain.greenroom.repository.DiaryRepository; +import com.greenroom.server.api.domain.user.entity.User; import com.greenroom.server.api.global.exception.CustomException; import com.greenroom.server.api.global.response.enums.ResponseCodeEnum; import lombok.RequiredArgsConstructor; @@ -12,6 +14,7 @@ import org.springframework.stereotype.Service; import java.time.LocalDate; +import java.time.YearMonth; import java.time.format.DateTimeParseException; import java.util.ArrayList; import java.util.List; @@ -37,7 +40,7 @@ public List deleteAllByGreenRoom(List greenroomIdList){ } public List getAllDiariesByGreenroomAndDate(ListgreenRoomList, LocalDate date){ - return diaryRepository.findByCreateDateAndGreenRoomIn(date,greenRoomList.stream().map(GreenRoom::getGreenroomId).toList()); + return diaryRepository.findByDateAndGreenRoomIn(date,greenRoomList.stream().map(GreenRoom::getGreenroomId).toList()); } public Diary createDiary(GreenRoom greenRoom, DiaryCreationRequestDto request, String imageUrl){ @@ -50,7 +53,18 @@ public Diary createDiary(GreenRoom greenRoom, DiaryCreationRequestDto request, S } Diary diary = Diary.createDiary(request.getTitle(),request.getContent(),greenRoom,imageUrl,date); - diaryRepository.save(diary); - return diary; + return diaryRepository.save(diary); + } + + public List getAllDiariesByUser(User user, YearMonth date){ + return diaryRepository.findByUserAndDate(user, date.getYear(),date.getMonthValue()); + } + + public DiaryResponseDto getSpecificDiary(Long diaryId,String userEmail){ + Diary diary = diaryRepository.findByDiaryId(diaryId).orElseThrow(()-> new CustomException(ResponseCodeEnum.DIARY_NOT_FOUND)); + + if(!diary.getGreenRoom().getUser().getEmail().equals(userEmail)){throw new CustomException(ResponseCodeEnum.NOT_AUTHORIZATION);} + + return DiaryResponseDto.from(diary); } } diff --git a/server/src/main/java/com/greenroom/server/api/domain/greenroom/service/GreenroomService.java b/server/src/main/java/com/greenroom/server/api/domain/greenroom/service/GreenroomService.java index 7c3cae4..a99af02 100644 --- a/server/src/main/java/com/greenroom/server/api/domain/greenroom/service/GreenroomService.java +++ b/server/src/main/java/com/greenroom/server/api/domain/greenroom/service/GreenroomService.java @@ -20,6 +20,7 @@ import org.springframework.web.multipart.MultipartFile; import java.time.LocalDate; +import java.time.YearMonth; import java.time.format.DateTimeParseException; import java.util.*; import java.util.stream.Collectors; @@ -449,5 +450,23 @@ public DiaryResponseDto createDiary(String email, DiaryCreationRequestDto reques return DiaryResponseDto.from(createdDiary); } + + public DiaryListResponseDto getAllDiaries(String email, YearMonth date){ + User user = customUserDetailService.findUserByEmail(email); + + Map> diaryList = diaryService.getAllDiariesByUser(user,date).stream().collect(Collectors.groupingBy(Diary::getDate)); + List result = new ArrayList<>(); + + List dateList = diaryList.keySet().stream().sorted((a,b)->b.getDayOfYear()-a.getDayOfYear()).toList(); + + for(LocalDate diaryDate : dateList){ + DiaryListResponseDto.DateInfo dateInfo = DiaryListResponseDto.DateInfo.from(diaryDate); + List diaryInfoList = diaryList.get(diaryDate).stream().map(DiaryListResponseDto.DiaryInfo::from).toList(); + + result.add(DiaryListResponseDto.DateAndDiaryList.of(dateInfo,diaryInfoList)); + } + + return DiaryListResponseDto.of(result); + } } diff --git a/server/src/main/java/com/greenroom/server/api/global/response/enums/ResponseCodeEnum.java b/server/src/main/java/com/greenroom/server/api/global/response/enums/ResponseCodeEnum.java index 631b0f1..8007176 100644 --- a/server/src/main/java/com/greenroom/server/api/global/response/enums/ResponseCodeEnum.java +++ b/server/src/main/java/com/greenroom/server/api/global/response/enums/ResponseCodeEnum.java @@ -44,6 +44,7 @@ public enum ResponseCodeEnum { CHECKED_IN_NOT_ALLOWED(HttpStatus.CONFLICT,"C028","출석 체크가 불가능함.",""), GREENROOM_NOT_FOUND(HttpStatus.NOT_FOUND,"C029","서버에 등록된 그린룸을 찾을 수 없음.",""), TOO_LONG_STRING(HttpStatus.BAD_REQUEST,"C030","제한된 길이를 초과하는 문자열이 전달되었음.",""), + DIARY_NOT_FOUND(HttpStatus.NOT_FOUND,"C031","요청된 id에 해당하는 일기를 서버에서 찾을 수 없음.",""), //500~ UNKNOWN_SERVER_ERROR(HttpStatus.INTERNAL_SERVER_ERROR,"D000","정의되지 않은 알 수 없는 서버 에러가 발생함.","서버에 문의"), diff --git a/server/src/test/java/com/greenroom/server/api/GreenroomIntegrationTest.java b/server/src/test/java/com/greenroom/server/api/GreenroomIntegrationTest.java index 6ad959e..6896bd3 100644 --- a/server/src/test/java/com/greenroom/server/api/GreenroomIntegrationTest.java +++ b/server/src/test/java/com/greenroom/server/api/GreenroomIntegrationTest.java @@ -172,6 +172,12 @@ public User signupForTest(){ } + public User signupForTest2(){ + User user = User.createUser(new SignupRequestDto("test@gmail.com",PW,NAME), gradeRepository.findById(1L).orElse(null)); + userRepository.save(user); + return user; + } + public GreenRoom createGreenRoom(User user){ Plant plant = plantRepository.findById(20L).get(); @@ -190,6 +196,22 @@ public GreenRoom createGreenRoom(User user){ return greenRoom; } + public GreenRoom createGreenRoom2(User user){ + + Plant plant = plantRepository.findById(21L).get(); + + GreenRoom greenRoom = GreenRoom.of("test그린룸22",null,user,plant); + + greenRoomRepository.save(greenRoom); + + Todo todo = Todo.builder().greenRoom(greenRoom).activity(activityRepository.findAll().get(0)).nextTodoDate(LocalDate.now().plusDays(8)).term(10).baseDate(LocalDate.now().minusDays(2)).build(); + todoRepository.save(todo); + + adornmentRepository.save(Adornment.createAdornment(itemRepository.findAll().get(0),greenRoom)); + + return greenRoom; + } + public GreenRoom createGreenRoomForCalender(User user){ Plant plant = plantRepository.findById(20L).get(); @@ -305,10 +327,18 @@ private MockMultipartFile getInvalidTestMultiPartFile (){ parameterWithName("nickname").description("중복을 확인할 nickname") ); + private final List queryParametersForDiaryList = List.of( + parameterWithName("date").description("일기를 조회할 날짜(연도-월) : YYYY-MM") + ); + private final List pathParameterForGreenroomId = List.of( parameterWithName("greenroom_id").description("그린룸 id") ); + private final List pathParameterForDiary = List.of( + parameterWithName("diary_id").description("일기 고유 id") + ); + List requestPartDescriptorsForGreenroomRegistration = List.of( partWithName("imageFile").description("식물 이미지 파일").attributes(new Attributes.Attribute("content-type","image/*")), partWithName("data").description("그린룸 등록 정보").attributes(new Attributes.Attribute("content-type","application/json")) @@ -522,9 +552,12 @@ private MockMultipartFile getInvalidTestMultiPartFile (){ ).attributes(new Attributes.Attribute("constraint","과거 날짜 조회시 이미 완료된 활동 내역이므로 null")), fieldWithPath("data.mainInfo[].diary").type(JsonFieldType.ARRAY).description("활동 정보 및 일기 내역").optional().attributes(new Attributes.Attribute("constraint","일기 내역이 없는 경우 빈 배열")), fieldWithPath("data.mainInfo[].diary[].diaryId").type(JsonFieldType.NUMBER).description("일기 id"), + fieldWithPath("data.mainInfo[].diary[].greenroomId").type(JsonFieldType.NUMBER).description("그린룸 id"), + fieldWithPath("data.mainInfo[].diary[].greenroomName").type(JsonFieldType.STRING).description("그린룸 별명"), fieldWithPath("data.mainInfo[].diary[].title").type(JsonFieldType.STRING).description("일기 제목"), fieldWithPath("data.mainInfo[].diary[].body").type(JsonFieldType.STRING).description("일기 본문"), - fieldWithPath("data.mainInfo[].diary[].imageUrl").type(JsonFieldType.STRING).description("일기에 등록한 이미지 url").optional().attributes(new Attributes.Attribute("constraint","등록한 이미지가 없을 경우 null"))); + fieldWithPath("data.mainInfo[].diary[].imageUrl").type(JsonFieldType.STRING).description("일기에 등록한 이미지 url").optional().attributes(new Attributes.Attribute("constraint","등록한 이미지가 없을 경우 null")), + fieldWithPath("data.mainInfo[].diary[].dateTime").type(JsonFieldType.STRING).description("일기 작성 날짜 및 시간 : YYYY-MM-DDTHH:MM:SS")); List resultDescriptorsForDiaryCreation = List.of( @@ -533,11 +566,44 @@ private MockMultipartFile getInvalidTestMultiPartFile (){ fieldWithPath("data").type(JsonFieldType.OBJECT).optional().description("data"), fieldWithPath("data.diaryId").type(JsonFieldType.NUMBER).description("새롭게 생성된 다이어리 고유 id"), fieldWithPath("data.greenroomId").type(JsonFieldType.NUMBER).description("그린룸 id"), - fieldWithPath("data.greenroomName").type(JsonFieldType.STRING).description("그린룸 별명").optional(), + fieldWithPath("data.greenroomName").type(JsonFieldType.STRING).description("그린룸 별명"), + fieldWithPath("data.title").type(JsonFieldType.STRING).description("일기 제목"), + fieldWithPath("data.content").type(JsonFieldType.STRING).description("일기 본문"), + fieldWithPath("data.imageUrl").type(JsonFieldType.STRING).description("일기 이미지").optional().attributes(new Attributes.Attribute("constraint","등록된 이미지가 없으면 null")), + fieldWithPath("data.dateTime").type(JsonFieldType.STRING).description("일기 작성 날짜 및 시간 : YYYY-MM-DDTHH:MM:SS") + ); + + List resultDescriptorsForDiaryList = List.of( + fieldWithPath("status").type(JsonFieldType.STRING).description("응답 상태"), + fieldWithPath("code").type(JsonFieldType.STRING).description("상태 코드"), + fieldWithPath("data").type(JsonFieldType.OBJECT).optional().description("data"), + fieldWithPath("data.diaryList").type(JsonFieldType.ARRAY).optional().description("날짜 별 일기 목록").attributes(new Attributes.Attribute("constraint","해당 날짜(연도+월)에 등록된 일기가 없으면 빈 배열 반환")), + fieldWithPath("data.diaryList[].dateInfo").type(JsonFieldType.OBJECT).description("일기 작성된 날짜"), + fieldWithPath("data.diaryList[].dateInfo.year").type(JsonFieldType.NUMBER).description("일기 작성 연도"), + fieldWithPath("data.diaryList[].dateInfo.month").type(JsonFieldType.NUMBER).description("일기 작성 월"), + fieldWithPath("data.diaryList[].dateInfo.date").type(JsonFieldType.NUMBER).description("일기 작성 일자"), + fieldWithPath("data.diaryList[].dateInfo.day").type(JsonFieldType.STRING).description("일기 작성 요일"), + fieldWithPath("data.diaryList[].diaryInfo").type(JsonFieldType.ARRAY).description("날짜 별 작성된 일기 목록"), + fieldWithPath("data.diaryList[].diaryInfo[].diaryId").type(JsonFieldType.NUMBER).description("일기 id"), + fieldWithPath("data.diaryList[].diaryInfo[].greenroomId").type(JsonFieldType.NUMBER).description("그린룸 id"), + fieldWithPath("data.diaryList[].diaryInfo[].greenroomName").type(JsonFieldType.STRING).description("그린룸 이름"), + fieldWithPath("data.diaryList[].diaryInfo[].title").type(JsonFieldType.STRING).description("일기 제목"), + fieldWithPath("data.diaryList[].diaryInfo[].content").type(JsonFieldType.STRING).description("일기 본문"), + fieldWithPath("data.diaryList[].diaryInfo[].imageUrl").type(JsonFieldType.STRING).description("일기 이미지 url").optional().attributes(new Attributes.Attribute("constraint","등록된 이미지가 없으면 null")), + fieldWithPath("data.diaryList[].diaryInfo[].dateTime").type(JsonFieldType.STRING).description("일기 작성 날짜 및 시간 : YYYY-MM-DDTHH:MM:SS") + ); + + List resultDescriptorsForDiary = List.of( + fieldWithPath("status").type(JsonFieldType.STRING).description("응답 상태"), + fieldWithPath("code").type(JsonFieldType.STRING).description("상태 코드"), + fieldWithPath("data").type(JsonFieldType.OBJECT).optional().description("data"), + fieldWithPath("data.diaryId").type(JsonFieldType.NUMBER).description("새롭게 생성된 다이어리 고유 id"), + fieldWithPath("data.greenroomId").type(JsonFieldType.NUMBER).description("그린룸 id"), + fieldWithPath("data.greenroomName").type(JsonFieldType.STRING).description("그린룸 별명"), fieldWithPath("data.title").type(JsonFieldType.STRING).description("일기 제목"), fieldWithPath("data.content").type(JsonFieldType.STRING).description("일기 본문"), fieldWithPath("data.imageUrl").type(JsonFieldType.STRING).description("일기 이미지").optional().attributes(new Attributes.Attribute("constraint","등록된 이미지가 없으면 null")), - fieldWithPath("data.date").type(JsonFieldType.STRING).description("일기 작성 날짜") + fieldWithPath("data.dateTime").type(JsonFieldType.STRING).description("일기 작성 날짜 및 시간 : YYYY-MM-DDTHH:MM:SS") ); @@ -1699,4 +1765,150 @@ private RestDocumentationResultHandler getDocumentForDiaryCreation(Integer ident } + private ResultActions getResultActionsForDiaryList(String date) throws Exception { + + String token = getTokenForTest((long) (10*1000)); + + return mockMvc.perform( // api 실행 + RestDocumentationRequestBuilders + .get("/api/greenroom/diaries") + .param("date",date) + .header(HttpHeaders.AUTHORIZATION, "Bearer "+token)); + } + + private RestDocumentationResultHandler getDocumentForDiaryList(Integer identifier){ + return document("api/greenroom/diaries/"+identifier, + preprocessRequest(prettyPrint(),modifyUris().scheme("https").host("greenroom-server.site").removePort()), // (2) + preprocessResponse(prettyPrint(), getModifiedHeader()), // (3) + queryParameters(queryParametersForDiaryList), + responseFields(resultDescriptorsForDiaryList), // responseBody 설명 + requestHeaders(headerWithName("Authorization").description("Bearer : 사용자 access Token")), + resource( + ResourceSnippetParameters.builder() + .tag("그린룸") // 문서에서 api들이 태그로 분류됨 + .summary("연도/월 별 작성된 일기 조회 api") // api 이름 + .description("특정 연도-월에 작성된 모든 일기 목록을 조회함.") // api 설명 + .build())); + } + + @Test + @Transactional + public void 일기목록_조회_성공() throws Exception { + //given + + //test용 data 생성 + + User user =signupForTest(); + GreenRoom greenRoom = createGreenRoom(user); + GreenRoom greenRoom1 = createGreenRoom2(user); + + + Diary diary1 = Diary.createDiary("일기제목111","일기 본문111",greenRoom,null,LocalDate.of(2025,4,5)); diary1.updateCreateDate(LocalDateTime.now()); + Diary diary2 = Diary.createDiary("일기제목222","일기 본문222",greenRoom,null,LocalDate.of(2025,4,3));diary2.updateCreateDate(LocalDateTime.now()); + Diary diary3 = Diary.createDiary("일기제목333","일기 본문333",greenRoom1,null,LocalDate.of(2025,4,2));diary3.updateCreateDate(LocalDateTime.now()); + Diary diary4 = Diary.createDiary("일기제목444","일기 본문444",greenRoom1,null,LocalDate.of(2025,4,3));diary4.updateCreateDate(LocalDateTime.now()); + + diaryRepository.save(diary1);diaryRepository.save(diary2);diaryRepository.save(diary3);diaryRepository.save(diary4); + + //when + ResultActions resultActions = getResultActionsForDiaryList("2025-04"); + + //then + resultActions.andExpect(status().isOk()); + + //문서화 + resultActions.andDo(getDocumentForDiaryList(1)); + + } + + + private ResultActions getResultActionsForDiary(Long diaryId) throws Exception { + + String token = getTokenForTest((long) (10*1000)); + return mockMvc.perform( // api 실행 + RestDocumentationRequestBuilders + .get("/api/greenroom/diaries/{diary_id}",diaryId) + .header(HttpHeaders.AUTHORIZATION, "Bearer "+token)); + } + + private RestDocumentationResultHandler getDocumentForDiary(Integer identifier){ + return document("api/greenroom/diaries/specific/"+identifier, + preprocessRequest(prettyPrint(),modifyUris().scheme("https").host("greenroom-server.site").removePort()), + preprocessResponse(prettyPrint(), getModifiedHeader()), + pathParameters(pathParameterForDiary), + responseFields(resultDescriptorsForDiary), // responseBody 설명 + requestHeaders(headerWithName("Authorization").description("Bearer : 사용자 access Token")), + resource(ResourceSnippetParameters.builder() + .tag("그린룸") // 문서에서 api들이 태그로 분류됨 + .summary("일기 상세 조회 api") // api 이름 + .description("특정 일기를 상세 조회함.") // api 설명 + .build())); + } + + @Test + @Transactional + public void 일기_조회_성공() throws Exception { + //given + + //test용 data 생성 + User user =signupForTest(); + GreenRoom greenRoom = createGreenRoom(user); + + Diary diary = Diary.createDiary("일기제목111","일기 본문111",greenRoom,null,LocalDate.of(2025,4,5)); + diary.updateCreateDate(LocalDateTime.now()); + diaryRepository.save(diary); + //when + ResultActions resultActions = getResultActionsForDiary(diary.getDiaryId()); + + //then + resultActions.andExpect(status().isOk()); + + //문서화 + resultActions.andDo(getDocumentForDiary(1)); + + } + + @Test + @Transactional + public void 일기_조회_실패1() throws Exception { + //given + + //test용 data 생성 + User user =signupForTest(); + GreenRoom greenRoom = createGreenRoom(user); + + //when + ResultActions resultActions = getResultActionsForDiary(10L); + + //then + resultActions.andExpect(status().is(ResponseCodeEnum.DIARY_NOT_FOUND.getStatus().value())).andExpect(jsonPath("code").value(ResponseCodeEnum.DIARY_NOT_FOUND.getCode())); + + //문서화 + resultActions.andDo(getDocumentForDiary(2)); + + } + + @Test + @Transactional + public void 일기_조회_실패2() throws Exception { + //given + + //test용 data 생성 + User user =signupForTest2(); + GreenRoom greenRoom = createGreenRoom(user); + Diary diary = Diary.createDiary("일기제목111","일기 본문111",greenRoom,null,LocalDate.of(2025,4,5)); + diary.updateCreateDate(LocalDateTime.now()); + diaryRepository.save(diary); + + //when + ResultActions resultActions = getResultActionsForDiary(diary.getDiaryId()); + + //then + resultActions.andExpect(status().is(ResponseCodeEnum.NOT_AUTHORIZATION.getStatus().value())).andExpect(jsonPath("code").value(ResponseCodeEnum.NOT_AUTHORIZATION.getCode())); + + //문서화 + resultActions.andDo(getDocumentForDiary(3)); + + } + }