From fa120e81cb06e40374bb9a5d0193fd9b1932362b Mon Sep 17 00:00:00 2001 From: khsrla9806 Date: Tue, 19 Sep 2023 19:22:49 +0900 Subject: [PATCH 1/5] =?UTF-8?q?Feat:=20=EC=B4=88=EB=8C=80=EC=9E=A5=20?= =?UTF-8?q?=EB=AA=A9=EB=A1=9D=20Controller=20=EB=A9=94=EC=84=9C=EB=93=9C?= =?UTF-8?q?=20=EA=B5=AC=ED=98=84=20(#41)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../invitation/controller/InvitationController.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/main/java/com/livable/server/invitation/controller/InvitationController.java b/src/main/java/com/livable/server/invitation/controller/InvitationController.java index 0a0b88c4..eb3c74c1 100644 --- a/src/main/java/com/livable/server/invitation/controller/InvitationController.java +++ b/src/main/java/com/livable/server/invitation/controller/InvitationController.java @@ -9,6 +9,7 @@ import org.springframework.web.bind.annotation.*; import javax.validation.Valid; +import java.util.List; @RequiredArgsConstructor @RequestMapping("/api/invitation") @@ -34,4 +35,12 @@ public ResponseEntity createInvitation( return invitationService.createInvitation(dto, memberId); } + @GetMapping + public ResponseEntity>> getInvitations() { + + Long memberId = 1L; // TODO: JWT 토큰에서 추출한 값으로 수정 + + return invitationService.getInvitations(memberId); + } + } From e9d97630b3de05773dc36903b80c89f51a61e82d Mon Sep 17 00:00:00 2001 From: khsrla9806 Date: Tue, 19 Sep 2023 19:23:13 +0900 Subject: [PATCH 2/5] =?UTF-8?q?Feat:=20=EC=B4=88=EB=8C=80=EC=9E=A5=20?= =?UTF-8?q?=EB=AA=A9=EB=A1=9D=20=EC=9A=94=EC=B2=AD=20DTO=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84=20(#41)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/invitation/dto/InvitationResponse.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/main/java/com/livable/server/invitation/dto/InvitationResponse.java b/src/main/java/com/livable/server/invitation/dto/InvitationResponse.java index 33631c3c..12accd08 100644 --- a/src/main/java/com/livable/server/invitation/dto/InvitationResponse.java +++ b/src/main/java/com/livable/server/invitation/dto/InvitationResponse.java @@ -1,5 +1,6 @@ package com.livable.server.invitation.dto; +import com.livable.server.entity.Invitation; import com.livable.server.entity.Office; import lombok.*; @@ -60,4 +61,17 @@ private static String getFormattedPlaceName(String name, String floor, String ro return String.format("%s (%s층 %s호)", name, floor, roomNumber); } + @Getter + @AllArgsConstructor + public static class ListDTO { + private Long invitationId; + private String visitorName; + private Long visitorCount; + private String purpose; + private String officeName; + private LocalDate startDate; + private LocalTime startTime; + private LocalTime endTime; + } + } From d9ea821de5e6ab147bcd32a5d71a24f7e69e6ff1 Mon Sep 17 00:00:00 2001 From: khsrla9806 Date: Tue, 19 Sep 2023 19:23:54 +0900 Subject: [PATCH 3/5] =?UTF-8?q?Feat:=20=EC=B4=88=EB=8C=80=EC=9E=A5=20?= =?UTF-8?q?=EB=AA=A9=EB=A1=9D=20Repository=20=EC=83=9D=EC=84=B1=20?= =?UTF-8?q?=EB=B0=8F=20QueryDsl=20=EA=B5=AC=ED=98=84=20(#41)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../repository/InvitationQueryRepository.java | 9 ++++ .../InvitationQueryRepositoryImpl.java | 50 +++++++++++++++++++ .../repository/InvitationRepository.java | 2 +- 3 files changed, 60 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/livable/server/invitation/repository/InvitationQueryRepository.java create mode 100644 src/main/java/com/livable/server/invitation/repository/InvitationQueryRepositoryImpl.java diff --git a/src/main/java/com/livable/server/invitation/repository/InvitationQueryRepository.java b/src/main/java/com/livable/server/invitation/repository/InvitationQueryRepository.java new file mode 100644 index 00000000..05b3977b --- /dev/null +++ b/src/main/java/com/livable/server/invitation/repository/InvitationQueryRepository.java @@ -0,0 +1,9 @@ +package com.livable.server.invitation.repository; + +import com.livable.server.invitation.dto.InvitationResponse; + +import java.util.List; + +public interface InvitationQueryRepository { + List findInvitationsByMemberId(Long memberId); +} diff --git a/src/main/java/com/livable/server/invitation/repository/InvitationQueryRepositoryImpl.java b/src/main/java/com/livable/server/invitation/repository/InvitationQueryRepositoryImpl.java new file mode 100644 index 00000000..e2f28772 --- /dev/null +++ b/src/main/java/com/livable/server/invitation/repository/InvitationQueryRepositoryImpl.java @@ -0,0 +1,50 @@ +package com.livable.server.invitation.repository; + +import com.livable.server.entity.QVisitor; +import com.livable.server.invitation.dto.InvitationResponse; +import com.querydsl.core.types.Projections; +import com.querydsl.jpa.JPAExpressions; +import com.querydsl.jpa.impl.JPAQueryFactory; +import lombok.RequiredArgsConstructor; + +import java.util.List; + +import static com.livable.server.entity.QInvitation.invitation; +import static com.livable.server.entity.QVisitor.visitor; + +@RequiredArgsConstructor +public class InvitationQueryRepositoryImpl implements InvitationQueryRepository { + + private final JPAQueryFactory queryFactory; + + @Override + public List findInvitationsByMemberId(Long memberId) { + QVisitor subVisitorForMaxId = new QVisitor("subVisitor"); + QVisitor subVisitor = new QVisitor("subVisitor"); + + return queryFactory + .select(Projections.constructor(InvitationResponse.ListDTO.class, + visitor.invitation.id, + JPAExpressions + .select(subVisitor.name) + .from(subVisitor) + .where(subVisitor.id.eq( + JPAExpressions + .select(subVisitorForMaxId.id.min()) + .from(subVisitorForMaxId) + .where(subVisitorForMaxId.invitation.id.eq(visitor.invitation.id)) + )), + visitor.invitation.id.count(), + invitation.purpose, + invitation.officeName, + invitation.startDate, + invitation.startTime, + invitation.endTime + )) + .from(visitor) + .innerJoin(invitation) + .on(visitor.invitation.id.eq(invitation.id), invitation.member.id.eq(memberId)) + .groupBy(visitor.invitation.id) + .fetch(); + } +} diff --git a/src/main/java/com/livable/server/invitation/repository/InvitationRepository.java b/src/main/java/com/livable/server/invitation/repository/InvitationRepository.java index 176c6ffb..e92a2082 100644 --- a/src/main/java/com/livable/server/invitation/repository/InvitationRepository.java +++ b/src/main/java/com/livable/server/invitation/repository/InvitationRepository.java @@ -3,5 +3,5 @@ import com.livable.server.entity.Invitation; import org.springframework.data.jpa.repository.JpaRepository; -public interface InvitationRepository extends JpaRepository { +public interface InvitationRepository extends JpaRepository, InvitationQueryRepository { } From d8ce032da433e3b687279ad084f2029306ee2bd2 Mon Sep 17 00:00:00 2001 From: khsrla9806 Date: Tue, 19 Sep 2023 19:24:13 +0900 Subject: [PATCH 4/5] =?UTF-8?q?Feat:=20=EC=B4=88=EB=8C=80=EC=9E=A5=20?= =?UTF-8?q?=EB=AA=A9=EB=A1=9D=20Service=20=EB=A1=9C=EC=A7=81=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84=20(#41)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/invitation/service/InvitationService.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/main/java/com/livable/server/invitation/service/InvitationService.java b/src/main/java/com/livable/server/invitation/service/InvitationService.java index 8ab682e7..f7b8f603 100644 --- a/src/main/java/com/livable/server/invitation/service/InvitationService.java +++ b/src/main/java/com/livable/server/invitation/service/InvitationService.java @@ -220,4 +220,12 @@ private void createInvitationReservationMap(List reservations, Invi invitationReservationMapRepository.save(invitationReservationMap); } } + + @Transactional(readOnly = true) + public ResponseEntity>> getInvitations(Long memberId) { + Member member = findMemberById(memberId); + List invitationDTOs = invitationRepository.findInvitationsByMemberId(member.getId()); + + return ApiResponse.success(invitationDTOs, HttpStatus.OK); + } } From e9aebb1cf1f6998cf02c897d4fca0a48905c4ca9 Mon Sep 17 00:00:00 2001 From: khsrla9806 Date: Tue, 19 Sep 2023 19:43:02 +0900 Subject: [PATCH 5/5] =?UTF-8?q?Refactor:=20=EC=B4=88=EB=8C=80=EC=9E=A5=20?= =?UTF-8?q?=EB=AA=A9=EB=A1=9D=20=EC=BF=BC=EB=A6=AC=20=EB=82=A0=EC=A7=9C,?= =?UTF-8?q?=20=EC=A0=95=EB=A0=AC=20=EC=A1=B0=EA=B1=B4=20=EC=B6=94=EA=B0=80?= =?UTF-8?q?=20(#41)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../repository/InvitationQueryRepositoryImpl.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/livable/server/invitation/repository/InvitationQueryRepositoryImpl.java b/src/main/java/com/livable/server/invitation/repository/InvitationQueryRepositoryImpl.java index e2f28772..592774f9 100644 --- a/src/main/java/com/livable/server/invitation/repository/InvitationQueryRepositoryImpl.java +++ b/src/main/java/com/livable/server/invitation/repository/InvitationQueryRepositoryImpl.java @@ -7,6 +7,7 @@ import com.querydsl.jpa.impl.JPAQueryFactory; import lombok.RequiredArgsConstructor; +import java.time.LocalDate; import java.util.List; import static com.livable.server.entity.QInvitation.invitation; @@ -43,8 +44,13 @@ public List findInvitationsByMemberId(Long memberId) )) .from(visitor) .innerJoin(invitation) - .on(visitor.invitation.id.eq(invitation.id), invitation.member.id.eq(memberId)) + .on( + visitor.invitation.id.eq(invitation.id), + invitation.member.id.eq(memberId), + invitation.startDate.goe(LocalDate.now()) + ) .groupBy(visitor.invitation.id) + .orderBy(invitation.startDate.asc(), invitation.startTime.asc()) .fetch(); } }