Skip to content

Commit

Permalink
Merge pull request #13 from Kusitms-28th-Kobaco-B/develop
Browse files Browse the repository at this point in the history
1차 배포
  • Loading branch information
tioon authored Mar 9, 2024
2 parents da8ecfd + cc7512c commit c626e92
Show file tree
Hide file tree
Showing 85 changed files with 3,133 additions and 162 deletions.
8 changes: 7 additions & 1 deletion build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,9 @@ dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.2.0'
implementation 'org.springframework.boot:spring-boot-starter-webflux'

// Crawling
implementation 'org.seleniumhq.selenium:selenium-java:4.1.2'
implementation 'org.jsoup:jsoup:1.15.3'

// Lombok
Expand All @@ -35,13 +38,16 @@ dependencies {
// Spring Test
testImplementation 'org.springframework.boot:spring-boot-starter-test'

//H2
// H2
runtimeOnly 'com.mysql:mysql-connector-j'
implementation 'com.h2database:h2'

// HTTP
implementation 'org.apache.httpcomponents:httpclient:4.5.13'

//JSON
implementation 'com.googlecode.json-simple:json-simple:1.1.1'

}

tasks.named('test') {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,170 @@
package kobako.backend.advertisementCopy.application;


import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import kobako.backend.copyGallery.domain.CopyGallery;
import kobako.backend.copyGallery.infra.presistence.CopyGalleryRepository;
import kobako.backend.global.prompt.PromptSetter;
import kobako.backend.member.domain.Member;
import kobako.backend.member.infra.presistence.MemberRepository;
import kobako.backend.advertisementCopy.domain.AdvertisementCopy;
import kobako.backend.advertisementCopy.dto.request.GenerateAdvertisementCopyRequest;
import kobako.backend.advertisementCopy.dto.request.UpdateAdvertisementCopyRequest;
import kobako.backend.advertisementCopy.dto.response.AdvertisementCopyResponse;
import kobako.backend.advertisementCopy.infra.presistence.AdvertisementCopyRepository;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.http.Header;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.client.RestTemplate;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.NoSuchElementException;


@Slf4j
@Service
@RequiredArgsConstructor
@Transactional
public class AdvertisementCopyService {

@Value("${naver.clova.clovaApiKey}")
private String clovaApiKey;

@Value("${naver.clova.ApiGwKey}")
private String apiGwKey;

@Value("${naver.clova.RequestId}")
private String requestId;


private final MemberRepository memberRepository;
private final AdvertisementCopyRepository advertisementCopyRepository;
private final CopyGalleryRepository copyGalleryRepository;



public List<AdvertisementCopyResponse> getRecentAdvertisementCopy (
Long memberId
) {
// 사용자가 생성한 광고카피를 최신순으로 탐색
List<AdvertisementCopy> advertisementCopies = advertisementCopyRepository.findByMember_MemberIdOrderByCreatedDateDesc(memberId);

// List 반환
return AdvertisementCopyResponse.ofAdvertisementCopiesList(advertisementCopies);
}

public AdvertisementCopyResponse generateAdvertisementCopy(
Long memberId,
GenerateAdvertisementCopyRequest generateAdvertisementCopyRequest
) {

Member member = memberRepository.findById(memberId)
.orElseThrow(() -> new IllegalArgumentException("Member not found with id: " + memberId));


JSONObject request_data = PromptSetter.GeneratePrompt(generateAdvertisementCopyRequest);

RestTemplate restTemplate = new RestTemplate();

HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
headers.set("X-NCP-CLOVASTUDIO-API-KEY", clovaApiKey);
headers.set("X-NCP-APIGW-API-KEY", apiGwKey);
headers.set("X-NCP-CLOVASTUDIO-REQUEST-ID", requestId);

HttpEntity<String> entity = new HttpEntity<>(request_data.toString(), headers);

ResponseEntity<String> response = restTemplate.postForEntity("https://clovastudio.apigw.ntruss.com/testapp/v1/completions/LK-D2", entity, String.class);

JSONParser parser = new JSONParser();
try {
JSONObject json = (JSONObject) parser.parse(response.getBody());

JSONObject result = (JSONObject) json.get("result");
String outputText = ((String) result.get("outputText")).trim();

log.info(outputText);

AdvertisementCopy advertisementCopy
= advertisementCopyRepository.save(generateAdvertisementCopyRequest.toAdvertismentCopy(member,outputText));

return AdvertisementCopyResponse.of(advertisementCopy);

} catch (ParseException e) {
e.printStackTrace();
return null;
}
}





public AdvertisementCopyResponse updateAdvertisementCopy(
Long advertisementCopyId,
UpdateAdvertisementCopyRequest updateAdvertisementCopyRequest
) {

AdvertisementCopy advertisementCopy = advertisementCopyRepository.findById(advertisementCopyId)
.orElseThrow(() -> new NoSuchElementException("AdvertisementCopy not found with id: " + advertisementCopyId));

advertisementCopy.setMessage(updateAdvertisementCopyRequest.getMessage());
advertisementCopyRepository.save(advertisementCopy);

return AdvertisementCopyResponse.of(advertisementCopy);
}

public AdvertisementCopyResponse loadAdvertisementCopy(Long memberId, Long advertisementCopyId){

// 이미 저장된 광고 카피면 Exception 발생
copyGalleryRepository.findByAdvertisementCopy_AdvertisementCopyId(advertisementCopyId)
.ifPresent(existingCopyGallery -> {throw new IllegalArgumentException("AdvertisementCopy already exists in CopyGallery");});

// 광고카피 탐색
AdvertisementCopy advertisementCopy = advertisementCopyRepository.findByMember_MemberIdAndAdvertisementCopyId(memberId, advertisementCopyId)
.orElseThrow(() -> new NoSuchElementException("AdvertisementCopy not found with id: " + advertisementCopyId));

// List<String>은 따로 복사해서 다시 넣기.
List<String> keywords = new ArrayList<>(advertisementCopy.getKeywords());

// 카피갤러리 생성
CopyGallery copyGallery = CopyGallery.builder()
.advertisementCopy(advertisementCopy)
.member(advertisementCopy.getMember())
.service(advertisementCopy.getService())
.productName(advertisementCopy.getProductName())
.tone(advertisementCopy.getTone())
.views(0L)
.keywords(keywords)
.message(advertisementCopy.getMessage())
.build();
copyGalleryRepository.save(copyGallery);

return AdvertisementCopyResponse.of(advertisementCopy);
}


}
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
package kobako.backend.advertisementCopy.domain;

import jakarta.persistence.*;
import jakarta.persistence.Entity;
import kobako.backend.member.domain.Member;
import kobako.backend.global.ENUM.Service;
import kobako.backend.global.ENUM.TargetAge;
import kobako.backend.global.ENUM.TargetGender;
import kobako.backend.global.ENUM.Tone;
import kobako.backend.global.base.BaseEntity;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

import java.util.List;

@Entity(name = "ADVERTISEMENT_COPY")
@Getter
@Setter
@NoArgsConstructor
@Builder
public class AdvertisementCopy extends BaseEntity {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "advertisement_copy_id")
private Long advertisementCopyId;

@ManyToOne
@JoinColumn(name = "member_id")
private Member member;

@Enumerated(EnumType.STRING)
private Service service;

@Column(name = "project_name")
private String projectName;

@Column(name = "product_name")
private String productName;

@Enumerated(EnumType.STRING)
@Column(name = "target_gender")
private TargetGender targetGender;

@Enumerated(EnumType.STRING)
@Column(name = "target_age")
private TargetAge targetAge;

@Enumerated(EnumType.STRING)
private Tone tone;

@ElementCollection
private List<String> keywords;

@Column(length = 500)
private String message;

@Builder
public AdvertisementCopy(Long advertisementCopyId, Member member, Service service, String projectName, String productName, TargetGender targetGender, TargetAge targetAge, Tone tone, List<String> keywords, String message) {
super();
this.advertisementCopyId = advertisementCopyId;
this.member = member;
this.service = service;
this.projectName = projectName;
this.productName = productName;
this.targetGender = targetGender;
this.targetAge = targetAge;
this.tone = tone;
this.keywords = keywords;
this.message = message;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package kobako.backend.advertisementCopy.dto.request;


import kobako.backend.advertisementCopy.domain.AdvertisementCopy;
import kobako.backend.global.ENUM.*;
import kobako.backend.member.domain.Member;
import lombok.*;

import java.util.List;

@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class GenerateAdvertisementCopyRequest {

private Service service;
private String projectName;
private String productName;
private TargetGender targetGender;
private TargetAge targetAge;
private List<String> keyword;
private Tone tone;



public AdvertisementCopy toAdvertismentCopy(Member member, String message){
return AdvertisementCopy.builder()
.service(this.service)
.member(member)
.projectName(this.projectName)
.productName(this.productName)
.targetGender(this.targetGender)
.targetAge(this.targetAge)
.tone(this.tone)
.message(message)
.build();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package kobako.backend.advertisementCopy.dto.request;

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class UpdateAdvertisementCopyRequest {
private String message;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
package kobako.backend.advertisementCopy.dto.response;

import kobako.backend.copyGallery.domain.CopyGallery;
import kobako.backend.advertisementCopy.domain.AdvertisementCopy;
import kobako.backend.global.ENUM.Service;
import kobako.backend.global.ENUM.Tone;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

import java.util.List;
import java.util.stream.Collectors;

@Getter
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class AdvertisementCopyResponse {

private Long advertisementCopyId;
private Service service;
private Tone tone;
private String message;


public static AdvertisementCopyResponse of (AdvertisementCopy advertisementCopy){
return AdvertisementCopyResponse.builder()
.advertisementCopyId(advertisementCopy.getAdvertisementCopyId())
.service(advertisementCopy.getService())
.tone(advertisementCopy.getTone())
.message(advertisementCopy.getMessage())
.build();
}

// AdvertisementCopy를 AdvertisementCopyResponse로 변환 (List)
public static List<AdvertisementCopyResponse> ofAdvertisementCopiesList(List<AdvertisementCopy> advertisementCopies) {
return advertisementCopies.stream()
.map(advertisementCopy -> AdvertisementCopyResponse.builder()
.advertisementCopyId(advertisementCopy.getAdvertisementCopyId())
.service(advertisementCopy.getService())
.tone(advertisementCopy.getTone())
.message(advertisementCopy.getMessage())
.build())
.collect(Collectors.toList());
}

// copyGallery를 AdvertisementCopyResponse로 변환 (List)
public static List<AdvertisementCopyResponse> ofCopyGalleriesList(List<CopyGallery> copyGalleries) {
return copyGalleries.stream()
.map(copyGallery -> AdvertisementCopyResponse.builder()
.advertisementCopyId(copyGallery.getAdvertisementCopy().getAdvertisementCopyId())
.service(copyGallery.getService())
.tone(copyGallery.getTone())
.message(copyGallery.getMessage())
.build())
.collect(Collectors.toList());
}



}
Loading

0 comments on commit c626e92

Please sign in to comment.