106 lines
2.6 KiB
Go
106 lines
2.6 KiB
Go
package main
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"strconv"
|
|
|
|
"github.com/genjidb/genji"
|
|
"github.com/genjidb/genji/document"
|
|
"github.com/genjidb/genji/types"
|
|
"go.arsenm.dev/lure/internal/api"
|
|
"go.arsenm.dev/lure/internal/db"
|
|
)
|
|
|
|
type lureWebAPI struct {
|
|
db *genji.DB
|
|
}
|
|
|
|
func (l lureWebAPI) Search(ctx context.Context, req *api.SearchRequest) (*api.SearchResponse, error) {
|
|
query := "(name LIKE ? OR description LIKE ? OR ? IN provides)"
|
|
args := []any{"%" + req.Query + "%", "%" + req.Query + "%", req.Query}
|
|
|
|
if req.FilterValue != nil && req.FilterType != api.FILTER_TYPE_NO_FILTER {
|
|
switch req.FilterType {
|
|
case api.FILTER_TYPE_IN_REPOSITORY:
|
|
query += " AND repository = ?"
|
|
case api.FILTER_TYPE_SUPPORTS_ARCH:
|
|
query += " AND ? IN architectures"
|
|
}
|
|
args = append(args, *req.FilterValue)
|
|
}
|
|
|
|
if req.SortBy != api.SORT_BY_UNSORTED {
|
|
switch req.SortBy {
|
|
case api.SORT_BY_NAME:
|
|
query += " ORDER BY name"
|
|
case api.SORT_BY_REPOSITORY:
|
|
query += " ORDER BY repository"
|
|
case api.SORT_BY_VERSION:
|
|
query += " ORDER BY version"
|
|
}
|
|
}
|
|
|
|
if req.Limit != 0 {
|
|
query += " LIMIT " + strconv.FormatInt(req.Limit, 10)
|
|
}
|
|
|
|
doc, err := db.GetPkgs(l.db, query, args...)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
fmt.Println(query, args)
|
|
out := &api.SearchResponse{}
|
|
err = doc.Iterate(func(d types.Document) error {
|
|
pkg := &db.Package{}
|
|
err = document.ScanDocument(d, pkg)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
out.Packages = append(out.Packages, dbPkgToAPI(pkg))
|
|
return nil
|
|
})
|
|
return out, err
|
|
}
|
|
|
|
func (l lureWebAPI) GetPkg(ctx context.Context, req *api.GetPackageRequest) (*api.Package, error) {
|
|
pkg, err := db.GetPkg(l.db, "name = ? AND repository = ?", req.Name, req.Repository)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return dbPkgToAPI(pkg), nil
|
|
}
|
|
|
|
func dbPkgToAPI(pkg *db.Package) *api.Package {
|
|
return &api.Package{
|
|
Name: pkg.Name,
|
|
Repository: pkg.Repository,
|
|
Version: pkg.Version,
|
|
Release: int64(pkg.Release),
|
|
Epoch: ptr(int64(pkg.Epoch)),
|
|
Description: &pkg.Description,
|
|
Homepage: &pkg.Homepage,
|
|
Maintainer: &pkg.Maintainer,
|
|
Architectures: pkg.Architectures,
|
|
Licenses: pkg.Licenses,
|
|
Provides: pkg.Provides,
|
|
Conflicts: pkg.Conflicts,
|
|
Replaces: pkg.Replaces,
|
|
Depends: dbMapToAPI(pkg.Depends),
|
|
BuildDepends: dbMapToAPI(pkg.BuildDepends),
|
|
}
|
|
}
|
|
|
|
func ptr[T any](v T) *T {
|
|
return &v
|
|
}
|
|
|
|
func dbMapToAPI(m map[string][]string) map[string]*api.StringList {
|
|
out := make(map[string]*api.StringList, len(m))
|
|
for override, list := range m {
|
|
out[override] = &api.StringList{Entries: list}
|
|
}
|
|
return out
|
|
}
|