From 25557b2c222d66b7988becd55ba068caf6d59452 Mon Sep 17 00:00:00 2001 From: yichen Date: Wed, 26 Mar 2025 14:18:11 +0800 Subject: [PATCH 01/17] feat: add mock text suggestion and edited text suggestion API endpoints --- mock/suggestion/Dockerfile | 14 ++++++ mock/suggestion/app.py | 84 ++++++++++++++++++++++++++++++++ mock/suggestion/config.py | 19 ++++++++ mock/suggestion/requirements.txt | 2 + 4 files changed, 119 insertions(+) create mode 100644 mock/suggestion/Dockerfile create mode 100644 mock/suggestion/app.py create mode 100644 mock/suggestion/config.py create mode 100644 mock/suggestion/requirements.txt diff --git a/mock/suggestion/Dockerfile b/mock/suggestion/Dockerfile new file mode 100644 index 00000000..b1a1e913 --- /dev/null +++ b/mock/suggestion/Dockerfile @@ -0,0 +1,14 @@ +FROM python:3.9-slim +LABEL authors="yichen" + +WORKDIR /app + +COPY app.py . +COPY config.py . +COPY requirements.txt . + +RUN pip install -r requirements.txt + +EXPOSE 5000 + +CMD ["python", "app.py"] diff --git a/mock/suggestion/app.py b/mock/suggestion/app.py new file mode 100644 index 00000000..4ea2eb52 --- /dev/null +++ b/mock/suggestion/app.py @@ -0,0 +1,84 @@ +from flask import Flask, request, jsonify +from flask_cors import CORS +import json +from config import KEYWORDS, REPLACEMENTS + +app = Flask(__name__) +CORS(app) + +def highlight_text(text): + """Scan text for predefined keywords and highlight them with tags.""" + highlighted_text = text + suggestions = [] + counter = 1 + + for category, words in KEYWORDS.items(): + for word in words: + if word in highlighted_text: + tag = f"{word}" + highlighted_text = highlighted_text.replace(word, tag, 1) + suggestions.append({ + "message": f"{highlighted_text}", + "feedback": f"This phrase falls under {category}. Consider rewording.", + "replacement": REPLACEMENTS.get(word, f"Consider rewording '{word}'") + }) + counter += 1 + + return highlighted_text, suggestions + +@app.route('/api/mock-text-suggestion', methods=['POST']) +def mock_text_suggestion(): + """Mock API to analyze the original text input.""" + data = request.json + text = data.get("text", "") + + if not text: + return jsonify({"error": "No text provided"}), 400 + + highlighted_text, suggestions = highlight_text(text) + + response = { + "text": text, + "suggestions": suggestions + } + + return app.response_class( + response=json.dumps(response, ensure_ascii=False), + status=200, + mimetype="application/json" + ) + +@app.route('/api/mock-edited-text-suggestion', methods=['POST']) +def mock_edited_text_suggestion(): + """Mock API to analyze user-edited text.""" + data = request.json + text = data.get("text", "") + edited_text = data.get("edited_text", "") + suggestions = data.get("suggestions", []) + + if not text or not edited_text: + return jsonify({"error": "No text or edited_text provided"}), 400 + + # Mock the text-suggestion for edited highlight text + new_suggestions = [] + for suggestion in suggestions: + if "" in suggestion["message"]: # Only provide suggestion for `` + new_suggestions.append({ + "edited_message": suggestion["edited_message"].replace("來佔便宜", "可能尋求更好的經濟機會"), + "feedback": "‘佔便宜’ 可能帶有偏見性表述,建議以更客觀的方式描述難民的處境。", + "replacement": "部分難民可能尋求更好的經濟機會與生活條件" + }) + + response = { + "edited_text": edited_text, + "suggestions": new_suggestions + } + + return app.response_class( + response=json.dumps(response, ensure_ascii=False), + status=200, + mimetype="application/json" + ) + +if __name__ == '__main__': + app.run(host='0.0.0.0', port=5000, debug=True) diff --git a/mock/suggestion/config.py b/mock/suggestion/config.py new file mode 100644 index 00000000..b074795f --- /dev/null +++ b/mock/suggestion/config.py @@ -0,0 +1,19 @@ +KEYWORDS = { + "煽動性詞語": ["邪惡", "愚蠢", "可恥", "荒謬", "噁心", "醜陋"], + "極端化詞彙": ["所有", "沒有例外", "絕對", "從來沒有", "毫無疑問"], + "缺乏事實支持": ["明顯", "大家都知道", "鐵一般的事實"], + "人身攻擊": ["蠢蛋", "白痴", "低能", "垃圾", "腦殘", "智障"], + "偏見 & 刻板印象": ["某某派", "某某黨", "年輕人都", "女人就是", "男人就是"], + "引戰語言": ["你不懂啦", "這麼簡單的道理", "睜眼說瞎話", "你果然是"], + "缺乏邏輯推理": ["我猜測", "應該是這樣", "想都不用想", "這一定是"] +} + +REPLACEMENTS = { + "愚蠢": "可能存在問題", + "所有": "許多", + "明顯": "根據數據顯示", + "垃圾": "缺乏邏輯", + "年輕人都": "某些年輕人可能傾向於", + "你不懂啦": "這點可能需要進一步討論", + "我猜測": "根據目前資訊,我推測" +} \ No newline at end of file diff --git a/mock/suggestion/requirements.txt b/mock/suggestion/requirements.txt new file mode 100644 index 00000000..70114e3f --- /dev/null +++ b/mock/suggestion/requirements.txt @@ -0,0 +1,2 @@ +flask +flask-cors \ No newline at end of file From 1ede06d62a2c42d46c24866b4d9fc1889eace63c Mon Sep 17 00:00:00 2001 From: yichen Date: Thu, 27 Mar 2025 15:16:23 +0800 Subject: [PATCH 02/17] feat: add text suggestion dto --- .../dto/EditedTextRequestSuggestionItem.java | 21 ++++++++++++++++++ .../dto/EditedTextResponseSuggestionItem.java | 19 ++++++++++++++++ .../dto/EditedTextSuggestionMapper.java | 21 ++++++++++++++++++ .../dto/EditedTextSuggestionRequest.java | 22 +++++++++++++++++++ .../dto/EditedTextSuggestionResponse.java | 20 +++++++++++++++++ .../dto/TextResponseSuggestionItem.java | 17 ++++++++++++++ .../suggestion/dto/TextSuggestionMapper.java | 21 ++++++++++++++++++ .../suggestion/dto/TextSuggestionRequest.java | 13 +++++++++++ .../dto/TextSuggestionResponse.java | 18 +++++++++++++++ .../service/suggestion/dto/package-info.java | 1 + 10 files changed, 173 insertions(+) create mode 100644 src/main/java/tw/commonground/backend/service/suggestion/dto/EditedTextRequestSuggestionItem.java create mode 100644 src/main/java/tw/commonground/backend/service/suggestion/dto/EditedTextResponseSuggestionItem.java create mode 100644 src/main/java/tw/commonground/backend/service/suggestion/dto/EditedTextSuggestionMapper.java create mode 100644 src/main/java/tw/commonground/backend/service/suggestion/dto/EditedTextSuggestionRequest.java create mode 100644 src/main/java/tw/commonground/backend/service/suggestion/dto/EditedTextSuggestionResponse.java create mode 100644 src/main/java/tw/commonground/backend/service/suggestion/dto/TextResponseSuggestionItem.java create mode 100644 src/main/java/tw/commonground/backend/service/suggestion/dto/TextSuggestionMapper.java create mode 100644 src/main/java/tw/commonground/backend/service/suggestion/dto/TextSuggestionRequest.java create mode 100644 src/main/java/tw/commonground/backend/service/suggestion/dto/TextSuggestionResponse.java create mode 100644 src/main/java/tw/commonground/backend/service/suggestion/dto/package-info.java diff --git a/src/main/java/tw/commonground/backend/service/suggestion/dto/EditedTextRequestSuggestionItem.java b/src/main/java/tw/commonground/backend/service/suggestion/dto/EditedTextRequestSuggestionItem.java new file mode 100644 index 00000000..58d942d2 --- /dev/null +++ b/src/main/java/tw/commonground/backend/service/suggestion/dto/EditedTextRequestSuggestionItem.java @@ -0,0 +1,21 @@ +package tw.commonground.backend.service.suggestion.dto; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.*; + +@Getter +@Setter +@Builder +@ToString +@NoArgsConstructor +@AllArgsConstructor +public class EditedTextRequestSuggestionItem { + private String message; + + private String feedback; + + private String replacement; + + @JsonProperty("edited_message") + private String editedMessage; +} diff --git a/src/main/java/tw/commonground/backend/service/suggestion/dto/EditedTextResponseSuggestionItem.java b/src/main/java/tw/commonground/backend/service/suggestion/dto/EditedTextResponseSuggestionItem.java new file mode 100644 index 00000000..5041088f --- /dev/null +++ b/src/main/java/tw/commonground/backend/service/suggestion/dto/EditedTextResponseSuggestionItem.java @@ -0,0 +1,19 @@ +package tw.commonground.backend.service.suggestion.dto; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.*; + +@Getter +@Setter +@Builder +@ToString +@NoArgsConstructor +@AllArgsConstructor +public class EditedTextResponseSuggestionItem { + private String feedback; + + private String replacement; + + @JsonProperty("edited_message") + private String editedMessage; +} diff --git a/src/main/java/tw/commonground/backend/service/suggestion/dto/EditedTextSuggestionMapper.java b/src/main/java/tw/commonground/backend/service/suggestion/dto/EditedTextSuggestionMapper.java new file mode 100644 index 00000000..1b8c977f --- /dev/null +++ b/src/main/java/tw/commonground/backend/service/suggestion/dto/EditedTextSuggestionMapper.java @@ -0,0 +1,21 @@ +package tw.commonground.backend.service.suggestion.dto; + +import tw.commonground.backend.service.suggestion.entity.EditedTextSuggestionDetailEntity; +import tw.commonground.backend.service.suggestion.entity.EditedTextSuggestionEntity; + +public class EditedTextSuggestionMapper { + + public static EditedTextSuggestionEntity toEntity(EditedTextSuggestionRequest request) { + return EditedTextSuggestionEntity.builder() + .editedText(request.getEditedText()) + .build(); + } + + public static EditedTextResponseSuggestionItem toResponse(EditedTextSuggestionDetailEntity entity) { + return EditedTextResponseSuggestionItem.builder() + .editedMessage(entity.getEditedMessage()) + .feedback(entity.getFeedback()) + .replacement(entity.getReplacement()) + .build(); + } +} diff --git a/src/main/java/tw/commonground/backend/service/suggestion/dto/EditedTextSuggestionRequest.java b/src/main/java/tw/commonground/backend/service/suggestion/dto/EditedTextSuggestionRequest.java new file mode 100644 index 00000000..a115e31c --- /dev/null +++ b/src/main/java/tw/commonground/backend/service/suggestion/dto/EditedTextSuggestionRequest.java @@ -0,0 +1,22 @@ +package tw.commonground.backend.service.suggestion.dto; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.*; + +import java.util.List; + +@Getter +@Setter +@Builder +@ToString +@AllArgsConstructor +@NoArgsConstructor +public class EditedTextSuggestionRequest { + private String text; + + @JsonProperty("edited_text") + private String editedText; + + @ToString.Exclude + private List suggestions; +} diff --git a/src/main/java/tw/commonground/backend/service/suggestion/dto/EditedTextSuggestionResponse.java b/src/main/java/tw/commonground/backend/service/suggestion/dto/EditedTextSuggestionResponse.java new file mode 100644 index 00000000..5a2d3934 --- /dev/null +++ b/src/main/java/tw/commonground/backend/service/suggestion/dto/EditedTextSuggestionResponse.java @@ -0,0 +1,20 @@ +package tw.commonground.backend.service.suggestion.dto; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.*; + +import java.util.List; + +@Getter +@Setter +@Builder +@ToString +@AllArgsConstructor +@NoArgsConstructor +public class EditedTextSuggestionResponse { + @JsonProperty("edited_text") + private String editedText; + + @ToString.Exclude + private List suggestions; +} diff --git a/src/main/java/tw/commonground/backend/service/suggestion/dto/TextResponseSuggestionItem.java b/src/main/java/tw/commonground/backend/service/suggestion/dto/TextResponseSuggestionItem.java new file mode 100644 index 00000000..01fad687 --- /dev/null +++ b/src/main/java/tw/commonground/backend/service/suggestion/dto/TextResponseSuggestionItem.java @@ -0,0 +1,17 @@ +package tw.commonground.backend.service.suggestion.dto; + +import lombok.*; + +@Getter +@Setter +@Builder +@ToString +@NoArgsConstructor +@AllArgsConstructor +public class TextResponseSuggestionItem { + private String message; + + private String feedback; + + private String replacement; +} diff --git a/src/main/java/tw/commonground/backend/service/suggestion/dto/TextSuggestionMapper.java b/src/main/java/tw/commonground/backend/service/suggestion/dto/TextSuggestionMapper.java new file mode 100644 index 00000000..d75e365d --- /dev/null +++ b/src/main/java/tw/commonground/backend/service/suggestion/dto/TextSuggestionMapper.java @@ -0,0 +1,21 @@ +package tw.commonground.backend.service.suggestion.dto; + +import tw.commonground.backend.service.suggestion.entity.TextSuggestionDetailEntity; +import tw.commonground.backend.service.suggestion.entity.TextSuggestionEntity; + +public class TextSuggestionMapper { + + public static TextSuggestionEntity toEntity(TextSuggestionRequest request) { + return TextSuggestionEntity.builder() + .text(request.getText()) + .build(); + } + + public static TextResponseSuggestionItem toResponse(TextSuggestionDetailEntity entity) { + return TextResponseSuggestionItem.builder() + .message(entity.getMessage()) + .feedback(entity.getFeedback()) + .replacement(entity.getReplacement()) + .build(); + } +} diff --git a/src/main/java/tw/commonground/backend/service/suggestion/dto/TextSuggestionRequest.java b/src/main/java/tw/commonground/backend/service/suggestion/dto/TextSuggestionRequest.java new file mode 100644 index 00000000..32443666 --- /dev/null +++ b/src/main/java/tw/commonground/backend/service/suggestion/dto/TextSuggestionRequest.java @@ -0,0 +1,13 @@ +package tw.commonground.backend.service.suggestion.dto; + +import lombok.*; + +@Getter +@Setter +@Builder +@ToString +@AllArgsConstructor +@NoArgsConstructor +public class TextSuggestionRequest { + private String text; +} diff --git a/src/main/java/tw/commonground/backend/service/suggestion/dto/TextSuggestionResponse.java b/src/main/java/tw/commonground/backend/service/suggestion/dto/TextSuggestionResponse.java new file mode 100644 index 00000000..3adfb03e --- /dev/null +++ b/src/main/java/tw/commonground/backend/service/suggestion/dto/TextSuggestionResponse.java @@ -0,0 +1,18 @@ +package tw.commonground.backend.service.suggestion.dto; + +import lombok.*; + +import java.util.List; + +@Getter +@Setter +@Builder +@ToString +@AllArgsConstructor +@NoArgsConstructor +public class TextSuggestionResponse { + private String text; + + @ToString.Exclude + private List suggestions; +} diff --git a/src/main/java/tw/commonground/backend/service/suggestion/dto/package-info.java b/src/main/java/tw/commonground/backend/service/suggestion/dto/package-info.java new file mode 100644 index 00000000..98679e7b --- /dev/null +++ b/src/main/java/tw/commonground/backend/service/suggestion/dto/package-info.java @@ -0,0 +1 @@ +package tw.commonground.backend.service.suggestion.dto; From 261c016f27a70d46049e811a767936bea72681d5 Mon Sep 17 00:00:00 2001 From: yichen Date: Thu, 27 Mar 2025 15:17:38 +0800 Subject: [PATCH 03/17] feat: add text suggestion entity --- .../EditedTextSuggestionDetailEntity.java | 29 +++++++++++++++++++ .../EditedTextSuggestionDetailRepository.java | 6 ++++ .../entity/EditedTextSuggestionEntity.java | 25 ++++++++++++++++ .../EditedTextSuggestionRepository.java | 6 ++++ .../entity/TextSuggestionDetailEntity.java | 27 +++++++++++++++++ .../TextSuggestionDetailRepository.java | 6 ++++ .../entity/TextSuggestionEntity.java | 25 ++++++++++++++++ .../entity/TextSuggestionRepository.java | 6 ++++ .../suggestion/entity/package-info.java | 1 + 9 files changed, 131 insertions(+) create mode 100644 src/main/java/tw/commonground/backend/service/suggestion/entity/EditedTextSuggestionDetailEntity.java create mode 100644 src/main/java/tw/commonground/backend/service/suggestion/entity/EditedTextSuggestionDetailRepository.java create mode 100644 src/main/java/tw/commonground/backend/service/suggestion/entity/EditedTextSuggestionEntity.java create mode 100644 src/main/java/tw/commonground/backend/service/suggestion/entity/EditedTextSuggestionRepository.java create mode 100644 src/main/java/tw/commonground/backend/service/suggestion/entity/TextSuggestionDetailEntity.java create mode 100644 src/main/java/tw/commonground/backend/service/suggestion/entity/TextSuggestionDetailRepository.java create mode 100644 src/main/java/tw/commonground/backend/service/suggestion/entity/TextSuggestionEntity.java create mode 100644 src/main/java/tw/commonground/backend/service/suggestion/entity/TextSuggestionRepository.java create mode 100644 src/main/java/tw/commonground/backend/service/suggestion/entity/package-info.java diff --git a/src/main/java/tw/commonground/backend/service/suggestion/entity/EditedTextSuggestionDetailEntity.java b/src/main/java/tw/commonground/backend/service/suggestion/entity/EditedTextSuggestionDetailEntity.java new file mode 100644 index 00000000..be069928 --- /dev/null +++ b/src/main/java/tw/commonground/backend/service/suggestion/entity/EditedTextSuggestionDetailEntity.java @@ -0,0 +1,29 @@ +package tw.commonground.backend.service.suggestion.entity; + +import jakarta.persistence.*; +import lombok.*; + +@Entity +@Getter +@Setter +@Builder +@ToString +@AllArgsConstructor +@NoArgsConstructor +public class EditedTextSuggestionDetailEntity { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @ManyToOne + @JoinColumn(name = "edited_text_suggestion_id", nullable = false) + @ToString.Exclude + private EditedTextSuggestionEntity editedTextSuggestion; + + private String editedMessage; + + private String feedback; + + private String replacement; +} diff --git a/src/main/java/tw/commonground/backend/service/suggestion/entity/EditedTextSuggestionDetailRepository.java b/src/main/java/tw/commonground/backend/service/suggestion/entity/EditedTextSuggestionDetailRepository.java new file mode 100644 index 00000000..d29f34a6 --- /dev/null +++ b/src/main/java/tw/commonground/backend/service/suggestion/entity/EditedTextSuggestionDetailRepository.java @@ -0,0 +1,6 @@ +package tw.commonground.backend.service.suggestion.entity; + +import org.springframework.data.jpa.repository.JpaRepository; + +public interface EditedTextSuggestionDetailRepository extends JpaRepository { +} diff --git a/src/main/java/tw/commonground/backend/service/suggestion/entity/EditedTextSuggestionEntity.java b/src/main/java/tw/commonground/backend/service/suggestion/entity/EditedTextSuggestionEntity.java new file mode 100644 index 00000000..5edff8bc --- /dev/null +++ b/src/main/java/tw/commonground/backend/service/suggestion/entity/EditedTextSuggestionEntity.java @@ -0,0 +1,25 @@ +package tw.commonground.backend.service.suggestion.entity; + +import jakarta.persistence.*; +import lombok.*; + +import java.util.ArrayList; +import java.util.List; + +@Entity +@Getter +@Setter +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class EditedTextSuggestionEntity { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + private String editedText; + + @OneToMany(mappedBy = "editedTextSuggestion", cascade = CascadeType.ALL, orphanRemoval = true) + @ToString.Exclude + private List suggestions = new ArrayList<>(); +} diff --git a/src/main/java/tw/commonground/backend/service/suggestion/entity/EditedTextSuggestionRepository.java b/src/main/java/tw/commonground/backend/service/suggestion/entity/EditedTextSuggestionRepository.java new file mode 100644 index 00000000..b23e5048 --- /dev/null +++ b/src/main/java/tw/commonground/backend/service/suggestion/entity/EditedTextSuggestionRepository.java @@ -0,0 +1,6 @@ +package tw.commonground.backend.service.suggestion.entity; + +import org.springframework.data.jpa.repository.JpaRepository; + +public interface EditedTextSuggestionRepository extends JpaRepository { +} diff --git a/src/main/java/tw/commonground/backend/service/suggestion/entity/TextSuggestionDetailEntity.java b/src/main/java/tw/commonground/backend/service/suggestion/entity/TextSuggestionDetailEntity.java new file mode 100644 index 00000000..1d2e53e2 --- /dev/null +++ b/src/main/java/tw/commonground/backend/service/suggestion/entity/TextSuggestionDetailEntity.java @@ -0,0 +1,27 @@ +package tw.commonground.backend.service.suggestion.entity; + +import jakarta.persistence.*; +import lombok.*; + +@Entity +@Getter +@Setter +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class TextSuggestionDetailEntity { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @ManyToOne + @JoinColumn(name = "text_suggestion_id", nullable = false) + @ToString.Exclude + private TextSuggestionEntity textSuggestion; + + private String message; + + private String feedback; + + private String replacement; +} diff --git a/src/main/java/tw/commonground/backend/service/suggestion/entity/TextSuggestionDetailRepository.java b/src/main/java/tw/commonground/backend/service/suggestion/entity/TextSuggestionDetailRepository.java new file mode 100644 index 00000000..447c1779 --- /dev/null +++ b/src/main/java/tw/commonground/backend/service/suggestion/entity/TextSuggestionDetailRepository.java @@ -0,0 +1,6 @@ +package tw.commonground.backend.service.suggestion.entity; + +import org.springframework.data.jpa.repository.JpaRepository; + +public interface TextSuggestionDetailRepository extends JpaRepository { +} diff --git a/src/main/java/tw/commonground/backend/service/suggestion/entity/TextSuggestionEntity.java b/src/main/java/tw/commonground/backend/service/suggestion/entity/TextSuggestionEntity.java new file mode 100644 index 00000000..617c62a1 --- /dev/null +++ b/src/main/java/tw/commonground/backend/service/suggestion/entity/TextSuggestionEntity.java @@ -0,0 +1,25 @@ +package tw.commonground.backend.service.suggestion.entity; + +import jakarta.persistence.*; +import lombok.*; + +import java.util.ArrayList; +import java.util.List; + +@Entity +@Getter +@Setter +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class TextSuggestionEntity { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + private String text; + + @OneToMany(mappedBy = "textSuggestion", cascade = CascadeType.ALL, orphanRemoval = true) + @ToString.Exclude + private List suggestions = new ArrayList<>(); +} diff --git a/src/main/java/tw/commonground/backend/service/suggestion/entity/TextSuggestionRepository.java b/src/main/java/tw/commonground/backend/service/suggestion/entity/TextSuggestionRepository.java new file mode 100644 index 00000000..51d64a63 --- /dev/null +++ b/src/main/java/tw/commonground/backend/service/suggestion/entity/TextSuggestionRepository.java @@ -0,0 +1,6 @@ +package tw.commonground.backend.service.suggestion.entity; + +import org.springframework.data.jpa.repository.JpaRepository; + +public interface TextSuggestionRepository extends JpaRepository { +} diff --git a/src/main/java/tw/commonground/backend/service/suggestion/entity/package-info.java b/src/main/java/tw/commonground/backend/service/suggestion/entity/package-info.java new file mode 100644 index 00000000..c16fdf0e --- /dev/null +++ b/src/main/java/tw/commonground/backend/service/suggestion/entity/package-info.java @@ -0,0 +1 @@ +package tw.commonground.backend.service.suggestion.entity; From 9402e918775f040638fa705b017eacec8f165d06 Mon Sep 17 00:00:00 2001 From: yichen Date: Thu, 27 Mar 2025 15:20:22 +0800 Subject: [PATCH 04/17] feat: add text suggestion controller and service. --- .../suggestion/SuggestionController.java | 27 +++++ .../service/suggestion/SuggestionService.java | 105 ++++++++++++++++++ .../service/suggestion/package-info.java | 1 + 3 files changed, 133 insertions(+) create mode 100644 src/main/java/tw/commonground/backend/service/suggestion/SuggestionController.java create mode 100644 src/main/java/tw/commonground/backend/service/suggestion/SuggestionService.java create mode 100644 src/main/java/tw/commonground/backend/service/suggestion/package-info.java diff --git a/src/main/java/tw/commonground/backend/service/suggestion/SuggestionController.java b/src/main/java/tw/commonground/backend/service/suggestion/SuggestionController.java new file mode 100644 index 00000000..7425b77d --- /dev/null +++ b/src/main/java/tw/commonground/backend/service/suggestion/SuggestionController.java @@ -0,0 +1,27 @@ +package tw.commonground.backend.service.suggestion; + +import tw.commonground.backend.service.suggestion.dto.*; +import org.springframework.web.bind.annotation.*; +import tw.commonground.backend.shared.tracing.Traced; + +@Traced +@RestController +@RequestMapping("/api") +public class SuggestionController { + + private final SuggestionService suggestionService; + + public SuggestionController(SuggestionService suggestionService) { + this.suggestionService = suggestionService; + } + + @PostMapping("/text-suggestion") + public TextSuggestionResponse getTextSuggestions(@RequestBody TextSuggestionRequest request) { + return suggestionService.getTextSuggestions(request); + } + + @PostMapping("/edited-text-suggestion") + public EditedTextSuggestionResponse getEditedTextSuggestions(@RequestBody EditedTextSuggestionRequest request) { + return suggestionService.getEditedTextSuggestions(request); + } +} diff --git a/src/main/java/tw/commonground/backend/service/suggestion/SuggestionService.java b/src/main/java/tw/commonground/backend/service/suggestion/SuggestionService.java new file mode 100644 index 00000000..e7472e09 --- /dev/null +++ b/src/main/java/tw/commonground/backend/service/suggestion/SuggestionService.java @@ -0,0 +1,105 @@ +package tw.commonground.backend.service.suggestion; + +import tw.commonground.backend.service.suggestion.dto.*; +import tw.commonground.backend.service.suggestion.entity.*; +import tw.commonground.backend.service.suggestion.dto.TextSuggestionMapper; +import tw.commonground.backend.service.suggestion.dto.EditedTextSuggestionMapper; +import org.springframework.http.*; +import org.springframework.stereotype.Service; +import org.springframework.web.client.RestTemplate; + +import java.util.ArrayList; +import java.util.List; + +@Service +public class SuggestionService { + + private final RestTemplate restTemplate = new RestTemplate(); + private final String MOCK_API_URL = "http://localhost:5001"; + + private final TextSuggestionRepository textSuggestionRepository; + private final TextSuggestionDetailRepository textSuggestionDetailRepository; + private final EditedTextSuggestionRepository editedTextSuggestionRepository; + private final EditedTextSuggestionDetailRepository editedTextSuggestionDetailRepository; + + public SuggestionService(TextSuggestionRepository textSuggestionRepository, + TextSuggestionDetailRepository textSuggestionDetailRepository, + EditedTextSuggestionRepository editedTextSuggestionRepository, + EditedTextSuggestionDetailRepository editedTextSuggestionDetailRepository) { + this.textSuggestionRepository = textSuggestionRepository; + this.textSuggestionDetailRepository = textSuggestionDetailRepository; + this.editedTextSuggestionRepository = editedTextSuggestionRepository; + this.editedTextSuggestionDetailRepository = editedTextSuggestionDetailRepository; + } + + + public TextSuggestionResponse getTextSuggestions(TextSuggestionRequest request) { + String url = MOCK_API_URL + "/api/mock-text-suggestion"; + TextSuggestionResponse response = makePostRequest(url, request, TextSuggestionResponse.class); + + TextSuggestionEntity textSuggestionEntity = textSuggestionRepository.save( + TextSuggestionMapper.toEntity(request) + ); + + if (textSuggestionEntity.getSuggestions() == null) { + textSuggestionEntity.setSuggestions(new ArrayList<>()); + } + + textSuggestionEntity.getSuggestions().clear(); + List details = response.getSuggestions().stream() + .map(suggestion -> TextSuggestionDetailEntity.builder() + .textSuggestion(textSuggestionEntity) + .message(suggestion.getMessage()) + .feedback(suggestion.getFeedback()) + .replacement(suggestion.getReplacement()) + .build()) + .toList(); + + textSuggestionDetailRepository.saveAll(details); + textSuggestionEntity.getSuggestions().addAll(details); + textSuggestionRepository.save(textSuggestionEntity); + + return response; + } + + + public EditedTextSuggestionResponse getEditedTextSuggestions(EditedTextSuggestionRequest request) { + String url = MOCK_API_URL + "/api/mock-edited-text-suggestion"; + EditedTextSuggestionResponse response = makePostRequest(url, request, EditedTextSuggestionResponse.class); + + EditedTextSuggestionEntity editedTextSuggestionEntity = editedTextSuggestionRepository.save( + EditedTextSuggestionMapper.toEntity(request) + ); + + if (editedTextSuggestionEntity.getSuggestions() == null) { + editedTextSuggestionEntity.setSuggestions(new ArrayList<>()); + } + + editedTextSuggestionEntity.getSuggestions().clear(); + List details = response.getSuggestions().stream() + .map(suggestion -> EditedTextSuggestionDetailEntity.builder() + .editedTextSuggestion(editedTextSuggestionEntity) + .editedMessage(suggestion.getEditedMessage()) + .feedback(suggestion.getFeedback()) + .replacement(suggestion.getReplacement()) + .build()) + .toList(); + + editedTextSuggestionDetailRepository.saveAll(details); + editedTextSuggestionEntity.getSuggestions().addAll(details); + editedTextSuggestionRepository.save(editedTextSuggestionEntity); + + return response; + } + + + private T makePostRequest(String url, Object request, Class responseType) { + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON); + + HttpEntity requestEntity = new HttpEntity<>(request, headers); + ResponseEntity response = restTemplate.exchange(url, HttpMethod.POST, requestEntity, responseType); + + return response.getBody(); + } +} diff --git a/src/main/java/tw/commonground/backend/service/suggestion/package-info.java b/src/main/java/tw/commonground/backend/service/suggestion/package-info.java new file mode 100644 index 00000000..e7b40a5c --- /dev/null +++ b/src/main/java/tw/commonground/backend/service/suggestion/package-info.java @@ -0,0 +1 @@ +package tw.commonground.backend.service.suggestion; From f57841e83ea961cef0df94123913d312f8be7d97 Mon Sep 17 00:00:00 2001 From: yichen Date: Thu, 27 Mar 2025 15:21:46 +0800 Subject: [PATCH 05/17] feat: add docker-compose to run PostgreSQL and mock suggestion services --- docker-compose.yml | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 docker-compose.yml diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 00000000..f884024a --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,34 @@ +version: "3.8" + +services: + mock-suggestion: + build: + context: ./mock/suggestion + dockerfile: Dockerfile + container_name: mock-suggestion + ports: + - "5001:5000" + networks: + - cg-network + + postgres: + image: postgres:latest + container_name: postgres + environment: + POSTGRES_USER: postgres + POSTGRES_PASSWORD: password + POSTGRES_DB: commonground + ports: + - "5432:5432" + networks: + - cg-network + volumes: + - postgres_data:/var/lib/postgresql/data + +networks: + cg-network: + driver: bridge + +volumes: + postgres_data: + driver: local From 34d1a4d97eaf7edbb0d1ca34d4b86e4cca0bf5af Mon Sep 17 00:00:00 2001 From: yichen Date: Thu, 27 Mar 2025 15:24:09 +0800 Subject: [PATCH 06/17] refactor: make TextSuggestionMapper and EditedTextSuggestionMapper constructor private --- .../service/suggestion/dto/EditedTextSuggestionMapper.java | 6 +++++- .../service/suggestion/dto/TextSuggestionMapper.java | 6 +++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/main/java/tw/commonground/backend/service/suggestion/dto/EditedTextSuggestionMapper.java b/src/main/java/tw/commonground/backend/service/suggestion/dto/EditedTextSuggestionMapper.java index 1b8c977f..489108f8 100644 --- a/src/main/java/tw/commonground/backend/service/suggestion/dto/EditedTextSuggestionMapper.java +++ b/src/main/java/tw/commonground/backend/service/suggestion/dto/EditedTextSuggestionMapper.java @@ -3,7 +3,11 @@ import tw.commonground.backend.service.suggestion.entity.EditedTextSuggestionDetailEntity; import tw.commonground.backend.service.suggestion.entity.EditedTextSuggestionEntity; -public class EditedTextSuggestionMapper { +public final class EditedTextSuggestionMapper { + + private EditedTextSuggestionMapper() { + // hide constructor + } public static EditedTextSuggestionEntity toEntity(EditedTextSuggestionRequest request) { return EditedTextSuggestionEntity.builder() diff --git a/src/main/java/tw/commonground/backend/service/suggestion/dto/TextSuggestionMapper.java b/src/main/java/tw/commonground/backend/service/suggestion/dto/TextSuggestionMapper.java index d75e365d..847254cc 100644 --- a/src/main/java/tw/commonground/backend/service/suggestion/dto/TextSuggestionMapper.java +++ b/src/main/java/tw/commonground/backend/service/suggestion/dto/TextSuggestionMapper.java @@ -3,7 +3,11 @@ import tw.commonground.backend.service.suggestion.entity.TextSuggestionDetailEntity; import tw.commonground.backend.service.suggestion.entity.TextSuggestionEntity; -public class TextSuggestionMapper { +public final class TextSuggestionMapper { + + private TextSuggestionMapper() { + // hide constructor + } public static TextSuggestionEntity toEntity(TextSuggestionRequest request) { return TextSuggestionEntity.builder() From 4d48183f63917acbf5c7a2a0f68ef508456e8d64 Mon Sep 17 00:00:00 2001 From: yichen Date: Thu, 27 Mar 2025 16:07:52 +0800 Subject: [PATCH 07/17] style: fix linter issues for java. --- .../backend/service/suggestion/SuggestionService.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/tw/commonground/backend/service/suggestion/SuggestionService.java b/src/main/java/tw/commonground/backend/service/suggestion/SuggestionService.java index e7472e09..4bd05d32 100644 --- a/src/main/java/tw/commonground/backend/service/suggestion/SuggestionService.java +++ b/src/main/java/tw/commonground/backend/service/suggestion/SuggestionService.java @@ -15,7 +15,7 @@ public class SuggestionService { private final RestTemplate restTemplate = new RestTemplate(); - private final String MOCK_API_URL = "http://localhost:5001"; + private final String mockApiUrl = "http://localhost:5001"; private final TextSuggestionRepository textSuggestionRepository; private final TextSuggestionDetailRepository textSuggestionDetailRepository; @@ -34,7 +34,7 @@ public SuggestionService(TextSuggestionRepository textSuggestionRepository, public TextSuggestionResponse getTextSuggestions(TextSuggestionRequest request) { - String url = MOCK_API_URL + "/api/mock-text-suggestion"; + String url = mockApiUrl + "/api/mock-text-suggestion"; TextSuggestionResponse response = makePostRequest(url, request, TextSuggestionResponse.class); TextSuggestionEntity textSuggestionEntity = textSuggestionRepository.save( @@ -64,7 +64,7 @@ public TextSuggestionResponse getTextSuggestions(TextSuggestionRequest request) public EditedTextSuggestionResponse getEditedTextSuggestions(EditedTextSuggestionRequest request) { - String url = MOCK_API_URL + "/api/mock-edited-text-suggestion"; + String url = mockApiUrl + "/api/mock-edited-text-suggestion"; EditedTextSuggestionResponse response = makePostRequest(url, request, EditedTextSuggestionResponse.class); EditedTextSuggestionEntity editedTextSuggestionEntity = editedTextSuggestionRepository.save( From 1c1eb30c763f1f558562aa9d16c9f9a808348612 Mon Sep 17 00:00:00 2001 From: yichen Date: Thu, 27 Mar 2025 16:08:46 +0800 Subject: [PATCH 08/17] style: fix linter issues for docker. --- mock/suggestion/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mock/suggestion/Dockerfile b/mock/suggestion/Dockerfile index b1a1e913..623bbde2 100644 --- a/mock/suggestion/Dockerfile +++ b/mock/suggestion/Dockerfile @@ -7,7 +7,7 @@ COPY app.py . COPY config.py . COPY requirements.txt . -RUN pip install -r requirements.txt +RUN pip install --no-cache-dir -r requirements.txt EXPOSE 5000 From 2dd359fe650e02ada2f3b323763cb8a5ae3db018 Mon Sep 17 00:00:00 2001 From: yichen Date: Thu, 27 Mar 2025 16:13:04 +0800 Subject: [PATCH 09/17] style: fix linter issues for python. --- mock/suggestion/app.py | 5 ++++- mock/suggestion/config.py | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/mock/suggestion/app.py b/mock/suggestion/app.py index 4ea2eb52..e48dc8fb 100644 --- a/mock/suggestion/app.py +++ b/mock/suggestion/app.py @@ -64,7 +64,10 @@ def mock_edited_text_suggestion(): for suggestion in suggestions: if "" in suggestion["message"]: # Only provide suggestion for `` new_suggestions.append({ - "edited_message": suggestion["edited_message"].replace("來佔便宜", "可能尋求更好的經濟機會"), + "edited_message": suggestion["edited_message"].replace( + "來佔便宜", + "可能尋求更好的經濟機會" + ), "feedback": "‘佔便宜’ 可能帶有偏見性表述,建議以更客觀的方式描述難民的處境。", "replacement": "部分難民可能尋求更好的經濟機會與生活條件" }) diff --git a/mock/suggestion/config.py b/mock/suggestion/config.py index b074795f..8f4330b9 100644 --- a/mock/suggestion/config.py +++ b/mock/suggestion/config.py @@ -16,4 +16,4 @@ "年輕人都": "某些年輕人可能傾向於", "你不懂啦": "這點可能需要進一步討論", "我猜測": "根據目前資訊,我推測" -} \ No newline at end of file +} From 6ef7da9e28a8e87976feed8b4cf2d304f2b47858 Mon Sep 17 00:00:00 2001 From: yichen Date: Wed, 30 Apr 2025 23:20:24 +0800 Subject: [PATCH 10/17] style: fix linter --- mock/suggestion/app.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/mock/suggestion/app.py b/mock/suggestion/app.py index e48dc8fb..01fc85ff 100644 --- a/mock/suggestion/app.py +++ b/mock/suggestion/app.py @@ -6,6 +6,7 @@ app = Flask(__name__) CORS(app) + def highlight_text(text): """Scan text for predefined keywords and highlight them with tags.""" highlighted_text = text @@ -19,13 +20,16 @@ def highlight_text(text): highlighted_text = highlighted_text.replace(word, tag, 1) suggestions.append({ "message": f"{highlighted_text}", - "feedback": f"This phrase falls under {category}. Consider rewording.", - "replacement": REPLACEMENTS.get(word, f"Consider rewording '{word}'") + "feedback": + f"This phrase falls under {category}. Consider rewording.", + "replacement": + REPLACEMENTS.get(word, f"Consider rewording '{word}'") }) counter += 1 return highlighted_text, suggestions + @app.route('/api/mock-text-suggestion', methods=['POST']) def mock_text_suggestion(): """Mock API to analyze the original text input.""" @@ -48,6 +52,7 @@ def mock_text_suggestion(): mimetype="application/json" ) + @app.route('/api/mock-edited-text-suggestion', methods=['POST']) def mock_edited_text_suggestion(): """Mock API to analyze user-edited text.""" @@ -83,5 +88,6 @@ def mock_edited_text_suggestion(): mimetype="application/json" ) + if __name__ == '__main__': app.run(host='0.0.0.0', port=5000, debug=True) From e152888fa51e2cacf23d8b26bc128b5248a33f73 Mon Sep 17 00:00:00 2001 From: yichen Date: Thu, 1 May 2025 17:16:15 +0800 Subject: [PATCH 11/17] chore: set mock suggestion api debug to false --- mock/suggestion/app.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mock/suggestion/app.py b/mock/suggestion/app.py index 01fc85ff..78e8b302 100644 --- a/mock/suggestion/app.py +++ b/mock/suggestion/app.py @@ -90,4 +90,4 @@ def mock_edited_text_suggestion(): if __name__ == '__main__': - app.run(host='0.0.0.0', port=5000, debug=True) + app.run(host='0.0.0.0', port=5000, debug=False) From 7daafa9f9549b7e996fcbbb42fd8cd3006a6bf33 Mon Sep 17 00:00:00 2001 From: yichen Date: Thu, 1 May 2025 17:22:57 +0800 Subject: [PATCH 12/17] chore: skip hardcoded_bind_all_interfaces for linter --- mock/suggestion/app.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mock/suggestion/app.py b/mock/suggestion/app.py index 78e8b302..739bb0ca 100644 --- a/mock/suggestion/app.py +++ b/mock/suggestion/app.py @@ -90,4 +90,4 @@ def mock_edited_text_suggestion(): if __name__ == '__main__': - app.run(host='0.0.0.0', port=5000, debug=False) + app.run(host='0.0.0.0', port=5000, debug=False) #nosec B104 From 663ce7e09e9701952555b1e8c76656d42aa83e41 Mon Sep 17 00:00:00 2001 From: yichen Date: Thu, 1 May 2025 17:31:48 +0800 Subject: [PATCH 13/17] style: fix linter --- mock/suggestion/app.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mock/suggestion/app.py b/mock/suggestion/app.py index 739bb0ca..c58fb3bb 100644 --- a/mock/suggestion/app.py +++ b/mock/suggestion/app.py @@ -90,4 +90,4 @@ def mock_edited_text_suggestion(): if __name__ == '__main__': - app.run(host='0.0.0.0', port=5000, debug=False) #nosec B104 + app.run(host='0.0.0.0', port=5000, debug=False) # nosec B104 From 1a17111f36721d830dfa6d98874a77e10f6d3014 Mon Sep 17 00:00:00 2001 From: yichen Date: Thu, 1 May 2025 17:38:11 +0800 Subject: [PATCH 14/17] style: fix linter --- mock/suggestion/app.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mock/suggestion/app.py b/mock/suggestion/app.py index c58fb3bb..9302d3e3 100644 --- a/mock/suggestion/app.py +++ b/mock/suggestion/app.py @@ -90,4 +90,4 @@ def mock_edited_text_suggestion(): if __name__ == '__main__': - app.run(host='0.0.0.0', port=5000, debug=False) # nosec B104 + app.run(host='0.0.0.0', port=5000, debug=False) # nosec B104 From 63c0442456be01ecd732b4ebd2c75eb6f25a93e2 Mon Sep 17 00:00:00 2001 From: yichen Date: Thu, 1 May 2025 18:45:10 +0800 Subject: [PATCH 15/17] chore: disable python linter --- .mega-linter.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.mega-linter.yml b/.mega-linter.yml index db81778f..1cbcd11a 100644 --- a/.mega-linter.yml +++ b/.mega-linter.yml @@ -8,5 +8,7 @@ DISABLE_LINTERS: - REPOSITORY_DEVSKIM - REPOSITORY_TRIVY - COPYPASTE_JSCPD + - PYTHON_PYRIGHT + - PYTHON_PYLINT FILTER_REGEX_EXCLUDE: "(src/main/resources/static|script)" From 79f3c3fe7af1d69838bd3a56f1f9e53f85324976 Mon Sep 17 00:00:00 2001 From: yichen Date: Wed, 7 May 2025 14:24:34 +0800 Subject: [PATCH 16/17] fix: resolve requested changes --- .../backend/service/suggestion/SuggestionService.java | 5 ++++- .../service/suggestion/dto/EditedTextSuggestionRequest.java | 1 - .../service/suggestion/dto/EditedTextSuggestionResponse.java | 1 - .../service/suggestion/dto/TextSuggestionResponse.java | 1 - 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/tw/commonground/backend/service/suggestion/SuggestionService.java b/src/main/java/tw/commonground/backend/service/suggestion/SuggestionService.java index 4bd05d32..04d2793d 100644 --- a/src/main/java/tw/commonground/backend/service/suggestion/SuggestionService.java +++ b/src/main/java/tw/commonground/backend/service/suggestion/SuggestionService.java @@ -1,5 +1,6 @@ package tw.commonground.backend.service.suggestion; +import org.springframework.beans.factory.annotation.Value; import tw.commonground.backend.service.suggestion.dto.*; import tw.commonground.backend.service.suggestion.entity.*; import tw.commonground.backend.service.suggestion.dto.TextSuggestionMapper; @@ -15,7 +16,9 @@ public class SuggestionService { private final RestTemplate restTemplate = new RestTemplate(); - private final String mockApiUrl = "http://localhost:5001"; + + @Value("${mockApiUrl}") + private String mockApiUrl; private final TextSuggestionRepository textSuggestionRepository; private final TextSuggestionDetailRepository textSuggestionDetailRepository; diff --git a/src/main/java/tw/commonground/backend/service/suggestion/dto/EditedTextSuggestionRequest.java b/src/main/java/tw/commonground/backend/service/suggestion/dto/EditedTextSuggestionRequest.java index a115e31c..eec8c7d9 100644 --- a/src/main/java/tw/commonground/backend/service/suggestion/dto/EditedTextSuggestionRequest.java +++ b/src/main/java/tw/commonground/backend/service/suggestion/dto/EditedTextSuggestionRequest.java @@ -17,6 +17,5 @@ public class EditedTextSuggestionRequest { @JsonProperty("edited_text") private String editedText; - @ToString.Exclude private List suggestions; } diff --git a/src/main/java/tw/commonground/backend/service/suggestion/dto/EditedTextSuggestionResponse.java b/src/main/java/tw/commonground/backend/service/suggestion/dto/EditedTextSuggestionResponse.java index 5a2d3934..e4343ff9 100644 --- a/src/main/java/tw/commonground/backend/service/suggestion/dto/EditedTextSuggestionResponse.java +++ b/src/main/java/tw/commonground/backend/service/suggestion/dto/EditedTextSuggestionResponse.java @@ -15,6 +15,5 @@ public class EditedTextSuggestionResponse { @JsonProperty("edited_text") private String editedText; - @ToString.Exclude private List suggestions; } diff --git a/src/main/java/tw/commonground/backend/service/suggestion/dto/TextSuggestionResponse.java b/src/main/java/tw/commonground/backend/service/suggestion/dto/TextSuggestionResponse.java index 3adfb03e..0f93b7b7 100644 --- a/src/main/java/tw/commonground/backend/service/suggestion/dto/TextSuggestionResponse.java +++ b/src/main/java/tw/commonground/backend/service/suggestion/dto/TextSuggestionResponse.java @@ -13,6 +13,5 @@ public class TextSuggestionResponse { private String text; - @ToString.Exclude private List suggestions; } From a704fac4eab8d6c1eda8a19aeaa31a88e451b2ce Mon Sep 17 00:00:00 2001 From: yichen Date: Fri, 9 May 2025 11:56:18 +0800 Subject: [PATCH 17/17] chore: not store suggestion data into database --- .../service/suggestion/SuggestionService.java | 71 +------------------ .../dto/EditedTextSuggestionMapper.java | 25 ------- .../suggestion/dto/TextSuggestionMapper.java | 25 ------- .../EditedTextSuggestionDetailEntity.java | 29 -------- .../EditedTextSuggestionDetailRepository.java | 6 -- .../entity/EditedTextSuggestionEntity.java | 25 ------- .../EditedTextSuggestionRepository.java | 6 -- .../entity/TextSuggestionDetailEntity.java | 27 ------- .../TextSuggestionDetailRepository.java | 6 -- .../entity/TextSuggestionEntity.java | 25 ------- .../entity/TextSuggestionRepository.java | 6 -- .../suggestion/entity/package-info.java | 1 - 12 files changed, 3 insertions(+), 249 deletions(-) delete mode 100644 src/main/java/tw/commonground/backend/service/suggestion/dto/EditedTextSuggestionMapper.java delete mode 100644 src/main/java/tw/commonground/backend/service/suggestion/dto/TextSuggestionMapper.java delete mode 100644 src/main/java/tw/commonground/backend/service/suggestion/entity/EditedTextSuggestionDetailEntity.java delete mode 100644 src/main/java/tw/commonground/backend/service/suggestion/entity/EditedTextSuggestionDetailRepository.java delete mode 100644 src/main/java/tw/commonground/backend/service/suggestion/entity/EditedTextSuggestionEntity.java delete mode 100644 src/main/java/tw/commonground/backend/service/suggestion/entity/EditedTextSuggestionRepository.java delete mode 100644 src/main/java/tw/commonground/backend/service/suggestion/entity/TextSuggestionDetailEntity.java delete mode 100644 src/main/java/tw/commonground/backend/service/suggestion/entity/TextSuggestionDetailRepository.java delete mode 100644 src/main/java/tw/commonground/backend/service/suggestion/entity/TextSuggestionEntity.java delete mode 100644 src/main/java/tw/commonground/backend/service/suggestion/entity/TextSuggestionRepository.java delete mode 100644 src/main/java/tw/commonground/backend/service/suggestion/entity/package-info.java diff --git a/src/main/java/tw/commonground/backend/service/suggestion/SuggestionService.java b/src/main/java/tw/commonground/backend/service/suggestion/SuggestionService.java index 04d2793d..7f221195 100644 --- a/src/main/java/tw/commonground/backend/service/suggestion/SuggestionService.java +++ b/src/main/java/tw/commonground/backend/service/suggestion/SuggestionService.java @@ -2,16 +2,10 @@ import org.springframework.beans.factory.annotation.Value; import tw.commonground.backend.service.suggestion.dto.*; -import tw.commonground.backend.service.suggestion.entity.*; -import tw.commonground.backend.service.suggestion.dto.TextSuggestionMapper; -import tw.commonground.backend.service.suggestion.dto.EditedTextSuggestionMapper; import org.springframework.http.*; import org.springframework.stereotype.Service; import org.springframework.web.client.RestTemplate; -import java.util.ArrayList; -import java.util.List; - @Service public class SuggestionService { @@ -20,79 +14,20 @@ public class SuggestionService { @Value("${mockApiUrl}") private String mockApiUrl; - private final TextSuggestionRepository textSuggestionRepository; - private final TextSuggestionDetailRepository textSuggestionDetailRepository; - private final EditedTextSuggestionRepository editedTextSuggestionRepository; - private final EditedTextSuggestionDetailRepository editedTextSuggestionDetailRepository; - - public SuggestionService(TextSuggestionRepository textSuggestionRepository, - TextSuggestionDetailRepository textSuggestionDetailRepository, - EditedTextSuggestionRepository editedTextSuggestionRepository, - EditedTextSuggestionDetailRepository editedTextSuggestionDetailRepository) { - this.textSuggestionRepository = textSuggestionRepository; - this.textSuggestionDetailRepository = textSuggestionDetailRepository; - this.editedTextSuggestionRepository = editedTextSuggestionRepository; - this.editedTextSuggestionDetailRepository = editedTextSuggestionDetailRepository; - } + public SuggestionService() { } public TextSuggestionResponse getTextSuggestions(TextSuggestionRequest request) { String url = mockApiUrl + "/api/mock-text-suggestion"; - TextSuggestionResponse response = makePostRequest(url, request, TextSuggestionResponse.class); - - TextSuggestionEntity textSuggestionEntity = textSuggestionRepository.save( - TextSuggestionMapper.toEntity(request) - ); - - if (textSuggestionEntity.getSuggestions() == null) { - textSuggestionEntity.setSuggestions(new ArrayList<>()); - } - - textSuggestionEntity.getSuggestions().clear(); - List details = response.getSuggestions().stream() - .map(suggestion -> TextSuggestionDetailEntity.builder() - .textSuggestion(textSuggestionEntity) - .message(suggestion.getMessage()) - .feedback(suggestion.getFeedback()) - .replacement(suggestion.getReplacement()) - .build()) - .toList(); - textSuggestionDetailRepository.saveAll(details); - textSuggestionEntity.getSuggestions().addAll(details); - textSuggestionRepository.save(textSuggestionEntity); - - return response; + return makePostRequest(url, request, TextSuggestionResponse.class); } public EditedTextSuggestionResponse getEditedTextSuggestions(EditedTextSuggestionRequest request) { String url = mockApiUrl + "/api/mock-edited-text-suggestion"; - EditedTextSuggestionResponse response = makePostRequest(url, request, EditedTextSuggestionResponse.class); - - EditedTextSuggestionEntity editedTextSuggestionEntity = editedTextSuggestionRepository.save( - EditedTextSuggestionMapper.toEntity(request) - ); - - if (editedTextSuggestionEntity.getSuggestions() == null) { - editedTextSuggestionEntity.setSuggestions(new ArrayList<>()); - } - - editedTextSuggestionEntity.getSuggestions().clear(); - List details = response.getSuggestions().stream() - .map(suggestion -> EditedTextSuggestionDetailEntity.builder() - .editedTextSuggestion(editedTextSuggestionEntity) - .editedMessage(suggestion.getEditedMessage()) - .feedback(suggestion.getFeedback()) - .replacement(suggestion.getReplacement()) - .build()) - .toList(); - - editedTextSuggestionDetailRepository.saveAll(details); - editedTextSuggestionEntity.getSuggestions().addAll(details); - editedTextSuggestionRepository.save(editedTextSuggestionEntity); - return response; + return makePostRequest(url, request, EditedTextSuggestionResponse.class); } diff --git a/src/main/java/tw/commonground/backend/service/suggestion/dto/EditedTextSuggestionMapper.java b/src/main/java/tw/commonground/backend/service/suggestion/dto/EditedTextSuggestionMapper.java deleted file mode 100644 index 489108f8..00000000 --- a/src/main/java/tw/commonground/backend/service/suggestion/dto/EditedTextSuggestionMapper.java +++ /dev/null @@ -1,25 +0,0 @@ -package tw.commonground.backend.service.suggestion.dto; - -import tw.commonground.backend.service.suggestion.entity.EditedTextSuggestionDetailEntity; -import tw.commonground.backend.service.suggestion.entity.EditedTextSuggestionEntity; - -public final class EditedTextSuggestionMapper { - - private EditedTextSuggestionMapper() { - // hide constructor - } - - public static EditedTextSuggestionEntity toEntity(EditedTextSuggestionRequest request) { - return EditedTextSuggestionEntity.builder() - .editedText(request.getEditedText()) - .build(); - } - - public static EditedTextResponseSuggestionItem toResponse(EditedTextSuggestionDetailEntity entity) { - return EditedTextResponseSuggestionItem.builder() - .editedMessage(entity.getEditedMessage()) - .feedback(entity.getFeedback()) - .replacement(entity.getReplacement()) - .build(); - } -} diff --git a/src/main/java/tw/commonground/backend/service/suggestion/dto/TextSuggestionMapper.java b/src/main/java/tw/commonground/backend/service/suggestion/dto/TextSuggestionMapper.java deleted file mode 100644 index 847254cc..00000000 --- a/src/main/java/tw/commonground/backend/service/suggestion/dto/TextSuggestionMapper.java +++ /dev/null @@ -1,25 +0,0 @@ -package tw.commonground.backend.service.suggestion.dto; - -import tw.commonground.backend.service.suggestion.entity.TextSuggestionDetailEntity; -import tw.commonground.backend.service.suggestion.entity.TextSuggestionEntity; - -public final class TextSuggestionMapper { - - private TextSuggestionMapper() { - // hide constructor - } - - public static TextSuggestionEntity toEntity(TextSuggestionRequest request) { - return TextSuggestionEntity.builder() - .text(request.getText()) - .build(); - } - - public static TextResponseSuggestionItem toResponse(TextSuggestionDetailEntity entity) { - return TextResponseSuggestionItem.builder() - .message(entity.getMessage()) - .feedback(entity.getFeedback()) - .replacement(entity.getReplacement()) - .build(); - } -} diff --git a/src/main/java/tw/commonground/backend/service/suggestion/entity/EditedTextSuggestionDetailEntity.java b/src/main/java/tw/commonground/backend/service/suggestion/entity/EditedTextSuggestionDetailEntity.java deleted file mode 100644 index be069928..00000000 --- a/src/main/java/tw/commonground/backend/service/suggestion/entity/EditedTextSuggestionDetailEntity.java +++ /dev/null @@ -1,29 +0,0 @@ -package tw.commonground.backend.service.suggestion.entity; - -import jakarta.persistence.*; -import lombok.*; - -@Entity -@Getter -@Setter -@Builder -@ToString -@AllArgsConstructor -@NoArgsConstructor -public class EditedTextSuggestionDetailEntity { - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; - - @ManyToOne - @JoinColumn(name = "edited_text_suggestion_id", nullable = false) - @ToString.Exclude - private EditedTextSuggestionEntity editedTextSuggestion; - - private String editedMessage; - - private String feedback; - - private String replacement; -} diff --git a/src/main/java/tw/commonground/backend/service/suggestion/entity/EditedTextSuggestionDetailRepository.java b/src/main/java/tw/commonground/backend/service/suggestion/entity/EditedTextSuggestionDetailRepository.java deleted file mode 100644 index d29f34a6..00000000 --- a/src/main/java/tw/commonground/backend/service/suggestion/entity/EditedTextSuggestionDetailRepository.java +++ /dev/null @@ -1,6 +0,0 @@ -package tw.commonground.backend.service.suggestion.entity; - -import org.springframework.data.jpa.repository.JpaRepository; - -public interface EditedTextSuggestionDetailRepository extends JpaRepository { -} diff --git a/src/main/java/tw/commonground/backend/service/suggestion/entity/EditedTextSuggestionEntity.java b/src/main/java/tw/commonground/backend/service/suggestion/entity/EditedTextSuggestionEntity.java deleted file mode 100644 index 5edff8bc..00000000 --- a/src/main/java/tw/commonground/backend/service/suggestion/entity/EditedTextSuggestionEntity.java +++ /dev/null @@ -1,25 +0,0 @@ -package tw.commonground.backend.service.suggestion.entity; - -import jakarta.persistence.*; -import lombok.*; - -import java.util.ArrayList; -import java.util.List; - -@Entity -@Getter -@Setter -@Builder -@AllArgsConstructor -@NoArgsConstructor -public class EditedTextSuggestionEntity { - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; - - private String editedText; - - @OneToMany(mappedBy = "editedTextSuggestion", cascade = CascadeType.ALL, orphanRemoval = true) - @ToString.Exclude - private List suggestions = new ArrayList<>(); -} diff --git a/src/main/java/tw/commonground/backend/service/suggestion/entity/EditedTextSuggestionRepository.java b/src/main/java/tw/commonground/backend/service/suggestion/entity/EditedTextSuggestionRepository.java deleted file mode 100644 index b23e5048..00000000 --- a/src/main/java/tw/commonground/backend/service/suggestion/entity/EditedTextSuggestionRepository.java +++ /dev/null @@ -1,6 +0,0 @@ -package tw.commonground.backend.service.suggestion.entity; - -import org.springframework.data.jpa.repository.JpaRepository; - -public interface EditedTextSuggestionRepository extends JpaRepository { -} diff --git a/src/main/java/tw/commonground/backend/service/suggestion/entity/TextSuggestionDetailEntity.java b/src/main/java/tw/commonground/backend/service/suggestion/entity/TextSuggestionDetailEntity.java deleted file mode 100644 index 1d2e53e2..00000000 --- a/src/main/java/tw/commonground/backend/service/suggestion/entity/TextSuggestionDetailEntity.java +++ /dev/null @@ -1,27 +0,0 @@ -package tw.commonground.backend.service.suggestion.entity; - -import jakarta.persistence.*; -import lombok.*; - -@Entity -@Getter -@Setter -@Builder -@AllArgsConstructor -@NoArgsConstructor -public class TextSuggestionDetailEntity { - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; - - @ManyToOne - @JoinColumn(name = "text_suggestion_id", nullable = false) - @ToString.Exclude - private TextSuggestionEntity textSuggestion; - - private String message; - - private String feedback; - - private String replacement; -} diff --git a/src/main/java/tw/commonground/backend/service/suggestion/entity/TextSuggestionDetailRepository.java b/src/main/java/tw/commonground/backend/service/suggestion/entity/TextSuggestionDetailRepository.java deleted file mode 100644 index 447c1779..00000000 --- a/src/main/java/tw/commonground/backend/service/suggestion/entity/TextSuggestionDetailRepository.java +++ /dev/null @@ -1,6 +0,0 @@ -package tw.commonground.backend.service.suggestion.entity; - -import org.springframework.data.jpa.repository.JpaRepository; - -public interface TextSuggestionDetailRepository extends JpaRepository { -} diff --git a/src/main/java/tw/commonground/backend/service/suggestion/entity/TextSuggestionEntity.java b/src/main/java/tw/commonground/backend/service/suggestion/entity/TextSuggestionEntity.java deleted file mode 100644 index 617c62a1..00000000 --- a/src/main/java/tw/commonground/backend/service/suggestion/entity/TextSuggestionEntity.java +++ /dev/null @@ -1,25 +0,0 @@ -package tw.commonground.backend.service.suggestion.entity; - -import jakarta.persistence.*; -import lombok.*; - -import java.util.ArrayList; -import java.util.List; - -@Entity -@Getter -@Setter -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class TextSuggestionEntity { - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; - - private String text; - - @OneToMany(mappedBy = "textSuggestion", cascade = CascadeType.ALL, orphanRemoval = true) - @ToString.Exclude - private List suggestions = new ArrayList<>(); -} diff --git a/src/main/java/tw/commonground/backend/service/suggestion/entity/TextSuggestionRepository.java b/src/main/java/tw/commonground/backend/service/suggestion/entity/TextSuggestionRepository.java deleted file mode 100644 index 51d64a63..00000000 --- a/src/main/java/tw/commonground/backend/service/suggestion/entity/TextSuggestionRepository.java +++ /dev/null @@ -1,6 +0,0 @@ -package tw.commonground.backend.service.suggestion.entity; - -import org.springframework.data.jpa.repository.JpaRepository; - -public interface TextSuggestionRepository extends JpaRepository { -} diff --git a/src/main/java/tw/commonground/backend/service/suggestion/entity/package-info.java b/src/main/java/tw/commonground/backend/service/suggestion/entity/package-info.java deleted file mode 100644 index c16fdf0e..00000000 --- a/src/main/java/tw/commonground/backend/service/suggestion/entity/package-info.java +++ /dev/null @@ -1 +0,0 @@ -package tw.commonground.backend.service.suggestion.entity;