66import org .springframework .transaction .annotation .Transactional ;
77
88import com .pinback .application .article .dto .command .ArticleCreateCommand ;
9+ import com .pinback .application .article .dto .response .ArticleMetadataResponse ;
910import com .pinback .application .article .port .in .CreateArticlePort ;
1011import com .pinback .application .article .port .out .ArticleGetServicePort ;
1112import com .pinback .application .article .port .out .ArticleSaveServicePort ;
1415import com .pinback .application .common .exception .MemoLengthLimitException ;
1516import com .pinback .application .notification .port .in .GetPushSubscriptionPort ;
1617import com .pinback .application .notification .port .in .ScheduleArticleReminderPort ;
18+ import com .pinback .application .test .port .out .ArticleMetadataPort ;
1719import com .pinback .domain .article .entity .Article ;
1820import com .pinback .domain .category .entity .Category ;
1921import com .pinback .domain .notification .entity .PushSubscription ;
2022import com .pinback .domain .user .entity .User ;
2123import com .pinback .shared .util .TextUtil ;
2224
2325import lombok .RequiredArgsConstructor ;
26+ import lombok .extern .slf4j .Slf4j ;
2427
28+ @ Slf4j
2529@ Service
2630@ RequiredArgsConstructor
2731@ Transactional
@@ -37,6 +41,8 @@ public class CreateArticleUsecase implements CreateArticlePort {
3741 private final GetPushSubscriptionPort getPushSubscription ;
3842 private final ScheduleArticleReminderPort scheduleArticleReminder ;
3943
44+ private final ArticleMetadataPort articleMetadataPort ;
45+
4046 @ Override
4147 public void createArticle (User user , ArticleCreateCommand command ) {
4248 validateArticleCreation (user , command );
@@ -48,6 +54,26 @@ public void createArticle(User user, ArticleCreateCommand command) {
4854 scheduleReminderIfNeeded (savedArticle , user , command .remindTime ());
4955 }
5056
57+ @ Override
58+ public void createArticleV3 (User user , ArticleCreateCommand command ) {
59+ // 1. url 중복 검증
60+ validateArticleCreation (user , command );
61+
62+ // 2. 메타데이터 가져오기
63+ ArticleMetadataResponse metadata = articleMetadataPort .extractMetadata (command .url ());
64+
65+ // 3.0 로그로 찍어서 확인해보기
66+ log .info ("title: {}, thumbnail: {}" , metadata .title (), metadata .thumbnailUrl ());
67+
68+ // 3. 아티클 저장
69+ Category category = getCategoryPort .getCategoryAndUser (command .categoryId (), user );
70+ // s3에 url 있는지 확인 후 있으면 가져오고, 없으면 저장해서 가져오기
71+ Article article = Article .createWithMetaData (command .url (), command .memo (), user , category ,
72+ command .remindTime (), metadata .title (), metadata .thumbnailUrl ());
73+ Article savedArticle = articleSaveService .save (article );
74+ scheduleReminderIfNeeded (savedArticle , user , command .remindTime ());
75+ }
76+
5177 private void validateArticleCreation (User user , ArticleCreateCommand command ) {
5278 if (articleGetService .checkExistsByUserAndUrl (user , command .url ())) {
5379 throw new ArticleAlreadyExistException ();
0 commit comments