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

127 lines
3.7 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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
}