From 80c7ed4f8664eeb506e1b480630e70c969ae29b7 Mon Sep 17 00:00:00 2001 From: Hyeok_Choi Date: Sat, 23 Mar 2024 22:07:04 +0900 Subject: [PATCH 1/3] =?UTF-8?q?:sparkles:=20feature:=20gpt=20generator=20c?= =?UTF-8?q?ontent=20=EC=83=9D=EC=84=B1=20api=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../config/TransactionTemplateConfig.java | 26 ++++++ .../admin/controller/AdminController.java | 13 +++ .../dto/GetDiaryNoteAndPromptResponse.java | 28 +++++++ .../domain/admin/service/AdminService.java | 81 ++++++++++++++++++- .../diary/domain/PromptGeneratorResult.java | 4 + .../repository/DiaryQueryRepository.java | 3 + .../repository/DiaryQueryRepositoryImpl.java | 15 ++++ .../diary/service/AdminDiaryService.java | 14 ++++ .../service/GoogleTranslatorService.java | 44 ++++++++++ .../service/TranslateTextService.java | 6 ++ 10 files changed, 233 insertions(+), 1 deletion(-) create mode 100644 src/main/java/tipitapi/drawmytoday/common/config/TransactionTemplateConfig.java create mode 100644 src/main/java/tipitapi/drawmytoday/domain/admin/dto/GetDiaryNoteAndPromptResponse.java create mode 100644 src/main/java/tipitapi/drawmytoday/domain/generator/api/google/service/GoogleTranslatorService.java create mode 100644 src/main/java/tipitapi/drawmytoday/domain/generator/service/TranslateTextService.java diff --git a/src/main/java/tipitapi/drawmytoday/common/config/TransactionTemplateConfig.java b/src/main/java/tipitapi/drawmytoday/common/config/TransactionTemplateConfig.java new file mode 100644 index 00000000..62190878 --- /dev/null +++ b/src/main/java/tipitapi/drawmytoday/common/config/TransactionTemplateConfig.java @@ -0,0 +1,26 @@ +package tipitapi.drawmytoday.common.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.transaction.PlatformTransactionManager; +import org.springframework.transaction.support.TransactionTemplate; + +@Configuration +public class TransactionTemplateConfig { + + @Bean + public TransactionTemplate writeTransactionTemplate( + PlatformTransactionManager transactionManager) { + TransactionTemplate transactionTemplate = new TransactionTemplate(transactionManager); + transactionTemplate.setReadOnly(false); + return transactionTemplate; + } + + @Bean + public TransactionTemplate readTransactionTemplate( + PlatformTransactionManager transactionManager) { + TransactionTemplate transactionTemplate = new TransactionTemplate(transactionManager); + transactionTemplate.setReadOnly(true); + return transactionTemplate; + } +} diff --git a/src/main/java/tipitapi/drawmytoday/domain/admin/controller/AdminController.java b/src/main/java/tipitapi/drawmytoday/domain/admin/controller/AdminController.java index ec1788f2..48499c0e 100644 --- a/src/main/java/tipitapi/drawmytoday/domain/admin/controller/AdminController.java +++ b/src/main/java/tipitapi/drawmytoday/domain/admin/controller/AdminController.java @@ -8,6 +8,7 @@ import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.responses.ApiResponses; import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import java.util.stream.LongStream; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Page; import org.springframework.data.domain.Sort.Direction; @@ -60,4 +61,16 @@ public ResponseEntity>> getDiaries( withTest) ).asHttp(HttpStatus.OK); } + + @Operation(summary = "GPT Generator Content 추가") + @GetMapping("/add-gpt-generator-content") + public ResponseEntity addGptGeneratorContent( + @AuthUser JwtTokenInfo jwtTokenInfo, + @RequestParam(value = "reputation", required = false, defaultValue = "1") Long reputation + ) { + int added = LongStream.range(0, reputation). + mapToObj(i -> adminService.addGptGeneratorContent(jwtTokenInfo.getUserId())). + reduce(0, Integer::sum); + return ResponseEntity.ok(added); + } } diff --git a/src/main/java/tipitapi/drawmytoday/domain/admin/dto/GetDiaryNoteAndPromptResponse.java b/src/main/java/tipitapi/drawmytoday/domain/admin/dto/GetDiaryNoteAndPromptResponse.java new file mode 100644 index 00000000..2c88b3fa --- /dev/null +++ b/src/main/java/tipitapi/drawmytoday/domain/admin/dto/GetDiaryNoteAndPromptResponse.java @@ -0,0 +1,28 @@ +package tipitapi.drawmytoday.domain.admin.dto; + +import com.querydsl.core.annotations.QueryProjection; +import lombok.Getter; + +@Getter +public class GetDiaryNoteAndPromptResponse { + + private final Long promptId; + private String notes; + private final String prompt; + + @QueryProjection + public GetDiaryNoteAndPromptResponse(Long promptId, String notes, String prompt) { + this.promptId = promptId; + this.notes = notes; + this.prompt = prompt; + } + + public void updateNotes(String notes) { + this.notes = notes; + } + + public String getGptPrompt() { + String[] promptTexts = prompt.split("Impressionist oil painting,"); + return promptTexts[promptTexts.length - 1].trim(); + } +} diff --git a/src/main/java/tipitapi/drawmytoday/domain/admin/service/AdminService.java b/src/main/java/tipitapi/drawmytoday/domain/admin/service/AdminService.java index 3840253c..4c277b3f 100644 --- a/src/main/java/tipitapi/drawmytoday/domain/admin/service/AdminService.java +++ b/src/main/java/tipitapi/drawmytoday/domain/admin/service/AdminService.java @@ -1,25 +1,104 @@ package tipitapi.drawmytoday.domain.admin.service; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import java.util.List; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; import org.springframework.data.domain.Page; import org.springframework.data.domain.Sort.Direction; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.transaction.support.TransactionTemplate; import tipitapi.drawmytoday.domain.admin.dto.GetDiaryAdminResponse; +import tipitapi.drawmytoday.domain.admin.dto.GetDiaryNoteAndPromptResponse; +import tipitapi.drawmytoday.domain.diary.domain.Prompt; +import tipitapi.drawmytoday.domain.diary.repository.PromptRepository; import tipitapi.drawmytoday.domain.diary.service.AdminDiaryService; +import tipitapi.drawmytoday.domain.generator.api.gpt.domain.ChatCompletionsRole; +import tipitapi.drawmytoday.domain.generator.api.gpt.domain.Message; +import tipitapi.drawmytoday.domain.generator.api.gpt.dto.GptChatCompletionsRequest; +import tipitapi.drawmytoday.domain.generator.service.TranslateTextService; import tipitapi.drawmytoday.domain.user.service.ValidateUserService; +@Slf4j @Service -@Transactional(readOnly = true) @RequiredArgsConstructor public class AdminService { private final ValidateUserService validateUserService; private final AdminDiaryService adminDiaryService; + private final TranslateTextService translateTextService; + private final TransactionTemplate writeTransactionTemplate; + private final PromptRepository promptRepository; + private final ObjectMapper objectMapper; + @Value("${openai.gpt.chat_completions_prompt}") + private String gptChatCompletionsPrompt; + @Transactional(readOnly = true) public Page getDiaries(Long userId, int size, int page, Direction direction, Long emotionId, boolean withTest) { validateUserService.validateAdminUserById(userId); return adminDiaryService.getDiaries(size, page, direction, emotionId, withTest); } + + public int addGptGeneratorContent(Long userId) { + validateUserService.validateAdminUserById(userId); + List responses = adminDiaryService.getDiaryNoteAndPrompt(); + ExecutorService executor = Executors.newFixedThreadPool(10); + CountDownLatch latch = new CountDownLatch(responses.size()); + for (int i = 0; i < responses.size(); i++) { + GetDiaryNoteAndPromptResponse response = responses.get(i); + int finalI = i; + executor.execute(() -> { + try { + String translatedNotes = translateTextService.translateAutoToEnglish( + response.getNotes()); + response.updateNotes(translatedNotes); + } catch (Exception e) { + log.error("번역 API 예외가 발생했습니다.", e); + responses.remove(finalI); + } finally { + latch.countDown(); + } + }); + } + + try { + latch.await(); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + log.error("작업이 중단되었습니다.", e); + throw new RuntimeException(e); + } + + executor.shutdown(); + + if (responses.isEmpty()) { + throw new RuntimeException("번역할 데이터가 없거나 모두 실패했습니다."); + } + + writeTransactionTemplate.executeWithoutResult(status -> { + for (GetDiaryNoteAndPromptResponse response : responses) { + Prompt prompt = promptRepository.findById(response.getPromptId()).get(); + List messages = GptChatCompletionsRequest.createFirstMessage( + gptChatCompletionsPrompt, response.getNotes()) + .getMessages(); + messages.add(new Message(ChatCompletionsRole.assistant, response.getGptPrompt())); + String gptResponses; + try { + gptResponses = objectMapper.writeValueAsString(messages); + } catch (JsonProcessingException e) { + log.error("GPT Message를 JSON으로 변환하는데 실패했습니다.", e); + throw new RuntimeException(e); + } + prompt.getPromptGeneratorResult().updatePromptGeneratorContent(gptResponses); + } + }); + return responses.size(); + } } diff --git a/src/main/java/tipitapi/drawmytoday/domain/diary/domain/PromptGeneratorResult.java b/src/main/java/tipitapi/drawmytoday/domain/diary/domain/PromptGeneratorResult.java index 6080b3e7..ba78e74c 100644 --- a/src/main/java/tipitapi/drawmytoday/domain/diary/domain/PromptGeneratorResult.java +++ b/src/main/java/tipitapi/drawmytoday/domain/diary/domain/PromptGeneratorResult.java @@ -39,4 +39,8 @@ public PromptGeneratorType getPromptGeneratorType() { public String getPromptGeneratorContent() { return promptGeneratorContent; } + + public void updatePromptGeneratorContent(String promptGeneratorContent) { + this.promptGeneratorContent = promptGeneratorContent; + } } diff --git a/src/main/java/tipitapi/drawmytoday/domain/diary/repository/DiaryQueryRepository.java b/src/main/java/tipitapi/drawmytoday/domain/diary/repository/DiaryQueryRepository.java index 7d6ba144..220d1807 100644 --- a/src/main/java/tipitapi/drawmytoday/domain/diary/repository/DiaryQueryRepository.java +++ b/src/main/java/tipitapi/drawmytoday/domain/diary/repository/DiaryQueryRepository.java @@ -8,6 +8,7 @@ import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Sort.Direction; import tipitapi.drawmytoday.domain.admin.dto.GetDiaryAdminResponse; +import tipitapi.drawmytoday.domain.admin.dto.GetDiaryNoteAndPromptResponse; import tipitapi.drawmytoday.domain.diary.domain.Diary; import tipitapi.drawmytoday.domain.diary.dto.GetMonthlyDiariesResponse; @@ -20,4 +21,6 @@ Page getDiariesForMonitorAsPage(Pageable pageable, List getMonthlyDiaries(Long userId, LocalDateTime startMonth, LocalDateTime endMonth); + + List getDiaryNoteAndPrompt(); } diff --git a/src/main/java/tipitapi/drawmytoday/domain/diary/repository/DiaryQueryRepositoryImpl.java b/src/main/java/tipitapi/drawmytoday/domain/diary/repository/DiaryQueryRepositoryImpl.java index c048ddd3..baf8c5c0 100644 --- a/src/main/java/tipitapi/drawmytoday/domain/diary/repository/DiaryQueryRepositoryImpl.java +++ b/src/main/java/tipitapi/drawmytoday/domain/diary/repository/DiaryQueryRepositoryImpl.java @@ -18,7 +18,9 @@ import org.springframework.data.domain.Sort.Direction; import org.springframework.data.support.PageableExecutionUtils; import tipitapi.drawmytoday.domain.admin.dto.GetDiaryAdminResponse; +import tipitapi.drawmytoday.domain.admin.dto.GetDiaryNoteAndPromptResponse; import tipitapi.drawmytoday.domain.admin.dto.QGetDiaryAdminResponse; +import tipitapi.drawmytoday.domain.admin.dto.QGetDiaryNoteAndPromptResponse; import tipitapi.drawmytoday.domain.diary.domain.Diary; import tipitapi.drawmytoday.domain.diary.dto.GetMonthlyDiariesResponse; import tipitapi.drawmytoday.domain.diary.dto.QGetMonthlyDiariesResponse; @@ -86,4 +88,17 @@ public List getMonthlyDiaries(Long userId, LocalDateT .groupBy(diary.diaryId) .fetch(); } + + @Override + public List getDiaryNoteAndPrompt() { + return queryFactory.select( + new QGetDiaryNoteAndPromptResponse(prompt.promptId, diary.notes, prompt.promptText)) + .from(prompt) + .leftJoin(image).on(prompt.promptId.eq(image.prompt.promptId)) + .leftJoin(diary).on(image.diary.diaryId.eq(diary.diaryId)) + .where(prompt.promptGeneratorResult.promptGeneratorContent.isNull()) + .where(prompt.promptText.notLike("%, portrait")) + .limit(10L) + .fetch(); + } } diff --git a/src/main/java/tipitapi/drawmytoday/domain/diary/service/AdminDiaryService.java b/src/main/java/tipitapi/drawmytoday/domain/diary/service/AdminDiaryService.java index cbb47615..47a989f7 100644 --- a/src/main/java/tipitapi/drawmytoday/domain/diary/service/AdminDiaryService.java +++ b/src/main/java/tipitapi/drawmytoday/domain/diary/service/AdminDiaryService.java @@ -1,5 +1,7 @@ package tipitapi.drawmytoday.domain.diary.service; +import java.util.List; +import java.util.stream.Collectors; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Value; import org.springframework.data.domain.Page; @@ -7,7 +9,9 @@ import org.springframework.data.domain.Sort.Direction; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import tipitapi.drawmytoday.common.utils.Encryptor; import tipitapi.drawmytoday.domain.admin.dto.GetDiaryAdminResponse; +import tipitapi.drawmytoday.domain.admin.dto.GetDiaryNoteAndPromptResponse; import tipitapi.drawmytoday.domain.diary.repository.DiaryRepository; import tipitapi.drawmytoday.domain.r2.service.R2PreSignedService; @@ -18,6 +22,7 @@ public class AdminDiaryService { private final DiaryRepository diaryRepository; private final R2PreSignedService r2PreSignedService; + private final Encryptor encryptor; @Value("${presigned-image.expiration.admin-diaries}") private int imageExpiration; @@ -33,4 +38,13 @@ private GetDiaryAdminResponse generatePresignedURL(GetDiaryAdminResponse respons r2PreSignedService.getCustomDomainUrl(response.getImageURL())); return response; } + + public List getDiaryNoteAndPrompt() { + return diaryRepository.getDiaryNoteAndPrompt() + .stream() + .map(response -> { + response.updateNotes(encryptor.decrypt(response.getNotes())); + return response; + }).collect(Collectors.toList()); + } } diff --git a/src/main/java/tipitapi/drawmytoday/domain/generator/api/google/service/GoogleTranslatorService.java b/src/main/java/tipitapi/drawmytoday/domain/generator/api/google/service/GoogleTranslatorService.java new file mode 100644 index 00000000..3c83a999 --- /dev/null +++ b/src/main/java/tipitapi/drawmytoday/domain/generator/api/google/service/GoogleTranslatorService.java @@ -0,0 +1,44 @@ +package tipitapi.drawmytoday.domain.generator.api.google.service; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.web.client.RestClientException; +import org.springframework.web.client.RestTemplate; +import tipitapi.drawmytoday.domain.generator.service.TranslateTextService; + +@Slf4j +@Service +@RequiredArgsConstructor +public class GoogleTranslatorService implements TranslateTextService { + + private final RestTemplate restTemplate = new RestTemplate(); + private final ObjectMapper objectMapper; + private static final String GOOGLE_TRANSLATE_URL = "https://translate.googleapis.com/translate_a/single"; + + @Override + public String translateAutoToEnglish(String text) { + String translatedText = null; + try { + String jsonResult = restTemplate.getForObject( + GOOGLE_TRANSLATE_URL + "?client=gtx&sl=auto&tl=en&dt=t&dt=bd&dj=1&source=icon&q=" + + text, String.class); + JsonNode rootNode = objectMapper.readTree(jsonResult); + if (rootNode.get("sentences") != null) { + translatedText = rootNode.get("sentences").get(0).get("trans").asText(); + } else { + translatedText = rootNode.get("dict").get(0).get("terms").get(0).asText(); + } + } catch (RestClientException e) { + log.error("구글 번역 API 요청 실패: {}", text, e); + throw e; + } catch (JsonProcessingException e) { + log.error("구글 번역 API 응답 파싱 실패: {}", text, e); + throw new RuntimeException("구글 번역 API 응답 파싱 실패: " + text, e); + } + return translatedText; + } +} diff --git a/src/main/java/tipitapi/drawmytoday/domain/generator/service/TranslateTextService.java b/src/main/java/tipitapi/drawmytoday/domain/generator/service/TranslateTextService.java new file mode 100644 index 00000000..50a9ab9f --- /dev/null +++ b/src/main/java/tipitapi/drawmytoday/domain/generator/service/TranslateTextService.java @@ -0,0 +1,6 @@ +package tipitapi.drawmytoday.domain.generator.service; + +public interface TranslateTextService { + + String translateAutoToEnglish(String text); +} From 152f857bd5882f189a2aa2429e9dba9d9032473a Mon Sep 17 00:00:00 2001 From: Hyeok_Choi Date: Sat, 23 Mar 2024 22:22:27 +0900 Subject: [PATCH 2/3] =?UTF-8?q?:hammer:=20refactor:=20=EC=9D=B4=EB=AF=B8?= =?UTF-8?q?=EC=A7=80=EB=A5=BC=20=EA=B0=96=EA=B3=A0=20=EC=9E=88=EB=8A=94=20?= =?UTF-8?q?=ED=94=84=EB=A1=AC=ED=94=84=ED=8A=B8=EB=A7=8C=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD=ED=95=98=EB=8F=84=EB=A1=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../drawmytoday/domain/admin/service/AdminService.java | 4 +++- .../java/tipitapi/drawmytoday/domain/diary/domain/Prompt.java | 4 ++++ .../domain/diary/domain/PromptGeneratorResult.java | 4 ---- .../domain/diary/repository/DiaryQueryRepositoryImpl.java | 4 ++-- 4 files changed, 9 insertions(+), 7 deletions(-) diff --git a/src/main/java/tipitapi/drawmytoday/domain/admin/service/AdminService.java b/src/main/java/tipitapi/drawmytoday/domain/admin/service/AdminService.java index 4c277b3f..e7cbd42c 100644 --- a/src/main/java/tipitapi/drawmytoday/domain/admin/service/AdminService.java +++ b/src/main/java/tipitapi/drawmytoday/domain/admin/service/AdminService.java @@ -17,6 +17,7 @@ import tipitapi.drawmytoday.domain.admin.dto.GetDiaryAdminResponse; import tipitapi.drawmytoday.domain.admin.dto.GetDiaryNoteAndPromptResponse; import tipitapi.drawmytoday.domain.diary.domain.Prompt; +import tipitapi.drawmytoday.domain.diary.domain.PromptGeneratorResult; import tipitapi.drawmytoday.domain.diary.repository.PromptRepository; import tipitapi.drawmytoday.domain.diary.service.AdminDiaryService; import tipitapi.drawmytoday.domain.generator.api.gpt.domain.ChatCompletionsRole; @@ -96,7 +97,8 @@ public int addGptGeneratorContent(Long userId) { log.error("GPT Message를 JSON으로 변환하는데 실패했습니다.", e); throw new RuntimeException(e); } - prompt.getPromptGeneratorResult().updatePromptGeneratorContent(gptResponses); + PromptGeneratorResult result = PromptGeneratorResult.createGpt3Result(gptResponses); + prompt.updatePromptGeneratorResult(result); } }); return responses.size(); diff --git a/src/main/java/tipitapi/drawmytoday/domain/diary/domain/Prompt.java b/src/main/java/tipitapi/drawmytoday/domain/diary/domain/Prompt.java index f3fcecaa..c1da17b9 100644 --- a/src/main/java/tipitapi/drawmytoday/domain/diary/domain/Prompt.java +++ b/src/main/java/tipitapi/drawmytoday/domain/diary/domain/Prompt.java @@ -48,4 +48,8 @@ public static Prompt create(String promptText) { public void imageGeneratorSuccess() { this.isSuccess = true; } + + public void updatePromptGeneratorResult(PromptGeneratorResult promptGeneratorResult) { + this.promptGeneratorResult = promptGeneratorResult; + } } diff --git a/src/main/java/tipitapi/drawmytoday/domain/diary/domain/PromptGeneratorResult.java b/src/main/java/tipitapi/drawmytoday/domain/diary/domain/PromptGeneratorResult.java index ba78e74c..6080b3e7 100644 --- a/src/main/java/tipitapi/drawmytoday/domain/diary/domain/PromptGeneratorResult.java +++ b/src/main/java/tipitapi/drawmytoday/domain/diary/domain/PromptGeneratorResult.java @@ -39,8 +39,4 @@ public PromptGeneratorType getPromptGeneratorType() { public String getPromptGeneratorContent() { return promptGeneratorContent; } - - public void updatePromptGeneratorContent(String promptGeneratorContent) { - this.promptGeneratorContent = promptGeneratorContent; - } } diff --git a/src/main/java/tipitapi/drawmytoday/domain/diary/repository/DiaryQueryRepositoryImpl.java b/src/main/java/tipitapi/drawmytoday/domain/diary/repository/DiaryQueryRepositoryImpl.java index baf8c5c0..002de52e 100644 --- a/src/main/java/tipitapi/drawmytoday/domain/diary/repository/DiaryQueryRepositoryImpl.java +++ b/src/main/java/tipitapi/drawmytoday/domain/diary/repository/DiaryQueryRepositoryImpl.java @@ -94,8 +94,8 @@ public List getDiaryNoteAndPrompt() { return queryFactory.select( new QGetDiaryNoteAndPromptResponse(prompt.promptId, diary.notes, prompt.promptText)) .from(prompt) - .leftJoin(image).on(prompt.promptId.eq(image.prompt.promptId)) - .leftJoin(diary).on(image.diary.diaryId.eq(diary.diaryId)) + .join(image).on(prompt.promptId.eq(image.prompt.promptId)) + .join(diary).on(image.diary.diaryId.eq(diary.diaryId)) .where(prompt.promptGeneratorResult.promptGeneratorContent.isNull()) .where(prompt.promptText.notLike("%, portrait")) .limit(10L) From a10331284b399fa37e7e925a91f6eb6600133d2a Mon Sep 17 00:00:00 2001 From: Hyeok_Choi Date: Mon, 25 Mar 2024 11:46:44 +0900 Subject: [PATCH 3/3] =?UTF-8?q?:hammer:=20refactor:=20=EA=B0=84=EB=8B=A8?= =?UTF-8?q?=ED=95=9C=20=EB=84=A4=EC=9D=B4=EB=B0=8D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../drawmytoday/domain/admin/controller/AdminController.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/tipitapi/drawmytoday/domain/admin/controller/AdminController.java b/src/main/java/tipitapi/drawmytoday/domain/admin/controller/AdminController.java index 48499c0e..550d1349 100644 --- a/src/main/java/tipitapi/drawmytoday/domain/admin/controller/AdminController.java +++ b/src/main/java/tipitapi/drawmytoday/domain/admin/controller/AdminController.java @@ -68,9 +68,9 @@ public ResponseEntity addGptGeneratorContent( @AuthUser JwtTokenInfo jwtTokenInfo, @RequestParam(value = "reputation", required = false, defaultValue = "1") Long reputation ) { - int added = LongStream.range(0, reputation). + int addedCount = LongStream.range(0, reputation). mapToObj(i -> adminService.addGptGeneratorContent(jwtTokenInfo.getUserId())). reduce(0, Integer::sum); - return ResponseEntity.ok(added); + return ResponseEntity.ok(addedCount); } }