// // Copyright (C) 2024 veypi // 2025-03-04 16:08:06 // Distributed under terms of the MIT license. // package policy 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"` Resource string `json:"resource" src:"query" desc:"资源类型筛选"` Scope string `json:"scope" src:"query" desc:"作用域筛选"` } type ListResponse struct { Items []models.Policy `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.Policy{}) if req.Resource != "" { db = db.Where("resource = ?", req.Resource) } if req.Scope != "" { db = db.Where("scope = ?", req.Scope) } var total int64 if err := db.Count(&total).Error; err != nil { return nil, vigo.ErrInternalServer.WithError(err) } var policies []models.Policy offset := (req.Page - 1) * req.PageSize if err := db.Order("created_at DESC").Offset(offset).Limit(req.PageSize).Find(&policies).Error; err != nil { return nil, vigo.ErrInternalServer.WithError(err) } totalPages := int(total) / req.PageSize if int(total)%req.PageSize > 0 { totalPages++ } return &ListResponse{ Items: policies, Total: total, Page: req.Page, PageSize: req.PageSize, TotalPages: totalPages, }, nil }