|
|
|
@@ -2,6 +2,7 @@ package controller |
|
|
|
|
|
|
|
import ( |
|
|
|
"context" |
|
|
|
"log/slog" |
|
|
|
"net/http" |
|
|
|
"strconv" |
|
|
|
"time" |
|
|
|
@@ -42,3 +43,53 @@ func TracksListController(db *gorm.DB, context context.Context) http.HandlerFunc |
|
|
|
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) |
|
|
|
} |
|
|
|
} |