thread-master/backend/internal/model/publish_queue_event/usecase/usecase.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
}