Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat : 광고 생성, 조회 api 추가 #32

Merged
merged 14 commits into from
Mar 1, 2024
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
@@ -0,0 +1,50 @@
package core.kobaco.application.advertise.controller;

import core.kobaco.application.advertise.service.AdvertiseService;
import core.kobaco.application.advertise.service.dto.AdvertiseCreateRequest;
import core.kobaco.application.advertise.service.dto.AdvertiseDetailResponse;
import core.kobaco.application.advertise.service.dto.AdvertiseLikeDetailResponse;
import lombok.RequiredArgsConstructor;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.web.bind.annotation.*;

@RestController
@RequiredArgsConstructor
@RequestMapping("/api/advertises")
public class AdvertiseController {
private final AdvertiseService advertiseService;

@PostMapping
public void createAdvertise(AdvertiseCreateRequest request) {
advertiseService.createAdvertise(request);
}

@GetMapping
public Page<String> getAdvertiseList(Pageable pageable) {
return null;
}

@GetMapping("/{advertiseId}")
public AdvertiseDetailResponse getAdvertise(@PathVariable Long advertiseId) {
return advertiseService.getAdvertise(advertiseId);
}

@PatchMapping("/{advertiseId}/like")
public void likeAdvertise(@PathVariable Long advertiseId) {
advertiseService.likeAdvertise(advertiseId);
}

@GetMapping("/{advertiseId}/like")
public AdvertiseLikeDetailResponse getAdvertiseLikeCount(@PathVariable Long advertiseId) {
return advertiseService.getAdvertiseLikeCount(advertiseId);
}

@PostMapping("/{advertiseId}/save")
public void saveAdvertise(@PathVariable Long advertiseId) {
}

@PostMapping("/{advertiseId}/capture")
public void captureAdvertise(@PathVariable Long advertiseId) {
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
package core.kobaco.application.advertise.service;

import core.kobaco.application.advertise.service.dto.AdvertiseCreateRequest;
import core.kobaco.application.advertise.service.dto.AdvertiseDetailResponse;
import core.kobaco.application.advertise.service.dto.AdvertiseLikeDetailResponse;
import core.kobaco.domain.advertise.service.AdvertiseAppender;
import core.kobaco.domain.advertise.service.AdvertiseLikeManager;
import core.kobaco.domain.advertise.service.AdvertiseReader;
import core.kobaco.domain.keyword.service.KeywordFactory;
import core.kobaco.domain.keyword.service.KeywordReader;
import core.kobaco.domain.user.UserUtils;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;

import java.util.List;

@Service
@RequiredArgsConstructor
@Transactional(readOnly = true)
public class AdvertiseService {
private final UserUtils userUtils;
private final AdvertiseReader advertiseReader;
private final AdvertiseAppender advertiseAppender;
private final KeywordReader keywordReader;
private final KeywordFactory keywordFactory;
private final AdvertiseLikeManager advertiseLikeManager;

@Transactional
public void createAdvertise(AdvertiseCreateRequest request){
final List<Long> keywordIdList = keywordFactory.upsert(request.keywordList());
advertiseAppender.append(request.toDomain(), keywordIdList);
}

public void getAdvertiseList(){

}


public AdvertiseDetailResponse getAdvertise(final Long advertiseId) {
return AdvertiseDetailResponse.of(
advertiseReader.getAdvertise(advertiseId),
advertiseReader.getAdvertiseKeyword(advertiseId)
.stream()
.map(keyword -> keywordReader.getKeyword(keyword.getKeywordId()).getKeyword())
.toList()
);
}

@Transactional
public void likeAdvertise(final Long advertiseId) {
final Long userId = userUtils.getRequestUserId();
advertiseLikeManager.like(advertiseId, userId);
}

public AdvertiseLikeDetailResponse getAdvertiseLikeCount(final Long advertiseId) {
return AdvertiseLikeDetailResponse.of(
advertiseLikeManager.isLike(advertiseId),
advertiseLikeManager.getLikeCount(advertiseId)
);
}

public void saveAdvertise(final Long advertiseId) {
}

public void captureAdvertise(final Long advertiseId, MultipartFile multipartFile) {

}


}
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package core.kobaco.application.advertise.service.dto;

import core.kobaco.domain.advertise.Advertisement;
import core.kobaco.domain.advertise.AdvertisementDetail;

import java.util.List;

public record AdvertiseCreateRequest(
String videoUrl,
String title,
String description,
String copy,
String copyDetail,
List<String> peopleList,
List<String> objectList,
String owner,
String ownerCompany,
String makerCompany,
List<String> keywordList
){
public Advertisement toDomain(){
return Advertisement.of(
null,
videoUrl,
title,
description,
copy,
copyDetail,
AdvertisementDetail.of(
peopleList,
objectList,
owner,
ownerCompany,
makerCompany
)
);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package core.kobaco.application.advertise.service.dto;

import core.kobaco.domain.advertise.Advertisement;
import core.kobaco.domain.advertise.AdvertisementKeyword;

import java.util.List;

public record AdvertiseDetailResponse(
Long advertiseId,
String videoUrl,
String title,
String description,
String copy,
String copyDetail,
List<String> peopleList,
List<String> objectList,
String owner,
String ownerCompany,
String makerCompany,
List<String> keywordList
) {

public static AdvertiseDetailResponse of(Advertisement advertisement, List<String> keywordList){
return new AdvertiseDetailResponse(
advertisement.getAdvertiseId(),
advertisement.getVideoUrl(),
advertisement.getTitle(),
advertisement.getDescription(),
advertisement.getCopy(),
advertisement.getCopyDetail(),
advertisement.getAdvertisementDetail().getPeopleList(),
advertisement.getAdvertisementDetail().getObjectList(),
advertisement.getAdvertisementDetail().getOwner(),
advertisement.getAdvertisementDetail().getOwnerCompany(),
advertisement.getAdvertisementDetail().getMakerCompany(),
keywordList
);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package core.kobaco.application.advertise.service.dto;

import javax.swing.text.StyledEditorKit;

public record AdvertiseLikeDetailResponse(
Boolean isLike,
Long likeCount
) {
public static AdvertiseLikeDetailResponse of(Boolean isLike, Long likeCount) {
return new AdvertiseLikeDetailResponse(isLike, likeCount);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package core.kobaco.application.advertise.service.dto;

import java.util.List;

public record AdvertiseSimpleResponse (
String previewImageUrl,
String title,
List<String> keywords
){
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@

@Slf4j
@RestController
@RequestMapping("/v1/users")
@RequestMapping("/api/users")
@RequiredArgsConstructor
public class UserController {
private final UserService userService;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package core.kobaco.domain.advertise;

import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Getter;

import java.util.List;

@Getter
@AllArgsConstructor(access = AccessLevel.PRIVATE)
public class Advertisement {
private Long advertiseId;
private String videoUrl;
private String title;
private String description;
private String copy;
private String copyDetail;
private AdvertisementDetail advertisementDetail;

public static Advertisement of(Long advertiseId,
String videoUrl,
String title,
String description,
String copy,
String copyDetail,
AdvertisementDetail advertisementDetail) {
return new Advertisement(advertiseId, videoUrl, title, description, copy, copyDetail, advertisementDetail);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package core.kobaco.domain.advertise;

import io.jsonwebtoken.impl.security.PrivateECKey;
import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Getter;

import java.util.List;

@Getter
@AllArgsConstructor(access = AccessLevel.PRIVATE)
public class AdvertisementDetail {
private List<String> peopleList;
private List<String> objectList;
private String owner;
private String ownerCompany;
private String makerCompany;


public static AdvertisementDetail of(List<String> peopleList,
List<String> objectList,
String owner,
String ownerCompany,
String makerCompany) {
return new AdvertisementDetail(peopleList, objectList, owner, ownerCompany, makerCompany);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package core.kobaco.domain.advertise;

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.RequiredArgsConstructor;

@Getter
public class AdvertisementKeyword {
private Long advertiseKeywordId;
private Long advertiseId;
private Long keywordId;

private AdvertisementKeyword(Long advertiseKeywordId, Long advertiseId, Long keywordId) {
this.advertiseKeywordId = advertiseKeywordId;
this.advertiseId = advertiseId;
this.keywordId = keywordId;
}

public static AdvertisementKeyword of(Long advertiseKeywordId, Long advertiseId, Long keywordId) {
return new AdvertisementKeyword(advertiseKeywordId, advertiseId, keywordId);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package core.kobaco.domain.advertise;

import java.util.List;

public interface AdvertisementKeywordRepository {
List<AdvertisementKeyword> findAllByAdvertiseId(Long advertiseId);

AdvertisementKeyword save(AdvertisementKeyword advertisementKeyword);

void saveAll(List<AdvertisementKeyword> advertisementKeywords);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package core.kobaco.domain.advertise;

import java.util.Optional;

public interface AdvertisementRepository {
Optional<Advertisement> findById(Long advertiseId);

Advertisement save(Advertisement advertisement);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package core.kobaco.domain.advertise.service;

import core.kobaco.domain.advertise.Advertisement;
import core.kobaco.domain.advertise.AdvertisementKeyword;
import core.kobaco.domain.advertise.AdvertisementKeywordRepository;
import core.kobaco.domain.advertise.AdvertisementRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
@RequiredArgsConstructor
public class AdvertiseAppender {
private final AdvertisementRepository advertisementRepository;
private final AdvertisementKeywordRepository advertisementKeywordRepository;

public void append(Advertisement advertisement, List<Long> keywordIds) {
final Advertisement savedAdvertisement = advertisementRepository.save(advertisement);
final List<AdvertisementKeyword> advertisementKeywords = keywordIds.stream()
.map(keywordId -> AdvertisementKeyword.of(null, savedAdvertisement.getAdvertiseId(), keywordId))
.toList();
advertisementKeywordRepository.saveAll(advertisementKeywords);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package core.kobaco.domain.advertise.service;

public interface AdvertiseLikeManager {
Long getLikeCount(Long advertiseId);

Boolean isLike(Long advertiseId);

void like(Long advertiseId, Long userId);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package core.kobaco.domain.advertise.service;

import core.kobaco.domain.advertise.*;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
@RequiredArgsConstructor
public class AdvertiseReader {
private final AdvertisementRepository advertisementRepository;
private final AdvertisementKeywordRepository advertisementKeywordRepository;

public Advertisement getAdvertise(Long advertiseId) {
return advertisementRepository.findById(advertiseId)
.orElseThrow(() -> new IllegalArgumentException("해당 광고가 존재하지 않습니다."));
}

public List<AdvertisementKeyword> getAdvertiseKeyword(Long advertiseId) {
return advertisementKeywordRepository.findAllByAdvertiseId(advertiseId);
}

}
Loading
Loading