From b054a055e68cec90938c49af5813241ef4c211bf Mon Sep 17 00:00:00 2001 From: dayoung030303 Date: Mon, 21 Jul 2025 15:15:33 +0900 Subject: [PATCH] =?UTF-8?q?=EA=B3=B5=EC=9C=A0=EB=90=9C=20=EC=8A=A4?= =?UTF-8?q?=ED=8E=98=EC=9D=B4=EC=8A=A4=EC=9D=98=20=EC=B9=B4=EB=93=9C=20?= =?UTF-8?q?=EB=AA=A9=EB=A1=9D=20=EC=A1=B0=ED=9A=8C,=20=EA=B7=B8=EB=9E=98?= =?UTF-8?q?=ED=94=84=20=EC=A1=B0=ED=9A=8C=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../card/controller/ShareCardController.java | 35 +++++++++++++ .../domain/dto/response/CardlinkResponse.java | 2 + .../dto/response/CardshareResponse.java | 25 +++++++++ .../card/repository/CardRepository.java | 2 + .../card/service/CardService.java | 52 +++++++++++++++++-- .../controller/ShareGraphController.java | 24 +++++++++ .../dto/response/GraphShareResponse.java | 17 ++++++ .../graph/service/GraphService.java | 31 ++++++++++- .../space/repository/SpaceRepository.java | 1 + 9 files changed, 184 insertions(+), 5 deletions(-) create mode 100644 src/main/java/com/example/gp_backend_data/card/controller/ShareCardController.java create mode 100644 src/main/java/com/example/gp_backend_data/card/domain/dto/response/CardshareResponse.java create mode 100644 src/main/java/com/example/gp_backend_data/graph/controller/ShareGraphController.java create mode 100644 src/main/java/com/example/gp_backend_data/graph/domain/dto/response/GraphShareResponse.java diff --git a/src/main/java/com/example/gp_backend_data/card/controller/ShareCardController.java b/src/main/java/com/example/gp_backend_data/card/controller/ShareCardController.java new file mode 100644 index 0000000..4b4ecc4 --- /dev/null +++ b/src/main/java/com/example/gp_backend_data/card/controller/ShareCardController.java @@ -0,0 +1,35 @@ +package com.example.gp_backend_data.card.controller; + +import com.example.gp_backend_data.card.domain.dto.response.CardCreateResponse; +import com.example.gp_backend_data.card.domain.dto.response.CardshareResponse; +import com.example.gp_backend_data.card.service.CardService; +import jakarta.persistence.EntityNotFoundException; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.UUID; + +@RestController +@RequestMapping("/share") +@RequiredArgsConstructor +public class ShareCardController { + + private final CardService cardService; + + @GetMapping("/{sharingId}/cards") + public List getSharedCards( + @PathVariable UUID sharingId, + @RequestParam(defaultValue = "10") int count, + @RequestParam(defaultValue = "1") int page, + @RequestParam(defaultValue = "createdAt") String sortBy) { + + try { + return cardService.getSharedCards(sharingId, count, page, sortBy); + } catch (IllegalArgumentException e) { + throw new IllegalArgumentException("400 Bad Request: " + e.getMessage()); + } catch (EntityNotFoundException e) { + throw new EntityNotFoundException("404 Not Found: " + e.getMessage()); + } + } +} diff --git a/src/main/java/com/example/gp_backend_data/card/domain/dto/response/CardlinkResponse.java b/src/main/java/com/example/gp_backend_data/card/domain/dto/response/CardlinkResponse.java index 87d94e4..d867357 100644 --- a/src/main/java/com/example/gp_backend_data/card/domain/dto/response/CardlinkResponse.java +++ b/src/main/java/com/example/gp_backend_data/card/domain/dto/response/CardlinkResponse.java @@ -1,5 +1,6 @@ package com.example.gp_backend_data.card.domain.dto.response; +import com.example.gp_backend_data.card.domain.entity.Cardlink; import lombok.Builder; import lombok.Getter; @@ -13,4 +14,5 @@ public class CardlinkResponse { private String content; // private int positionStart; // private String contentLength; + } diff --git a/src/main/java/com/example/gp_backend_data/card/domain/dto/response/CardshareResponse.java b/src/main/java/com/example/gp_backend_data/card/domain/dto/response/CardshareResponse.java new file mode 100644 index 0000000..c58160d --- /dev/null +++ b/src/main/java/com/example/gp_backend_data/card/domain/dto/response/CardshareResponse.java @@ -0,0 +1,25 @@ +package com.example.gp_backend_data.card.domain.dto.response; + +import com.example.gp_backend_data.card.domain.entity.Card; +import lombok.*; + +import java.time.LocalDateTime; +import java.util.List; +import java.util.UUID; + +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class CardshareResponse { + private UUID cardId; + private UUID sharingId; + private String title; + //private String color; + private List cardlinks; + private String aiSummary; + //private String userSummary; + private LocalDateTime createdAt; + +} diff --git a/src/main/java/com/example/gp_backend_data/card/repository/CardRepository.java b/src/main/java/com/example/gp_backend_data/card/repository/CardRepository.java index 7260671..099ba33 100644 --- a/src/main/java/com/example/gp_backend_data/card/repository/CardRepository.java +++ b/src/main/java/com/example/gp_backend_data/card/repository/CardRepository.java @@ -24,4 +24,6 @@ public interface CardRepository extends JpaRepository { // List findTodayCreatedCards(); @Query("SELECT c FROM Card c WHERE c.createdAt >= :start AND c.createdAt < :end") List findCardsCreatedBetween(@Param("start") LocalDateTime start, @Param("end") LocalDateTime end); + @Query("SELECT c FROM Card c WHERE c.spaceId = :spaceId ORDER BY c.createdAt DESC") + Page findBySpaceIdOrderByCreatedAtDesc(@Param("spaceId") byte[] spaceId, Pageable pageable); } diff --git a/src/main/java/com/example/gp_backend_data/card/service/CardService.java b/src/main/java/com/example/gp_backend_data/card/service/CardService.java index 5c8072a..d36cca7 100644 --- a/src/main/java/com/example/gp_backend_data/card/service/CardService.java +++ b/src/main/java/com/example/gp_backend_data/card/service/CardService.java @@ -2,10 +2,7 @@ import com.example.gp_backend_data.card.domain.dto.request.CardCreateRequest; import com.example.gp_backend_data.card.domain.dto.request.CardUpdateRequest; -import com.example.gp_backend_data.card.domain.dto.response.CardlinkResponse; -import com.example.gp_backend_data.card.domain.dto.response.CardCreateResponse; -import com.example.gp_backend_data.card.domain.dto.response.CardListResponse; -import com.example.gp_backend_data.card.domain.dto.response.CardResponse; +import com.example.gp_backend_data.card.domain.dto.response.*; import com.example.gp_backend_data.card.domain.entity.Card; import com.example.gp_backend_data.card.repository.CardlinkRepository; import com.example.gp_backend_data.card.repository.CardRepository; @@ -144,6 +141,53 @@ public List getCardsBySpace(UUID spaceId, int count, int pag .collect(Collectors.toList()); } + //공유된 스페이스의 지식카드 목록 조회 + @Transactional(readOnly = true) + public List getSharedCards(UUID sharingId, int count, int page, String sortBy) { + if (!"createdAt".equals(sortBy)) { + throw new IllegalArgumentException("400 Bad Request: Invalid sortBy value"); + } + + Space space = spaceRepository.findBySharingIdAndIsShared(uuidHelper.convertUUIDToByteArray(sharingId), true) + .orElseThrow(() -> new EntityNotFoundException("Shared space not found.")); + + Pageable pageable = PageRequest.of(page - 1, count); + Page cards = cardRepository.findBySpaceIdOrderByCreatedAtDesc(space.getSpaceId(), pageable); + + + if (page == 1 && cards.isEmpty()) { + throw new EntityNotFoundException("404 Not Found: No cards available for this spaceId"); + } + + if (cards.isEmpty()) { + throw new ResponseStatusException(NO_CONTENT, "No more items available"); + } + + return cards.getContent().stream() + .map(card -> { + List cardlinks = cardlinkRepository.findByCard_CardId(card.getCardId()).stream() + .map(cardlink -> CardlinkResponse.builder() + .cardlinkId(uuidHelper.convertByteArrayToUUID(cardlink.getCardlinkId())) + .chatId(uuidHelper.convertByteArrayToUUID(cardlink.getChatId())) + .content(cardlink.getContent()) + //.positionStart(cardlink.getPositionStart()) + //.contentLength(cardlink.getContentLength()) + .build()) + .toList(); + return CardshareResponse.builder() + .cardId(uuidHelper.convertByteArrayToUUID(card.getCardId())) + .sharingId(sharingId) + .title(card.getTitle()) + //.color(uuidHelper.convertBytesToHex(card.getColor())) + .cardlinks(cardlinks) + .aiSummary(card.getAiSummary()) + .createdAt(card.getCreatedAt()) + .build(); + }) + .collect(Collectors.toList()); + + } + //지식카드 정보 수정 @Transactional public CardResponse updateCard(UUID cardId, CardUpdateRequest request) { diff --git a/src/main/java/com/example/gp_backend_data/graph/controller/ShareGraphController.java b/src/main/java/com/example/gp_backend_data/graph/controller/ShareGraphController.java new file mode 100644 index 0000000..8613892 --- /dev/null +++ b/src/main/java/com/example/gp_backend_data/graph/controller/ShareGraphController.java @@ -0,0 +1,24 @@ +package com.example.gp_backend_data.graph.controller; + +import com.example.gp_backend_data.graph.domain.dto.response.GraphResponse; +import com.example.gp_backend_data.graph.domain.dto.response.GraphShareResponse; +import com.example.gp_backend_data.graph.service.GraphService; +import lombok.RequiredArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.UUID; + +@RestController +@RequestMapping("/share") +@RequiredArgsConstructor +public class ShareGraphController { + + private final GraphService graphService; + + @GetMapping("/{sharingId}/graphs") + public ResponseEntity getShareGraph(@PathVariable UUID sharingId) { + GraphShareResponse response = graphService.getSharedGraph(sharingId); + return ResponseEntity.ok(response); + } +} diff --git a/src/main/java/com/example/gp_backend_data/graph/domain/dto/response/GraphShareResponse.java b/src/main/java/com/example/gp_backend_data/graph/domain/dto/response/GraphShareResponse.java new file mode 100644 index 0000000..146be65 --- /dev/null +++ b/src/main/java/com/example/gp_backend_data/graph/domain/dto/response/GraphShareResponse.java @@ -0,0 +1,17 @@ +package com.example.gp_backend_data.graph.domain.dto.response; + +import com.fasterxml.jackson.databind.JsonNode; +import lombok.*; + +import java.util.UUID; + +@Getter +@Setter +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class GraphShareResponse { + private UUID graphId; + private UUID sharingId; + private JsonNode items; +} diff --git a/src/main/java/com/example/gp_backend_data/graph/service/GraphService.java b/src/main/java/com/example/gp_backend_data/graph/service/GraphService.java index 1009dff..58a1c64 100644 --- a/src/main/java/com/example/gp_backend_data/graph/service/GraphService.java +++ b/src/main/java/com/example/gp_backend_data/graph/service/GraphService.java @@ -2,10 +2,14 @@ import com.example.gp_backend_data.graph.domain.dto.request.GraphRequest; import com.example.gp_backend_data.graph.domain.dto.response.GraphResponse; +import com.example.gp_backend_data.graph.domain.dto.response.GraphShareResponse; import com.example.gp_backend_data.graph.domain.entity.Graph; import com.example.gp_backend_data.graph.repository.GraphRepository; +import com.example.gp_backend_data.space.domain.entity.Space; +import com.example.gp_backend_data.space.repository.SpaceRepository; import com.example.gp_backend_data.utils.UUIDHelper; import com.fasterxml.jackson.databind.ObjectMapper; +import jakarta.persistence.EntityNotFoundException; import lombok.RequiredArgsConstructor; import org.springframework.dao.DataIntegrityViolationException; import org.springframework.stereotype.Service; @@ -19,6 +23,7 @@ @Transactional public class GraphService { private final GraphRepository graphRepository; + private final SpaceRepository spaceRepository; private final ObjectMapper objectMapper; private final UUIDHelper uuidHelper; @@ -41,6 +46,28 @@ public GraphResponse getGraphBySpaceId(UUID spaceId) { } } + //공유된 스페이스의 그래프 조회 + @Transactional + public GraphShareResponse getSharedGraph(UUID sharingId) { + + Space space = spaceRepository.findBySharingIdAndIsShared(uuidHelper.convertUUIDToByteArray(sharingId), true) + .orElseThrow(() -> new EntityNotFoundException("Shared space not found.")); + + Graph graph = graphRepository.findBySpaceId(space.getSpaceId()) + .orElseThrow(() -> new EntityNotFoundException("Graph not found for shared space.")); + + try { + return new GraphShareResponse( + uuidHelper.convertByteArrayToUUID(graph.getGraphId()), + sharingId, + objectMapper.readTree(graph.getData()) + ); + } catch (Exception e) { + throw new RuntimeException("Error parsing graph data", e); + } + } + + private Graph createNewGraphForSpace(byte[] spaceIdBytes) { try { UUID newGraphId = UUID.randomUUID(); @@ -90,5 +117,7 @@ public GraphResponse updateGraph(UUID graphId, GraphRequest request) { } return new GraphResponse(uuidHelper.convertByteArrayToUUID(graph.getGraphId()), uuidHelper.convertByteArrayToUUID(graph.getSpaceId()), request.getItems()); + } -} + +} \ No newline at end of file diff --git a/src/main/java/com/example/gp_backend_data/space/repository/SpaceRepository.java b/src/main/java/com/example/gp_backend_data/space/repository/SpaceRepository.java index 96e7628..f493346 100644 --- a/src/main/java/com/example/gp_backend_data/space/repository/SpaceRepository.java +++ b/src/main/java/com/example/gp_backend_data/space/repository/SpaceRepository.java @@ -13,4 +13,5 @@ public interface SpaceRepository extends JpaRepository { List findAllByUserId(byte[] userId, Sort sort); Optional findBySpaceIdAndUserId(byte[] spaceId, byte[] userId); List findByUserId(byte[] userId); + Optional findBySharingIdAndIsShared(byte[] sharingId, boolean isShared); }