// Copyright (C) 2024 veypi // 2025-03-04 16:08:06 // Distributed under terms of the MIT license. package org 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"` Keyword string `json:"keyword" src:"query"` } type ListResponse struct { Items []models.Org `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.Org{}) if req.Keyword != "" { db = db.Where("name LIKE ? OR code LIKE ?", "%"+req.Keyword+"%", "%"+req.Keyword+"%") } var total int64 if err := db.Count(&total).Error; err != nil { return nil, vigo.ErrInternalServer.WithError(err) } var orgs []models.Org offset := (req.Page - 1) * req.PageSize if err := db.Order("created_at DESC").Offset(offset).Limit(req.PageSize).Find(&orgs).Error; err != nil { return nil, vigo.ErrInternalServer.WithError(err) } totalPages := int(total) / req.PageSize if int(total)%req.PageSize > 0 { totalPages++ } return &ListResponse{ Items: orgs, Total: total, Page: req.Page, PageSize: req.PageSize, TotalPages: totalPages, }, nil }