127 lines
3.7 KiB
Go
127 lines
3.7 KiB
Go
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 按创建者列出 Webhook(createdBy=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 按创建者分页列出 Webhook(createdBy=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
|
||
}
|