diff --git a/crm/repository/content.go b/crm/repository/content.go new file mode 100644 index 000000000..62faaed40 --- /dev/null +++ b/crm/repository/content.go @@ -0,0 +1,76 @@ +package repository + +import ( + "context" + "github.com/crusttech/crust/crm/types" + "github.com/titpetric/factory" +) + +type ( + Content interface { + With(ctx context.Context) Content + + FindByID(id uint64) (*types.Content, error) + Find() ([]*types.Content, error) + Create(mod *types.Content) (*types.Content, error) + Update(mod *types.Content) (*types.Content, error) + DeleteByID(id uint64) error + } + + content struct { + *repository + } +) + +func NewContent(ctx context.Context) Content { + return &content{ + repository: &repository{ + ctx: ctx, + }, + } +} + +func (r *content) With(ctx context.Context) Content { + return &content{ + repository: r.repository.With(ctx), + } +} + + +func (r *content) FindByID(id uint64) (*types.Content, error) { + mod := &types.Content{} + if err := r.db().Get(mod, "SELECT * FROM crm_content WHERE id = ?", id); err != nil { + println(err.Error()) + return nil, ErrDatabaseError + } else { + return mod, nil + } +} + +func (r *content) Find() ([]*types.Content, error) { + mod := make([]*types.Content, 0) + if err := r.db().Select(&mod, "SELECT * FROM crm_content ORDER BY name ASC"); err != nil { + println(err.Error()) + return nil, ErrDatabaseError + } else { + return mod, nil + } +} + +func (r *content) Create(mod *types.Content) (*types.Content, error) { + mod.ID = factory.Sonyflake.NextID() + return mod, r.db().Insert("crm_content", mod) +} + +func (r *content) Update(mod *types.Content) (*types.Content, error) { + return mod, r.db().Replace("crm_content", mod) + +} + +func (r *content) DeleteByID(id uint64) error { + if _, err := r.db().Exec("DELETE FROM crm_content WHERE ID = ?", id); err != nil { + return ErrDatabaseError + } else { + return nil + } +} diff --git a/crm/repository/module.go b/crm/repository/module.go index 42192bb20..14f2c5798 100644 --- a/crm/repository/module.go +++ b/crm/repository/module.go @@ -74,34 +74,3 @@ func (r *module) DeleteByID(id uint64) error { return nil } } - -//func (r *module) Edit(r *moduleEditRequest) (interface{}, error) { -// db := factory.Database.MustGet() -// m := module{}.New() -// m.SetID(r.id).SetName(r.name) -// if m.GetID() > 0 { -// return m, db.With(ctx).Replace("crm_module", m) -// } -// m.SetID(factory.Sonyflake.NextID()) -// return m, db.With(ctx).Insert("crm_module", m) -//} -// -//func (r *module) ContentList(r *moduleContentListRequest) (interface{}, error) { -// db := factory.Database.MustGet() -// if r.id > 0 { -// m := ModuleContentRow{}.New() -// return m, db.Get(m, "select * from crm_module id=?", r.id) -// } -// -// res := make([]ModuleContentRow, 0) -// err = db.With(ctx).Select(&res, "select * from crm_module order by name asc") -// return res, err -//} -// -//func (r *module) ContentEdit(r *moduleContentEditRequest) (interface{}, error) { -// return nil, errors.New("Not implemented: module.content/edit") -//} -// -//func (r *module) ContentDelete(r *moduleContentDeleteRequest) (interface{}, error) { -// return nil, errors.New("Not implemented: module.content/delete") -//} diff --git a/crm/rest/field.go b/crm/rest/field.go index 379760d63..01a151212 100644 --- a/crm/rest/field.go +++ b/crm/rest/field.go @@ -5,8 +5,8 @@ import ( "context" "github.com/crusttech/crust/crm/rest/server" - "github.com/crusttech/crust/crm/types" "github.com/crusttech/crust/crm/service" + "github.com/crusttech/crust/crm/types" ) var _ = errors.Wrap diff --git a/crm/rest/module.go b/crm/rest/module.go index 82bb4961a..1453d646e 100644 --- a/crm/rest/module.go +++ b/crm/rest/module.go @@ -7,21 +7,23 @@ import ( "context" "github.com/crusttech/crust/crm/rest/server" - "github.com/crusttech/crust/crm/types" "github.com/crusttech/crust/crm/service" + "github.com/crusttech/crust/crm/types" ) var _ = errors.Wrap type ( Module struct { - module service.ModuleService + module service.ModuleService + content service.ContentService } ) func (Module) New() server.ModuleAPI { return &Module{ - module: service.Module(), + module: service.Module(), + content: service.Content(), } } @@ -38,31 +40,48 @@ func (s *Module) Delete(ctx context.Context, r *server.ModuleDeleteRequest) (int } func (s *Module) Create(ctx context.Context, r *server.ModuleCreateRequest) (interface{}, error) { - m := &types.Module{Name: r.Name} - return s.module.With(ctx).Create(m) + return s.module.With(ctx).Create( + &types.Module{Name: r.Name}, + ) } func (s *Module) Edit(ctx context.Context, r *server.ModuleEditRequest) (interface{}, error) { - m := &types.Module{ID: r.ID, Name: r.Name} - return s.module.With(ctx).Update(m) + return s.module.With(ctx).Update( + &types.Module{ID: r.ID, Name: r.Name}, + ) } -func (*Module) ContentList(ctx context.Context, r *server.ModuleContentListRequest) (interface{}, error) { - return nil, errors.New("Not implemented: Module.content/edit") +func (s *Module) ContentList(ctx context.Context, r *server.ModuleContentListRequest) (interface{}, error) { + return s.content.With(ctx).Find() } -func (*Module) ContentRead(ctx context.Context, r *server.ModuleContentReadRequest) (interface{}, error) { - return nil, errors.New("Not implemented: Module.content/edit") +func (s *Module) ContentRead(ctx context.Context, r *server.ModuleContentReadRequest) (interface{}, error) { + return s.content.With(ctx).FindByID(r.ID) } -func (*Module) ContentCreate(ctx context.Context, r *server.ModuleContentCreateRequest) (interface{}, error) { - return nil, errors.New("Not implemented: Module.content/edit") +func (s *Module) ContentCreate(ctx context.Context, r *server.ModuleContentCreateRequest) (interface{}, error) { + item := &types.Content{ + ModuleID: r.Module, + } + fields := &item.Fields + if err := fields.Scan(r.Payload); err != nil { + return nil, err + } + return s.content.With(ctx).Create(item) } -func (*Module) ContentEdit(ctx context.Context, r *server.ModuleContentEditRequest) (interface{}, error) { - return nil, errors.New("Not implemented: Module.content/edit") +func (s *Module) ContentEdit(ctx context.Context, r *server.ModuleContentEditRequest) (interface{}, error) { + item := &types.Content{ + ID: r.ID, + ModuleID: r.Module, + } + fields := &item.Fields + if err := fields.Scan(r.Payload); err != nil { + return nil, err + } + return s.content.With(ctx).Update(item) } -func (*Module) ContentDelete(ctx context.Context, r *server.ModuleContentDeleteRequest) (interface{}, error) { - return nil, errors.New("Not implemented: Module.content/delete") +func (s *Module) ContentDelete(ctx context.Context, r *server.ModuleContentDeleteRequest) (interface{}, error) { + return resputil.OK(), s.content.With(ctx).DeleteByID(r.ID) } diff --git a/crm/service/content.go b/crm/service/content.go new file mode 100644 index 000000000..6b13a5e2b --- /dev/null +++ b/crm/service/content.go @@ -0,0 +1,56 @@ +package service + +import ( + "context" + "github.com/crusttech/crust/crm/repository" + "github.com/crusttech/crust/crm/types" +) + +type ( + content struct { + repository repository.Content + } + + ContentService interface { + With(ctx context.Context) ContentService + + FindByID(contentID uint64) (*types.Content, error) + Find() ([]*types.Content, error) + + Create(content *types.Content) (*types.Content, error) + Update(content *types.Content) (*types.Content, error) + DeleteByID(contentID uint64) error + } +) + +func Content() ContentService { + return &content{ + repository: repository.NewContent(context.Background()), + } +} + +func (s *content) With(ctx context.Context) ContentService { + return &content{ + repository: s.repository.With(ctx), + } +} + +func (s *content) FindByID(id uint64) (*types.Content, error) { + return s.repository.FindByID(id) +} + +func (s *content) Find() ([]*types.Content, error) { + return s.repository.Find() +} + +func (s *content) Create(mod *types.Content) (*types.Content, error) { + return s.repository.Create(mod) +} + +func (s *content) Update(mod *types.Content) (*types.Content, error) { + return s.repository.Update(mod) +} + +func (s *content) DeleteByID(id uint64) error { + return s.repository.DeleteByID(id) +} diff --git a/crm/types/field.go b/crm/types/field.go index 764367d38..5d1774b62 100644 --- a/crm/types/field.go +++ b/crm/types/field.go @@ -1,5 +1,7 @@ package types +/* If you want to edit this file by hand, remove codegen/[project]/types/index.php */ + type ( // Fields - CRM input field definitions Field struct { diff --git a/crm/types/module.go b/crm/types/module.go index d8671afe7..2112bc7ce 100644 --- a/crm/types/module.go +++ b/crm/types/module.go @@ -1,5 +1,7 @@ package types +/* If you want to edit this file by hand, remove codegen/[project]/types/index.php */ + import ( "github.com/jmoiron/sqlx/types" ) @@ -12,9 +14,9 @@ type ( } // Modules - CRM module definitions - ModuleContentRow struct { + Content struct { ID uint64 `db:"id"` ModuleID uint64 `db:"module_id"` - Fields types.JSONText `db:"fields"` + Fields types.JSONText `db:"json"` } )