From f66f11e9dd7606c3102908fe35b6f2cd9e51a244 Mon Sep 17 00:00:00 2001 From: Tit Petric Date: Thu, 5 Jul 2018 13:52:44 +0200 Subject: [PATCH] scaffold module api --- crm/docs/src/spec/modules.json | 103 +++++++++++++++++++++++ crm/modules.go | 27 ++++++ crm/modules.handlers.go | 28 +++++++ crm/modules.interfaces.go | 38 +++++++++ crm/modules.request.go | 146 +++++++++++++++++++++++++++++++++ crm/modules.structs.go | 36 ++++++++ 6 files changed, 378 insertions(+) create mode 100644 crm/docs/src/spec/modules.json create mode 100644 crm/modules.go create mode 100644 crm/modules.handlers.go create mode 100644 crm/modules.interfaces.go create mode 100644 crm/modules.request.go create mode 100644 crm/modules.structs.go diff --git a/crm/docs/src/spec/modules.json b/crm/docs/src/spec/modules.json new file mode 100644 index 000000000..f51e4bfaf --- /dev/null +++ b/crm/docs/src/spec/modules.json @@ -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" + } + ] + } + } + ] +} \ No newline at end of file diff --git a/crm/modules.go b/crm/modules.go new file mode 100644 index 000000000..c83fab8c4 --- /dev/null +++ b/crm/modules.go @@ -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") +} diff --git a/crm/modules.handlers.go b/crm/modules.handlers.go new file mode 100644 index 000000000..837d42fa0 --- /dev/null +++ b/crm/modules.handlers.go @@ -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) }) +} diff --git a/crm/modules.interfaces.go b/crm/modules.interfaces.go new file mode 100644 index 000000000..8c573d5ad --- /dev/null +++ b/crm/modules.interfaces.go @@ -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{} diff --git a/crm/modules.request.go b/crm/modules.request.go new file mode 100644 index 000000000..7505f5540 --- /dev/null +++ b/crm/modules.request.go @@ -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() diff --git a/crm/modules.structs.go b/crm/modules.structs.go new file mode 100644 index 000000000..465c09bcb --- /dev/null +++ b/crm/modules.structs.go @@ -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 +}