Преглед на файлове

feat: add implementation where you can get last track for each unique tracker id

master
Blaz Smehov преди 1 месец
родител
ревизия
796886f49f
променени са 2 файла, в които са добавени 52 реда и са изтрити 0 реда
  1. +1
    -0
      internal/app/server/routes.go
  2. +51
    -0
      internal/pkg/controller/tracks_controller.go

+ 1
- 0
internal/app/server/routes.go Целия файл

@@ -59,6 +59,7 @@ func (a *ServerApp) RegisterRoutes() http.Handler {


// Tracks // Tracks
r.HandleFunc("/reslevis/getTracks/{id}", controller.TracksListController(a.DB, a.ctx)).Methods("GET") r.HandleFunc("/reslevis/getTracks/{id}", controller.TracksListController(a.DB, a.ctx)).Methods("GET")
r.HandleFunc("/reslevis/getTracks", controller.TracksListAllController(a.DB, a.ctx)).Methods("GET")


r.HandleFunc("/reslevis/health", controller.HealthController(a.AppState, a.ctx)).Methods("GET") r.HandleFunc("/reslevis/health", controller.HealthController(a.AppState, a.ctx)).Methods("GET")




+ 51
- 0
internal/pkg/controller/tracks_controller.go Целия файл

@@ -2,6 +2,7 @@ package controller


import ( import (
"context" "context"
"log/slog"
"net/http" "net/http"
"strconv" "strconv"
"time" "time"
@@ -42,3 +43,53 @@ func TracksListController(db *gorm.DB, context context.Context) http.HandlerFunc
response.JSON(w, http.StatusOK, tracks) response.JSON(w, http.StatusOK, tracks)
} }
} }

func TracksListAllController(db *gorm.DB, context context.Context) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
query := r.URL.Query()
lStr := query.Get("limit")
if lStr == "" {
lStr = "100"
}

limit, err := strconv.Atoi(lStr)
if err != nil {
slog.Error("Error in converting limit string to integer value")
response.InternalError(w, "internal server error", err)
return
}

offsetStr := query.Get("offset")
if offsetStr == "" {
offsetStr = "0"
}

offset, err := strconv.Atoi(offsetStr)
if err != nil {
slog.Error("Error in converting offset string to integer value")
response.InternalError(w, "internal server error", err)
return
}

var tracks []model.Tracks

// Subquery to get the latest timestamp per tracker
subQuery := db.Model(&model.Tracks{}).
Select("tracker, MAX(timestamp) AS max_timestamp").
Group("tracker")

if err := db.WithContext(context).
Table("tracks").
Select("tracks.*").
Joins("JOIN (?) AS latest ON tracks.tracker = latest.tracker AND tracks.timestamp = latest.max_timestamp", subQuery).
Order("tracks.timestamp DESC").
Limit(limit).
Offset(offset).
Find(&tracks).Error; err != nil {
response.InternalError(w, "failed to list tracks", err)
return
}

response.JSON(w, http.StatusOK, tracks)
}
}

Зареждане…
Отказ
Запис