diff --git a/server/compose/rest.yaml b/server/compose/rest.yaml index 8b3d699cc..8084b649e 100644 --- a/server/compose/rest.yaml +++ b/server/compose/rest.yaml @@ -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 diff --git a/server/compose/rest/handlers/pageLayout.go b/server/compose/rest/handlers/pageLayout.go index 7f92c15da..059d39445 100644 --- a/server/compose/rest/handlers/pageLayout.go +++ b/server/compose/rest/handlers/pageLayout.go @@ -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) diff --git a/server/compose/rest/page_layout.go b/server/compose/rest/page_layout.go index 658015cac..8e850da49 100644 --- a/server/compose/rest/page_layout.go +++ b/server/compose/rest/page_layout.go @@ -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 diff --git a/server/compose/rest/request/pageLayout.go b/server/compose/rest/request/pageLayout.go index f697df6e8..7976a0569 100644 --- a/server/compose/rest/request/pageLayout.go +++ b/server/compose/rest/request/pageLayout.go @@ -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{}