feat: 重构内容和订单列表接口,使用过滤器结构体简化参数传递;更新相关服务和测试用例

This commit is contained in:
2025-12-29 15:41:48 +08:00
parent fba77afec1
commit 9d598e7f9b
11 changed files with 286 additions and 232 deletions

View File

@@ -2,6 +2,7 @@ package services
import (
"context"
"errors"
"time"
"quyun/v2/app/errorx"
@@ -13,6 +14,7 @@ import (
"github.com/google/uuid"
"github.com/spf13/cast"
"go.ipao.vip/gen/types"
"gorm.io/gorm"
)
// @provider
@@ -27,33 +29,31 @@ func (s *super) CheckToken(ctx context.Context) (*super_dto.LoginResponse, error
return &super_dto.LoginResponse{}, nil
}
func (s *super) ListUsers(ctx context.Context, page, limit int, username string) (*requests.Pager, error) {
func (s *super) ListUsers(ctx context.Context, filter *super_dto.UserListFilter) (*requests.Pager, error) {
tbl, q := models.UserQuery.QueryContext(ctx)
if username != "" {
q = q.Where(tbl.Username.Like("%" + username + "%")).Or(tbl.Nickname.Like("%" + username + "%"))
if filter.Username != nil && *filter.Username != "" {
q = q.Where(tbl.Username.Like("%" + *filter.Username + "%")).Or(tbl.Nickname.Like("%" + *filter.Username + "%"))
}
p := requests.Pagination{Page: int64(page), Limit: int64(limit)}
filter.Pagination.Format()
total, err := q.Count()
if err != nil {
return nil, errorx.ErrDatabaseError
return nil, errorx.ErrDatabaseError.WithCause(err)
}
list, err := q.Offset(int(p.Offset())).Limit(int(p.Limit)).Order(tbl.ID.Desc()).Find()
list, err := q.Offset(int(filter.Pagination.Offset())).Limit(int(filter.Pagination.Limit)).Order(tbl.ID.Desc()).Find()
if err != nil {
return nil, errorx.ErrDatabaseError
return nil, errorx.ErrDatabaseError.WithCause(err)
}
var data []super_dto.UserItem
for _, u := range list {
data = append(data, super_dto.UserItem{
SuperUserLite: super_dto.SuperUserLite{
ID: u.ID,
Username: u.Username,
Roles: u.Roles,
Status: u.Status,
// StatusDescription: u.Status.Description(), // Status is consts.UserStatus, it has Description()
// But u.Status might be string if gen didn't map it properly? No, it's consts.UserStatus.
ID: u.ID,
Username: u.Username,
Roles: u.Roles,
Status: u.Status,
StatusDescription: u.Status.Description(),
CreatedAt: u.CreatedAt.Format(time.RFC3339),
UpdatedAt: u.UpdatedAt.Format(time.RFC3339),
@@ -64,7 +64,7 @@ func (s *super) ListUsers(ctx context.Context, page, limit int, username string)
}
return &requests.Pager{
Pagination: p,
Pagination: filter.Pagination,
Total: total,
Items: data,
}, nil
@@ -74,7 +74,10 @@ func (s *super) GetUser(ctx context.Context, id int64) (*super_dto.UserItem, err
tbl, q := models.UserQuery.QueryContext(ctx)
u, err := q.Where(tbl.ID.Eq(id)).First()
if err != nil {
return nil, errorx.ErrRecordNotFound
if errors.Is(err, gorm.ErrRecordNotFound) {
return nil, errorx.ErrRecordNotFound
}
return nil, errorx.ErrDatabaseError.WithCause(err)
}
return &super_dto.UserItem{
SuperUserLite: super_dto.SuperUserLite{
@@ -95,7 +98,7 @@ func (s *super) UpdateUserStatus(ctx context.Context, id int64, form *super_dto.
tbl, q := models.UserQuery.QueryContext(ctx)
_, err := q.Where(tbl.ID.Eq(id)).Update(tbl.Status, consts.UserStatus(form.Status))
if err != nil {
return errorx.ErrDatabaseError
return errorx.ErrDatabaseError.WithCause(err)
}
return nil
}
@@ -108,26 +111,26 @@ func (s *super) UpdateUserRoles(ctx context.Context, id int64, form *super_dto.U
tbl, q := models.UserQuery.QueryContext(ctx)
_, err := q.Where(tbl.ID.Eq(id)).Update(tbl.Roles, roles)
if err != nil {
return errorx.ErrDatabaseError
return errorx.ErrDatabaseError.WithCause(err)
}
return nil
}
func (s *super) ListTenants(ctx context.Context, page, limit int, name string) (*requests.Pager, error) {
func (s *super) ListTenants(ctx context.Context, filter *super_dto.TenantListFilter) (*requests.Pager, error) {
tbl, q := models.TenantQuery.QueryContext(ctx)
if name != "" {
q = q.Where(tbl.Name.Like("%" + name + "%"))
if filter.Name != nil && *filter.Name != "" {
q = q.Where(tbl.Name.Like("%" + *filter.Name + "%"))
}
p := requests.Pagination{Page: int64(page), Limit: int64(limit)}
filter.Pagination.Format()
total, err := q.Count()
if err != nil {
return nil, errorx.ErrDatabaseError
return nil, errorx.ErrDatabaseError.WithCause(err)
}
list, err := q.Offset(int(p.Offset())).Limit(int(p.Limit)).Order(tbl.ID.Desc()).Find()
list, err := q.Offset(int(filter.Pagination.Offset())).Limit(int(filter.Pagination.Limit)).Order(tbl.ID.Desc()).Find()
if err != nil {
return nil, errorx.ErrDatabaseError
return nil, errorx.ErrDatabaseError.WithCause(err)
}
var data []super_dto.TenantItem
@@ -146,7 +149,7 @@ func (s *super) ListTenants(ctx context.Context, page, limit int, name string) (
}
return &requests.Pager{
Pagination: p,
Pagination: filter.Pagination,
Total: total,
Items: data,
}, nil
@@ -166,7 +169,7 @@ func (s *super) CreateTenant(ctx context.Context, form *super_dto.TenantCreateFo
Status: consts.TenantStatusVerified,
}
if err := models.TenantQuery.WithContext(ctx).Create(t); err != nil {
return errorx.ErrDatabaseError
return errorx.ErrDatabaseError.WithCause(err)
}
return nil
}
@@ -175,7 +178,10 @@ func (s *super) GetTenant(ctx context.Context, id int64) (*super_dto.TenantItem,
tbl, q := models.TenantQuery.QueryContext(ctx)
t, err := q.Where(tbl.ID.Eq(id)).First()
if err != nil {
return nil, errorx.ErrRecordNotFound
if errors.Is(err, gorm.ErrRecordNotFound) {
return nil, errorx.ErrRecordNotFound
}
return nil, errorx.ErrDatabaseError.WithCause(err)
}
return &super_dto.TenantItem{
ID: t.ID,
@@ -194,7 +200,7 @@ func (s *super) UpdateTenantStatus(ctx context.Context, id int64, form *super_dt
tbl, q := models.TenantQuery.QueryContext(ctx)
_, err := q.Where(tbl.ID.Eq(id)).Update(tbl.Status, consts.TenantStatus(form.Status))
if err != nil {
return errorx.ErrDatabaseError
return errorx.ErrDatabaseError.WithCause(err)
}
return nil
}
@@ -204,21 +210,22 @@ func (s *super) UpdateTenantExpire(ctx context.Context, id int64, form *super_dt
tbl, q := models.TenantQuery.QueryContext(ctx)
_, err := q.Where(tbl.ID.Eq(id)).Update(tbl.ExpiredAt, expire)
if err != nil {
return errorx.ErrDatabaseError
return errorx.ErrDatabaseError.WithCause(err)
}
return nil
}
func (s *super) ListContents(ctx context.Context, page, limit int) (*requests.Pager, error) {
func (s *super) ListContents(ctx context.Context, filter *super_dto.SuperContentListFilter) (*requests.Pager, error) {
tbl, q := models.ContentQuery.QueryContext(ctx)
p := requests.Pagination{Page: int64(page), Limit: int64(limit)}
filter.Pagination.Format()
total, err := q.Count()
if err != nil {
return nil, errorx.ErrDatabaseError
return nil, errorx.ErrDatabaseError.WithCause(err)
}
list, err := q.Offset(int(p.Offset())).Limit(int(p.Limit)).Order(tbl.ID.Desc()).Find()
list, err := q.Offset(int(filter.Pagination.Offset())).Limit(int(filter.Pagination.Limit)).Order(tbl.ID.Desc()).Find()
if err != nil {
return nil, errorx.ErrDatabaseError
return nil, errorx.ErrDatabaseError.WithCause(err)
}
// Simplified DTO for list
var data []any
@@ -226,7 +233,7 @@ func (s *super) ListContents(ctx context.Context, page, limit int) (*requests.Pa
data = append(data, c) // TODO: Map to DTO
}
return &requests.Pager{
Pagination: p,
Pagination: filter.Pagination,
Total: total,
Items: data,
}, nil
@@ -236,25 +243,26 @@ func (s *super) UpdateContentStatus(ctx context.Context, tenantID, contentID int
tbl, q := models.ContentQuery.QueryContext(ctx)
_, err := q.Where(tbl.ID.Eq(contentID), tbl.TenantID.Eq(tenantID)).Update(tbl.Status, consts.ContentStatus(form.Status))
if err != nil {
return errorx.ErrDatabaseError
return errorx.ErrDatabaseError.WithCause(err)
}
return nil
}
func (s *super) ListOrders(ctx context.Context, page, limit int) (*requests.Pager, error) {
func (s *super) ListOrders(ctx context.Context, filter *super_dto.SuperOrderListFilter) (*requests.Pager, error) {
tbl, q := models.OrderQuery.QueryContext(ctx)
p := requests.Pagination{Page: int64(page), Limit: int64(limit)}
filter.Pagination.Format()
total, err := q.Count()
if err != nil {
return nil, errorx.ErrDatabaseError
return nil, errorx.ErrDatabaseError.WithCause(err)
}
list, err := q.Offset(int(p.Offset())).Limit(int(p.Limit)).Order(tbl.ID.Desc()).Find()
list, err := q.Offset(int(filter.Pagination.Offset())).Limit(int(filter.Pagination.Limit)).Order(tbl.ID.Desc()).Find()
if err != nil {
return nil, errorx.ErrDatabaseError
return nil, errorx.ErrDatabaseError.WithCause(err)
}
// TODO: Map to DTO
return &requests.Pager{
Pagination: p,
Pagination: filter.Pagination,
Total: total,
Items: list,
}, nil