mirror of
https://github.com/sstent/garminsync-go.git
synced 2025-12-06 08:01:52 +00:00
88 lines
2.0 KiB
Go
88 lines
2.0 KiB
Go
package web
|
|
|
|
import (
|
|
"context"
|
|
"log"
|
|
"net/http"
|
|
"strconv"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
"github.com/sstent/garminsync-go/internal/database"
|
|
"github.com/sstent/garminsync-go/internal/garmin"
|
|
"github.com/sstent/garminsync-go/internal/sync"
|
|
)
|
|
|
|
type WebHandler struct {
|
|
db *database.SQLiteDB
|
|
syncer *sync.SyncService
|
|
garmin *garmin.Client
|
|
}
|
|
|
|
func NewWebHandler(db *database.SQLiteDB, syncer *sync.SyncService, garmin *garmin.Client) *WebHandler {
|
|
return &WebHandler{
|
|
db: db,
|
|
syncer: syncer,
|
|
garmin: garmin,
|
|
}
|
|
}
|
|
|
|
func (h *WebHandler) RegisterRoutes(router *gin.RouterGroup) {
|
|
router.GET("/stats", h.GetStats)
|
|
router.GET("/activities", h.ActivityList)
|
|
router.GET("/activities/:id", h.ActivityDetail)
|
|
router.POST("/sync", h.Sync)
|
|
}
|
|
|
|
func (h *WebHandler) GetStats(c *gin.Context) {
|
|
stats, err := h.db.GetStats()
|
|
if err != nil {
|
|
c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to get stats"})
|
|
return
|
|
}
|
|
c.JSON(http.StatusOK, stats)
|
|
}
|
|
|
|
func (h *WebHandler) ActivityList(c *gin.Context) {
|
|
limit, _ := strconv.Atoi(c.Query("limit"))
|
|
offset, _ := strconv.Atoi(c.Query("offset"))
|
|
|
|
if limit <= 0 {
|
|
limit = 50
|
|
}
|
|
|
|
activities, err := h.db.GetActivities(limit, offset)
|
|
if err != nil {
|
|
c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to get activities"})
|
|
return
|
|
}
|
|
|
|
c.JSON(http.StatusOK, activities)
|
|
}
|
|
|
|
func (h *WebHandler) ActivityDetail(c *gin.Context) {
|
|
id, err := strconv.Atoi(c.Param("id"))
|
|
if err != nil {
|
|
c.JSON(http.StatusBadRequest, gin.H{"error": "Invalid activity ID"})
|
|
return
|
|
}
|
|
|
|
activity, err := h.db.GetActivity(id)
|
|
if err != nil {
|
|
c.JSON(http.StatusNotFound, gin.H{"error": "Activity not found"})
|
|
return
|
|
}
|
|
|
|
c.JSON(http.StatusOK, activity)
|
|
}
|
|
|
|
func (h *WebHandler) Sync(c *gin.Context) {
|
|
go func() {
|
|
err := h.syncer.Sync(context.Background())
|
|
if err != nil {
|
|
log.Printf("Sync error: %v", err)
|
|
}
|
|
}()
|
|
|
|
c.JSON(http.StatusOK, gin.H{"status": "sync_started", "message": "Sync started in background"})
|
|
}
|