Add page independent layout search endpoint
This commit is contained in:
committed by
Jože Fortun
parent
175a597de2
commit
2144f086ef
+87
-14
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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{}
|
||||
|
||||
Reference in New Issue
Block a user