80 lines
2.1 KiB
Go
80 lines
2.1 KiB
Go
package api
|
|
|
|
import (
|
|
"fmt"
|
|
"net/http"
|
|
|
|
"github.com/kjannette/trahn-backend/internal/repository"
|
|
)
|
|
|
|
type priceJSON struct {
|
|
T int64 `json:"t"`
|
|
P float64 `json:"p"`
|
|
}
|
|
|
|
func (s *Server) handlePricesToday(w http.ResponseWriter, r *http.Request) {
|
|
ctx := r.Context()
|
|
today := repository.TradingDayNow()
|
|
prices, err := s.priceRepo.GetByDay(ctx, today)
|
|
if err != nil {
|
|
fmt.Printf("Error fetching today's prices: %v\n", err)
|
|
writeError(w, http.StatusInternalServerError, "failed to fetch prices")
|
|
return
|
|
}
|
|
|
|
out := make([]priceJSON, len(prices))
|
|
for i, p := range prices {
|
|
out[i] = priceJSON{T: p.Timestamp.UnixMilli(), P: p.Price}
|
|
}
|
|
writeJSON(w, http.StatusOK, out)
|
|
}
|
|
|
|
func (s *Server) handlePricesByDay(w http.ResponseWriter, r *http.Request) {
|
|
date := r.PathValue("date")
|
|
if !validateDate(date) {
|
|
writeError(w, http.StatusBadRequest, "invalid date format, expected YYYY-MM-DD")
|
|
return
|
|
}
|
|
|
|
ctx := r.Context()
|
|
prices, err := s.priceRepo.GetByDay(ctx, date)
|
|
if err != nil {
|
|
fmt.Printf("Error fetching prices for %s: %v\n", date, err)
|
|
writeError(w, http.StatusInternalServerError, "failed to fetch prices")
|
|
return
|
|
}
|
|
|
|
out := make([]priceJSON, len(prices))
|
|
for i, p := range prices {
|
|
out[i] = priceJSON{T: p.Timestamp.UnixMilli(), P: p.Price}
|
|
}
|
|
writeJSON(w, http.StatusOK, out)
|
|
}
|
|
|
|
func (s *Server) handleAvailableDays(w http.ResponseWriter, r *http.Request) {
|
|
days, err := s.priceRepo.GetAvailableDays(r.Context())
|
|
if err != nil {
|
|
fmt.Printf("Error fetching available days: %v\n", err)
|
|
writeError(w, http.StatusInternalServerError, "failed to fetch available days")
|
|
return
|
|
}
|
|
if days == nil {
|
|
days = []string{}
|
|
}
|
|
writeJSON(w, http.StatusOK, days)
|
|
}
|
|
|
|
func (s *Server) handleLatestPrice(w http.ResponseWriter, r *http.Request) {
|
|
price, err := s.priceRepo.GetLatest(r.Context())
|
|
if err != nil {
|
|
fmt.Printf("Error fetching latest price: %v\n", err)
|
|
writeError(w, http.StatusInternalServerError, "failed to fetch latest price")
|
|
return
|
|
}
|
|
if price == nil {
|
|
writeError(w, http.StatusNotFound, "no price data available")
|
|
return
|
|
}
|
|
writeJSON(w, http.StatusOK, priceJSON{T: price.Timestamp.UnixMilli(), P: price.Price})
|
|
}
|