Files
2026-07-15 22:42:31 +08:00

235 lines
5.3 KiB
Go

package invitation_repo
import (
"github.com/XingfenD/yoresee_doc/internal/model"
"gorm.io/gorm"
)
type InvitationListOperation struct {
repo *InvitationRepository
m *model.Invitation
creatorID *int64
keyword *string
maxUsedCnt *int64
expiresAtStart *string
expiresAtEnd *string
createdAtStart *string
createdAtEnd *string
disabled *bool
sortField string
sortDesc bool
page int
pageSize int
tx *gorm.DB
}
func (r *InvitationRepository) List(m *model.Invitation) *InvitationListOperation {
return &InvitationListOperation{
repo: r,
m: m,
}
}
func (op *InvitationListOperation) WithTx(tx *gorm.DB) *InvitationListOperation {
op.tx = tx
return op
}
func (op *InvitationListOperation) WithCreatorID(creatorID *int64) *InvitationListOperation {
op.creatorID = creatorID
return op
}
func (op *InvitationListOperation) WithKeyword(keyword *string) *InvitationListOperation {
op.keyword = keyword
return op
}
func (op *InvitationListOperation) WithMaxUsedCnt(maxUsedCnt *int64) *InvitationListOperation {
op.maxUsedCnt = maxUsedCnt
return op
}
func (op *InvitationListOperation) WithExpiresAtRange(start, end *string) *InvitationListOperation {
op.expiresAtStart = start
op.expiresAtEnd = end
return op
}
func (op *InvitationListOperation) WithCreatedAtRange(start, end *string) *InvitationListOperation {
op.createdAtStart = start
op.createdAtEnd = end
return op
}
func (op *InvitationListOperation) WithDisabled(disabled *bool) *InvitationListOperation {
op.disabled = disabled
return op
}
func (op *InvitationListOperation) WithSort(field string, desc bool) *InvitationListOperation {
op.sortField = field
op.sortDesc = desc
return op
}
func (op *InvitationListOperation) WithPagination(page, pageSize int) *InvitationListOperation {
op.page = page
op.pageSize = pageSize
return op
}
func (op *InvitationListOperation) Exec() ([]model.Invitation, error) {
db := op.repo.db
if op.tx != nil {
db = op.tx
}
dbQuery := db.Model(&model.Invitation{})
if op.m != nil {
dbQuery = dbQuery.Where(op.m)
}
if op.creatorID != nil {
dbQuery = dbQuery.Where("created_by = ?", *op.creatorID)
}
if op.keyword != nil && *op.keyword != "" {
dbQuery = dbQuery.Where("code ILIKE ?", "%"+*op.keyword+"%")
}
if op.maxUsedCnt != nil {
dbQuery = dbQuery.Where("max_used_cnt = ?", *op.maxUsedCnt)
}
if op.expiresAtStart != nil && *op.expiresAtStart != "" {
dbQuery = dbQuery.Where("expires_at >= ?", *op.expiresAtStart)
}
if op.expiresAtEnd != nil && *op.expiresAtEnd != "" {
dbQuery = dbQuery.Where("expires_at <= ?", *op.expiresAtEnd)
}
if op.createdAtStart != nil && *op.createdAtStart != "" {
dbQuery = dbQuery.Where("created_at >= ?", *op.createdAtStart)
}
if op.createdAtEnd != nil && *op.createdAtEnd != "" {
dbQuery = dbQuery.Where("created_at <= ?", *op.createdAtEnd)
}
if op.disabled != nil {
dbQuery = dbQuery.Where("disabled = ?", *op.disabled)
}
sortField := op.sortField
if sortField == "" {
sortField = "created_at"
}
orderDirection := "ASC"
if op.sortDesc {
orderDirection = "DESC"
}
dbQuery = dbQuery.Order(sortField + " " + orderDirection)
page := op.page
pageSize := op.pageSize
if page <= 0 {
page = 1
}
if pageSize <= 0 {
pageSize = 10
}
if pageSize > 100 {
pageSize = 100
}
offset := (page - 1) * pageSize
dbQuery = dbQuery.Offset(offset).Limit(pageSize)
var invitations []model.Invitation
err := dbQuery.Find(&invitations).Error
if err != nil {
return nil, err
}
return invitations, nil
}
func (op *InvitationListOperation) ExecWithTotal() ([]model.Invitation, int64, error) {
db := op.repo.db
if op.tx != nil {
db = op.tx
}
dbQuery := db.Model(&model.Invitation{})
if op.m != nil {
dbQuery = dbQuery.Where(op.m)
}
if op.creatorID != nil {
dbQuery = dbQuery.Where("created_by = ?", *op.creatorID)
}
if op.keyword != nil && *op.keyword != "" {
dbQuery = dbQuery.Where("code ILIKE ?", "%"+*op.keyword+"%")
}
if op.maxUsedCnt != nil {
dbQuery = dbQuery.Where("max_used_cnt = ?", *op.maxUsedCnt)
}
if op.expiresAtStart != nil && *op.expiresAtStart != "" {
dbQuery = dbQuery.Where("expires_at >= ?", *op.expiresAtStart)
}
if op.expiresAtEnd != nil && *op.expiresAtEnd != "" {
dbQuery = dbQuery.Where("expires_at <= ?", *op.expiresAtEnd)
}
if op.createdAtStart != nil && *op.createdAtStart != "" {
dbQuery = dbQuery.Where("created_at >= ?", *op.createdAtStart)
}
if op.createdAtEnd != nil && *op.createdAtEnd != "" {
dbQuery = dbQuery.Where("created_at <= ?", *op.createdAtEnd)
}
if op.disabled != nil {
dbQuery = dbQuery.Where("disabled = ?", *op.disabled)
}
var total int64
err := dbQuery.Count(&total).Error
if err != nil {
return nil, 0, err
}
sortField := op.sortField
if sortField == "" {
sortField = "created_at"
}
orderDirection := "ASC"
if op.sortDesc {
orderDirection = "DESC"
}
dbQuery = dbQuery.Order(sortField + " " + orderDirection)
page := op.page
pageSize := op.pageSize
if page <= 0 {
page = 1
}
if pageSize <= 0 {
pageSize = 10
}
if pageSize > 100 {
pageSize = 100
}
offset := (page - 1) * pageSize
dbQuery = dbQuery.Offset(offset).Limit(pageSize)
var invitations []model.Invitation
err = dbQuery.Find(&invitations).Error
if err != nil {
return nil, 0, err
}
return invitations, total, nil
}