Files
user-system/internal/repository/webhook_repository.go

127 lines
3.7 KiB
Go
Raw Normal View History

package repository
import (
"context"
"github.com/user-management-system/internal/domain"
"gorm.io/gorm"
)
// WebhookRepository Webhook 持久化仓储
type WebhookRepository struct {
db *gorm.DB
}
// NewWebhookRepository 创建 Webhook 仓储
func NewWebhookRepository(db *gorm.DB) *WebhookRepository {
return &WebhookRepository{db: db}
}
// Create 创建 Webhook
func (r *WebhookRepository) Create(ctx context.Context, wh *domain.Webhook) error {
// GORM omits zero values on insert for fields with DB defaults. Explicitly
// backfill inactive status so repository callers can persist status=0.
requestedStatus := wh.Status
return r.db.WithContext(ctx).Transaction(func(tx *gorm.DB) error {
if err := tx.Create(wh).Error; err != nil {
return err
}
if requestedStatus == domain.WebhookStatusInactive {
if err := tx.Model(&domain.Webhook{}).Where("id = ?", wh.ID).Update("status", requestedStatus).Error; err != nil {
return err
}
wh.Status = requestedStatus
}
return nil
})
}
// Update 更新 Webhook 字段(只更新 updates map 中的字段)
func (r *WebhookRepository) Update(ctx context.Context, id int64, updates map[string]interface{}) error {
return r.db.WithContext(ctx).
Model(&domain.Webhook{}).
Where("id = ?", id).
Updates(updates).Error
}
// Delete 删除 Webhook软删除
func (r *WebhookRepository) Delete(ctx context.Context, id int64) error {
return r.db.WithContext(ctx).Delete(&domain.Webhook{}, id).Error
}
// GetByID 按 ID 获取 Webhook
func (r *WebhookRepository) GetByID(ctx context.Context, id int64) (*domain.Webhook, error) {
var wh domain.Webhook
err := r.db.WithContext(ctx).First(&wh, id).Error
if err != nil {
return nil, err
}
return &wh, nil
}
// ListByCreator 按创建者列出 WebhookcreatedBy=0 表示列出所有)
func (r *WebhookRepository) ListByCreator(ctx context.Context, createdBy int64) ([]*domain.Webhook, error) {
var webhooks []*domain.Webhook
query := r.db.WithContext(ctx)
if createdBy > 0 {
query = query.Where("created_by = ?", createdBy)
}
if err := query.Find(&webhooks).Error; err != nil {
return nil, err
}
return webhooks, nil
}
// ListByCreatorPaginated 按创建者分页列出 WebhookcreatedBy=0 表示列出所有)
func (r *WebhookRepository) ListByCreatorPaginated(ctx context.Context, createdBy int64, offset, limit int) ([]*domain.Webhook, int64, error) {
var webhooks []*domain.Webhook
var total int64
query := r.db.WithContext(ctx).Model(&domain.Webhook{})
if createdBy > 0 {
query = query.Where("created_by = ?", createdBy)
}
if err := query.Count(&total).Error; err != nil {
return nil, 0, err
}
if offset > 0 {
query = query.Offset(offset)
}
if limit > 0 {
query = query.Limit(limit)
}
if err := query.Order("created_at DESC").Find(&webhooks).Error; err != nil {
return nil, 0, err
}
return webhooks, total, nil
}
// ListActive 列出所有状态为活跃的 Webhook
func (r *WebhookRepository) ListActive(ctx context.Context) ([]*domain.Webhook, error) {
var webhooks []*domain.Webhook
err := r.db.WithContext(ctx).
Where("status = ?", domain.WebhookStatusActive).
Find(&webhooks).Error
return webhooks, err
}
// CreateDelivery 记录投递日志
func (r *WebhookRepository) CreateDelivery(ctx context.Context, delivery *domain.WebhookDelivery) error {
return r.db.WithContext(ctx).Create(delivery).Error
}
// ListDeliveries 按 Webhook ID 分页查询投递记录(最新在前)
func (r *WebhookRepository) ListDeliveries(ctx context.Context, webhookID int64, limit int) ([]*domain.WebhookDelivery, error) {
var deliveries []*domain.WebhookDelivery
err := r.db.WithContext(ctx).
Where("webhook_id = ?", webhookID).
Order("created_at DESC").
Limit(limit).
Find(&deliveries).Error
return deliveries, err
}