From 275c1f2d50e2292f72b74f6fd3b35eda0ef370f9 Mon Sep 17 00:00:00 2001 From: Vladimir Zagainov Date: Sun, 4 Jan 2026 14:38:21 +0300 Subject: [PATCH] feat: add updated_at to modpacks and /api/launcher/modpacks/summary endpoint --- cmd/server/main.go | 1 + internal/api/launcher_handler.go | 12 ++++++++++++ internal/database/modpack_repository.go | 25 +++++++++++++++++++++++++ internal/models/modpack.go | 7 +++++++ 4 files changed, 45 insertions(+) diff --git a/cmd/server/main.go b/cmd/server/main.go index 638d1ff..ebf8368 100644 --- a/cmd/server/main.go +++ b/cmd/server/main.go @@ -75,6 +75,7 @@ func main() { r.Route("/launcher", func(r chi.Router) { r.Get("/modpacks/{name}/manifest", launcherHandler.GetModpackManifest) + r.Get("/modpacks/summary", launcherHandler.GetModpacksSummary) }) }) r.Route("/authserver", func(r chi.Router) { diff --git a/internal/api/launcher_handler.go b/internal/api/launcher_handler.go index ab9b73d..cdda74e 100644 --- a/internal/api/launcher_handler.go +++ b/internal/api/launcher_handler.go @@ -35,3 +35,15 @@ func (h *LauncherHandler) GetModpackManifest(w http.ResponseWriter, r *http.Requ w.WriteHeader(http.StatusOK) json.NewEncoder(w).Encode(manifest) } + +func (h *LauncherHandler) GetModpacksSummary(w http.ResponseWriter, r *http.Request) { + summaries, err := h.ModpackRepo.GetModpacksSummary(r.Context()) + if err != nil { + http.Error(w, "Failed to get modpacks summary", http.StatusInternalServerError) + return + } + + w.Header().Set("Content-Type", "application/json") + w.WriteHeader(http.StatusOK) + json.NewEncoder(w).Encode(summaries) +} diff --git a/internal/database/modpack_repository.go b/internal/database/modpack_repository.go index 730227c..b17a088 100644 --- a/internal/database/modpack_repository.go +++ b/internal/database/modpack_repository.go @@ -101,3 +101,28 @@ func (r *ModpackRepository) GetAllFileHashes(ctx context.Context) (map[string]st return hashes, rows.Err() } + +// GetModpacksSummary возвращает список всех активных модпаков с датой последнего обновления. +func (r *ModpackRepository) GetModpacksSummary(ctx context.Context) ([]models.ModpackSummary, error) { + query := ` + SELECT name, updated_at + FROM modpacks + WHERE is_active = TRUE` + + rows, err := r.DB.Query(ctx, query) + if err != nil { + return nil, err + } + defer rows.Close() + + var summaries []models.ModpackSummary + for rows.Next() { + var s models.ModpackSummary + if err := rows.Scan(&s.Name, &s.UpdatedAt); err != nil { + return nil, err + } + summaries = append(summaries, s) + } + + return summaries, nil +} diff --git a/internal/models/modpack.go b/internal/models/modpack.go index 8e33363..950284f 100644 --- a/internal/models/modpack.go +++ b/internal/models/modpack.go @@ -10,6 +10,13 @@ type Modpack struct { MinecraftVersion string `json:"minecraft_version"` IsActive bool `json:"is_active"` CreatedAt time.Time `json:"created_at"` + UpdatedAt time.Time `json:"updated_at"` +} + +// ModpackSummary используется лаунчером для проверки наличия обновлений +type ModpackSummary struct { + Name string `json:"name"` + UpdatedAt time.Time `json:"updated_at"` } // ModpackFile представляет метаданные одного файла в модпаке