tenant: move admin member queries into service
This commit is contained in:
@@ -6,6 +6,7 @@ import (
|
||||
"time"
|
||||
|
||||
"quyun/v2/app/http/super/dto"
|
||||
tenantdto "quyun/v2/app/http/tenant/dto"
|
||||
"quyun/v2/app/requests"
|
||||
"quyun/v2/database"
|
||||
"quyun/v2/database/models"
|
||||
@@ -24,6 +25,81 @@ import (
|
||||
// @provider
|
||||
type tenant struct{}
|
||||
|
||||
// AdminTenantUsersPage 租户管理员分页查询成员列表(包含用户基础信息)。
|
||||
func (t *tenant) AdminTenantUsersPage(ctx context.Context, tenantID int64, filter *tenantdto.AdminTenantUserListFilter) (*requests.Pager, error) {
|
||||
if tenantID <= 0 {
|
||||
return nil, errors.New("tenant_id must be > 0")
|
||||
}
|
||||
if filter == nil {
|
||||
filter = &tenantdto.AdminTenantUserListFilter{}
|
||||
}
|
||||
|
||||
filter.Pagination.Format()
|
||||
|
||||
tbl, query := models.TenantUserQuery.QueryContext(ctx)
|
||||
conds := []gen.Condition{tbl.TenantID.Eq(tenantID)}
|
||||
if filter.UserID != nil && *filter.UserID > 0 {
|
||||
conds = append(conds, tbl.UserID.Eq(*filter.UserID))
|
||||
}
|
||||
if filter.Role != nil && *filter.Role != "" {
|
||||
conds = append(conds, tbl.Role.Contains(string(*filter.Role)))
|
||||
}
|
||||
if filter.Status != nil && *filter.Status != "" {
|
||||
conds = append(conds, tbl.Status.Eq(*filter.Status))
|
||||
}
|
||||
if username := filter.UsernameTrimmed(); username != "" {
|
||||
uTbl, _ := models.UserQuery.QueryContext(ctx)
|
||||
query = query.LeftJoin(uTbl, uTbl.ID.EqCol(tbl.UserID))
|
||||
conds = append(conds, uTbl.Username.Like(database.WrapLike(username)))
|
||||
}
|
||||
|
||||
items, total, err := query.Where(conds...).Order(tbl.ID.Desc()).FindByPage(int(filter.Offset()), int(filter.Limit))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
userIDs := make([]int64, 0, len(items))
|
||||
for _, tu := range items {
|
||||
if tu == nil {
|
||||
continue
|
||||
}
|
||||
userIDs = append(userIDs, tu.UserID)
|
||||
}
|
||||
|
||||
var users []*models.User
|
||||
if len(userIDs) > 0 {
|
||||
uTbl, uQuery := models.UserQuery.QueryContext(ctx)
|
||||
users, err = uQuery.Where(uTbl.ID.In(userIDs...)).Find()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
userMap := make(map[int64]*models.User, len(users))
|
||||
for _, u := range users {
|
||||
if u == nil {
|
||||
continue
|
||||
}
|
||||
userMap[u.ID] = u
|
||||
}
|
||||
|
||||
out := make([]*tenantdto.AdminTenantUserItem, 0, len(items))
|
||||
for _, tu := range items {
|
||||
if tu == nil {
|
||||
continue
|
||||
}
|
||||
out = append(out, &tenantdto.AdminTenantUserItem{
|
||||
TenantUser: tu,
|
||||
User: userMap[tu.UserID],
|
||||
})
|
||||
}
|
||||
|
||||
return &requests.Pager{
|
||||
Pagination: filter.Pagination,
|
||||
Total: total,
|
||||
Items: out,
|
||||
}, nil
|
||||
}
|
||||
|
||||
func (t *tenant) ContainsUserID(ctx context.Context, tenantID, userID int64) (*models.User, error) {
|
||||
tbl, query := models.TenantUserQuery.QueryContext(ctx)
|
||||
|
||||
@@ -71,6 +147,10 @@ func (t *tenant) RemoveUser(ctx context.Context, tenantID, userID int64) error {
|
||||
tbl, query := models.TenantUserQuery.QueryContext(ctx)
|
||||
tenantUser, err := query.Where(tbl.TenantID.Eq(tenantID), tbl.UserID.Eq(userID)).First()
|
||||
if err != nil {
|
||||
// 幂等:成员不存在时也返回成功,便于后台重试/批量移除。
|
||||
if errors.Is(err, gorm.ErrRecordNotFound) {
|
||||
return nil
|
||||
}
|
||||
return errors.Wrapf(err, "RemoveUser failed to find, tenantID: %d, userID: %d", tenantID, userID)
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user