diff --git a/api.go b/api.go index 650e70c..9f29426 100644 --- a/api.go +++ b/api.go @@ -1,10 +1,16 @@ package main import ( + "entgo.io/ent/dialect/sql" + "entgo.io/ent/dialect/sql/sqljson" + "github.com/c2h5oh/datasize" "github.com/go-chi/render" + log "github.com/sirupsen/logrus" "net/http" "somegit.dev/ALHP/ALHP.GO/ent" "somegit.dev/ALHP/ALHP.GO/ent/dbpackage" + "somegit.dev/ALHP/ALHP.GO/ent/predicate" + "strconv" ) type StatsResponse struct { @@ -19,6 +25,26 @@ type StatsResponse struct { } `json:"lto"` } +type ThinPackage struct { + Pkgbase string `json:"pkgbase"` + SplitPackages []string `json:"split_packages"` + Status dbpackage.Status `json:"status"` + SkipReason string `json:"skip_reason"` + LTO dbpackage.Lto `json:"lto"` + DebugSymbols dbpackage.DebugSymbols `json:"debug_symbols"` + ArchVersion string `json:"arch_version"` + RepoVersion string `json:"repo_version"` + BuildDate int64 `json:"build_date"` + PeakMem string `json:"peak_mem"` +} + +type PackageResponse struct { + Packages []*ThinPackage `json:"packages"` + Results int `json:"results"` + Page int `json:"page"` + Limit int `json:"limit"` +} + func GetStats(w http.ResponseWriter, r *http.Request) { ctx := r.Context() var v []struct { @@ -69,3 +95,70 @@ func GetStats(w http.ResponseWriter, r *http.Request) { render.Status(r, http.StatusOK) render.JSON(w, r, resp) } + +func GetPackages(w http.ResponseWriter, r *http.Request) { + ctx := r.Context() + pkgbase := r.URL.Query().Get("pkgbase") + status := r.URL.Query().Get("status") + + page, err := strconv.Atoi(r.URL.Query().Get("page")) + if err != nil { + log.Warningf("error parsing page: %v", err) + render.Status(r, http.StatusInternalServerError) + return + } + + limit, err := strconv.Atoi(r.URL.Query().Get("limit")) + if err != nil { + log.Warningf("error parsing page: %v", err) + render.Status(r, http.StatusInternalServerError) + return + } + + var constraints []predicate.DBPackage + + if pkgbase != "" { + constraints = append(constraints, dbpackage.Or(dbpackage.PkgbaseContains(pkgbase), func(selector *sql.Selector) { + selector.Where(sqljson.StringContains(dbpackage.FieldPackages, pkgbase)) + })) + } + + if status != "" { + constraints = append(constraints, dbpackage.StatusEQ(dbpackage.Status(status))) + } + + nPkgs, err := db.DBPackage.Query().Where(constraints...).Count(ctx) + if err != nil { + log.Warningf("error getting package count from db: %v", err) + render.Status(r, http.StatusInternalServerError) + return + } + rPackages, err := db.DBPackage.Query().Where(constraints...).Limit(limit).All(ctx) + if err != nil { + log.Warningf("error getting packages from db: %v", err) + render.Status(r, http.StatusInternalServerError) + return + } + + resp := new(PackageResponse) + for _, mPkg := range rPackages { + resp.Packages = append(resp.Packages, &ThinPackage{ + Pkgbase: mPkg.Pkgbase, + SplitPackages: mPkg.Packages, + Status: mPkg.Status, + SkipReason: mPkg.SkipReason, + LTO: mPkg.Lto, + DebugSymbols: mPkg.DebugSymbols, + ArchVersion: mPkg.Version, + RepoVersion: mPkg.RepoVersion, + BuildDate: mPkg.BuildTimeStart.Unix(), + PeakMem: (datasize.ByteSize(*mPkg.MaxRss) * datasize.KB).HumanReadable(), + }) + } + resp.Page = page + resp.Limit = limit + resp.Results = nPkgs + + render.Status(r, http.StatusOK) + render.JSON(w, r, resp) +}