Skip to content

Commit dd472e4

Browse files
authored
Merge pull request #92 from Prompt-Mate/feat/91/rewrite-api-refactor
rewriteResultId 중심 리라이팅 플로우 구축 + 레거시 API 숨김
2 parents ad9e50c + 70af2d1 commit dd472e4

6 files changed

Lines changed: 104 additions & 14 deletions

File tree

src/main/java/com/tave/PromptMate/controller/EvaluationController.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,19 @@
11
package com.tave.PromptMate.controller;
22

3+
import com.tave.PromptMate.dto.evaluation.AutoEvaluationRequest;
34
import com.tave.PromptMate.dto.evaluation.EvaluationResponse;
45
import com.tave.PromptMate.dto.evaluation.EvaluationSummaryResponse;
56
import com.tave.PromptMate.service.EvaluationService;
7+
import io.swagger.v3.oas.annotations.Hidden;
68
import jakarta.validation.Valid;
79
import lombok.RequiredArgsConstructor;
810
import org.springframework.data.domain.Page;
911
import org.springframework.http.ResponseEntity;
1012
import org.springframework.web.bind.annotation.*;
11-
import com.tave.PromptMate.dto.evaluation.AutoEvaluationRequest;
1213

1314
import java.net.URI;
1415

16+
@Hidden
1517
@RestController
1618
@RequiredArgsConstructor
1719
@RequestMapping("/api/evaluations")

src/main/java/com/tave/PromptMate/controller/PromptController.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import com.tave.PromptMate.dto.prompt.PromptResponse;
66
import com.tave.PromptMate.dto.prompt.UpdatePromptRequest;
77
import com.tave.PromptMate.service.PromptService;
8+
import io.swagger.v3.oas.annotations.Hidden;
89
import jakarta.validation.Valid;
910
import lombok.RequiredArgsConstructor;
1011
import org.springframework.data.domain.Page;
@@ -13,6 +14,7 @@
1314

1415
import java.net.URI;
1516

17+
@Hidden
1618
@RestController
1719
@RequiredArgsConstructor
1820
@RequestMapping("/api/prompts")

src/main/java/com/tave/PromptMate/controller/RewriteController.java

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,17 +4,19 @@
44
import com.tave.PromptMate.common.RewriteRunner;
55
import com.tave.PromptMate.dto.rewrite.*;
66
import com.tave.PromptMate.service.RewriteResultService;
7+
import io.swagger.v3.oas.annotations.Operation;
78
import jakarta.validation.Valid;
89
import lombok.RequiredArgsConstructor;
10+
import org.springframework.data.domain.Page;
911
import org.springframework.http.HttpStatus;
1012
import org.springframework.http.ResponseEntity;
1113
import org.springframework.security.core.annotation.AuthenticationPrincipal;
1214
import org.springframework.web.bind.annotation.*;
1315
import org.springframework.web.server.ResponseStatusException;
1416

15-
import java.net.URI;
1617
import java.util.List;
1718

19+
1820
@RestController
1921
@RequiredArgsConstructor
2022
@RequestMapping("/api")
@@ -65,25 +67,36 @@ public ResponseEntity<RewritePreviewResponse> preview(
6567

6668
}
6769

68-
// 리라이티 결과 생성(저장)하기
69-
@PostMapping("rewrite-results")
70-
public ResponseEntity<RewriteResponse> create(
70+
// 내 리라이팅 히스토리(페이징)
71+
@GetMapping("/rewrite-results/my")
72+
public ResponseEntity<Page<RewriteHistoryItemResponse>> getMyHistory(
7173
@AuthenticationPrincipal CustomUserDetails principal,
72-
@RequestBody @Valid CreateRewriteRequest req){
73-
74+
@RequestParam(defaultValue = "0") int page,
75+
@RequestParam(defaultValue = "10") int size
76+
) {
7477
Long userId = requireUserId(principal);
78+
return ResponseEntity.ok(rewriteResultService.getMyHistory(userId, page, size));
79+
}
7580

76-
RewriteResponse res = rewriteResultService.create(req);
77-
return ResponseEntity.created(URI.create("/api/rewrite-results/" + res.id())).body(res);
81+
// 내 최신 리라이팅 1건
82+
@GetMapping("/rewrite-results/my/latest")
83+
public ResponseEntity<RewriteHistoryItemResponse> getMyLatest(
84+
@AuthenticationPrincipal CustomUserDetails principal
85+
) {
86+
Long userId = requireUserId(principal);
87+
return ResponseEntity.ok(rewriteResultService.getMyLatest(userId));
7888
}
7989

90+
8091
// 프롬프트별 리라이팅 결과 전체 목록 조회
92+
@Operation(hidden = true, deprecated = true)
8193
@GetMapping("/prompts/{promptId}/rewrites")
8294
public ResponseEntity<List<RewriteResponse>> getByPrompt(@PathVariable Long promptId){
8395
return ResponseEntity.ok(rewriteResultService.getListByPrompt(promptId));
8496
}
8597

8698
// 프롬프트별 최신 1건 조회
99+
@Operation(hidden = true, deprecated = true)
87100
@GetMapping("/prompts/{promptId}/rewrites/latest")
88101
public ResponseEntity<RewriteResponse> getLatest(
89102
@AuthenticationPrincipal CustomUserDetails principal,
@@ -96,6 +109,7 @@ public ResponseEntity<RewriteResponse> getLatest(
96109
}
97110

98111
// 리라이팅 결과 단건 조회
112+
@Operation(hidden = true, deprecated = true)
99113
@GetMapping("/rewrite-results/{id}")
100114
public ResponseEntity<RewriteResponse> getOne(
101115
@AuthenticationPrincipal CustomUserDetails principal,
@@ -107,6 +121,7 @@ public ResponseEntity<RewriteResponse> getOne(
107121
}
108122

109123
// 리라이팅 삭제하기
124+
@Operation(hidden = true, deprecated = true)
110125
@DeleteMapping("/rewrite-results/{id}")
111126
public ResponseEntity<Void> delete(
112127
@AuthenticationPrincipal CustomUserDetails principal,
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package com.tave.PromptMate.dto.rewrite;
2+
3+
import java.time.LocalDateTime;
4+
5+
public record RewriteHistoryItemResponse(
6+
Long rewriteResultId,
7+
Long promptId,
8+
String beforePrompt, // 원문
9+
String rewrittenPrompt, // 결과
10+
Long latencyMs,
11+
String modelName,
12+
String version,
13+
LocalDateTime createdAt
14+
) {}

src/main/java/com/tave/PromptMate/repository/RewriteResultRepository.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package com.tave.PromptMate.repository;
22

33
import com.tave.PromptMate.domain.RewriteResult;
4+
import org.springframework.data.domain.Page;
5+
import org.springframework.data.domain.Pageable;
46
import org.springframework.data.jpa.repository.JpaRepository;
57

68
import java.util.List;
@@ -13,4 +15,9 @@ public interface RewriteResultRepository extends JpaRepository<RewriteResult, Lo
1315

1416
// 프롬프트별 전체 리라이팅 (최신순)
1517
List<RewriteResult> findByPromptIdOrderByCreatedAtDesc(Long promptId);
18+
19+
Page<RewriteResult> findByUserIdOrderByCreatedAtDesc(Long userId, Pageable pageable);
20+
21+
Optional<RewriteResult> findTopByUserIdOrderByCreatedAtDesc(Long userId);
22+
1623
}

src/main/java/com/tave/PromptMate/service/RewriteResultService.java

Lines changed: 55 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,15 @@
44
import com.tave.PromptMate.common.RewriteRunner;
55
import com.tave.PromptMate.domain.Prompt;
66
import com.tave.PromptMate.domain.RewriteResult;
7-
import com.tave.PromptMate.dto.rewrite.AiRewriteResult;
8-
import com.tave.PromptMate.dto.rewrite.CreateRewriteRequest;
9-
import com.tave.PromptMate.dto.rewrite.RewriteMapper;
10-
import com.tave.PromptMate.dto.rewrite.RewriteResponse;
7+
import com.tave.PromptMate.domain.User;
8+
import com.tave.PromptMate.dto.rewrite.*;
119
import com.tave.PromptMate.repository.PromptRepository;
1210
import com.tave.PromptMate.repository.RewriteResultRepository;
11+
import com.tave.PromptMate.repository.UserRepository;
1312
import lombok.RequiredArgsConstructor;
13+
import org.springframework.data.domain.Page;
14+
import org.springframework.data.domain.PageRequest;
15+
import org.springframework.data.domain.Pageable;
1416
import org.springframework.stereotype.Service;
1517
import org.springframework.transaction.annotation.Transactional;
1618

@@ -24,13 +26,28 @@ public class RewriteResultService {
2426
private final RewriteResultRepository rewriteResultRepository;
2527
private final PromptRepository promptRepository;
2628
private final RewriteRunner rewriteRunner;
29+
private final UserRepository userRepository;
2730

2831

2932
public Long createDraft(Long userId, String beforePrompt, AiRewriteResult ai) {
3033

34+
User user = userRepository.findById(userId)
35+
.orElseThrow(()->new NotFoundException("user not found: " + userId));
36+
37+
Prompt prompt = Prompt.builder()
38+
.user(user)
39+
.title("Draft Prompt")
40+
.content(beforePrompt)
41+
.deleted(true)
42+
.isPrivate(true)
43+
.category(null)
44+
.build();
45+
46+
promptRepository.save(prompt);
47+
3148
RewriteResult entity = RewriteResult.builder()
3249
.userId(userId)
33-
.prompt(null)
50+
.prompt(prompt)
3451
.modelName(ai.modelName())
3552
.inputTokens(ai.inputTokens())
3653
.outputTokens(ai.outputTokens())
@@ -42,6 +59,39 @@ public Long createDraft(Long userId, String beforePrompt, AiRewriteResult ai) {
4259
return entity.getId();
4360
}
4461

62+
public Page<RewriteHistoryItemResponse> getMyHistory(Long userId, int page, int size) {
63+
Pageable pageable = PageRequest.of(page, size);
64+
65+
return rewriteResultRepository.findByUserIdOrderByCreatedAtDesc(userId, pageable)
66+
.map(rr -> new RewriteHistoryItemResponse(
67+
rr.getId(),
68+
rr.getPrompt() != null ? rr.getPrompt().getId() : null,
69+
rr.getPrompt() != null ? rr.getPrompt().getContent() : null,
70+
rr.getContent(),
71+
rr.getLatencyMs(),
72+
rr.getModelName(),
73+
"v1",
74+
rr.getCreatedAt()
75+
));
76+
}
77+
78+
public RewriteHistoryItemResponse getMyLatest(Long userId) {
79+
RewriteResult rr = rewriteResultRepository.findTopByUserIdOrderByCreatedAtDesc(userId)
80+
.orElseThrow(() -> new NotFoundException("내 리라이팅 기록이 없습니다. userId=" + userId));
81+
82+
return new RewriteHistoryItemResponse(
83+
rr.getId(),
84+
rr.getPrompt() != null ? rr.getPrompt().getId() : null,
85+
rr.getPrompt() != null ? rr.getPrompt().getContent() : null,
86+
rr.getContent(),
87+
rr.getLatencyMs(),
88+
rr.getModelName(),
89+
"v1",
90+
rr.getCreatedAt()
91+
);
92+
}
93+
94+
4595

4696

4797

0 commit comments

Comments
 (0)