feat: 部署初版测试
This commit is contained in:
97
server/internal/handler/reply_handler.go
Normal file
97
server/internal/handler/reply_handler.go
Normal file
@@ -0,0 +1,97 @@
|
||||
package handler
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"log"
|
||||
"net/http"
|
||||
|
||||
"github.com/google/uuid"
|
||||
"github.com/zs/InsightReply/internal/model"
|
||||
"github.com/zs/InsightReply/internal/repository"
|
||||
)
|
||||
|
||||
type ReplyHandler struct {
|
||||
repo *repository.ReplyRepository
|
||||
}
|
||||
|
||||
func NewReplyHandler(repo *repository.ReplyRepository) *ReplyHandler {
|
||||
return &ReplyHandler{repo: repo}
|
||||
}
|
||||
|
||||
func (h *ReplyHandler) RecordReply(w http.ResponseWriter, r *http.Request) {
|
||||
var body struct {
|
||||
TweetID string `json:"tweet_id"`
|
||||
StrategyType string `json:"strategy_type"`
|
||||
Content string `json:"content"`
|
||||
Language string `json:"language"`
|
||||
}
|
||||
|
||||
if err := json.NewDecoder(r.Body).Decode(&body); err != nil {
|
||||
SendError(w, http.StatusBadRequest, 4001, "Invalid request body")
|
||||
return
|
||||
}
|
||||
|
||||
ctx := r.Context()
|
||||
userID, ok := ctx.Value("userID").(string)
|
||||
if !ok || userID == "" {
|
||||
SendError(w, http.StatusUnauthorized, 4002, "Unauthorized")
|
||||
return
|
||||
}
|
||||
|
||||
userUUID, err := uuid.Parse(userID)
|
||||
if err != nil {
|
||||
SendError(w, http.StatusBadRequest, 4003, "Invalid user ID format")
|
||||
return
|
||||
}
|
||||
|
||||
// Resolve the raw string X_Tweet_ID into our internal UUID
|
||||
// Create a dummy tweet entry via Upsert if it doesn't exist yet so foreign keys don't panic
|
||||
tweet := &model.Tweet{
|
||||
XTweetID: body.TweetID,
|
||||
Content: body.Content, // Temporarily store AI content as a placeholder if original is missing
|
||||
IsProcessed: false,
|
||||
}
|
||||
|
||||
err = h.repo.UpsertDummyTweet(tweet)
|
||||
if err != nil {
|
||||
SendError(w, http.StatusInternalServerError, 5001, "Failed to resolve tweet reference")
|
||||
return
|
||||
}
|
||||
|
||||
reply := &model.GeneratedReply{
|
||||
UserID: userUUID,
|
||||
TweetID: tweet.ID,
|
||||
StrategyType: body.StrategyType,
|
||||
Content: body.Content,
|
||||
Status: "copied",
|
||||
Language: body.Language,
|
||||
}
|
||||
|
||||
if err := h.repo.CreateGeneratedReply(reply); err != nil {
|
||||
SendError(w, http.StatusInternalServerError, 5002, "Failed to log generated reply")
|
||||
return
|
||||
}
|
||||
|
||||
SendSuccess(w, map[string]string{ "message": "Reply recorded successfully",
|
||||
})
|
||||
}
|
||||
|
||||
// GetReplies handles GET /api/v1/replies
|
||||
func (h *ReplyHandler) GetReplies(w http.ResponseWriter, r *http.Request) {
|
||||
userIDStr := r.Header.Get("X-User-ID")
|
||||
userID, err := uuid.Parse(userIDStr)
|
||||
if err != nil {
|
||||
http.Error(w, "Unauthorized", http.StatusUnauthorized)
|
||||
return
|
||||
}
|
||||
|
||||
replies, err := h.repo.GetGeneratedRepliesByUser(userID)
|
||||
if err != nil {
|
||||
log.Printf("Failed to get replies: %v", err)
|
||||
http.Error(w, "Failed to get replies", http.StatusInternalServerError)
|
||||
return
|
||||
}
|
||||
|
||||
w.Header().Set("Content-Type", "application/json")
|
||||
json.NewEncoder(w).Encode(replies)
|
||||
}
|
||||
Reference in New Issue
Block a user