3
0
Files
corteza/crm/repository/module.go
2018-11-21 05:50:07 +01:00

128 lines
3.3 KiB
Go

package repository
import (
"context"
"encoding/json"
"time"
"github.com/pkg/errors"
"github.com/titpetric/factory"
"github.com/crusttech/crust/crm/rest/request"
"github.com/crusttech/crust/crm/types"
)
type (
ModuleRepository interface {
With(ctx context.Context, db *factory.DB) ModuleRepository
Chart(r *request.ModuleChart) (interface{}, error)
FindByID(id uint64) (*types.Module, error)
Find() (types.ModuleSet, error)
Create(mod *types.Module) (*types.Module, error)
Update(mod *types.Module) (*types.Module, error)
DeleteByID(id uint64) error
Fields(mod *types.Module) ([]*types.ModuleField, error)
FieldNames(mod *types.Module) ([]string, error)
}
module struct {
*repository
}
)
func Module(ctx context.Context, db *factory.DB) ModuleRepository {
return (&module{}).With(ctx, db)
}
func (r *module) With(ctx context.Context, db *factory.DB) ModuleRepository {
return &module{
repository: r.repository.With(ctx, db),
}
}
// @todo: update to accepted DeletedAt column semantics from SAM
func (r *module) FindByID(id uint64) (*types.Module, error) {
mod := &types.Module{}
if err := r.db().Get(mod, "SELECT * FROM crm_module WHERE id=?", id); err != nil {
return nil, err
}
if err := r.fillPage(mod); err != nil {
return nil, err
}
return mod, nil
}
func (r *module) Find() (types.ModuleSet, error) {
mod := types.ModuleSet{}
return mod, r.db().Select(&mod, "SELECT * FROM crm_module ORDER BY id ASC")
}
func (r *module) Create(mod *types.Module) (*types.Module, error) {
mod.ID = factory.Sonyflake.NextID()
mod.CreatedAt = time.Now()
fields := make([]types.ModuleField, 0)
if err := json.Unmarshal(mod.Fields, &fields); err != nil {
return nil, errors.Wrap(err, "No fields")
}
for _, v := range fields {
v.ModuleID = mod.ID
if err := r.db().Replace("crm_module_form", v); err != nil {
return nil, errors.Wrap(err, "Error adding module fields")
}
}
return mod, r.db().Insert("crm_module", mod)
}
func (r *module) Update(mod *types.Module) (*types.Module, error) {
now := time.Now()
mod.UpdatedAt = &now
fields := make([]types.ModuleField, 0)
if err := json.Unmarshal(mod.Fields, &fields); err != nil {
return nil, errors.Wrap(err, "No fields")
}
for _, v := range fields {
v.ModuleID = mod.ID
if err := r.db().Replace("crm_module_form", v); err != nil {
return nil, errors.Wrap(err, "Error adding module fields")
}
}
return mod, r.db().Replace("crm_module", mod)
}
func (r *module) DeleteByID(id uint64) error {
_, err := r.db().Exec("DELETE FROM crm_module WHERE id=?", id)
return err
}
func (r *module) Fields(mod *types.Module) ([]*types.ModuleField, error) {
fields := make([]*types.ModuleField, 0)
return fields, r.db().Select(&fields, "select * from crm_module_form where module_id=? order by place asc", mod.ID)
}
// FieldNames returns a slice of field names, used for ordering content row columns
func (r *module) FieldNames(mod *types.Module) ([]string, error) {
if fields, err := r.Fields(mod); err != nil {
return []string{}, err
} else {
result := make([]string, len(fields))
for k, v := range fields {
result[k] = v.Name
}
return result, nil
}
}
func (r *module) fillPage(mod *types.Module) (err error) {
api := Page(r.Context(), r.db())
mod.Page, err = api.FindByModuleID(mod.ID)
return
}