76 lines
2.6 KiB
Go
76 lines
2.6 KiB
Go
package usecase
|
|
|
|
import (
|
|
"context"
|
|
"strings"
|
|
|
|
"haixun-backend/internal/library/clock"
|
|
app "haixun-backend/internal/library/errors"
|
|
"haixun-backend/internal/library/errors/code"
|
|
"haixun-backend/internal/model/publish_queue_event/domain/entity"
|
|
domrepo "haixun-backend/internal/model/publish_queue_event/domain/repository"
|
|
domusecase "haixun-backend/internal/model/publish_queue_event/domain/usecase"
|
|
|
|
"github.com/google/uuid"
|
|
)
|
|
|
|
type eventUseCase struct {
|
|
repo domrepo.Repository
|
|
}
|
|
|
|
func NewUseCase(repo domrepo.Repository) domusecase.UseCase {
|
|
return &eventUseCase{repo: repo}
|
|
}
|
|
|
|
func (u *eventUseCase) Record(ctx context.Context, req domusecase.RecordRequest) error {
|
|
if strings.TrimSpace(req.TenantID) == "" || strings.TrimSpace(req.OwnerUID) == "" {
|
|
return app.For(code.Auth).AuthUnauthorized("missing actor")
|
|
}
|
|
if strings.TrimSpace(req.AccountID) == "" || strings.TrimSpace(req.QueueID) == "" {
|
|
return app.For(code.ThreadsAccount).InputMissingRequired("account_id and queue_id are required")
|
|
}
|
|
eventType := strings.TrimSpace(req.EventType)
|
|
if eventType == "" {
|
|
eventType = entity.EventCreated
|
|
}
|
|
return u.repo.Create(ctx, &entity.Event{
|
|
ID: uuid.NewString(),
|
|
TenantID: strings.TrimSpace(req.TenantID),
|
|
OwnerUID: strings.TrimSpace(req.OwnerUID),
|
|
AccountID: strings.TrimSpace(req.AccountID),
|
|
QueueID: strings.TrimSpace(req.QueueID),
|
|
EventType: eventType,
|
|
FromStatus: strings.TrimSpace(req.FromStatus),
|
|
ToStatus: strings.TrimSpace(req.ToStatus),
|
|
Message: strings.TrimSpace(req.Message),
|
|
CreateAt: clock.NowUnixNano(),
|
|
})
|
|
}
|
|
|
|
func (u *eventUseCase) ListByQueue(ctx context.Context, tenantID, ownerUID, accountID, queueID string, limit int) ([]domusecase.EventSummary, error) {
|
|
items, err := u.repo.ListByQueue(ctx, tenantID, ownerUID, accountID, queueID, limit)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return toSummaries(items), nil
|
|
}
|
|
|
|
func (u *eventUseCase) ListRecentByAccount(ctx context.Context, tenantID, ownerUID, accountID string, limit int) ([]domusecase.EventSummary, error) {
|
|
items, err := u.repo.ListRecentByAccount(ctx, tenantID, ownerUID, accountID, limit)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return toSummaries(items), nil
|
|
}
|
|
|
|
func toSummaries(items []entity.Event) []domusecase.EventSummary {
|
|
out := make([]domusecase.EventSummary, 0, len(items))
|
|
for _, item := range items {
|
|
out = append(out, domusecase.EventSummary{
|
|
ID: item.ID, QueueID: item.QueueID, AccountID: item.AccountID, EventType: item.EventType,
|
|
FromStatus: item.FromStatus, ToStatus: item.ToStatus, Message: item.Message, CreateAt: item.CreateAt,
|
|
})
|
|
}
|
|
return out
|
|
}
|