Skip to content

Commit

Permalink
Merge pull request #125 from 9oormthon-univ/feature/#121
Browse files Browse the repository at this point in the history
✨ [FEAT] 그룹별 방명록 불러오기
  • Loading branch information
20210815 authored Dec 4, 2024
2 parents 93ba975 + 0a96a5b commit 2bc2b55
Show file tree
Hide file tree
Showing 17 changed files with 243 additions and 38 deletions.
1 change: 1 addition & 0 deletions src/main/java/com/carely/backend/code/ErrorCode.java
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ public enum ErrorCode {
CERTIFICATE_FAIL(HttpStatus.NOT_FOUND, "자격증 인증에 실패했습니다."),
HAS_NOT_CERTIFICATE(HttpStatus.NOT_FOUND, "자격증이 존재하지 않는 유저입니다."),
NOT_IDENTITY_USER(HttpStatus.NOT_FOUND, "주민등록번호가 유효하지 않습니다."),
GUESTBOOK_NOT_FOUNT(HttpStatus.NOT_FOUND, "방명록이 존재하지 않습니다."),

NEWS_NOT_FOUND(HttpStatus.NOT_FOUND, "소식을 찾을 수 없습니다."),
CACHE_NOT_FOUND(HttpStatus.NOT_FOUND, "캐시를 찾을 수 없거나 해당 트랜잭션은 이미 실행된 것입니다."),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -116,4 +116,5 @@ public ResponseEntity<ResponseDTO> getGroupUser(@PathVariable("groupId") Long gr
.status(SuccessCode.SUCCESS_RETRIEVE_USER.getStatus().value())
.body(new ResponseDTO<>(SuccessCode.SUCCESS_RETRIEVE_USER, res));
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import com.carely.backend.code.SuccessCode;
import com.carely.backend.controller.docs.GuestBookAPI;
import com.carely.backend.dto.guestBook.RequestGuestBookDTO;
import com.carely.backend.dto.guestBook.ResponseGroupGuestbookDTO;
import com.carely.backend.dto.guestBook.ResponseGuestBookDTO;
import com.carely.backend.dto.response.ResponseDTO;
import com.carely.backend.dto.user.CustomUserDetails;
Expand Down Expand Up @@ -66,4 +67,14 @@ public ResponseEntity<ResponseDTO<?>> deleteGuestBook(@Valid @AuthenticationPrin
.status(SuccessCode.SUCCESS_DELETE_GUESTBOOK.getStatus().value())
.body(new ResponseDTO<>(SuccessCode.SUCCESS_DELETE_GUESTBOOK, null));
}

// 그룹에 속한 방명록 조회
@GetMapping("/guestbook/{groupId}")
public ResponseEntity<ResponseDTO<?>> getGroupGuestbook(@PathVariable Long groupId, @AuthenticationPrincipal CustomUserDetails user) {
List<ResponseGroupGuestbookDTO> res = guestBookService.getGroupGusetbook(groupId, user.getUsername());

return ResponseEntity
.status(SuccessCode.SUCCESS_RETRIEVE_GUESTBOOK.getStatus().value())
.body(new ResponseDTO<>(SuccessCode.SUCCESS_RETRIEVE_GUESTBOOK, res));
}
}
74 changes: 74 additions & 0 deletions src/main/java/com/carely/backend/controller/docs/GuestBookAPI.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,15 @@

import com.carely.backend.dto.chat.ChatRequest;
import com.carely.backend.dto.guestBook.RequestGuestBookDTO;
import com.carely.backend.dto.response.ErrorResponseDTO;
import com.carely.backend.dto.response.ResponseDTO;
import com.carely.backend.dto.user.CustomUserDetails;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.media.Content;
import io.swagger.v3.oas.annotations.media.ExampleObject;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.responses.ApiResponses;
import jakarta.validation.Valid;
import org.springframework.http.ResponseEntity;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
Expand All @@ -29,5 +35,73 @@ public interface GuestBookAPI {

public ResponseEntity<ResponseDTO<?>> deleteGuestBook(@Valid @AuthenticationPrincipal CustomUserDetails user, @PathVariable Long id);

@Operation(summary = "그룹 방명록 불러오기", description = "group_id에 있는 방명록을 모두 불러옵니다.")
@ApiResponses(value = {
@ApiResponse(responseCode = "201", description = "그룹을 성공적으로 생성했을 경우",
content = @Content(mediaType = "application/json",
schema = @Schema(implementation = ResponseDTO.class),
examples = @ExampleObject(value = """
{
"status": 201,
"code": "SUCCESS_CREATE_GROUP",
"message": "그룹을 성공적으로 생성했습니다.",
"data": {
"groupId": 2,
"groupName": "그룹이름",
"city": "도봉구",
"description": "상세 설명",
"schedule": "스케쥴",
"headCount": 0,
"userType": "VOLUNTEER",
"groupImage": "https://groomcaregiver.s3.ap-northeast-2.amazonaws.com/group/d9ef4300-6bfb-4315-9023-7093c4236901"
}
}
"""))),

@ApiResponse(responseCode = "401", description = "잘못된 토큰으로 요청할 경우",
content = @Content(mediaType = "application/json",
schema = @Schema(implementation = ErrorResponseDTO.class),
examples = {
@ExampleObject(name = "INVALID_ACCESS_TOKEN", value = """
{
"status": 401,
"code": "INVALID_ACCESS_TOKEN",
"message": "유효하지 않은 토큰입니다.",
"data": null
}
"""),
@ExampleObject(name = "TOKEN_EXPIRED", value = """
{
"status": 401,
"code": "TOKEN_EXPIRED",
"message": "토큰이 만료되었습니다.",
"data": null
}
"""),
@ExampleObject(name = "TOKEN_MISSING", value = """
{
"status": 401,
"code": "TOKEN_MISSING",
"message": "요청 헤더에 토큰이 없습니다.",
"data": null
}
""")
})),

@ApiResponse(responseCode = "404", description = "존재하지 않는 access Token으로 요청할 경우",
content = @Content(mediaType = "application/json",
schema = @Schema(implementation = ErrorResponseDTO.class),
examples = {
@ExampleObject(value = """
{
"status": 404,
"code": "USER_NOT_FOUND",
"message": "사용자를 찾을 수 없습니다.",
"data": null
}
""")
}))
})
public ResponseEntity<ResponseDTO<?>> getGroupGuestbook(@PathVariable Long groupId, @AuthenticationPrincipal CustomUserDetails user);

}
6 changes: 6 additions & 0 deletions src/main/java/com/carely/backend/domain/Group.java
Original file line number Diff line number Diff line change
Expand Up @@ -41,5 +41,11 @@ public class Group extends BaseEntity {
@OneToMany(mappedBy = "group", cascade = CascadeType.ALL, orphanRemoval = true)
private Set<Like> likes = new HashSet<>();

@OneToMany(mappedBy = "group", cascade = CascadeType.ALL, orphanRemoval = true)
private Set<Volunteer> volunteerSessions = new HashSet<>();


public void setVolunteerSessions(Volunteer volunteer) {
this.volunteerSessions.add(volunteer);
}
}
24 changes: 14 additions & 10 deletions src/main/java/com/carely/backend/domain/GuestBookEntity.java
Original file line number Diff line number Diff line change
Expand Up @@ -16,20 +16,24 @@ public class GuestBookEntity extends BaseEntity {
private Long id;

// 자원봉사 섹션
@OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinColumn(name = "volunteer_section_id")
@ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinColumn(name = "volunteer_session_id")
private Volunteer volunteerSection;

@Lob
private String content;

// 자원봉사자
@ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinColumn(name = "volunteer_id")
private User volunteer;
private String writerType;

// 간병인
@ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinColumn(name = "caregiver_id")
private User caregiver;


// // 자원봉사자
// @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
// @JoinColumn(name = "volunteer_id")
// private User volunteer;
//
// // 간병인
// @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
// @JoinColumn(name = "caregiver_id")
// private User caregiver;
}
3 changes: 3 additions & 0 deletions src/main/java/com/carely/backend/domain/Volunteer.java
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,9 @@ public class Volunteer extends BaseEntity {
@JoinColumn(name = "caregiver_id")
private User caregiver;

@ManyToOne(cascade = CascadeType.ALL)
private Group group;

// 승인 처리
public void updateVolunteerApproval() {
this.isApproved = true;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package com.carely.backend.dto.guestBook;

import lombok.Builder;
import lombok.Getter;

@Getter
@Builder
public class ResponseGroupGuestbookDTO {
private GuestBookDTO volunteer;
private GuestBookDTO caregiver;

@Getter
@Builder
public static class GuestBookDTO {
private String userType;
private String username;
private String content;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,13 @@ protected ResponseEntity<ErrorResponseDTO> handleNoCertificateUserException(fina
.body(new ErrorResponseDTO(ErrorCode.HAS_NOT_CERTIFICATE));
}

@ExceptionHandler(GuestBookNotFoundException.class)
protected ResponseEntity<ErrorResponseDTO> handleGuestBookNotFoundException(final GuestBookNotFoundException e) {
return ResponseEntity
.status(ErrorCode.GUESTBOOK_NOT_FOUNT.getStatus().value())
.body(new ErrorResponseDTO(ErrorCode.GUESTBOOK_NOT_FOUNT));
}

@ExceptionHandler(ObjectNullException.class)
protected ResponseEntity<ErrorResponseDTO> handleObjectNullException(final ObjectNullException e) {
return ResponseEntity
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.carely.backend.exception;

public class GuestBookNotFoundException extends RuntimeException{
public GuestBookNotFoundException(String message) {
super(message);
}
}
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
package com.carely.backend.repository;

import com.carely.backend.domain.Group;
import com.carely.backend.domain.Volunteer;
import org.springframework.data.jpa.repository.JpaRepository;

import java.util.List;
import java.util.Set;

public interface GroupRepository extends JpaRepository<Group, Long> {
List<Group> findAllByCity(String city);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,16 +6,16 @@
import org.springframework.stereotype.Repository;

import java.util.List;
import java.util.Optional;

@Repository
public interface GuestBookRepository extends JpaRepository<GuestBookEntity, Long> {
//@Query("SELECT g FROM GuestBookEntity g WHERE g.id = :id")
GuestBookEntity findByVolunteerId(Long volunteerId);
GuestBookEntity findByVolunteerSectionId(Long volunteerSectionId);
List<GuestBookEntity> findByCaregiver(User caregiver);
List<GuestBookEntity> findByVolunteer(User volunteer);
Optional<GuestBookEntity> findByVolunteerSectionId(Long volunteerSectionId);

void deleteByVolunteerSectionId(Long volunteerSectionId);

Optional<GuestBookEntity> findByVolunteerSectionIdAndWriterType(Long volunteerSectionId, String writerType);


}
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,19 @@
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

public interface JoinGroupRepository extends JpaRepository<JoinGroup, Long> {
boolean existsByGroupAndUser(Group group, User superUser);
@Modifying
@Transactional
@Query("DELETE FROM JoinGroup jg WHERE jg.group = :group AND jg.user = :user")
void deleteByGroupAndUser(Group group, User user);


@Query("SELECT g FROM JoinGroup g JOIN g.user u1 JOIN g.user u2 WHERE u1.id = :userId1 AND u2.id = :userId2")
List<Group> findCommonGroups(@Param("userId1") Long userId1, @Param("userId2") Long userId2);
}
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,8 @@ public interface VolunteerRepository extends JpaRepository<Volunteer, Long> {

List<Volunteer> findByVolunteerAndHasMemoFalse(User writer);

@Query("SELECT v FROM Volunteer v " +
"WHERE v.caregiver IN (SELECT j.user FROM JoinGroup j WHERE j.group.id = :groupId) " +
"AND v.volunteer IN (SELECT j.user FROM JoinGroup j WHERE j.group.id = :groupId)")
List<Volunteer> findVolunteersInGroup(@Param("groupId") Long groupId);
// @Query("SELECT v FROM Volunteer v " +
// "WHERE v.caregiver IN (SELECT j.user FROM JoinGroup j WHERE j.group.id = :groupId) " +
// "AND v.volunteer IN (SELECT j.user FROM JoinGroup j WHERE j.group.id = :groupId)")
// List<Volunteer> findVolunteersInGroup(@Param("groupId") Long groupId);
}
10 changes: 6 additions & 4 deletions src/main/java/com/carely/backend/service/GroupService.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,13 @@


import com.carely.backend.domain.*;
import com.carely.backend.domain.enums.UserType;
import com.carely.backend.dto.group.CreateGroupDTO;
import com.carely.backend.dto.group.GetGroupDTO;
import com.carely.backend.dto.guestBook.ResponseGroupGuestbookDTO;
import com.carely.backend.dto.guestBook.ResponseGuestBookDTO;
import com.carely.backend.dto.user.UserResponseDTO;
import com.carely.backend.exception.AlreadyInGroupException;
import com.carely.backend.exception.GroupNotFoundException;
import com.carely.backend.exception.NotUserInGroupException;
import com.carely.backend.exception.NotWriterException;
import com.carely.backend.exception.*;
import com.carely.backend.repository.*;
import com.carely.backend.service.s3.S3Uploader;
import lombok.RequiredArgsConstructor;
Expand All @@ -34,6 +34,7 @@ public class GroupService {
private final VolunteerRepository volunteerRepository;
private final LikeRepository likeRepository;
private final NewsRepository newsRepository;
private final GuestBookRepository guestBookRepository;


public CreateGroupDTO.Res createCaregiverGroup(String kakaoId, CreateGroupDTO groupDTO) throws IOException {
Expand Down Expand Up @@ -183,4 +184,5 @@ private Long calculateTotalDurationForGroupUser(User user1, User user2) {
.sum();
}


}
Loading

0 comments on commit 2bc2b55

Please sign in to comment.