scaffold module api

This commit is contained in:
Tit Petric
2018-07-05 13:52:44 +02:00
parent 9ecc041b0d
commit f66f11e9dd
6 changed files with 378 additions and 0 deletions
+103
View File
@@ -0,0 +1,103 @@
{
"Title": "Modules",
"Description": "CRM module definitions",
"Package": "crm",
"Interface": "Modules",
"Struct": [
{
"name": "id",
"type": "uint64"
},
{
"name": "name",
"type": "string"
}
],
"Protocol": "",
"Authentication": [],
"Path": "/modules",
"APIs": [
{
"Name": "list",
"Method": "GET",
"Title": "List defined modules",
"Path": "/list",
"Parameters": {
"get": [
{
"name": "id",
"title": "Module ID",
"type": "string"
}
]
}
},
{
"Name": "edit",
"Method": "POST",
"Title": "Add/edit module",
"Path": "/edit",
"Parameters": {
"post": [
{
"name": "id",
"required": false,
"title": "Module ID",
"type": "uint64"
},
{
"name": "name",
"required": true,
"title": "Module Name",
"type": "string"
}
]
}
},
{
"Name": "content/list",
"Method": "GET",
"Title": "List contents from module section",
"Path": "/content/list",
"Parameters": null
},
{
"Name": "content/edit",
"Method": "POST",
"Title": "Add/update contents in module section",
"Path": "/content/edit",
"Parameters": {
"post": [
{
"name": "id",
"required": false,
"title": "Content ID",
"type": "uint64"
},
{
"name": "payload",
"required": true,
"title": "Content JSON",
"type": "string"
}
]
}
},
{
"Name": "content/delete",
"Method": "DELETE",
"Title": "Delete content row from module section",
"Path": "/content/delete",
"Parameters": {
"post": [
{
"name": "id",
"required": true,
"title": "Content ID",
"type": "uint64"
}
]
}
}
]
}
+27
View File
@@ -0,0 +1,27 @@
package crm
import (
"github.com/pkg/errors"
)
var _ = errors.Wrap
func (*Modules) List(r *modulesListRequest) (interface{}, error) {
return nil, errors.New("Not implemented: Modules.list")
}
func (*Modules) Edit(r *modulesEditRequest) (interface{}, error) {
return nil, errors.New("Not implemented: Modules.edit")
}
func (*Modules) ContentList(r *modulesContentListRequest) (interface{}, error) {
return nil, errors.New("Not implemented: Modules.content/list")
}
func (*Modules) ContentEdit(r *modulesContentEditRequest) (interface{}, error) {
return nil, errors.New("Not implemented: Modules.content/edit")
}
func (*Modules) ContentDelete(r *modulesContentDeleteRequest) (interface{}, error) {
return nil, errors.New("Not implemented: Modules.content/delete")
}
+28
View File
@@ -0,0 +1,28 @@
package crm
import (
"net/http"
"github.com/titpetric/factory/resputil"
)
func (mh *ModulesHandlers) List(w http.ResponseWriter, r *http.Request) {
params := modulesListRequest{}.new()
resputil.JSON(w, params.Fill(r), func() (interface{}, error) { return mh.Modules.List(params) })
}
func (mh *ModulesHandlers) Edit(w http.ResponseWriter, r *http.Request) {
params := modulesEditRequest{}.new()
resputil.JSON(w, params.Fill(r), func() (interface{}, error) { return mh.Modules.Edit(params) })
}
func (mh *ModulesHandlers) ContentList(w http.ResponseWriter, r *http.Request) {
params := modulesContentListRequest{}.new()
resputil.JSON(w, params.Fill(r), func() (interface{}, error) { return mh.Modules.ContentList(params) })
}
func (mh *ModulesHandlers) ContentEdit(w http.ResponseWriter, r *http.Request) {
params := modulesContentEditRequest{}.new()
resputil.JSON(w, params.Fill(r), func() (interface{}, error) { return mh.Modules.ContentEdit(params) })
}
func (mh *ModulesHandlers) ContentDelete(w http.ResponseWriter, r *http.Request) {
params := modulesContentDeleteRequest{}.new()
resputil.JSON(w, params.Fill(r), func() (interface{}, error) { return mh.Modules.ContentDelete(params) })
}
+38
View File
@@ -0,0 +1,38 @@
package crm
import (
"net/http"
)
// HTTP handlers are a superset of internal APIs
type ModulesHandlers struct {
*Modules
}
func (ModulesHandlers) new() *ModulesHandlers {
return &ModulesHandlers{
Modules{}.new(),
}
}
// Internal API interface
type ModulesAPI interface {
List(*modulesListRequest) (interface{}, error)
Edit(*modulesEditRequest) (interface{}, error)
ContentList(*modulesContentListRequest) (interface{}, error)
ContentEdit(*modulesContentEditRequest) (interface{}, error)
ContentDelete(*modulesContentDeleteRequest) (interface{}, error)
}
// HTTP API interface
type ModulesHandlersAPI interface {
List(http.ResponseWriter, *http.Request)
Edit(http.ResponseWriter, *http.Request)
ContentList(http.ResponseWriter, *http.Request)
ContentEdit(http.ResponseWriter, *http.Request)
ContentDelete(http.ResponseWriter, *http.Request)
}
// Compile time check to see if we implement the interfaces
var _ ModulesHandlersAPI = &ModulesHandlers{}
var _ ModulesAPI = &Modules{}
+146
View File
@@ -0,0 +1,146 @@
package crm
import (
"github.com/go-chi/chi"
"net/http"
)
var _ = chi.URLParam
// Modules list request parameters
type modulesListRequest struct {
id string
}
func (modulesListRequest) new() *modulesListRequest {
return &modulesListRequest{}
}
func (m *modulesListRequest) Fill(r *http.Request) error {
get := map[string]string{}
post := map[string]string{}
urlQuery := r.URL.Query()
for name, param := range urlQuery {
get[name] = string(param[0])
}
postVars := r.Form
for name, param := range postVars {
post[name] = string(param[0])
}
m.id = get["id"]
return nil
}
var _ RequestFiller = modulesListRequest{}.new()
// Modules edit request parameters
type modulesEditRequest struct {
id uint64
name string
}
func (modulesEditRequest) new() *modulesEditRequest {
return &modulesEditRequest{}
}
func (m *modulesEditRequest) Fill(r *http.Request) error {
get := map[string]string{}
post := map[string]string{}
urlQuery := r.URL.Query()
for name, param := range urlQuery {
get[name] = string(param[0])
}
postVars := r.Form
for name, param := range postVars {
post[name] = string(param[0])
}
m.id = parseUInt64(post["id"])
m.name = post["name"]
return nil
}
var _ RequestFiller = modulesEditRequest{}.new()
// Modules content/list request parameters
type modulesContentListRequest struct {
}
func (modulesContentListRequest) new() *modulesContentListRequest {
return &modulesContentListRequest{}
}
func (m *modulesContentListRequest) Fill(r *http.Request) error {
get := map[string]string{}
post := map[string]string{}
urlQuery := r.URL.Query()
for name, param := range urlQuery {
get[name] = string(param[0])
}
postVars := r.Form
for name, param := range postVars {
post[name] = string(param[0])
}
return nil
}
var _ RequestFiller = modulesContentListRequest{}.new()
// Modules content/edit request parameters
type modulesContentEditRequest struct {
id uint64
payload string
}
func (modulesContentEditRequest) new() *modulesContentEditRequest {
return &modulesContentEditRequest{}
}
func (m *modulesContentEditRequest) Fill(r *http.Request) error {
get := map[string]string{}
post := map[string]string{}
urlQuery := r.URL.Query()
for name, param := range urlQuery {
get[name] = string(param[0])
}
postVars := r.Form
for name, param := range postVars {
post[name] = string(param[0])
}
m.id = parseUInt64(post["id"])
m.payload = post["payload"]
return nil
}
var _ RequestFiller = modulesContentEditRequest{}.new()
// Modules content/delete request parameters
type modulesContentDeleteRequest struct {
id uint64
}
func (modulesContentDeleteRequest) new() *modulesContentDeleteRequest {
return &modulesContentDeleteRequest{}
}
func (m *modulesContentDeleteRequest) Fill(r *http.Request) error {
get := map[string]string{}
post := map[string]string{}
urlQuery := r.URL.Query()
for name, param := range urlQuery {
get[name] = string(param[0])
}
postVars := r.Form
for name, param := range postVars {
post[name] = string(param[0])
}
m.id = parseUInt64(post["id"])
return nil
}
var _ RequestFiller = modulesContentDeleteRequest{}.new()
+36
View File
@@ -0,0 +1,36 @@
package crm
// Modules
type Modules struct {
id uint64
name string
changed []string
}
func (Modules) new() *Modules {
return &Modules{}
}
func (m *Modules) Getid() uint64 {
return m.id
}
func (m *Modules) Setid(value uint64) *Modules {
if m.id != value {
m.changed = append(m.changed, "id")
m.id = value
}
return m
}
func (m *Modules) Getname() string {
return m.name
}
func (m *Modules) Setname(value string) *Modules {
if m.name != value {
m.changed = append(m.changed, "name")
m.name = value
}
return m
}