|  |  |  | //
 | 
					
						
							|  |  |  | // list.go
 | 
					
						
							|  |  |  | // Copyright (C) 2024 veypi <i@veypi.com>
 | 
					
						
							|  |  |  | // Distributed under terms of the MIT license.
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | package access | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							|  |  |  | 	"github.com/veypi/OneAuth/cfg" | 
					
						
							|  |  |  | 	"github.com/veypi/OneAuth/models" | 
					
						
							|  |  |  | 	"github.com/vyes/vigo" | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | type listOpts struct { | 
					
						
							|  |  |  | 	Page     int    `parse:"query" default:"1"` | 
					
						
							|  |  |  | 	PageSize int    `parse:"query" default:"20"` | 
					
						
							|  |  |  | 	AppID    string `parse:"query"` | 
					
						
							|  |  |  | 	UserID   string `parse:"query"` | 
					
						
							|  |  |  | 	RoleID   string `parse:"query"` | 
					
						
							|  |  |  | 	Name     string `parse:"query"` | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | type listResponse struct { | 
					
						
							|  |  |  | 	Total int64           `json:"total"` | 
					
						
							|  |  |  | 	Items []models.Access `json:"items"` | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | var _ = Router.Get("/", listAccess) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func listAccess(x *vigo.X) (any, error) { | 
					
						
							|  |  |  | 	// 解析查询参数
 | 
					
						
							|  |  |  | 	opts := &listOpts{} | 
					
						
							|  |  |  | 	if err := x.Parse(opts); err != nil { | 
					
						
							|  |  |  | 		return nil, err | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// 构建查询
 | 
					
						
							|  |  |  | 	db := cfg.DB().Model(&models.Access{}) | 
					
						
							|  |  |  | 	if opts.AppID != "" { | 
					
						
							|  |  |  | 		db = db.Where("app_id = ?", opts.AppID) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	if opts.UserID != "" { | 
					
						
							|  |  |  | 		db = db.Where("user_id = ?", opts.UserID) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	if opts.RoleID != "" { | 
					
						
							|  |  |  | 		db = db.Where("role_id = ?", opts.RoleID) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	if opts.Name != "" { | 
					
						
							|  |  |  | 		db = db.Where("name LIKE ?", "%"+opts.Name+"%") | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// 计算总数
 | 
					
						
							|  |  |  | 	var total int64 | 
					
						
							|  |  |  | 	if err := db.Count(&total).Error; err != nil { | 
					
						
							|  |  |  | 		return nil, err | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// 分页查询
 | 
					
						
							|  |  |  | 	offset := (opts.Page - 1) * opts.PageSize | 
					
						
							|  |  |  | 	var items []models.Access | 
					
						
							|  |  |  | 	if err := db.Offset(offset).Limit(opts.PageSize).Find(&items).Error; err != nil { | 
					
						
							|  |  |  | 		return nil, err | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return &listResponse{ | 
					
						
							|  |  |  | 		Total: total, | 
					
						
							|  |  |  | 		Items: items, | 
					
						
							|  |  |  | 	}, nil | 
					
						
							|  |  |  | } |