diff --git a/constants/permissions/permissions.go b/constants/permissions/permissions.go index 2c4f58c..1240c08 100644 --- a/constants/permissions/permissions.go +++ b/constants/permissions/permissions.go @@ -30,13 +30,13 @@ var All = map[string]int8{ TASKS_UPDATE: 6, USERS_READ: 7, - USERS_CREATE: 9, - USERS_UPDATE: 10, - USERS_DELETE: 11, - USERS_BLOCK: 12, + USERS_CREATE: 8, + USERS_UPDATE: 9, + USERS_DELETE: 10, + USERS_BLOCK: 11, - GROUPS_READ: 13, - GROUPS_CREATE: 14, - GROUPS_UPDATE: 15, - GROUPS_DELETE: 16, + GROUPS_READ: 12, + GROUPS_CREATE: 13, + GROUPS_UPDATE: 14, + GROUPS_DELETE: 15, } diff --git a/database/group.go b/database/group.go index 0094e8c..4c4cd20 100644 --- a/database/group.go +++ b/database/group.go @@ -4,6 +4,7 @@ import ( "context" "fmt" "math" + "system-trace/core/parsers" "system-trace/core/types" "time" @@ -19,7 +20,7 @@ type Group struct { 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 time.Time `bun:",soft_delete,nullzero" json:"deletedAt"` } var _ bun.BeforeAppendModelHook = (*Group)(nil) @@ -32,17 +33,32 @@ func (g *Group) BeforeAppendModel(ctx context.Context, query bun.Query) error { 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() groups = new([]Group) - count, err := PG.NewSelect(). + q := PG.NewSelect(). Model(groups). - Relation("Users"). + Relation("Issuer"). Relation("Permissions"). + WhereAllWithDeleted(). Offset(p.Page*p.Count - p.Count). Limit(p.Count). - Order(fmt.Sprintf("%s %s", ob.Key, ob.Order)). - ScanAndCount(ctx) + 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), diff --git a/database/session.go b/database/session.go index 81e252e..816304b 100644 --- a/database/session.go +++ b/database/session.go @@ -15,7 +15,7 @@ type Session struct { CreatedAt time.Time `bun:",notnull,default:current_timestamp" json:"createdAt"` FinishedAt time.Time `json:"finishedAt"` 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) diff --git a/database/user.go b/database/user.go index 74307cd..04ccd4c 100644 --- a/database/user.go +++ b/database/user.go @@ -4,6 +4,7 @@ import ( "context" "fmt" "math" + "system-trace/core/parsers" "system-trace/core/types" "system-trace/core/utils" "time" @@ -50,16 +51,30 @@ func FindByEmailAndPassword(email, password string) (*User, error) { 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() users = new([]User) - count, err := PG.NewSelect(). + q := PG.NewSelect(). Model(users). Relation("Group"). + WhereAllWithDeleted(). Offset(p.Page*p.Count - p.Count). Limit(p.Count). - Order(fmt.Sprintf("%s %s", ob.Key, ob.Order)). - ScanAndCount(ctx) + 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(`"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{ Count: len(*users), diff --git a/parsers/int.go b/parsers/int.go new file mode 100644 index 0000000..cf8834b --- /dev/null +++ b/parsers/int.go @@ -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 +} diff --git a/services/groups/groups.go b/services/groups/groups.go index 24c9deb..9d43664 100644 --- a/services/groups/groups.go +++ b/services/groups/groups.go @@ -20,6 +20,8 @@ import ( // @Router /groups [get] func GetGroupsHandler(c *fiber.Ctx) error { // TODO permission validate + s := c.Query("search") + p, err := parsers.ParsePagination(c) if err != nil { 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 { return c.Status(fiber.StatusBadRequest).JSON(types.JSONError{ Error: err.Error(), diff --git a/services/users/users.go b/services/users/users.go index a13a101..479e0be 100644 --- a/services/users/users.go +++ b/services/users/users.go @@ -21,6 +21,8 @@ import ( // @Router /users [get] func GetUsersHandler(c *fiber.Ctx) error { // TODO permission validate + s := c.Query("search") + p, err := parsers.ParsePagination(c) if err != nil { 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 { return c.Status(fiber.StatusBadRequest).JSON(types.JSONError{ Error: err.Error(),