// Copyright (C) 2024 veypi // 2025-03-04 16:08:06 // Distributed under terms of the MIT license. package role import ( "github.com/veypi/vbase/cfg" "github.com/veypi/vbase/models" "github.com/veypi/vigo" ) type ListRequest struct { Page int `json:"page" src:"query" default:"1"` PageSize int `json:"page_size" src:"query" default:"20"` OrgID string `json:"org_id" src:"query" desc:"组织ID筛选"` } type ListResponse struct { Items []models.Role `json:"items"` Total int64 `json:"total"` Page int `json:"page"` PageSize int `json:"page_size"` TotalPages int `json:"total_pages"` } func list(x *vigo.X, req *ListRequest) (*ListResponse, error) { db := cfg.DB().Model(&models.Role{}) if req.OrgID != "" { db = db.Where("org_id = ?", req.OrgID) } var total int64 if err := db.Count(&total).Error; err != nil { return nil, vigo.ErrInternalServer.WithError(err) } var roles []models.Role offset := (req.Page - 1) * req.PageSize if err := db.Order("created_at DESC").Offset(offset).Limit(req.PageSize).Find(&roles).Error; err != nil { return nil, vigo.ErrInternalServer.WithError(err) } totalPages := int(total) / req.PageSize if int(total)%req.PageSize > 0 { totalPages++ } return &ListResponse{ Items: roles, Total: total, Page: req.Page, PageSize: req.PageSize, TotalPages: totalPages, }, nil }