3
0

Improve type-set generator, apply to system, sam

This commit is contained in:
Denis Arh
2018-11-21 07:02:57 +01:00
parent 02eebb5cfc
commit e5ff3ae7b3
26 changed files with 850 additions and 409 deletions

View File

@@ -14,10 +14,12 @@ function gofmt {
echo "=== go generate ==="
cd system/db && go generate && cd ../..
cd system/types && go generate && cd ../..
cd crm/db && go generate && cd ../..
cd crm/types && go generate && cd ../..
cd crm/repository && go generate && cd ../..
cd sam/db && go generate && cd ../..
cd sam/types && go generate && cd ../..
_PWD=$PWD
SPECS=$(find $PWD -name 'spec.json' | xargs -n1 dirname)

View File

@@ -1,29 +1,36 @@
package main
// Makeshift *Set type generator for functions like Walk(), Filter(), FindByID() & IDs()
// *Set type generator for functions like Walk(), Filter(), FindByID() & IDs()
import (
"bytes"
"flag"
"fmt"
"go/format"
"io"
"os"
"strings"
"text/template"
"github.com/pkg/errors"
)
const tmplTypeSet = `package types
// Hello! This file is auto-generated.
type (
{{ range .Sets }}
// {{ . }}Set slice of {{ . }}
{{ . }}Set []*{{ . }}
{{- end }}
{{ range $i, $set := .Sets }}
// {{ $set.Name }}Set slice of {{ $set.Name }}
//
// This type is auto-generated.
{{ $set.Name }}Set []*{{ $set.Name }}
{{ end }}
)
{{ range .Sets }}
// Walk iterates through every slice item and calls w({{ . }}) err
func (set {{ . }}Set) Walk(w func(*{{ . }}) error) (err error) {
{{ range $i, $set := .Sets }}
// Walk iterates through every slice item and calls w({{ $set.Name }}) err
//
// This function is auto-generated.
func (set {{ $set.Name }}Set) Walk(w func(*{{ $set.Name }}) error) (err error) {
for i := range set {
if err = w(set[i]); err != nil {
return
@@ -33,10 +40,12 @@ func (set {{ . }}Set) Walk(w func(*{{ . }}) error) (err error) {
return
}
// Filter iterates through every slice item, calls f({{ . }}) (bool, err) and return filtered slice
func (set {{ . }}Set) Filter(f func(*{{ . }}) (bool, error)) (out {{ . }}Set, err error) {
// Filter iterates through every slice item, calls f({{ $set.Name }}) (bool, err) and return filtered slice
//
// This function is auto-generated.
func (set {{ $set.Name }}Set) Filter(f func(*{{ $set.Name }}) (bool, error)) (out {{ $set.Name }}Set, err error) {
var ok bool
out = {{ . }}Set{}
out = {{ $set.Name }}Set{}
for i := range set {
if ok, err = f(set[i]); err != nil {
return
@@ -48,8 +57,11 @@ func (set {{ . }}Set) Filter(f func(*{{ . }}) (bool, error)) (out {{ . }}Set, er
return
}
// Finds slice item by its ID property
func (set {{ . }}Set) FindByID(ID uint64) *{{ . }} {
{{ if $set.PK }}
// FindByID finds items from slice by its ID property
//
// This function is auto-generated.
func (set {{ $set.Name }}Set) FindByID(ID uint64) *{{ $set.Name }} {
for i := range set {
if set[i].ID == ID {
return set[i]
@@ -59,8 +71,10 @@ func (set {{ . }}Set) FindByID(ID uint64) *{{ . }} {
return nil
}
// Returns a slice of uint64s from all items in the set
func (set {{ . }}Set) IDs() (IDs []uint64) {
// IDs returns a slice of uint64s from all items in the set
//
// This function is auto-generated.
func (set {{ $set.Name }}Set) IDs() (IDs []uint64) {
IDs = make([]uint64, len(set))
for i := range set {
@@ -69,7 +83,8 @@ func (set {{ . }}Set) IDs() (IDs []uint64) {
return
}
{{- end }}
{{ end }}
{{ end }}
`
func main() {
@@ -77,13 +92,38 @@ func main() {
tpl := template.Must(template.Must(t.Clone()).Parse(tmplTypeSet))
if len(os.Args) < 3 {
exit(errors.New("type-set.go <output-file> <type type2 type3 ...>"))
type (
set struct {
Name string
PK bool
}
)
var (
stdTypesStr, nopkTypesStr, outputFile string
output io.Writer
)
flag.StringVar(&stdTypesStr, "types", "", "Comma separated list of types")
flag.StringVar(&nopkTypesStr, "no-pk-types", "", "Comma separated list of types without ID field")
flag.StringVar(&outputFile, "output", "", "JWT Expiration in minutes")
flag.Parse()
payload := struct {
Sets []set
}{}
for _, name := range strings.Split(stdTypesStr, ",") {
if name = strings.TrimSpace(name); len(name) > 0 {
payload.Sets = append(payload.Sets, set{Name: name, PK: true})
}
}
l := len(os.Args) - 1
outputFile := os.Args[l]
payload := struct{ Sets []string }{Sets: os.Args[1:l]}
for _, name := range strings.Split(nopkTypesStr, ",") {
if name = strings.TrimSpace(name); len(name) > 0 {
payload.Sets = append(payload.Sets, set{Name: name, PK: false})
}
}
buf := bytes.Buffer{}
@@ -96,13 +136,15 @@ func main() {
fmtsrc = buf.Bytes()
}
output, err := os.Create(outputFile)
if err != nil {
exit(err)
if outputFile == "" || outputFile == "-" {
output = os.Stdout
} else {
if output, err = os.Create(outputFile); err != nil {
exit(err)
}
defer output.(io.Closer).Close()
}
defer output.Close()
if _, err := output.Write(fmtsrc); err != nil {
exit(err)
}
@@ -110,7 +152,7 @@ func main() {
}
func stderr(format string, a ...interface{}) {
_, _ = os.Stderr.WriteString(fmt.Sprintf(format, a...))
_, _ = os.Stderr.WriteString(fmt.Sprintf(format+"\n", a...))
}
func exit(err error) {

View File

@@ -1,14 +1,23 @@
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
)
// 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 {
@@ -20,6 +29,8 @@ func (set ModuleSet) Walk(w func(*Module) error) (err error) {
}
// 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{}
@@ -34,7 +45,9 @@ func (set ModuleSet) Filter(f func(*Module) (bool, error)) (out ModuleSet, err e
return
}
// Finds slice item by its ID property
// 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 {
@@ -45,7 +58,9 @@ func (set ModuleSet) FindByID(ID uint64) *Module {
return nil
}
// Returns a slice of uint64s from all items in the set
// 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))
@@ -57,6 +72,8 @@ func (set ModuleSet) IDs() (IDs []uint64) {
}
// 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 {
@@ -68,6 +85,8 @@ func (set PageSet) Walk(w func(*Page) error) (err error) {
}
// 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{}
@@ -82,7 +101,9 @@ func (set PageSet) Filter(f func(*Page) (bool, error)) (out PageSet, err error)
return
}
// Finds slice item by its ID property
// 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 {
@@ -93,7 +114,9 @@ func (set PageSet) FindByID(ID uint64) *Page {
return nil
}
// Returns a slice of uint64s from all items in the set
// 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))

View File

@@ -1,6 +1,6 @@
package types
//go:generate go run ../../codegen/v2/type-set.go Module Page type-sets.gen.go
//go:generate go run ../../codegen/v2/type-set.go --types Module,Page --output type.gen.go
import (
"time"

View File

@@ -205,7 +205,7 @@ func (r *message) PrefillThreadParticipants(mm types.MessageSet) error {
return err
} else {
for _, p := range rval {
mm.FindById(p.ReplyTo).RepliesFrom = append(mm.FindById(p.ReplyTo).RepliesFrom, p.UserID)
mm.FindByID(p.ReplyTo).RepliesFrom = append(mm.FindByID(p.ReplyTo).RepliesFrom, p.UserID)
}
}

View File

@@ -187,7 +187,7 @@ func (svc *channel) FindMembers(channelID uint64) (out types.ChannelMemberSet, e
return err
} else {
return out.Walk(func(member *types.ChannelMember) error {
member.User = uu.FindById(member.UserID)
member.User = uu.FindByID(member.UserID)
return nil
})
}
@@ -572,7 +572,7 @@ func (svc *channel) InviteUser(channelID uint64, memberIDs ...uint64) (out types
}
for _, memberID := range memberIDs {
user := users.FindById(memberID)
user := users.FindByID(memberID)
if user == nil {
return errors.New("Unexisting user")
}
@@ -633,7 +633,7 @@ func (svc *channel) AddMember(channelID uint64, memberIDs ...uint64) (out types.
for _, memberID := range memberIDs {
var exists bool
user := users.FindById(memberID)
user := users.FindByID(memberID)
if user == nil {
return errors.New("Unexisting user")
}

View File

@@ -471,7 +471,7 @@ func (svc *message) preloadUsers(mm types.MessageSet) (err error) {
continue
}
if msg.User = uu.FindById(msg.UserID); msg.User != nil {
if msg.User = uu.FindByID(msg.UserID); msg.User != nil {
continue
}
@@ -494,7 +494,7 @@ func (svc *message) preloadFlags(mm types.MessageSet) (err error) {
}
return ff.Walk(func(flag *types.MessageFlag) error {
mm.FindById(flag.MessageID).Flags = append(mm.FindById(flag.MessageID).Flags, flag)
mm.FindByID(flag.MessageID).Flags = append(mm.FindByID(flag.MessageID).Flags, flag)
return nil
})
}
@@ -536,7 +536,7 @@ func (svc *message) preloadAttachments(mm types.MessageSet) (err error) {
} else {
return aa.Walk(func(a *types.MessageAttachment) error {
if a.MessageID > 0 {
if m := mm.FindById(a.MessageID); m != nil {
if m := mm.FindByID(a.MessageID); m != nil {
m.Attachment = &a.Attachment
}
}

View File

@@ -0,0 +1,67 @@
package types
// Hello! This file is auto-generated.
type (
// MessageAttachmentSet slice of MessageAttachment
//
// This type is auto-generated.
MessageAttachmentSet []*MessageAttachment
)
// Walk iterates through every slice item and calls w(MessageAttachment) err
//
// This function is auto-generated.
func (set MessageAttachmentSet) Walk(w func(*MessageAttachment) error) (err error) {
for i := range set {
if err = w(set[i]); err != nil {
return
}
}
return
}
// Filter iterates through every slice item, calls f(MessageAttachment) (bool, err) and return filtered slice
//
// This function is auto-generated.
func (set MessageAttachmentSet) Filter(f func(*MessageAttachment) (bool, error)) (out MessageAttachmentSet, err error) {
var ok bool
out = MessageAttachmentSet{}
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 MessageAttachmentSet) FindByID(ID uint64) *MessageAttachment {
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 MessageAttachmentSet) IDs() (IDs []uint64) {
IDs = make([]uint64, len(set))
for i := range set {
IDs[i] = set[i].ID
}
return
}

View File

@@ -1,5 +1,7 @@
package types
//go:generate go run ../../codegen/v2/type-set.go --types MessageAttachment --output attachment.gen.go
import (
"database/sql/driver"
"encoding/json"
@@ -43,20 +45,8 @@ type (
Attachment
MessageID uint64 `db:"rel_message" json:"-"`
}
MessageAttachmentSet []*MessageAttachment
)
func (aa MessageAttachmentSet) Walk(w func(*MessageAttachment) error) (err error) {
for i := range aa {
if err = w(aa[i]); err != nil {
return
}
}
return
}
func (a *Attachment) SetOriginalImageMeta(width, height int, animated bool) *attachmentFileMeta {
a.imageMeta(&a.Meta.Original, width, height, animated)
return &a.Meta.Original

67
sam/types/channel.gen.go Normal file
View File

@@ -0,0 +1,67 @@
package types
// Hello! This file is auto-generated.
type (
// ChannelSet slice of Channel
//
// This type is auto-generated.
ChannelSet []*Channel
)
// Walk iterates through every slice item and calls w(Channel) err
//
// This function is auto-generated.
func (set ChannelSet) Walk(w func(*Channel) error) (err error) {
for i := range set {
if err = w(set[i]); err != nil {
return
}
}
return
}
// Filter iterates through every slice item, calls f(Channel) (bool, err) and return filtered slice
//
// This function is auto-generated.
func (set ChannelSet) Filter(f func(*Channel) (bool, error)) (out ChannelSet, err error) {
var ok bool
out = ChannelSet{}
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 ChannelSet) FindByID(ID uint64) *Channel {
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 ChannelSet) IDs() (IDs []uint64) {
IDs = make([]uint64, len(set))
for i := range set {
IDs[i] = set[i].ID
}
return
}

View File

@@ -1,5 +1,7 @@
package types
//go:generate go run ../../codegen/v2/type-set.go --types Channel --output channel.gen.go
import (
"encoding/json"
"fmt"
@@ -51,8 +53,6 @@ type (
}
ChannelType string
ChannelSet []*Channel
)
// Scope returns permissions group that for this type
@@ -74,40 +74,6 @@ func (c *Channel) IsValid() bool {
return c.ArchivedAt == nil && c.DeletedAt == nil
}
func (cc ChannelSet) Walk(w func(*Channel) error) (err error) {
for i := range cc {
if err = w(cc[i]); err != nil {
return
}
}
return
}
func (cc ChannelSet) Filter(f func(*Channel) (bool, error)) (out ChannelSet, err error) {
var ok bool
out = ChannelSet{}
for i := range cc {
if ok, err = f(cc[i]); err != nil {
return
} else if ok {
out = append(out, cc[i])
}
}
return
}
func (cc ChannelSet) FindById(ID uint64) *Channel {
for i := range cc {
if cc[i].ID == ID {
return cc[i]
}
}
return nil
}
const (
ChannelTypePublic ChannelType = "public"
ChannelTypePrivate = "private"

View File

@@ -0,0 +1,41 @@
package types
// Hello! This file is auto-generated.
type (
// ChannelMemberSet slice of ChannelMember
//
// This type is auto-generated.
ChannelMemberSet []*ChannelMember
)
// Walk iterates through every slice item and calls w(ChannelMember) err
//
// This function is auto-generated.
func (set ChannelMemberSet) Walk(w func(*ChannelMember) error) (err error) {
for i := range set {
if err = w(set[i]); err != nil {
return
}
}
return
}
// Filter iterates through every slice item, calls f(ChannelMember) (bool, err) and return filtered slice
//
// This function is auto-generated.
func (set ChannelMemberSet) Filter(f func(*ChannelMember) (bool, error)) (out ChannelMemberSet, err error) {
var ok bool
out = ChannelMemberSet{}
for i := range set {
if ok, err = f(set[i]); err != nil {
return
} else if ok {
out = append(out, set[i])
}
}
return
}

View File

@@ -1,5 +1,7 @@
package types
//go:generate go run ../../codegen/v2/type-set.go --no-pk-types ChannelMember --output channel_member.gen.go
import (
"time"
@@ -26,68 +28,8 @@ type (
}
ChannelMembershipType string
ChannelMemberSet []*ChannelMember
)
func (mm ChannelMemberSet) Walk(w func(*ChannelMember) error) (err error) {
for i := range mm {
if err = w(mm[i]); err != nil {
return
}
}
return
}
// MembersOf extracts member IDs from channel member set
//
// It filters out only members that match a particular channel
func (mm ChannelMemberSet) MembersOf(channelID uint64) []uint64 {
var mmof = make([]uint64, 0)
for i := range mm {
if mm[i].ChannelID == channelID {
mmof = append(mmof, mm[i].UserID)
}
}
return mmof
}
// AllMemberIDs returns IDs of all members
func (mm ChannelMemberSet) AllMemberIDs() []uint64 {
var mmof = make([]uint64, 0)
for i := range mm {
mmof = append(mmof, mm[i].UserID)
}
return mmof
}
func (mm ChannelMemberSet) FindByUserID(userID uint64) *ChannelMember {
for i := range mm {
if mm[i].UserID == userID {
return mm[i]
}
}
return nil
}
func (mm ChannelMemberSet) FindByChannelID(channelID uint64) (out ChannelMemberSet) {
out = ChannelMemberSet{}
for i := range mm {
if mm[i].ChannelID == channelID {
out = append(out, mm[i])
}
}
return
}
const (
ChannelMembershipTypeOwner ChannelMembershipType = "owner"
ChannelMembershipTypeMember = "member"

76
sam/types/command.gen.go Normal file
View File

@@ -0,0 +1,76 @@
package types
// Hello! This file is auto-generated.
type (
// CommandSet slice of Command
//
// This type is auto-generated.
CommandSet []*Command
// CommandParamSet slice of CommandParam
//
// This type is auto-generated.
CommandParamSet []*CommandParam
)
// Walk iterates through every slice item and calls w(Command) err
//
// This function is auto-generated.
func (set CommandSet) Walk(w func(*Command) error) (err error) {
for i := range set {
if err = w(set[i]); err != nil {
return
}
}
return
}
// Filter iterates through every slice item, calls f(Command) (bool, err) and return filtered slice
//
// This function is auto-generated.
func (set CommandSet) Filter(f func(*Command) (bool, error)) (out CommandSet, err error) {
var ok bool
out = CommandSet{}
for i := range set {
if ok, err = f(set[i]); err != nil {
return
} else if ok {
out = append(out, set[i])
}
}
return
}
// Walk iterates through every slice item and calls w(CommandParam) err
//
// This function is auto-generated.
func (set CommandParamSet) Walk(w func(*CommandParam) error) (err error) {
for i := range set {
if err = w(set[i]); err != nil {
return
}
}
return
}
// Filter iterates through every slice item, calls f(CommandParam) (bool, err) and return filtered slice
//
// This function is auto-generated.
func (set CommandParamSet) Filter(f func(*CommandParam) (bool, error)) (out CommandParamSet, err error) {
var ok bool
out = CommandParamSet{}
for i := range set {
if ok, err = f(set[i]); err != nil {
return
} else if ok {
out = append(out, set[i])
}
}
return
}

View File

@@ -1,11 +1,6 @@
package types
import (
"database/sql/driver"
"encoding/json"
"github.com/pkg/errors"
)
//go:generate go run ../../codegen/v2/type-set.go --no-pk-types Command,CommandParam --output command.gen.go
type (
Command struct {
@@ -19,9 +14,6 @@ type (
Type string `db:"type" json:"type"`
Required bool `db:"required" json:"required"`
}
CommandSet []*Command
CommandParamSet []*CommandParam
)
var (
@@ -38,40 +30,3 @@ func init() {
Description: "It does exactly what it says on the tin"},
}
}
func (cc CommandSet) Walk(w func(*Command) error) (err error) {
for i := range cc {
if err = w(cc[i]); err != nil {
return
}
}
return
}
func (pp CommandParamSet) Walk(w func(*CommandParam) error) (err error) {
for i := range pp {
if err = w(pp[i]); err != nil {
return
}
}
return
}
func (pp *CommandParamSet) Scan(value interface{}) error {
switch value.(type) {
case nil:
*pp = CommandParamSet{}
case []uint8:
if err := json.Unmarshal(value.([]byte), pp); err != nil {
return errors.Wrapf(err, "Can not scan '%v' into CommandParamSet", value)
}
}
return nil
}
func (pp CommandParamSet) Value() (driver.Value, error) {
return json.Marshal(pp)
}

67
sam/types/mention.gen.go Normal file
View File

@@ -0,0 +1,67 @@
package types
// Hello! This file is auto-generated.
type (
// MentionSet slice of Mention
//
// This type is auto-generated.
MentionSet []*Mention
)
// Walk iterates through every slice item and calls w(Mention) err
//
// This function is auto-generated.
func (set MentionSet) Walk(w func(*Mention) error) (err error) {
for i := range set {
if err = w(set[i]); err != nil {
return
}
}
return
}
// Filter iterates through every slice item, calls f(Mention) (bool, err) and return filtered slice
//
// This function is auto-generated.
func (set MentionSet) Filter(f func(*Mention) (bool, error)) (out MentionSet, err error) {
var ok bool
out = MentionSet{}
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 MentionSet) FindByID(ID uint64) *Mention {
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 MentionSet) IDs() (IDs []uint64) {
IDs = make([]uint64, len(set))
for i := range set {
IDs[i] = set[i].ID
}
return
}

View File

@@ -1,5 +1,7 @@
package types
//go:generate go run ../../codegen/v2/type-set.go --types Mention --output mention.gen.go
import (
"time"
)
@@ -14,8 +16,6 @@ type (
CreatedAt time.Time `db:"created_at"`
}
MentionSet []*Mention
MentionFilter struct {
// All mentions by this user
MentionedByID uint64
@@ -27,97 +27,3 @@ type (
Limit uint
}
)
func (mm MentionSet) Walk(w func(*Mention) error) (err error) {
for i := range mm {
if err = w(mm[i]); err != nil {
return
}
}
return
}
func (mm MentionSet) FindByID(ID uint64) (out *Mention) {
out = &Mention{}
for i := range mm {
if mm[i].ID == ID {
return
}
}
return nil
}
func (mm MentionSet) FindByUserID(ID uint64) (out MentionSet) {
out = MentionSet{}
for i := range mm {
if mm[i].UserID == ID {
out = append(out, mm[i])
}
}
return
}
func (mm MentionSet) FindByMessageID(ID uint64) (out MentionSet) {
out = MentionSet{}
for i := range mm {
if mm[i].MessageID == ID {
out = append(out, mm[i])
}
}
return
}
func (mm MentionSet) IDs() (IDs []uint64) {
IDs = make([]uint64, len(mm))
for i := range mm {
IDs[i] = mm[i].ID
}
return
}
func (mm MentionSet) UserIDs() (IDs []uint64) {
IDs = make([]uint64, len(mm))
for i := range mm {
IDs[i] = mm[i].UserID
}
return
}
func (mm MentionSet) Diff(in MentionSet) (add, upd, del MentionSet) {
add, upd, del = MentionSet{}, MentionSet{}, MentionSet{}
for _, m := range in {
if m.ID == 0 {
// Mark for adding all new
add = append(add, m)
}
}
for _, m := range mm {
if m.ID == 0 {
// Ignore all unsaved
continue
}
if in.FindByID(m.ID) == nil {
// Mark for removal all that are not added
del = append(del, m)
} else {
// Mark for update all that are still there
upd = append(upd, m)
}
}
return
}

67
sam/types/message.gen.go Normal file
View File

@@ -0,0 +1,67 @@
package types
// Hello! This file is auto-generated.
type (
// MessageSet slice of Message
//
// This type is auto-generated.
MessageSet []*Message
)
// Walk iterates through every slice item and calls w(Message) err
//
// This function is auto-generated.
func (set MessageSet) Walk(w func(*Message) error) (err error) {
for i := range set {
if err = w(set[i]); err != nil {
return
}
}
return
}
// Filter iterates through every slice item, calls f(Message) (bool, err) and return filtered slice
//
// This function is auto-generated.
func (set MessageSet) Filter(f func(*Message) (bool, error)) (out MessageSet, err error) {
var ok bool
out = MessageSet{}
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 MessageSet) FindByID(ID uint64) *Message {
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 MessageSet) IDs() (IDs []uint64) {
IDs = make([]uint64, len(set))
for i := range set {
IDs[i] = set[i].ID
}
return
}

View File

@@ -1,5 +1,7 @@
package types
//go:generate go run ../../codegen/v2/type-set.go --types Message --output message.gen.go
import (
"database/sql/driver"
"time"
@@ -27,8 +29,6 @@ type (
RepliesFrom []uint64
}
MessageSet []*Message
MessageFilter struct {
Query string
@@ -72,36 +72,6 @@ const (
MessageTypeAttachment = "attachment"
)
func (mm MessageSet) Walk(w func(*Message) error) (err error) {
for i := range mm {
if err = w(mm[i]); err != nil {
return
}
}
return
}
func (mm MessageSet) FindById(ID uint64) *Message {
for i := range mm {
if mm[i].ID == ID {
return mm[i]
}
}
return nil
}
func (mm MessageSet) IDs() (IDs []uint64) {
IDs = make([]uint64, len(mm))
for i := range mm {
IDs[i] = mm[i].ID
}
return
}
func (mtype MessageType) String() string {
return string(mtype)
}

View File

@@ -0,0 +1,67 @@
package types
// Hello! This file is auto-generated.
type (
// MessageFlagSet slice of MessageFlag
//
// This type is auto-generated.
MessageFlagSet []*MessageFlag
)
// Walk iterates through every slice item and calls w(MessageFlag) err
//
// This function is auto-generated.
func (set MessageFlagSet) Walk(w func(*MessageFlag) error) (err error) {
for i := range set {
if err = w(set[i]); err != nil {
return
}
}
return
}
// Filter iterates through every slice item, calls f(MessageFlag) (bool, err) and return filtered slice
//
// This function is auto-generated.
func (set MessageFlagSet) Filter(f func(*MessageFlag) (bool, error)) (out MessageFlagSet, err error) {
var ok bool
out = MessageFlagSet{}
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 MessageFlagSet) FindByID(ID uint64) *MessageFlag {
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 MessageFlagSet) IDs() (IDs []uint64) {
IDs = make([]uint64, len(set))
for i := range set {
IDs[i] = set[i].ID
}
return
}

View File

@@ -1,5 +1,7 @@
package types
//go:generate go run ../../codegen/v2/type-set.go --types MessageFlag --output message_flag.gen.go
import (
"time"
)
@@ -16,8 +18,6 @@ type (
// Internal only
DeletedAt *time.Time `json:"-" db:"-"`
}
MessageFlagSet []*MessageFlag
)
const (
@@ -25,46 +25,6 @@ const (
MessageFlagBookmarkedMessage string = "bookmark"
)
func (ff MessageFlagSet) Walk(w func(*MessageFlag) error) (err error) {
for i := range ff {
if err = w(ff[i]); err != nil {
return
}
}
return
}
func (ff MessageFlagSet) FindById(ID uint64) *MessageFlag {
for i := range ff {
if ff[i].ID == ID {
return ff[i]
}
}
return nil
}
func (ff MessageFlagSet) IsBookmarked(UserID uint64) bool {
for i := range ff {
if ff[i].UserID == UserID && ff[i].IsBookmark() {
return true
}
}
return false
}
func (ff MessageFlagSet) IsPinned() bool {
for i := range ff {
if ff[i].IsPin() {
return true
}
}
return false
}
func (f *MessageFlag) IsReaction() bool {
return f.Flag != MessageFlagPinnedToChannel && f.Flag != MessageFlagBookmarkedMessage
}

165
sam/types/sets.go Normal file
View File

@@ -0,0 +1,165 @@
package types
import (
"database/sql/driver"
"encoding/json"
"github.com/pkg/errors"
)
// MembersOf extracts member IDs from channel member set
//
// It filters out only members that match a particular channel
func (set ChannelMemberSet) MembersOf(channelID uint64) []uint64 {
var mmof = make([]uint64, 0)
for i := range set {
if set[i].ChannelID == channelID {
mmof = append(mmof, set[i].UserID)
}
}
return mmof
}
// AllMemberIDs returns IDs of all members
func (set ChannelMemberSet) AllMemberIDs() []uint64 {
var mmof = make([]uint64, 0)
for i := range set {
mmof = append(mmof, set[i].UserID)
}
return mmof
}
func (set ChannelMemberSet) FindByUserID(userID uint64) *ChannelMember {
for i := range set {
if set[i].UserID == userID {
return set[i]
}
}
return nil
}
func (set ChannelMemberSet) FindByChannelID(channelID uint64) (out ChannelMemberSet) {
out = ChannelMemberSet{}
for i := range set {
if set[i].ChannelID == channelID {
out = append(out, set[i])
}
}
return
}
func (set *CommandParamSet) Scan(value interface{}) error {
switch value.(type) {
case nil:
*set = CommandParamSet{}
case []uint8:
if err := json.Unmarshal(value.([]byte), set); err != nil {
return errors.Wrapf(err, "Can not scan '%v' into CommandParamSet", value)
}
}
return nil
}
func (set CommandParamSet) Value() (driver.Value, error) {
return json.Marshal(set)
}
func (set MessageFlagSet) IsBookmarked(UserID uint64) bool {
for i := range set {
if set[i].UserID == UserID && set[i].IsBookmark() {
return true
}
}
return false
}
func (set MessageFlagSet) IsPinned() bool {
for i := range set {
if set[i].IsPin() {
return true
}
}
return false
}
func (set MentionSet) FindByUserID(ID uint64) (out MentionSet) {
out = MentionSet{}
for i := range set {
if set[i].UserID == ID {
out = append(out, set[i])
}
}
return
}
func (set MentionSet) FindByMessageID(ID uint64) (out MentionSet) {
out = MentionSet{}
for i := range set {
if set[i].MessageID == ID {
out = append(out, set[i])
}
}
return
}
func (set MentionSet) UserIDs() (IDs []uint64) {
IDs = make([]uint64, len(set))
for i := range set {
IDs[i] = set[i].UserID
}
return
}
func (set MentionSet) Diff(in MentionSet) (add, upd, del MentionSet) {
add, upd, del = MentionSet{}, MentionSet{}, MentionSet{}
for _, m := range in {
if m.ID == 0 {
// Mark for adding all new
add = append(add, m)
}
}
for _, m := range set {
if m.ID == 0 {
// Ignore all unsaved
continue
}
if in.FindByID(m.ID) == nil {
// Mark for removal all that are not added
del = append(del, m)
} else {
// Mark for update all that are still there
upd = append(upd, m)
}
}
return
}
func (set UnreadSet) FindByChannelId(channelID uint64) *Unread {
for i := range set {
if set[i].ChannelID == channelID {
return set[i]
}
}
return nil
}

41
sam/types/unread.gen.go Normal file
View File

@@ -0,0 +1,41 @@
package types
// Hello! This file is auto-generated.
type (
// UnreadSet slice of Unread
//
// This type is auto-generated.
UnreadSet []*Unread
)
// Walk iterates through every slice item and calls w(Unread) err
//
// This function is auto-generated.
func (set UnreadSet) Walk(w func(*Unread) error) (err error) {
for i := range set {
if err = w(set[i]); err != nil {
return
}
}
return
}
// Filter iterates through every slice item, calls f(Unread) (bool, err) and return filtered slice
//
// This function is auto-generated.
func (set UnreadSet) Filter(f func(*Unread) (bool, error)) (out UnreadSet, err error) {
var ok bool
out = UnreadSet{}
for i := range set {
if ok, err = f(set[i]); err != nil {
return
} else if ok {
out = append(out, set[i])
}
}
return
}

View File

@@ -1,5 +1,7 @@
package types
//go:generate go run ../../codegen/v2/type-set.go --no-pk-types Unread --output unread.gen.go
type (
Unread struct {
ChannelID uint64 `db:"rel_channel"`
@@ -13,26 +15,4 @@ type (
UnreadFilter struct {
UserID uint64
}
UnreadSet []*Unread
)
func (mm UnreadSet) Walk(w func(*Unread) error) (err error) {
for i := range mm {
if err = w(mm[i]); err != nil {
return
}
}
return
}
func (uu UnreadSet) FindByChannelId(channelID uint64) *Unread {
for i := range uu {
if uu[i].ChannelID == channelID {
return uu[i]
}
}
return nil
}

67
system/types/user.gen.go Normal file
View File

@@ -0,0 +1,67 @@
package types
// Hello! This file is auto-generated.
type (
// UserSet slice of User
//
// This type is auto-generated.
UserSet []*User
)
// Walk iterates through every slice item and calls w(User) err
//
// This function is auto-generated.
func (set UserSet) Walk(w func(*User) error) (err error) {
for i := range set {
if err = w(set[i]); err != nil {
return
}
}
return
}
// Filter iterates through every slice item, calls f(User) (bool, err) and return filtered slice
//
// This function is auto-generated.
func (set UserSet) Filter(f func(*User) (bool, error)) (out UserSet, err error) {
var ok bool
out = UserSet{}
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 UserSet) FindByID(ID uint64) *User {
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 UserSet) IDs() (IDs []uint64) {
IDs = make([]uint64, len(set))
for i := range set {
IDs[i] = set[i].ID
}
return
}

View File

@@ -1,5 +1,7 @@
package types
//go:generate go run ../../codegen/v2/type-set.go --types User --output user.gen.go
import (
"time"
@@ -28,8 +30,6 @@ type (
UserFilter struct {
Query string
}
UserSet []*User
)
func (u *User) Valid() bool {
@@ -53,23 +53,3 @@ func (u *User) GeneratePassword(password string) error {
u.Password = pwd
return nil
}
func (uu UserSet) Walk(w func(*User) error) (err error) {
for i := range uu {
if err = w(uu[i]); err != nil {
return
}
}
return
}
func (uu UserSet) FindById(ID uint64) *User {
for i := range uu {
if uu[i].ID == ID {
return uu[i]
}
}
return nil
}