first working package query api
This commit is contained in:
93
api.go
93
api.go
@@ -1,10 +1,16 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"entgo.io/ent/dialect/sql"
|
||||||
|
"entgo.io/ent/dialect/sql/sqljson"
|
||||||
|
"github.com/c2h5oh/datasize"
|
||||||
"github.com/go-chi/render"
|
"github.com/go-chi/render"
|
||||||
|
log "github.com/sirupsen/logrus"
|
||||||
"net/http"
|
"net/http"
|
||||||
"somegit.dev/ALHP/ALHP.GO/ent"
|
"somegit.dev/ALHP/ALHP.GO/ent"
|
||||||
"somegit.dev/ALHP/ALHP.GO/ent/dbpackage"
|
"somegit.dev/ALHP/ALHP.GO/ent/dbpackage"
|
||||||
|
"somegit.dev/ALHP/ALHP.GO/ent/predicate"
|
||||||
|
"strconv"
|
||||||
)
|
)
|
||||||
|
|
||||||
type StatsResponse struct {
|
type StatsResponse struct {
|
||||||
@@ -19,6 +25,26 @@ type StatsResponse struct {
|
|||||||
} `json:"lto"`
|
} `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) {
|
func GetStats(w http.ResponseWriter, r *http.Request) {
|
||||||
ctx := r.Context()
|
ctx := r.Context()
|
||||||
var v []struct {
|
var v []struct {
|
||||||
@@ -69,3 +95,70 @@ func GetStats(w http.ResponseWriter, r *http.Request) {
|
|||||||
render.Status(r, http.StatusOK)
|
render.Status(r, http.StatusOK)
|
||||||
render.JSON(w, r, resp)
|
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)
|
||||||
|
}
|
||||||
|
Reference in New Issue
Block a user