diff --git a/codegen.sh b/codegen.sh index 0b1709a58..762a9907a 100755 --- a/codegen.sh +++ b/codegen.sh @@ -22,12 +22,15 @@ function types { CGO_ENABLED=0 go build -o ./build/gen-type-set codegen/v2/type-set.go fi - ./build/gen-type-set --types Module,Page,Chart,Trigger,Record \ - --output crm/types/type.primary.gen.go - ./build/gen-type-set --with-primary-key=false --types ModuleField,RecordValue \ - --output crm/types/type.other.gen.go - ./build/gen-type-set --types Attachment \ - --output crm/types/attachment.gen.go + ./build/gen-type-set --types Attachment --output crm/types/attachment.gen.go + ./build/gen-type-set --types Module --output crm/types/module.gen.go + ./build/gen-type-set --types Page --output crm/types/page.gen.go + ./build/gen-type-set --types Chart --output crm/types/chart.gen.go + ./build/gen-type-set --types Trigger --output crm/types/trigger.gen.go + ./build/gen-type-set --types Record --output crm/types/record.gen.go + + ./build/gen-type-set --with-primary-key=false --types ModuleField --output crm/types/module_field.gen.go + ./build/gen-type-set --with-primary-key=false --types RecordValue --output crm/types/record_value.gen.go ./build/gen-type-set --types MessageAttachment --output messaging/types/attachment.gen.go ./build/gen-type-set --with-resources=true --types Channel --resource-type "rules.Resource" --imports "github.com/crusttech/crust/internal/rules" --output messaging/types/channel.gen.go diff --git a/crm/types/chart.gen.go b/crm/types/chart.gen.go new file mode 100644 index 000000000..47c6dbd08 --- /dev/null +++ b/crm/types/chart.gen.go @@ -0,0 +1,67 @@ +package types + +// Hello! This file is auto-generated. + +type ( + + // ChartSet slice of Chart + // + // This type is auto-generated. + ChartSet []*Chart +) + +// Walk iterates through every slice item and calls w(Chart) err +// +// This function is auto-generated. +func (set ChartSet) Walk(w func(*Chart) error) (err error) { + for i := range set { + if err = w(set[i]); err != nil { + return + } + } + + return +} + +// Filter iterates through every slice item, calls f(Chart) (bool, err) and return filtered slice +// +// This function is auto-generated. +func (set ChartSet) Filter(f func(*Chart) (bool, error)) (out ChartSet, err error) { + var ok bool + out = ChartSet{} + for i := range set { + if ok, err = f(set[i]); err != nil { + return + } else if ok { + out = append(out, set[i]) + } + } + + return +} + +// FindByID finds items from slice by its ID property +// +// This function is auto-generated. +func (set ChartSet) FindByID(ID uint64) *Chart { + for i := range set { + if set[i].ID == ID { + return set[i] + } + } + + return nil +} + +// IDs returns a slice of uint64s from all items in the set +// +// This function is auto-generated. +func (set ChartSet) IDs() (IDs []uint64) { + IDs = make([]uint64, len(set)) + + for i := range set { + IDs[i] = set[i].ID + } + + return +} diff --git a/crm/types/module.gen.go b/crm/types/module.gen.go new file mode 100644 index 000000000..a953dbc58 --- /dev/null +++ b/crm/types/module.gen.go @@ -0,0 +1,67 @@ +package types + +// Hello! This file is auto-generated. + +type ( + + // ModuleSet slice of Module + // + // This type is auto-generated. + ModuleSet []*Module +) + +// Walk iterates through every slice item and calls w(Module) err +// +// This function is auto-generated. +func (set ModuleSet) Walk(w func(*Module) error) (err error) { + for i := range set { + if err = w(set[i]); err != nil { + return + } + } + + return +} + +// Filter iterates through every slice item, calls f(Module) (bool, err) and return filtered slice +// +// This function is auto-generated. +func (set ModuleSet) Filter(f func(*Module) (bool, error)) (out ModuleSet, err error) { + var ok bool + out = ModuleSet{} + for i := range set { + if ok, err = f(set[i]); err != nil { + return + } else if ok { + out = append(out, set[i]) + } + } + + return +} + +// FindByID finds items from slice by its ID property +// +// This function is auto-generated. +func (set ModuleSet) FindByID(ID uint64) *Module { + for i := range set { + if set[i].ID == ID { + return set[i] + } + } + + return nil +} + +// IDs returns a slice of uint64s from all items in the set +// +// This function is auto-generated. +func (set ModuleSet) IDs() (IDs []uint64) { + IDs = make([]uint64, len(set)) + + for i := range set { + IDs[i] = set[i].ID + } + + return +} diff --git a/crm/types/module.go b/crm/types/module.go new file mode 100644 index 000000000..01e561ac4 --- /dev/null +++ b/crm/types/module.go @@ -0,0 +1,35 @@ +package types + +import ( + "time" + + "github.com/jmoiron/sqlx/types" + + "github.com/crusttech/crust/internal/rules" +) + +type ( + // Modules - CRM module definitions + Module struct { + ID uint64 `json:"moduleID,string" db:"id"` + Name string `json:"name" db:"name"` + Meta types.JSONText `json:"meta" db:"json"` + Fields ModuleFieldSet `json:"fields" db:"-"` + Page *Page `json:"page,omitempty"` + + CreatedAt time.Time `db:"created_at" json:"createdAt,omitempty"` + UpdatedAt *time.Time `db:"updated_at" json:"updatedAt,omitempty"` + DeletedAt *time.Time `db:"deleted_at" json:"deletedAt,omitempty"` + } +) + +// Resource returns a system resource ID for this type +func (r *Module) Resource() rules.Resource { + resource := rules.Resource{ + Service: "compose", + Scope: "module", + ID: r.ID, + } + + return resource +} diff --git a/crm/types/type.other.gen.go b/crm/types/module_field.gen.go similarity index 51% rename from crm/types/type.other.gen.go rename to crm/types/module_field.gen.go index 45114ee0a..9909d7a34 100644 --- a/crm/types/type.other.gen.go +++ b/crm/types/module_field.gen.go @@ -8,11 +8,6 @@ type ( // // This type is auto-generated. ModuleFieldSet []*ModuleField - - // RecordValueSet slice of RecordValue - // - // This type is auto-generated. - RecordValueSet []*RecordValue ) // Walk iterates through every slice item and calls w(ModuleField) err @@ -44,33 +39,3 @@ func (set ModuleFieldSet) Filter(f func(*ModuleField) (bool, error)) (out Module return } - -// Walk iterates through every slice item and calls w(RecordValue) err -// -// This function is auto-generated. -func (set RecordValueSet) Walk(w func(*RecordValue) error) (err error) { - for i := range set { - if err = w(set[i]); err != nil { - return - } - } - - return -} - -// Filter iterates through every slice item, calls f(RecordValue) (bool, err) and return filtered slice -// -// This function is auto-generated. -func (set RecordValueSet) Filter(f func(*RecordValue) (bool, error)) (out RecordValueSet, err error) { - var ok bool - out = RecordValueSet{} - for i := range set { - if ok, err = f(set[i]); err != nil { - return - } else if ok { - out = append(out, set[i]) - } - } - - return -} diff --git a/crm/types/module_field.go b/crm/types/module_field.go new file mode 100644 index 000000000..9e7685ce8 --- /dev/null +++ b/crm/types/module_field.go @@ -0,0 +1,83 @@ +package types + +import ( + "database/sql/driver" + "encoding/json" + + "github.com/jmoiron/sqlx/types" +) + +type ( + // Modules - CRM module definitions + ModuleField struct { + ModuleID uint64 `json:"moduleID,string" db:"module_id"` + Place int `json:"-" db:"place"` + + Kind string `json:"kind" db:"kind"` + Name string `json:"name" db:"name"` + Label string `json:"label" db:"label"` + + Options types.JSONText `json:"options" db:"json"` + + Private bool `json:"isPrivate" db:"is_private"` + Required bool `json:"isRequired" db:"is_required"` + Visible bool `json:"isVisible" db:"is_visible"` + Multi bool `json:"isMulti" db:"is_multi"` + } +) + +func (set *ModuleFieldSet) Scan(src interface{}) error { + if data, ok := src.([]byte); ok { + return json.Unmarshal(data, set) + } + return nil +} + +func (set ModuleFieldSet) Value() (driver.Value, error) { + return json.Marshal(set) +} + +func (set ModuleFieldSet) Names() (names []string) { + names = make([]string, len(set)) + + for i := range set { + names[i] = set[i].Name + } + + return +} + +func (set ModuleFieldSet) HasName(name string) bool { + for i := range set { + if name == set[i].Name { + return true + } + } + + return false +} + +func (set ModuleFieldSet) FindByName(name string) *ModuleField { + for i := range set { + if name == set[i].Name { + return set[i] + } + } + + return nil +} + +func (set ModuleFieldSet) FilterByModule(moduleID uint64) (ff ModuleFieldSet) { + for i := range set { + if set[i].ModuleID == moduleID { + ff = append(ff, set[i]) + } + } + + return +} + +// IsRef tells us if value of this field be a reference to something (another record, user)? +func (f ModuleField) IsRef() bool { + return f.Kind == "Record" || f.Kind == "Owner" || f.Kind == "File" +} diff --git a/crm/types/page.gen.go b/crm/types/page.gen.go new file mode 100644 index 000000000..664f77fab --- /dev/null +++ b/crm/types/page.gen.go @@ -0,0 +1,67 @@ +package types + +// Hello! This file is auto-generated. + +type ( + + // PageSet slice of Page + // + // This type is auto-generated. + PageSet []*Page +) + +// Walk iterates through every slice item and calls w(Page) err +// +// This function is auto-generated. +func (set PageSet) Walk(w func(*Page) error) (err error) { + for i := range set { + if err = w(set[i]); err != nil { + return + } + } + + return +} + +// Filter iterates through every slice item, calls f(Page) (bool, err) and return filtered slice +// +// This function is auto-generated. +func (set PageSet) Filter(f func(*Page) (bool, error)) (out PageSet, err error) { + var ok bool + out = PageSet{} + for i := range set { + if ok, err = f(set[i]); err != nil { + return + } else if ok { + out = append(out, set[i]) + } + } + + return +} + +// FindByID finds items from slice by its ID property +// +// This function is auto-generated. +func (set PageSet) FindByID(ID uint64) *Page { + for i := range set { + if set[i].ID == ID { + return set[i] + } + } + + return nil +} + +// IDs returns a slice of uint64s from all items in the set +// +// This function is auto-generated. +func (set PageSet) IDs() (IDs []uint64) { + IDs = make([]uint64, len(set)) + + for i := range set { + IDs[i] = set[i].ID + } + + return +} diff --git a/crm/types/page.go b/crm/types/page.go new file mode 100644 index 000000000..2d8fab143 --- /dev/null +++ b/crm/types/page.go @@ -0,0 +1,51 @@ +package types + +import ( + "github.com/jmoiron/sqlx/types" + + "github.com/crusttech/crust/internal/rules" +) + +type ( + // Page - page structure + Page struct { + ID uint64 `json:"pageID,string" db:"id"` + SelfID uint64 `json:"selfID,string" db:"self_id"` + + ModuleID uint64 `json:"moduleID,string" db:"module_id"` + Module *Module `json:"module,omitempty" db:"-"` + + Title string `json:"title" db:"title"` + Description string `json:"description" db:"description"` + + Blocks types.JSONText `json:"blocks" db:"blocks"` + + Children PageSet `json:"children,omitempty" db:"-"` + + Visible bool `json:"visible" db:"visible"` + Weight int `json:"-" db:"weight"` + } + + // Block - value of Page.Blocks ([]Block) + Block struct { + Title string `json:"title"` + Description string `json:"description"` + Options types.JSONText `json:"options"` + Kind string `json:"kind"` + X int `json:"x"` + Y int `json:"y"` + Width int `json:"width"` + Height int `json:"height"` + } +) + +// Resource returns a system resource ID for this type +func (r *Page) Resource() rules.Resource { + resource := rules.Resource{ + Service: "compose", + Scope: "page", + ID: r.ID, + } + + return resource +} diff --git a/crm/types/record.gen.go b/crm/types/record.gen.go new file mode 100644 index 000000000..bf2a9b59a --- /dev/null +++ b/crm/types/record.gen.go @@ -0,0 +1,67 @@ +package types + +// Hello! This file is auto-generated. + +type ( + + // RecordSet slice of Record + // + // This type is auto-generated. + RecordSet []*Record +) + +// Walk iterates through every slice item and calls w(Record) err +// +// This function is auto-generated. +func (set RecordSet) Walk(w func(*Record) error) (err error) { + for i := range set { + if err = w(set[i]); err != nil { + return + } + } + + return +} + +// Filter iterates through every slice item, calls f(Record) (bool, err) and return filtered slice +// +// This function is auto-generated. +func (set RecordSet) Filter(f func(*Record) (bool, error)) (out RecordSet, err error) { + var ok bool + out = RecordSet{} + for i := range set { + if ok, err = f(set[i]); err != nil { + return + } else if ok { + out = append(out, set[i]) + } + } + + return +} + +// FindByID finds items from slice by its ID property +// +// This function is auto-generated. +func (set RecordSet) FindByID(ID uint64) *Record { + for i := range set { + if set[i].ID == ID { + return set[i] + } + } + + return nil +} + +// IDs returns a slice of uint64s from all items in the set +// +// This function is auto-generated. +func (set RecordSet) IDs() (IDs []uint64) { + IDs = make([]uint64, len(set)) + + for i := range set { + IDs[i] = set[i].ID + } + + return +} diff --git a/crm/types/record.go b/crm/types/record.go new file mode 100644 index 000000000..10aa1b076 --- /dev/null +++ b/crm/types/record.go @@ -0,0 +1,54 @@ +package types + +import ( + "time" + + "github.com/crusttech/crust/internal/rules" +) + +type ( + // Record is a stored row in the `record` table + Record struct { + ID uint64 `json:"recordID,string" db:"id"` + ModuleID uint64 `json:"moduleID,string" db:"module_id"` + + Values RecordValueSet `json:"values,omitempty" db:"-"` + + OwnedBy uint64 `db:"owned_by" json:"ownedBy,string"` + CreatedAt time.Time `db:"created_at" json:"createdAt,omitempty"` + CreatedBy uint64 `db:"created_by" json:"createdBy,string" ` + UpdatedAt *time.Time `db:"updated_at" json:"updatedAt,omitempty,omitempty"` + UpdatedBy uint64 `db:"updated_by" json:"updatedBy,string,omitempty" ` + DeletedAt *time.Time `db:"deleted_at" json:"deletedAt,omitempty"` + DeletedBy uint64 `db:"deleted_by" json:"deletedBy,string,omitempty" ` + } +) + +// UserIDs returns a slice of user IDs from all items in the set +func (set RecordSet) UserIDs() (IDs []uint64) { + IDs = make([]uint64, 0) + +loop: + for i := range set { + for _, id := range IDs { + if id == set[i].OwnedBy { + continue loop + } + } + + IDs = append(IDs, set[i].OwnedBy) + } + + return +} + +// Resource returns a system resource ID for this type +func (r *Record) Resource() rules.Resource { + resource := rules.Resource{ + Service: "compose", + Scope: "module", // intentionally using module here so we can use Record's resource + ID: r.ModuleID, + } + + return resource +} diff --git a/crm/types/record_value.gen.go b/crm/types/record_value.gen.go new file mode 100644 index 000000000..36307ab07 --- /dev/null +++ b/crm/types/record_value.gen.go @@ -0,0 +1,41 @@ +package types + +// Hello! This file is auto-generated. + +type ( + + // RecordValueSet slice of RecordValue + // + // This type is auto-generated. + RecordValueSet []*RecordValue +) + +// Walk iterates through every slice item and calls w(RecordValue) err +// +// This function is auto-generated. +func (set RecordValueSet) Walk(w func(*RecordValue) error) (err error) { + for i := range set { + if err = w(set[i]); err != nil { + return + } + } + + return +} + +// Filter iterates through every slice item, calls f(RecordValue) (bool, err) and return filtered slice +// +// This function is auto-generated. +func (set RecordValueSet) Filter(f func(*RecordValue) (bool, error)) (out RecordValueSet, err error) { + var ok bool + out = RecordValueSet{} + for i := range set { + if ok, err = f(set[i]); err != nil { + return + } else if ok { + out = append(out, set[i]) + } + } + + return +} diff --git a/crm/types/record_value.go b/crm/types/record_value.go new file mode 100644 index 000000000..0ba3fb05e --- /dev/null +++ b/crm/types/record_value.go @@ -0,0 +1,37 @@ +package types + +import ( + "time" +) + +type ( + // RecordValue is a stored row in the `record_value` table + RecordValue struct { + RecordID uint64 `db:"record_id" json:"-"` + Name string `db:"name" json:"name"` + Value string `db:"value" json:"value,omitempty"` + Ref uint64 `db:"ref" json:"-"` + Place uint `db:"place" json:"-"` + DeletedAt *time.Time `db:"deleted_at" json:"deletedAt,omitempty"` + } +) + +func (set RecordValueSet) FilterByName(name string) (vv RecordValueSet) { + for i := range set { + if set[i].Name == name { + vv = append(vv, set[i]) + } + } + + return +} + +func (set RecordValueSet) FilterByRecordID(recordID uint64) (vv RecordValueSet) { + for i := range set { + if set[i].RecordID == recordID { + vv = append(vv, set[i]) + } + } + + return +} diff --git a/crm/types/trigger.gen.go b/crm/types/trigger.gen.go new file mode 100644 index 000000000..d2433a55c --- /dev/null +++ b/crm/types/trigger.gen.go @@ -0,0 +1,67 @@ +package types + +// Hello! This file is auto-generated. + +type ( + + // TriggerSet slice of Trigger + // + // This type is auto-generated. + TriggerSet []*Trigger +) + +// Walk iterates through every slice item and calls w(Trigger) err +// +// This function is auto-generated. +func (set TriggerSet) Walk(w func(*Trigger) error) (err error) { + for i := range set { + if err = w(set[i]); err != nil { + return + } + } + + return +} + +// Filter iterates through every slice item, calls f(Trigger) (bool, err) and return filtered slice +// +// This function is auto-generated. +func (set TriggerSet) Filter(f func(*Trigger) (bool, error)) (out TriggerSet, err error) { + var ok bool + out = TriggerSet{} + for i := range set { + if ok, err = f(set[i]); err != nil { + return + } else if ok { + out = append(out, set[i]) + } + } + + return +} + +// FindByID finds items from slice by its ID property +// +// This function is auto-generated. +func (set TriggerSet) FindByID(ID uint64) *Trigger { + for i := range set { + if set[i].ID == ID { + return set[i] + } + } + + return nil +} + +// IDs returns a slice of uint64s from all items in the set +// +// This function is auto-generated. +func (set TriggerSet) IDs() (IDs []uint64) { + IDs = make([]uint64, len(set)) + + for i := range set { + IDs[i] = set[i].ID + } + + return +} diff --git a/crm/types/type.primary.gen.go b/crm/types/type.primary.gen.go deleted file mode 100644 index 7b354d864..000000000 --- a/crm/types/type.primary.gen.go +++ /dev/null @@ -1,311 +0,0 @@ -package types - -// Hello! This file is auto-generated. - -type ( - - // ModuleSet slice of Module - // - // This type is auto-generated. - ModuleSet []*Module - - // PageSet slice of Page - // - // This type is auto-generated. - PageSet []*Page - - // ChartSet slice of Chart - // - // This type is auto-generated. - ChartSet []*Chart - - // TriggerSet slice of Trigger - // - // This type is auto-generated. - TriggerSet []*Trigger - - // RecordSet slice of Record - // - // This type is auto-generated. - RecordSet []*Record -) - -// Walk iterates through every slice item and calls w(Module) err -// -// This function is auto-generated. -func (set ModuleSet) Walk(w func(*Module) error) (err error) { - for i := range set { - if err = w(set[i]); err != nil { - return - } - } - - return -} - -// Filter iterates through every slice item, calls f(Module) (bool, err) and return filtered slice -// -// This function is auto-generated. -func (set ModuleSet) Filter(f func(*Module) (bool, error)) (out ModuleSet, err error) { - var ok bool - out = ModuleSet{} - for i := range set { - if ok, err = f(set[i]); err != nil { - return - } else if ok { - out = append(out, set[i]) - } - } - - return -} - -// FindByID finds items from slice by its ID property -// -// This function is auto-generated. -func (set ModuleSet) FindByID(ID uint64) *Module { - for i := range set { - if set[i].ID == ID { - return set[i] - } - } - - return nil -} - -// IDs returns a slice of uint64s from all items in the set -// -// This function is auto-generated. -func (set ModuleSet) IDs() (IDs []uint64) { - IDs = make([]uint64, len(set)) - - for i := range set { - IDs[i] = set[i].ID - } - - return -} - -// Walk iterates through every slice item and calls w(Page) err -// -// This function is auto-generated. -func (set PageSet) Walk(w func(*Page) error) (err error) { - for i := range set { - if err = w(set[i]); err != nil { - return - } - } - - return -} - -// Filter iterates through every slice item, calls f(Page) (bool, err) and return filtered slice -// -// This function is auto-generated. -func (set PageSet) Filter(f func(*Page) (bool, error)) (out PageSet, err error) { - var ok bool - out = PageSet{} - for i := range set { - if ok, err = f(set[i]); err != nil { - return - } else if ok { - out = append(out, set[i]) - } - } - - return -} - -// FindByID finds items from slice by its ID property -// -// This function is auto-generated. -func (set PageSet) FindByID(ID uint64) *Page { - for i := range set { - if set[i].ID == ID { - return set[i] - } - } - - return nil -} - -// IDs returns a slice of uint64s from all items in the set -// -// This function is auto-generated. -func (set PageSet) IDs() (IDs []uint64) { - IDs = make([]uint64, len(set)) - - for i := range set { - IDs[i] = set[i].ID - } - - return -} - -// Walk iterates through every slice item and calls w(Chart) err -// -// This function is auto-generated. -func (set ChartSet) Walk(w func(*Chart) error) (err error) { - for i := range set { - if err = w(set[i]); err != nil { - return - } - } - - return -} - -// Filter iterates through every slice item, calls f(Chart) (bool, err) and return filtered slice -// -// This function is auto-generated. -func (set ChartSet) Filter(f func(*Chart) (bool, error)) (out ChartSet, err error) { - var ok bool - out = ChartSet{} - for i := range set { - if ok, err = f(set[i]); err != nil { - return - } else if ok { - out = append(out, set[i]) - } - } - - return -} - -// FindByID finds items from slice by its ID property -// -// This function is auto-generated. -func (set ChartSet) FindByID(ID uint64) *Chart { - for i := range set { - if set[i].ID == ID { - return set[i] - } - } - - return nil -} - -// IDs returns a slice of uint64s from all items in the set -// -// This function is auto-generated. -func (set ChartSet) IDs() (IDs []uint64) { - IDs = make([]uint64, len(set)) - - for i := range set { - IDs[i] = set[i].ID - } - - return -} - -// Walk iterates through every slice item and calls w(Trigger) err -// -// This function is auto-generated. -func (set TriggerSet) Walk(w func(*Trigger) error) (err error) { - for i := range set { - if err = w(set[i]); err != nil { - return - } - } - - return -} - -// Filter iterates through every slice item, calls f(Trigger) (bool, err) and return filtered slice -// -// This function is auto-generated. -func (set TriggerSet) Filter(f func(*Trigger) (bool, error)) (out TriggerSet, err error) { - var ok bool - out = TriggerSet{} - for i := range set { - if ok, err = f(set[i]); err != nil { - return - } else if ok { - out = append(out, set[i]) - } - } - - return -} - -// FindByID finds items from slice by its ID property -// -// This function is auto-generated. -func (set TriggerSet) FindByID(ID uint64) *Trigger { - for i := range set { - if set[i].ID == ID { - return set[i] - } - } - - return nil -} - -// IDs returns a slice of uint64s from all items in the set -// -// This function is auto-generated. -func (set TriggerSet) IDs() (IDs []uint64) { - IDs = make([]uint64, len(set)) - - for i := range set { - IDs[i] = set[i].ID - } - - return -} - -// Walk iterates through every slice item and calls w(Record) err -// -// This function is auto-generated. -func (set RecordSet) Walk(w func(*Record) error) (err error) { - for i := range set { - if err = w(set[i]); err != nil { - return - } - } - - return -} - -// Filter iterates through every slice item, calls f(Record) (bool, err) and return filtered slice -// -// This function is auto-generated. -func (set RecordSet) Filter(f func(*Record) (bool, error)) (out RecordSet, err error) { - var ok bool - out = RecordSet{} - for i := range set { - if ok, err = f(set[i]); err != nil { - return - } else if ok { - out = append(out, set[i]) - } - } - - return -} - -// FindByID finds items from slice by its ID property -// -// This function is auto-generated. -func (set RecordSet) FindByID(ID uint64) *Record { - for i := range set { - if set[i].ID == ID { - return set[i] - } - } - - return nil -} - -// IDs returns a slice of uint64s from all items in the set -// -// This function is auto-generated. -func (set RecordSet) IDs() (IDs []uint64) { - IDs = make([]uint64, len(set)) - - for i := range set { - IDs[i] = set[i].ID - } - - return -} diff --git a/crm/types/types.go b/crm/types/types.go deleted file mode 100644 index f872a79e8..000000000 --- a/crm/types/types.go +++ /dev/null @@ -1,229 +0,0 @@ -package types - -import ( - "database/sql/driver" - "encoding/json" - "time" - - "github.com/jmoiron/sqlx/types" - - "github.com/crusttech/crust/internal/rules" -) - -type ( - // Record is a stored row in the `record` table - Record struct { - ID uint64 `json:"recordID,string" db:"id"` - ModuleID uint64 `json:"moduleID,string" db:"module_id"` - - Values RecordValueSet `json:"values,omitempty" db:"-"` - - OwnedBy uint64 `db:"owned_by" json:"ownedBy,string"` - CreatedAt time.Time `db:"created_at" json:"createdAt,omitempty"` - CreatedBy uint64 `db:"created_by" json:"createdBy,string" ` - UpdatedAt *time.Time `db:"updated_at" json:"updatedAt,omitempty,omitempty"` - UpdatedBy uint64 `db:"updated_by" json:"updatedBy,string,omitempty" ` - DeletedAt *time.Time `db:"deleted_at" json:"deletedAt,omitempty"` - DeletedBy uint64 `db:"deleted_by" json:"deletedBy,string,omitempty" ` - } - - // RecordValue is a stored row in the `record_value` table - RecordValue struct { - RecordID uint64 `db:"record_id" json:"-"` - Name string `db:"name" json:"name"` - Value string `db:"value" json:"value,omitempty"` - Ref uint64 `db:"ref" json:"-"` - Place uint `db:"place" json:"-"` - DeletedAt *time.Time `db:"deleted_at" json:"deletedAt,omitempty"` - } - - // Modules - CRM module definitions - Module struct { - ID uint64 `json:"moduleID,string" db:"id"` - Name string `json:"name" db:"name"` - Meta types.JSONText `json:"meta" db:"json"` - Fields ModuleFieldSet `json:"fields" db:"-"` - Page *Page `json:"page,omitempty"` - - CreatedAt time.Time `db:"created_at" json:"createdAt,omitempty"` - UpdatedAt *time.Time `db:"updated_at" json:"updatedAt,omitempty"` - DeletedAt *time.Time `db:"deleted_at" json:"deletedAt,omitempty"` - } - - // Modules - CRM module definitions - ModuleField struct { - ModuleID uint64 `json:"moduleID,string" db:"module_id"` - Place int `json:"-" db:"place"` - - Kind string `json:"kind" db:"kind"` - Name string `json:"name" db:"name"` - Label string `json:"label" db:"label"` - - Options types.JSONText `json:"options" db:"json"` - - Private bool `json:"isPrivate" db:"is_private"` - Required bool `json:"isRequired" db:"is_required"` - Visible bool `json:"isVisible" db:"is_visible"` - Multi bool `json:"isMulti" db:"is_multi"` - } - - // Page - page structure - Page struct { - ID uint64 `json:"pageID,string" db:"id"` - SelfID uint64 `json:"selfID,string" db:"self_id"` - - ModuleID uint64 `json:"moduleID,string" db:"module_id"` - Module *Module `json:"module,omitempty" db:"-"` - - Title string `json:"title" db:"title"` - Description string `json:"description" db:"description"` - - Blocks types.JSONText `json:"blocks" db:"blocks"` - - Children PageSet `json:"children,omitempty" db:"-"` - - Visible bool `json:"visible" db:"visible"` - Weight int `json:"-" db:"weight"` - } - - // Block - value of Page.Blocks ([]Block) - Block struct { - Title string `json:"title"` - Description string `json:"description"` - Options types.JSONText `json:"options"` - Kind string `json:"kind"` - X int `json:"x"` - Y int `json:"y"` - Width int `json:"width"` - Height int `json:"height"` - } -) - -func (set *ModuleFieldSet) Scan(src interface{}) error { - if data, ok := src.([]byte); ok { - return json.Unmarshal(data, set) - } - return nil -} - -func (set ModuleFieldSet) Value() (driver.Value, error) { - return json.Marshal(set) -} - -func (set ModuleFieldSet) Names() (names []string) { - names = make([]string, len(set)) - - for i := range set { - names[i] = set[i].Name - } - - return -} - -func (set ModuleFieldSet) HasName(name string) bool { - for i := range set { - if name == set[i].Name { - return true - } - } - - return false -} - -func (set ModuleFieldSet) FindByName(name string) *ModuleField { - for i := range set { - if name == set[i].Name { - return set[i] - } - } - - return nil -} - -func (set ModuleFieldSet) FilterByModule(moduleID uint64) (ff ModuleFieldSet) { - for i := range set { - if set[i].ModuleID == moduleID { - ff = append(ff, set[i]) - } - } - - return -} - -// IsRef tells us if value of this field be a reference to something (another record, user)? -func (f ModuleField) IsRef() bool { - return f.Kind == "Record" || f.Kind == "Owner" || f.Kind == "File" -} - -// UserIDs returns a slice of user IDs from all items in the set -// -// This function is auto-generated. -func (set RecordSet) UserIDs() (IDs []uint64) { - IDs = make([]uint64, 0) - -loop: - for i := range set { - for _, id := range IDs { - if id == set[i].OwnedBy { - continue loop - } - } - - IDs = append(IDs, set[i].OwnedBy) - } - - return -} - -func (set RecordValueSet) FilterByName(name string) (vv RecordValueSet) { - for i := range set { - if set[i].Name == name { - vv = append(vv, set[i]) - } - } - - return -} - -func (set RecordValueSet) FilterByRecordID(recordID uint64) (vv RecordValueSet) { - for i := range set { - if set[i].RecordID == recordID { - vv = append(vv, set[i]) - } - } - - return -} - -// Resource returns a system resource ID for this type -func (r *Module) Resource() rules.Resource { - resource := rules.Resource{ - Service: "compose", - Scope: "module", - ID: r.ID, - } - - return resource -} - -// Resource returns a system resource ID for this type -func (r *Record) Resource() rules.Resource { - resource := rules.Resource{ - Service: "compose", - Scope: "module", // intentionally using module here so we can use Record's resource - ID: r.ModuleID, - } - - return resource -} - -// Resource returns a system resource ID for this type -func (r *Page) Resource() rules.Resource { - resource := rules.Resource{ - Service: "compose", - Scope: "page", - ID: r.ID, - } - - return resource -}