package handlers import ( "bytes" "encoding/json" "fmt" "io" "net/http" "net/url" "time" ) type runRequest struct { TsCode string `json:"ts_code,omitempty"` Symbol string `json:"symbol,omitempty"` TradeDate string `json:"trade_date,omitempty"` } func (d *Deps) RunPipeline(w http.ResponseWriter, r *http.Request) { var req runRequest if err := json.NewDecoder(r.Body).Decode(&req); err != nil { writeErr(w, http.StatusBadRequest, "invalid json") return } body, err := json.Marshal(req) if err != nil { writeErr(w, http.StatusInternalServerError, "encode request failed") return } client := &http.Client{Timeout: 60 * time.Second} resp, err := client.Post(d.TushareURL+"/api/v1/run", "application/json", bytes.NewReader(body)) if err != nil { writeErr(w, http.StatusBadGateway, fmt.Sprintf("tushare service unavailable: %v", err)) return } defer resp.Body.Close() w.Header().Set("Content-Type", "application/json") w.WriteHeader(resp.StatusCode) _, _ = io.Copy(w, resp.Body) } func (d *Deps) GetActiveContract(w http.ResponseWriter, r *http.Request) { symbol := r.URL.Query().Get("symbol") if symbol == "" { writeErr(w, http.StatusBadRequest, "symbol is required") return } target := fmt.Sprintf("%s/api/v1/contracts/active?symbol=%s", d.TushareURL, url.QueryEscape(symbol)) client := &http.Client{Timeout: 10 * time.Second} resp, err := client.Get(target) if err != nil { writeErr(w, http.StatusBadGateway, fmt.Sprintf("tushare service unavailable: %v", err)) return } defer resp.Body.Close() w.Header().Set("Content-Type", "application/json") w.WriteHeader(resp.StatusCode) _, _ = io.Copy(w, resp.Body) }