Add page independent layout search endpoint

This commit is contained in:
Tomaž Jerman
2023-04-07 12:39:26 +02:00
committed by Jože Fortun
parent 175a597de2
commit 2144f086ef
4 changed files with 355 additions and 14 deletions
+87 -14
View File
@@ -554,7 +554,7 @@ endpoints:
- title: Page Layouts
description: Compose page layouts
entrypoint: pageLayout
path: "/namespace/{namespaceID}/page/{pageID}/layout"
path: "/namespace/{namespaceID}"
authentication: []
imports:
- sqlxTypes github.com/jmoiron/sqlx/types
@@ -567,17 +567,61 @@ endpoints:
name: namespaceID
required: true
title: Namespace ID
- type: uint64
name: pageID
required: true
title: Page ID
apis:
- name: list
- name: listNamespace
method: GET
path: "/"
path: "/page-layout"
title: List available page layouts
parameters:
get:
- type: uint64
name: pageID
required: true
title: Page ID
- type: uint64
name: moduleID
required: false
title: Module ID
- type: uint64
name: parentID
required: false
title: Parent ID
- type: bool
name: primary
required: false
title: Default layouts
- type: string
name: query
required: false
title: Search query
- type: string
name: handle
required: false
title: Search by handle
- type: map[string]string
name: labels
title: Labels
parser: label.ParseStrings
- type: uint
name: limit
title: Limit
- type: string
name: pageCursor
title: Page cursor
- type: string
name: sort
title: Sort items
- name: list
method: GET
path: "/page/{pageID}/layout/"
title: List available page layouts
parameters:
path:
- type: uint64
name: pageID
required: true
title: Page ID
get:
- type: uint64
name: moduleID
required: false
@@ -614,8 +658,13 @@ endpoints:
- name: create
method: POST
title: Create page layout
path: "/"
path: "/page/{pageID}/layout/"
parameters:
path:
- type: uint64
name: pageID
required: true
title: Page ID
post:
- type: uint64
name: parentID
@@ -655,11 +704,15 @@ endpoints:
required: false
title: OwnedBy
- name: read
path: "/{pageLayoutID}"
path: "/page/{pageID}/layout/{pageLayoutID}"
method: GET
title: Get page details
parameters:
path:
- type: uint64
name: pageID
required: true
title: Page ID
- type: uint64
name: pageLayoutID
required: true
@@ -668,9 +721,13 @@ endpoints:
- name: update
method: POST
title: Update page
path: "/{pageLayoutID}"
path: "/page/{pageID}/layout/{pageLayoutID}"
parameters:
path:
- type: uint64
name: pageID
required: true
title: Page ID
- type: uint64
name: pageLayoutID
required: true
@@ -714,27 +771,39 @@ endpoints:
required: false
title: OwnedBy
- name: delete
path: "/{pageLayoutID}"
path: "/page/{pageID}/layout/{pageLayoutID}"
method: DELETE
title: Delete page layout
parameters:
path:
- type: uint64
name: pageID
required: true
title: Page ID
- { type: uint64, name: pageLayoutID, required: true, title: Page layout ID }
get:
- { type: string, name: strategy, title: "Page delete strategy (abort, force, rebase, cascade)" }
- name: undelete
path: "/{pageLayoutID}/undelete"
path: "/page/{pageID}/layout/{pageLayoutID}/undelete"
method: POST
title: Undelete soft deleted Delete page layout
parameters:
path:
- type: uint64
name: pageID
required: true
title: Page ID
- { type: uint64, name: pageLayoutID, required: true, title: Page layout ID }
- name: listTranslations
method: GET
title: List page layout translation
path: "/{pageLayoutID}/translation"
path: "/page/{pageID}/layout/{pageLayoutID}/translation"
parameters:
path:
- type: uint64
name: pageID
required: true
title: Page ID
- type: uint64
name: pageLayoutID
required: true
@@ -742,9 +811,13 @@ endpoints:
- name: updateTranslations
method: PATCH
title: Update page layout translation
path: "/{pageLayoutID}/translation"
path: "/page/{pageID}/layout/{pageLayoutID}/translation"
parameters:
path:
- type: uint64
name: pageID
required: true
title: Page ID
- type: uint64
name: pageLayoutID
required: true
@@ -19,6 +19,7 @@ import (
type (
// Internal API interface
PageLayoutAPI interface {
ListNamespace(context.Context, *request.PageLayoutListNamespace) (interface{}, error)
List(context.Context, *request.PageLayoutList) (interface{}, error)
Create(context.Context, *request.PageLayoutCreate) (interface{}, error)
Read(context.Context, *request.PageLayoutRead) (interface{}, error)
@@ -31,6 +32,7 @@ type (
// HTTP API interface
PageLayout struct {
ListNamespace func(http.ResponseWriter, *http.Request)
List func(http.ResponseWriter, *http.Request)
Create func(http.ResponseWriter, *http.Request)
Read func(http.ResponseWriter, *http.Request)
@@ -44,6 +46,22 @@ type (
func NewPageLayout(h PageLayoutAPI) *PageLayout {
return &PageLayout{
ListNamespace: func(w http.ResponseWriter, r *http.Request) {
defer r.Body.Close()
params := request.NewPageLayoutListNamespace()
if err := params.Fill(r); err != nil {
api.Send(w, r, err)
return
}
value, err := h.ListNamespace(r.Context(), params)
if err != nil {
api.Send(w, r, err)
return
}
api.Send(w, r, value)
},
List: func(w http.ResponseWriter, r *http.Request) {
defer r.Body.Close()
params := request.NewPageLayoutList()
@@ -178,6 +196,7 @@ func NewPageLayout(h PageLayoutAPI) *PageLayout {
func (h PageLayout) MountRoutes(r chi.Router, middlewares ...func(http.Handler) http.Handler) {
r.Group(func(r chi.Router) {
r.Use(middlewares...)
r.Get("/namespace/{namespaceID}/page-layout", h.ListNamespace)
r.Get("/namespace/{namespaceID}/page/{pageID}/layout/", h.List)
r.Post("/namespace/{namespaceID}/page/{pageID}/layout/", h.Create)
r.Get("/namespace/{namespaceID}/page/{pageID}/layout/{pageLayoutID}", h.Read)
+26
View File
@@ -82,6 +82,32 @@ func (ctrl *PageLayout) List(ctx context.Context, r *request.PageLayoutList) (in
return ctrl.makeFilterPayload(ctx, set, filter, err)
}
func (ctrl *PageLayout) ListNamespace(ctx context.Context, r *request.PageLayoutListNamespace) (interface{}, error) {
var (
err error
f = types.PageLayoutFilter{
NamespaceID: r.NamespaceID,
ModuleID: r.ModuleID,
PageID: r.PageID,
Labels: r.Labels,
Handle: r.Handle,
Query: r.Query,
}
)
if f.Paging, err = filter.NewPaging(r.Limit, r.PageCursor); err != nil {
return nil, err
}
if f.Sorting, err = filter.NewSorting(r.Sort); err != nil {
return nil, err
}
set, filter, err := ctrl.pageLayout.Find(ctx, f)
return ctrl.makeFilterPayload(ctx, set, filter, err)
}
func (ctrl *PageLayout) Create(ctx context.Context, r *request.PageLayoutCreate) (interface{}, error) {
var (
err error
+223
View File
@@ -37,6 +37,63 @@ var (
type (
// Internal API interface
PageLayoutListNamespace struct {
// NamespaceID PATH parameter
//
// Namespace ID
NamespaceID uint64 `json:",string"`
// PageID GET parameter
//
// Page ID
PageID uint64 `json:",string"`
// ModuleID GET parameter
//
// Module ID
ModuleID uint64 `json:",string"`
// ParentID GET parameter
//
// Parent ID
ParentID uint64 `json:",string"`
// Primary GET parameter
//
// Default layouts
Primary bool
// Query GET parameter
//
// Search query
Query string
// Handle GET parameter
//
// Search by handle
Handle string
// Labels GET parameter
//
// Labels
Labels map[string]string
// Limit GET parameter
//
// Limit
Limit uint
// PageCursor GET parameter
//
// Page cursor
PageCursor string
// Sort GET parameter
//
// Sort items
Sort string
}
PageLayoutList struct {
// NamespaceID PATH parameter
//
@@ -309,6 +366,172 @@ type (
}
)
// NewPageLayoutListNamespace request
func NewPageLayoutListNamespace() *PageLayoutListNamespace {
return &PageLayoutListNamespace{}
}
// Auditable returns all auditable/loggable parameters
func (r PageLayoutListNamespace) Auditable() map[string]interface{} {
return map[string]interface{}{
"namespaceID": r.NamespaceID,
"pageID": r.PageID,
"moduleID": r.ModuleID,
"parentID": r.ParentID,
"primary": r.Primary,
"query": r.Query,
"handle": r.Handle,
"labels": r.Labels,
"limit": r.Limit,
"pageCursor": r.PageCursor,
"sort": r.Sort,
}
}
// Auditable returns all auditable/loggable parameters
func (r PageLayoutListNamespace) GetNamespaceID() uint64 {
return r.NamespaceID
}
// Auditable returns all auditable/loggable parameters
func (r PageLayoutListNamespace) GetPageID() uint64 {
return r.PageID
}
// Auditable returns all auditable/loggable parameters
func (r PageLayoutListNamespace) GetModuleID() uint64 {
return r.ModuleID
}
// Auditable returns all auditable/loggable parameters
func (r PageLayoutListNamespace) GetParentID() uint64 {
return r.ParentID
}
// Auditable returns all auditable/loggable parameters
func (r PageLayoutListNamespace) GetPrimary() bool {
return r.Primary
}
// Auditable returns all auditable/loggable parameters
func (r PageLayoutListNamespace) GetQuery() string {
return r.Query
}
// Auditable returns all auditable/loggable parameters
func (r PageLayoutListNamespace) GetHandle() string {
return r.Handle
}
// Auditable returns all auditable/loggable parameters
func (r PageLayoutListNamespace) GetLabels() map[string]string {
return r.Labels
}
// Auditable returns all auditable/loggable parameters
func (r PageLayoutListNamespace) GetLimit() uint {
return r.Limit
}
// Auditable returns all auditable/loggable parameters
func (r PageLayoutListNamespace) GetPageCursor() string {
return r.PageCursor
}
// Auditable returns all auditable/loggable parameters
func (r PageLayoutListNamespace) GetSort() string {
return r.Sort
}
// Fill processes request and fills internal variables
func (r *PageLayoutListNamespace) Fill(req *http.Request) (err error) {
{
// GET params
tmp := req.URL.Query()
if val, ok := tmp["pageID"]; ok && len(val) > 0 {
r.PageID, err = payload.ParseUint64(val[0]), nil
if err != nil {
return err
}
}
if val, ok := tmp["moduleID"]; ok && len(val) > 0 {
r.ModuleID, err = payload.ParseUint64(val[0]), nil
if err != nil {
return err
}
}
if val, ok := tmp["parentID"]; ok && len(val) > 0 {
r.ParentID, err = payload.ParseUint64(val[0]), nil
if err != nil {
return err
}
}
if val, ok := tmp["primary"]; ok && len(val) > 0 {
r.Primary, err = payload.ParseBool(val[0]), nil
if err != nil {
return err
}
}
if val, ok := tmp["query"]; ok && len(val) > 0 {
r.Query, err = val[0], nil
if err != nil {
return err
}
}
if val, ok := tmp["handle"]; ok && len(val) > 0 {
r.Handle, err = val[0], nil
if err != nil {
return err
}
}
if val, ok := tmp["labels[]"]; ok {
r.Labels, err = label.ParseStrings(val)
if err != nil {
return err
}
} else if val, ok := tmp["labels"]; ok {
r.Labels, err = label.ParseStrings(val)
if err != nil {
return err
}
}
if val, ok := tmp["limit"]; ok && len(val) > 0 {
r.Limit, err = payload.ParseUint(val[0]), nil
if err != nil {
return err
}
}
if val, ok := tmp["pageCursor"]; ok && len(val) > 0 {
r.PageCursor, err = val[0], nil
if err != nil {
return err
}
}
if val, ok := tmp["sort"]; ok && len(val) > 0 {
r.Sort, err = val[0], nil
if err != nil {
return err
}
}
}
{
var val string
// path params
val = chi.URLParam(req, "namespaceID")
r.NamespaceID, err = payload.ParseUint64(val), nil
if err != nil {
return err
}
}
return err
}
// NewPageLayoutList request
func NewPageLayoutList() *PageLayoutList {
return &PageLayoutList{}