core/database/group.go
2024-07-04 10:06:46 +07:00

112 lines
2.7 KiB
Go

package database
import (
"context"
"fmt"
"math"
"system-trace/core/parsers"
"system-trace/core/types"
"time"
"github.com/uptrace/bun"
)
type Group struct {
ID int32 `bun:",pk,autoincrement"`
IssuerID int32 `bun:",notnull" json:"issuerId"`
Issuer *User `bun:"rel:belongs-to,join:issuer_id=id" json:"issuer"`
Name string `bun:",notnull,unique" json:"name"`
Users []*User `bun:"rel:has-many,join:id=group_id,array" json:"users"`
Permissions []*GroupPermission `bun:"rel:has-many,join:id=group_id,array" json:"permissions"`
CreatedAt time.Time `bun:",notnull,default:current_timestamp" json:"createdAt"`
UpdatedAt time.Time `json:"updatedAt"`
DeletedAt time.Time `bun:",soft_delete,nullzero" json:"deletedAt"`
}
var _ bun.BeforeAppendModelHook = (*Group)(nil)
func (g *Group) BeforeAppendModel(ctx context.Context, query bun.Query) error {
switch query.(type) {
case *bun.UpdateQuery:
g.UpdatedAt = time.Now()
}
return nil
}
func FindGroups(s string, p *types.Pagination, ob *types.OrderBy) (groups *[]Group, cursor *types.Cursor, err error) {
ctx := context.Background()
groups = new([]Group)
q := PG.NewSelect().
Model(groups).
Relation("Issuer").
Relation("Permissions").
WhereAllWithDeleted().
Offset(p.Page*p.Count - p.Count).
Limit(p.Count).
Order(fmt.Sprintf("%s %s", ob.Key, ob.Order))
if len(s) > 0 {
q.WhereGroup(" AND ", func(q *bun.SelectQuery) *bun.SelectQuery {
if parsers.IsInt(s) {
return q.Where(`"group"."id" = ?`, s)
} else {
return q.
Where(`"group"."name" LIKE ?`, "%"+s+"%").
WhereOr(`"issuer"."email" LIKE ?`, "%"+s+"%").
WhereOr(`"issuer"."real_name" LIKE ?`, "%"+s+"%")
}
})
}
count, err := q.ScanAndCount(ctx)
return groups, &types.Cursor{
Count: len(*groups),
CurrentPage: p.Page,
TotalPages: math.Ceil(float64(count) / float64(p.Count)),
TotalRows: float64(count),
}, err
}
func FindGroupByID(id int) (group *Group, err error) {
ctx := context.Background()
group = new(Group)
err = PG.NewSelect().
Model(group).
Where("id = ?", id).
Scan(ctx)
return group, err
}
func InsertGroup(g *Group) error {
ctx := context.Background()
_, err := PG.NewInsert().
Model(g).
Returning("NULL").
Exec(ctx)
return err
}
func UpdateGroup(g *Group, cols []string) error {
ctx := context.Background()
_, err := PG.NewUpdate().
Model(g).
Column(cols...).
WherePK().
Exec(ctx)
return err
}
func DeleteGroup(id int) error {
ctx := context.Background()
_, err := PG.NewDelete().
Model(new(Group)).
Where("id = ?", id).
Exec(ctx)
return err
}