completely read functions (needs to rework search)

This commit is contained in:
Vitaliy Pavlov 2024-07-04 10:06:46 +07:00
parent 7ed9f67c37
commit 657291fa37
7 changed files with 68 additions and 21 deletions

View File

@ -30,13 +30,13 @@ var All = map[string]int8{
TASKS_UPDATE: 6, TASKS_UPDATE: 6,
USERS_READ: 7, USERS_READ: 7,
USERS_CREATE: 9, USERS_CREATE: 8,
USERS_UPDATE: 10, USERS_UPDATE: 9,
USERS_DELETE: 11, USERS_DELETE: 10,
USERS_BLOCK: 12, USERS_BLOCK: 11,
GROUPS_READ: 13, GROUPS_READ: 12,
GROUPS_CREATE: 14, GROUPS_CREATE: 13,
GROUPS_UPDATE: 15, GROUPS_UPDATE: 14,
GROUPS_DELETE: 16, GROUPS_DELETE: 15,
} }

View File

@ -4,6 +4,7 @@ import (
"context" "context"
"fmt" "fmt"
"math" "math"
"system-trace/core/parsers"
"system-trace/core/types" "system-trace/core/types"
"time" "time"
@ -19,7 +20,7 @@ type Group struct {
Permissions []*GroupPermission `bun:"rel:has-many,join:id=group_id,array" json:"permissions"` Permissions []*GroupPermission `bun:"rel:has-many,join:id=group_id,array" json:"permissions"`
CreatedAt time.Time `bun:",notnull,default:current_timestamp" json:"createdAt"` CreatedAt time.Time `bun:",notnull,default:current_timestamp" json:"createdAt"`
UpdatedAt time.Time `json:"updatedAt"` UpdatedAt time.Time `json:"updatedAt"`
DeletedAt time.Time `bun:",soft_delete,nullzero" json:"-"` DeletedAt time.Time `bun:",soft_delete,nullzero" json:"deletedAt"`
} }
var _ bun.BeforeAppendModelHook = (*Group)(nil) var _ bun.BeforeAppendModelHook = (*Group)(nil)
@ -32,17 +33,32 @@ func (g *Group) BeforeAppendModel(ctx context.Context, query bun.Query) error {
return nil return nil
} }
func FindGroups(p *types.Pagination, ob *types.OrderBy) (groups *[]Group, cursor *types.Cursor, err error) { func FindGroups(s string, p *types.Pagination, ob *types.OrderBy) (groups *[]Group, cursor *types.Cursor, err error) {
ctx := context.Background() ctx := context.Background()
groups = new([]Group) groups = new([]Group)
count, err := PG.NewSelect(). q := PG.NewSelect().
Model(groups). Model(groups).
Relation("Users"). Relation("Issuer").
Relation("Permissions"). Relation("Permissions").
WhereAllWithDeleted().
Offset(p.Page*p.Count - p.Count). Offset(p.Page*p.Count - p.Count).
Limit(p.Count). Limit(p.Count).
Order(fmt.Sprintf("%s %s", ob.Key, ob.Order)). Order(fmt.Sprintf("%s %s", ob.Key, ob.Order))
ScanAndCount(ctx)
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{ return groups, &types.Cursor{
Count: len(*groups), Count: len(*groups),

View File

@ -15,7 +15,7 @@ type Session struct {
CreatedAt time.Time `bun:",notnull,default:current_timestamp" json:"createdAt"` CreatedAt time.Time `bun:",notnull,default:current_timestamp" json:"createdAt"`
FinishedAt time.Time `json:"finishedAt"` FinishedAt time.Time `json:"finishedAt"`
UpdatedAt time.Time `json:"updatedAt"` UpdatedAt time.Time `json:"updatedAt"`
DeletedAt time.Time `bun:",soft_delete,nullzero" json:"-"` DeletedAt time.Time `bun:",soft_delete,nullzero" json:"deletedAt"`
} }
var _ bun.BeforeAppendModelHook = (*Session)(nil) var _ bun.BeforeAppendModelHook = (*Session)(nil)

View File

@ -4,6 +4,7 @@ import (
"context" "context"
"fmt" "fmt"
"math" "math"
"system-trace/core/parsers"
"system-trace/core/types" "system-trace/core/types"
"system-trace/core/utils" "system-trace/core/utils"
"time" "time"
@ -50,16 +51,30 @@ func FindByEmailAndPassword(email, password string) (*User, error) {
return u, err return u, err
} }
func FindUsers(p *types.Pagination, ob *types.OrderBy) (users *[]User, cursor *types.Cursor, err error) { func FindUsers(s string, p *types.Pagination, ob *types.OrderBy) (users *[]User, cursor *types.Cursor, err error) {
ctx := context.Background() ctx := context.Background()
users = new([]User) users = new([]User)
count, err := PG.NewSelect(). q := PG.NewSelect().
Model(users). Model(users).
Relation("Group"). Relation("Group").
WhereAllWithDeleted().
Offset(p.Page*p.Count - p.Count). Offset(p.Page*p.Count - p.Count).
Limit(p.Count). Limit(p.Count).
Order(fmt.Sprintf("%s %s", ob.Key, ob.Order)). Order(fmt.Sprintf("%s %s", ob.Key, ob.Order))
ScanAndCount(ctx)
if len(s) > 0 {
q.WhereGroup(" AND ", func(q *bun.SelectQuery) *bun.SelectQuery {
if parsers.IsInt(s) {
return q.Where(`"user"."id" = ?`, s)
} else {
return q.
Where(`"user"."email" LIKE ?`, "%"+s+"%").
WhereOr(`"user"."real_name" LIKE ?`, "%"+s+"%")
}
})
}
count, err := q.ScanAndCount(ctx)
return users, &types.Cursor{ return users, &types.Cursor{
Count: len(*users), Count: len(*users),

12
parsers/int.go Normal file
View File

@ -0,0 +1,12 @@
package parsers
import "unicode"
func IsInt(s string) bool {
for _, c := range s {
if !unicode.IsDigit(c) {
return false
}
}
return true
}

View File

@ -20,6 +20,8 @@ import (
// @Router /groups [get] // @Router /groups [get]
func GetGroupsHandler(c *fiber.Ctx) error { func GetGroupsHandler(c *fiber.Ctx) error {
// TODO permission validate // TODO permission validate
s := c.Query("search")
p, err := parsers.ParsePagination(c) p, err := parsers.ParsePagination(c)
if err != nil { if err != nil {
return c.Status(fiber.StatusBadRequest).JSON(types.JSONError{ return c.Status(fiber.StatusBadRequest).JSON(types.JSONError{
@ -34,7 +36,7 @@ func GetGroupsHandler(c *fiber.Ctx) error {
}) })
} }
groups, cursor, err := database.FindGroups(p, ob) groups, cursor, err := database.FindGroups(s, p, ob)
if err != nil { if err != nil {
return c.Status(fiber.StatusBadRequest).JSON(types.JSONError{ return c.Status(fiber.StatusBadRequest).JSON(types.JSONError{
Error: err.Error(), Error: err.Error(),

View File

@ -21,6 +21,8 @@ import (
// @Router /users [get] // @Router /users [get]
func GetUsersHandler(c *fiber.Ctx) error { func GetUsersHandler(c *fiber.Ctx) error {
// TODO permission validate // TODO permission validate
s := c.Query("search")
p, err := parsers.ParsePagination(c) p, err := parsers.ParsePagination(c)
if err != nil { if err != nil {
return c.Status(fiber.StatusBadRequest).JSON(types.JSONError{ return c.Status(fiber.StatusBadRequest).JSON(types.JSONError{
@ -35,7 +37,7 @@ func GetUsersHandler(c *fiber.Ctx) error {
}) })
} }
users, cursor, err := database.FindUsers(p, ob) users, cursor, err := database.FindUsers(s, p, ob)
if err != nil { if err != nil {
return c.Status(fiber.StatusBadRequest).JSON(types.JSONError{ return c.Status(fiber.StatusBadRequest).JSON(types.JSONError{
Error: err.Error(), Error: err.Error(),