Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@

import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.http.ResponseEntity;

import com.sofa.linkiving.domain.link.dto.request.LinkCreateReq;
import com.sofa.linkiving.domain.link.dto.request.LinkMemoUpdateReq;
Expand All @@ -20,71 +19,72 @@
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.Valid;

@Tag(name = "Link", description = "링크 관리 API")
public interface LinkApi {

@Operation(summary = "메타 정보 수집", description = "URL의 OG 태그를 크롤링하여 메타 정보를 반환합니다")
BaseResponse<MetaScrapeRes> scrapeMetadata(
MetaScrapeReq request,
@Valid MetaScrapeReq request,
Member member
);

@Operation(summary = "URL 중복 체크", description = "저장하려는 URL이 이미 존재하는지 확인하고, 존재 시 linkId를 반환합니다")
ResponseEntity<BaseResponse<LinkDuplicateCheckRes>> checkDuplicate(
BaseResponse<LinkDuplicateCheckRes> checkDuplicate(
String url,
Member member
);

@Operation(summary = "링크 생성", description = "새로운 링크를 저장합니다")
ResponseEntity<BaseResponse<LinkRes>> createLink(
LinkCreateReq request,
BaseResponse<LinkRes> createLink(
@Valid LinkCreateReq request,
Member member
);

@Operation(summary = "링크 수정", description = "링크 정보를 수정합니다. null이 아닌 필드만 수정됩니다.")
ResponseEntity<BaseResponse<LinkRes>> updateLink(
BaseResponse<LinkRes> updateLink(
Long id,
LinkUpdateReq request,
@Valid LinkUpdateReq request,
Member member
);

@Operation(summary = "링크 삭제", description = "링크를 삭제합니다 (Soft Delete)")
ResponseEntity<BaseResponse<Void>> deleteLink(
BaseResponse<Void> deleteLink(
Long id,
Member member
);

@Operation(summary = "링크 조회", description = "링크 상세 정보를 조회합니다")
ResponseEntity<BaseResponse<LinkRes>> getLink(
BaseResponse<LinkRes> getLink(
Long id,
Member member
);

@Operation(summary = "링크 목록 조회", description = "저장된 링크 목록을 페이징하여 조회합니다")
ResponseEntity<BaseResponse<Page<LinkRes>>> getLinkList(
BaseResponse<Page<LinkRes>> getLinkList(
Pageable pageable,
Member member
);

@Operation(summary = "링크 제목 수정", description = "링크 제목만 수정합니다")
ResponseEntity<BaseResponse<LinkRes>> updateTitle(
BaseResponse<LinkRes> updateTitle(
Long id,
LinkTitleUpdateReq request,
@Valid LinkTitleUpdateReq request,
Member member
);

@Operation(summary = "링크 메모 수정", description = "링크 메모만 수정합니다")
ResponseEntity<BaseResponse<LinkRes>> updateMemo(
BaseResponse<LinkRes> updateMemo(
Long id,
LinkMemoUpdateReq request,
@Valid LinkMemoUpdateReq request,
Member member
);

@Operation(summary = "요약 재생성", description = "요약을 재생성 하고 신규 요약 기존 요약, 기존 및 신규 요약 비교 정보을 제공합니다.")
BaseResponse<RecreateSummaryResponse> recreateSummary(
Long id,
@Schema(description = "요청 형식(CONCISE: 간결하게, DETAILED:자세하게)") Format format,
@Valid @Schema(description = "요청 형식(CONCISE: 간결하게, DETAILED:자세하게)") Format format,
Member member
);
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.web.PageableDefault;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PatchMapping;
Expand All @@ -30,7 +29,6 @@
import com.sofa.linkiving.global.common.BaseResponse;
import com.sofa.linkiving.security.annotation.AuthMember;

import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;

@RestController
Expand All @@ -43,7 +41,7 @@ public class LinkController implements LinkApi {
@Override
@PostMapping("/meta-scrape")
public BaseResponse<MetaScrapeRes> scrapeMetadata(
@Valid @RequestBody MetaScrapeReq request,
@RequestBody MetaScrapeReq request,
@AuthMember Member member
) {
MetaScrapeRes response = linkFacade.scrapeMetadata(request.url());
Expand All @@ -52,18 +50,18 @@ public BaseResponse<MetaScrapeRes> scrapeMetadata(

@Override
@GetMapping("/duplicate")
public ResponseEntity<BaseResponse<LinkDuplicateCheckRes>> checkDuplicate(
public BaseResponse<LinkDuplicateCheckRes> checkDuplicate(
@RequestParam String url,
@AuthMember Member member
) {
LinkDuplicateCheckRes response = linkFacade.checkDuplicate(member, url);
return ResponseEntity.ok(BaseResponse.success(response, "URL 중복 체크 완료"));
return BaseResponse.success(response, "URL 중복 체크 완료");
}

@Override
@PostMapping
public ResponseEntity<BaseResponse<LinkRes>> createLink(
@Valid @RequestBody LinkCreateReq request,
public BaseResponse<LinkRes> createLink(
@RequestBody LinkCreateReq request,
@AuthMember Member member
) {
LinkRes response = linkFacade.createLink(
Expand All @@ -73,14 +71,14 @@ public ResponseEntity<BaseResponse<LinkRes>> createLink(
request.memo(),
request.imageUrl()
);
return ResponseEntity.ok(BaseResponse.success(response, "링크 생성 완료"));
return BaseResponse.success(response, "링크 생성 완료");
}

@Override
@PutMapping("/{id}")
public ResponseEntity<BaseResponse<LinkRes>> updateLink(
public BaseResponse<LinkRes> updateLink(
@PathVariable Long id,
@Valid @RequestBody LinkUpdateReq request,
@RequestBody LinkUpdateReq request,
@AuthMember Member member
) {
LinkRes response = linkFacade.updateLink(
Expand All @@ -89,66 +87,66 @@ public ResponseEntity<BaseResponse<LinkRes>> updateLink(
request.title(),
request.memo()
);
return ResponseEntity.ok(BaseResponse.success(response, "링크 수정 완료"));
return BaseResponse.success(response, "링크 수정 완료");
}

@Override
@DeleteMapping("/{id}")
public ResponseEntity<BaseResponse<Void>> deleteLink(
public BaseResponse<Void> deleteLink(
@PathVariable Long id,
@AuthMember Member member
) {
linkFacade.deleteLink(id, member);
return ResponseEntity.ok(BaseResponse.noContent("링크 삭제 완료"));
return BaseResponse.noContent("링크 삭제 완료");
}

@Override
@GetMapping("/{id}")
public ResponseEntity<BaseResponse<LinkRes>> getLink(
public BaseResponse<LinkRes> getLink(
@PathVariable Long id,
@AuthMember Member member
) {
LinkRes response = linkFacade.getLink(id, member);
return ResponseEntity.ok(BaseResponse.success(response, "링크 조회 완료"));
return BaseResponse.success(response, "링크 조회 완료");
}

@Override
@GetMapping
public ResponseEntity<BaseResponse<Page<LinkRes>>> getLinkList(
public BaseResponse<Page<LinkRes>> getLinkList(
@PageableDefault(size = 20) Pageable pageable,
@AuthMember Member member
) {
Page<LinkRes> response = linkFacade.getLinkList(member, pageable);
return ResponseEntity.ok(BaseResponse.success(response, "링크 목록 조회 완료"));
return BaseResponse.success(response, "링크 목록 조회 완료");
}

@Override
@PatchMapping("/{id}/title")
public ResponseEntity<BaseResponse<LinkRes>> updateTitle(
public BaseResponse<LinkRes> updateTitle(
@PathVariable Long id,
@Valid @RequestBody LinkTitleUpdateReq request,
@RequestBody LinkTitleUpdateReq request,
@AuthMember Member member
) {
LinkRes response = linkFacade.updateTitle(id, member, request.title());
return ResponseEntity.ok(BaseResponse.success(response, "제목 수정 완료"));
return BaseResponse.success(response, "제목 수정 완료");
}

@Override
@PatchMapping("/{id}/memo")
public ResponseEntity<BaseResponse<LinkRes>> updateMemo(
public BaseResponse<LinkRes> updateMemo(
@PathVariable Long id,
@Valid @RequestBody LinkMemoUpdateReq request,
@RequestBody LinkMemoUpdateReq request,
@AuthMember Member member
) {
LinkRes response = linkFacade.updateMemo(id, member, request.memo());
return ResponseEntity.ok(BaseResponse.success(response, "메모 수정 완료"));
return BaseResponse.success(response, "메모 수정 완료");
}

@Override
@GetMapping("/{id}/summary")
public BaseResponse<RecreateSummaryResponse> recreateSummary(
@PathVariable Long id,
@Valid @RequestParam Format format,
@RequestParam Format format,
@AuthMember Member member
) {
RecreateSummaryResponse response = linkFacade.recreateSummary(member, id, format);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
import com.sofa.linkiving.domain.link.dto.response.LinkRes;
import com.sofa.linkiving.domain.link.dto.response.MetaScrapeRes;
import com.sofa.linkiving.domain.link.dto.response.RecreateSummaryResponse;
import com.sofa.linkiving.domain.link.entity.Link;
import com.sofa.linkiving.domain.link.enums.Format;
import com.sofa.linkiving.domain.link.service.LinkService;
import com.sofa.linkiving.domain.link.service.SummaryService;
Expand All @@ -28,19 +29,23 @@ public class LinkFacade {
private final SummaryService summaryService;

public LinkRes createLink(Member member, String url, String title, String memo, String imageUrl) {
return linkService.createLink(member, url, title, memo, imageUrl);
Link link = linkService.createLink(member, url, title, memo, imageUrl);
return LinkRes.from(link);
}

public LinkRes updateLink(Long linkId, Member member, String title, String memo) {
return linkService.updateLink(linkId, member, title, memo);
Link link = linkService.updateLink(linkId, member, title, memo);
return LinkRes.from(link);
}

public LinkRes updateTitle(Long linkId, Member member, String title) {
return linkService.updateTitle(linkId, member, title);
Link link = linkService.updateTitle(linkId, member, title);
return LinkRes.from(link);
}

public LinkRes updateMemo(Long linkId, Member member, String memo) {
return linkService.updateMemo(linkId, member, memo);
Link link = linkService.updateMemo(linkId, member, memo);
return LinkRes.from(link);
}

public void deleteLink(Long linkId, Member member) {
Expand All @@ -49,23 +54,27 @@ public void deleteLink(Long linkId, Member member) {

@Transactional(readOnly = true)
public LinkRes getLink(Long linkId, Member member) {
return linkService.getLink(linkId, member);
Link link = linkService.getLink(linkId, member);
return LinkRes.from(link);
}

@Transactional(readOnly = true)
public Page<LinkRes> getLinkList(Member member, Pageable pageable) {
return linkService.getLinkList(member, pageable);
Page<Link> links = linkService.getLinkList(member, pageable);
return links.map(LinkRes::from);
}

@Transactional(readOnly = true)
public LinkDuplicateCheckRes checkDuplicate(Member member, String url) {
return linkService.checkDuplicate(member, url);
return linkService.findLinkIdByUrl(member, url)
.map(LinkDuplicateCheckRes::exists)
.orElse(LinkDuplicateCheckRes.notExists());
}

@Transactional(readOnly = true)
public RecreateSummaryResponse recreateSummary(Member member, Long linkId, Format format) {

String url = linkService.getLink(linkId, member).url();
String url = linkService.getLink(linkId, member).getUrl();

String existingSummary = summaryService.getSummary(linkId).getContent();
String newSummary = summaryService.createSummary(linkId, url, format);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package com.sofa.linkiving.domain.link.service;

import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.sofa.linkiving.domain.link.entity.Link;
import com.sofa.linkiving.domain.link.repository.LinkRepository;
Expand All @@ -10,7 +9,6 @@
import lombok.RequiredArgsConstructor;

@Service
@Transactional
@RequiredArgsConstructor
public class LinkCommandService {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.sofa.linkiving.domain.link.entity.Link;
import com.sofa.linkiving.domain.link.error.LinkErrorCode;
Expand All @@ -18,7 +17,6 @@

@Slf4j
@Service
@Transactional(readOnly = true)
@RequiredArgsConstructor
public class LinkQueryService {

Expand Down
Loading