diff --git a/bridge b/bridge index 32a6031..e2d9ef9 100755 Binary files a/bridge and b/bridge differ diff --git a/decoder b/decoder index f2a061b..fb991ec 100755 Binary files a/decoder and b/decoder differ diff --git a/internal/pkg/controller/alerts_controller.go b/internal/pkg/controller/alerts_controller.go index 68d884b..c47a095 100644 --- a/internal/pkg/controller/alerts_controller.go +++ b/internal/pkg/controller/alerts_controller.go @@ -4,7 +4,9 @@ import ( "context" "encoding/json" "errors" + "log/slog" "net/http" + "strconv" "github.com/AFASystems/presence/internal/pkg/api/response" "github.com/AFASystems/presence/internal/pkg/service" @@ -15,7 +17,31 @@ import ( func AlertsListController(db *gorm.DB, ctx context.Context) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { - alerts, err := service.GetAllAlerts(db, ctx) + query := r.URL.Query() + + lStr := query.Get("limit") + if lStr == "" { + lStr = "100" + } + limit, err := strconv.Atoi(lStr) + if err != nil { + slog.Error("invalid limit parameter", "value", lStr) + response.BadRequest(w, "invalid limit parameter") + return + } + + oStr := query.Get("offset") + if oStr == "" { + oStr = "0" + } + offset, err := strconv.Atoi(oStr) + if err != nil { + slog.Error("invalid offset parameter", "value", oStr) + response.BadRequest(w, "invalid offset parameter") + return + } + + alerts, err := service.GetAllAlerts(db, ctx, limit, offset) if err != nil { response.InternalError(w, "failed to list alerts", err) return diff --git a/internal/pkg/controller/floor_controller.go b/internal/pkg/controller/floor_controller.go index 93521e3..8690e1c 100644 --- a/internal/pkg/controller/floor_controller.go +++ b/internal/pkg/controller/floor_controller.go @@ -3,7 +3,9 @@ package controller import ( "context" "encoding/json" + "log/slog" "net/http" + "strconv" "github.com/AFASystems/presence/internal/pkg/api/response" "github.com/AFASystems/presence/internal/pkg/model" @@ -34,12 +36,32 @@ func FloorAddController(db *gorm.DB, context context.Context) http.HandlerFunc { func FloorListController(db *gorm.DB, context context.Context) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { - var floors []model.Floor - if err := db.WithContext(context).Find(&floors).Error; err != nil { - response.InternalError(w, "failed to list floors", err) + query := r.URL.Query() + + lStr := query.Get("limit") + if lStr == "" { + lStr = "100" + } + limit, err := strconv.Atoi(lStr) + if err != nil { + slog.Error("invalid limit parameter", "value", lStr) + response.BadRequest(w, "invalid limit parameter") + return + } + + oStr := query.Get("offset") + if oStr == "" { + oStr = "0" + } + offset, err := strconv.Atoi(oStr) + if err != nil { + slog.Error("invalid offset parameter", "value", oStr) + response.BadRequest(w, "invalid offset parameter") return } - if err := db.WithContext(context).Find(&floors).Error; err != nil { + + var floors []model.Floor + if err := db.WithContext(context).Limit(limit).Offset(offset).Find(&floors).Error; err != nil { response.InternalError(w, "failed to list floors", err) return } diff --git a/internal/pkg/controller/gateways_controller.go b/internal/pkg/controller/gateways_controller.go index 5392940..2e312ec 100644 --- a/internal/pkg/controller/gateways_controller.go +++ b/internal/pkg/controller/gateways_controller.go @@ -3,7 +3,9 @@ package controller import ( "context" "encoding/json" + "log/slog" "net/http" + "strconv" "github.com/AFASystems/presence/internal/pkg/api/response" "github.com/AFASystems/presence/internal/pkg/model" @@ -35,8 +37,32 @@ func GatewayAddController(db *gorm.DB, context context.Context) http.HandlerFunc func GatewayListController(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("invalid limit parameter", "value", lStr) + response.BadRequest(w, "invalid limit parameter") + return + } + + oStr := query.Get("offset") + if oStr == "" { + oStr = "0" + } + offset, err := strconv.Atoi(oStr) + if err != nil { + slog.Error("invalid offset parameter", "value", oStr) + response.BadRequest(w, "invalid offset parameter") + return + } + var gateways []model.Gateway - if err := db.WithContext(context).Find(&gateways).Error; err != nil { + if err := db.WithContext(context).Limit(limit).Offset(offset).Find(&gateways).Error; err != nil { response.InternalError(w, "failed to list gateways", err) return } diff --git a/internal/pkg/controller/trackers_controller.go b/internal/pkg/controller/trackers_controller.go index f384385..c20dbc7 100644 --- a/internal/pkg/controller/trackers_controller.go +++ b/internal/pkg/controller/trackers_controller.go @@ -5,6 +5,7 @@ import ( "encoding/json" "log/slog" "net/http" + "strconv" "github.com/AFASystems/presence/internal/pkg/api/response" "github.com/AFASystems/presence/internal/pkg/kafkaclient" @@ -67,8 +68,32 @@ func TrackerAdd(db *gorm.DB, writer *kafka.Writer, context context.Context) http func TrackerList(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("invalid limit parameter", "value", lStr) + response.BadRequest(w, "invalid limit parameter") + return + } + + oStr := query.Get("offset") + if oStr == "" { + oStr = "0" + } + offset, err := strconv.Atoi(oStr) + if err != nil { + slog.Error("invalid offset parameter", "value", oStr) + response.BadRequest(w, "invalid offset parameter") + return + } + var list []model.Tracker - if err := db.WithContext(context).Find(&list).Error; err != nil { + if err := db.WithContext(context).Limit(limit).Offset(offset).Find(&list).Error; err != nil { response.InternalError(w, "failed to list trackers", err) return } diff --git a/internal/pkg/controller/trackerzones_controller.go b/internal/pkg/controller/trackerzones_controller.go index 568a71c..7119a65 100644 --- a/internal/pkg/controller/trackerzones_controller.go +++ b/internal/pkg/controller/trackerzones_controller.go @@ -3,7 +3,9 @@ package controller import ( "context" "encoding/json" + "log/slog" "net/http" + "strconv" "github.com/AFASystems/presence/internal/pkg/api/response" "github.com/AFASystems/presence/internal/pkg/model" @@ -34,8 +36,32 @@ func TrackerZoneAddController(db *gorm.DB, context context.Context) http.Handler func TrackerZoneListController(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("invalid limit parameter", "value", lStr) + response.BadRequest(w, "invalid limit parameter") + return + } + + oStr := query.Get("offset") + if oStr == "" { + oStr = "0" + } + offset, err := strconv.Atoi(oStr) + if err != nil { + slog.Error("invalid offset parameter", "value", oStr) + response.BadRequest(w, "invalid offset parameter") + return + } + var list []model.TrackerZones - if err := db.WithContext(context).Find(&list).Error; err != nil { + if err := db.WithContext(context).Limit(limit).Offset(offset).Find(&list).Error; err != nil { response.InternalError(w, "failed to list tracker zones", err) return } diff --git a/internal/pkg/controller/zone_controller.go b/internal/pkg/controller/zone_controller.go index e087367..59a3e26 100644 --- a/internal/pkg/controller/zone_controller.go +++ b/internal/pkg/controller/zone_controller.go @@ -3,7 +3,9 @@ package controller import ( "context" "encoding/json" + "log/slog" "net/http" + "strconv" "github.com/AFASystems/presence/internal/pkg/api/response" "github.com/AFASystems/presence/internal/pkg/model" @@ -34,8 +36,32 @@ func ZoneAddController(db *gorm.DB, context context.Context) http.HandlerFunc { func ZoneListController(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("invalid limit parameter", "value", lStr) + response.BadRequest(w, "invalid limit parameter") + return + } + + oStr := query.Get("offset") + if oStr == "" { + oStr = "0" + } + offset, err := strconv.Atoi(oStr) + if err != nil { + slog.Error("invalid offset parameter", "value", oStr) + response.BadRequest(w, "invalid offset parameter") + return + } + var zones []model.Zone - if err := db.WithContext(context).Find(&zones).Error; err != nil { + if err := db.WithContext(context).Limit(limit).Offset(offset).Find(&zones).Error; err != nil { response.InternalError(w, "failed to list zones", err) return } diff --git a/internal/pkg/model/tracks.go b/internal/pkg/model/tracks.go index ff64f3e..03de760 100644 --- a/internal/pkg/model/tracks.go +++ b/internal/pkg/model/tracks.go @@ -4,13 +4,13 @@ import "time" type Tracks struct { ID uint `gorm:"unique;primaryKey;autoIncrement"` - UUID string `json:"id" gorm:"foreignKey"` - Timestamp time.Time `json:"timestamp"` + UUID string `json:"id" gorm:"foreignKey;index:idx_tracks_uuid_ts,priority:1"` + Timestamp time.Time `json:"timestamp" gorm:"index:idx_tracks_tracker_ts,priority:2;index:idx_tracks_uuid_ts,priority:2"` Type string `json:"type"` Status string `json:"status"` Gateway string `json:"gateway" gorm:"index"` GatewayMac string `json:"gatewayMac"` - Tracker string `json:"tracker" gorm:"index"` + Tracker string `json:"tracker" gorm:"index:idx_tracks_tracker_ts,priority:1"` TrackerMac string `json:"trackerMac"` Subject string `json:"subject"` SubjectName string `json:"subjectName"` diff --git a/internal/pkg/service/alert_service.go b/internal/pkg/service/alert_service.go index 72259db..dd12274 100644 --- a/internal/pkg/service/alert_service.go +++ b/internal/pkg/service/alert_service.go @@ -21,9 +21,9 @@ func DeleteAlertByTrackerID(trackerID string, db *gorm.DB, ctx context.Context) return nil } -func GetAllAlerts(db *gorm.DB, ctx context.Context) ([]model.Alert, error) { +func GetAllAlerts(db *gorm.DB, ctx context.Context, limit, offset int) ([]model.Alert, error) { var alerts []model.Alert - if err := db.WithContext(ctx).Find(&alerts).Error; err != nil { + if err := db.WithContext(ctx).Limit(limit).Offset(offset).Find(&alerts).Error; err != nil { return []model.Alert{}, err } diff --git a/location b/location index c7021a6..cd6acbf 100755 Binary files a/location and b/location differ diff --git a/server b/server index 5c35b69..e07a08e 100755 Binary files a/server and b/server differ