Skip to content

Commit d641f00

Browse files
authored
Merge pull request #107 from Team-Wable/feat/#106
[FEAT] curation with title thumbnail
2 parents aeb23b8 + 7fa7c0a commit d641f00

File tree

7 files changed

+58
-9
lines changed

7 files changed

+58
-9
lines changed

WableServer/build.gradle

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,9 +63,13 @@ dependencies {
6363
implementation("software.amazon.awssdk:bom:2.21.0")
6464
implementation("software.amazon.awssdk:s3:2.21.0")
6565

66-
//FCM sdk
66+
//* FCM sdk
6767
implementation 'com.google.firebase:firebase-admin:9.2.0'
6868

69+
//* Curation Link meta doc
70+
implementation 'org.jsoup:jsoup:1.17.2'
71+
72+
6973
testImplementation 'org.springframework.boot:spring-boot-starter-test'
7074
}
7175

WableServer/src/main/java/com/wable/www/WableServer/api/curation/controller/CurationController.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,8 @@ public class CurationController {
3030

3131
@GetMapping("v1/curation")
3232
@Operation(summary = "큐레이션 목록 조회 API 입니다.",description = "Curation List Get")
33-
public ResponseEntity<ApiResponse<List<CurationGetAllResponseDto>>> getCurationAll(Principal principal,
34-
@RequestParam(value = "cursor") Long cursor) {
35-
return ApiResponse.success(GET_CURATION_ALL_SUCCESS, curationQueryService.getCurationAll(MemberUtil.getMemberId(principal), cursor));
33+
public ResponseEntity<ApiResponse<List<CurationGetAllResponseDto>>> getCurationAll(@RequestParam(value = "cursor") Long cursor) {
34+
return ApiResponse.success(GET_CURATION_ALL_SUCCESS, curationQueryService.getCurationAll(cursor));
3635
}
3736

3837
@GetMapping("v1/curation/number")

WableServer/src/main/java/com/wable/www/WableServer/api/curation/domain/Curation.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,16 @@ public class Curation extends BaseTimeEntity {
1919
@Column(name = "curation_link")
2020
private String curationLink;
2121

22+
@Column(name = "curation_title")
23+
private String curationTitle;
24+
25+
@Column(name = "curation_thumbnail", length = 1000)
26+
private String curationThumbnail;
27+
2228
@Builder
23-
public Curation(Long memberId, String curationLink) {
29+
public Curation(Long memberId, String curationLink, String curationTitle, String curationThumbnail) {
2430
this.curationLink = curationLink;
31+
this.curationTitle = curationTitle;
32+
this.curationThumbnail = curationThumbnail;
2533
}
2634
}

WableServer/src/main/java/com/wable/www/WableServer/api/curation/dto/response/CurationGetAllResponseDto.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,16 @@
66
public record CurationGetAllResponseDto(
77
Long curationId,
88
String curationLink,
9+
String curationTitle,
10+
String curationThumbnail,
911
String time
1012
) {
1113
public static CurationGetAllResponseDto of(Curation curation, String time) {
1214
return new CurationGetAllResponseDto(
1315
curation.getId(),
1416
curation.getCurationLink(),
17+
curation.getCurationTitle(),
18+
curation.getCurationThumbnail(),
1519
time
1620
);
1721
}

WableServer/src/main/java/com/wable/www/WableServer/api/curation/service/CurationCommandService.java

Lines changed: 36 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,12 @@
33
import com.wable.www.WableServer.api.curation.domain.Curation;
44
import com.wable.www.WableServer.api.curation.dto.request.CurationPostRequestDto;
55
import com.wable.www.WableServer.api.curation.repository.CurationRepository;
6+
import com.wable.www.WableServer.common.exception.BadRequestException;
7+
import com.wable.www.WableServer.common.response.ErrorStatus;
68
import lombok.RequiredArgsConstructor;
9+
import org.jsoup.Jsoup;
10+
import org.jsoup.nodes.Document;
11+
import org.jsoup.nodes.Element;
712
import org.springframework.stereotype.Service;
813
import org.springframework.transaction.annotation.Transactional;
914

@@ -14,8 +19,36 @@ public class CurationCommandService {
1419
private final CurationRepository curationRepository;
1520

1621
public void postCuration(CurationPostRequestDto curationPostRequestDto) {
17-
Curation curation = curationRepository.save(Curation.builder()
18-
.curationLink(curationPostRequestDto.curationLink())
19-
.build());
22+
String link = curationPostRequestDto.curationLink();
23+
24+
// 기본값 (메타 태그 없을 경우 대비)
25+
String title = null;
26+
String thumbnail = null;
27+
28+
try {
29+
Document doc = Jsoup.connect(link).get();
30+
31+
Element ogTitle = doc.selectFirst("meta[property=og:title]");
32+
if (ogTitle != null) {
33+
title = ogTitle.attr("content");
34+
} else if (doc.title() != null) {
35+
title = doc.title();
36+
}
37+
38+
Element ogImage = doc.selectFirst("meta[property=og:image]");
39+
if (ogImage != null) {
40+
thumbnail = ogImage.attr("content");
41+
}
42+
} catch (Exception e) {
43+
throw new BadRequestException(ErrorStatus.CRAWLING_ERROR.getMessage());
44+
}
45+
46+
Curation curation = curationRepository.save(
47+
Curation.builder()
48+
.curationLink(link)
49+
.curationTitle(title)
50+
.curationThumbnail(thumbnail)
51+
.build()
52+
);
2053
}
2154
}

WableServer/src/main/java/com/wable/www/WableServer/api/curation/service/CurationQueryService.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
public class CurationQueryService {
2121
private final CurationRepository curationRepository;
2222

23-
public List<CurationGetAllResponseDto> getCurationAll(Long memberId, Long cursor) {
23+
public List<CurationGetAllResponseDto> getCurationAll(Long cursor) {
2424
PageRequest pageRequest = PageRequest.of(0, 15);
2525
Slice<Curation> curationList;
2626

WableServer/src/main/java/com/wable/www/WableServer/common/response/ErrorStatus.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ public enum ErrorStatus {
5656
* 500 SERVER_ERROR
5757
*/
5858
INTERNAL_SERVER_ERROR("예상치 못한 서버 에러가 발생했습니다."),
59+
CRAWLING_ERROR("데이터 크롤링에 에러가 발생했습니다."),
5960
BAD_GATEWAY_EXCEPTION("일시적인 에러가 발생하였습니다.\n잠시 후 다시 시도해주세요!");
6061

6162
private final String message;

0 commit comments

Comments
 (0)