template-monorepo/internal/model/notification/repository/memory_notification.go

95 lines
2.6 KiB
Go

package repository
import (
"context"
"time"
"gateway/internal/model/notification"
domentity "gateway/internal/model/notification/domain/entity"
"gateway/internal/model/notification/domain/enum"
domrepo "gateway/internal/model/notification/domain/repository"
"go.mongodb.org/mongo-driver/v2/bson"
)
// MemoryNotificationRepository is an in-memory NotificationRepository for tests and local tooling.
type MemoryNotificationRepository struct {
byID map[string]*domentity.Notification
byIdem map[string]*domentity.Notification
}
// NewMemoryNotificationRepository creates an empty in-memory store.
func NewMemoryNotificationRepository() *MemoryNotificationRepository {
return &MemoryNotificationRepository{
byID: make(map[string]*domentity.Notification),
byIdem: make(map[string]*domentity.Notification),
}
}
func idemKey(tenantID string, kind enum.NotifyKind, key string) string {
return tenantID + ":" + string(kind) + ":" + key
}
func (r *MemoryNotificationRepository) Insert(_ context.Context, data *domentity.Notification) error {
if data.ID.IsZero() {
data.ID = bson.NewObjectID()
}
now := time.Now().UTC().UnixNano()
if data.CreateAt == nil {
data.CreateAt = &now
}
if data.UpdateAt == nil {
data.UpdateAt = &now
}
if data.OccurredAt == nil {
data.OccurredAt = &now
}
k := idemKey(data.TenantID, data.Kind, data.IdempotencyKey)
if _, exists := r.byIdem[k]; exists {
return notification.ErrDuplicateIdempotency
}
r.byIdem[k] = data
r.byID[data.ID.Hex()] = data
return nil
}
func (r *MemoryNotificationRepository) FindByID(_ context.Context, tenantID, id string) (*domentity.Notification, error) {
doc, ok := r.byID[id]
if !ok || doc.TenantID != tenantID {
return nil, notification.ErrNotFound
}
return doc, nil
}
func (r *MemoryNotificationRepository) FindByIdempotency(
_ context.Context,
tenantID string,
kind enum.NotifyKind,
idempotencyKey string,
) (*domentity.Notification, error) {
doc, ok := r.byIdem[idemKey(tenantID, kind, idempotencyKey)]
if !ok {
return nil, notification.ErrNotFound
}
return doc, nil
}
func (r *MemoryNotificationRepository) UpdateDelivery(_ context.Context, tenantID, id string, update *domrepo.NotificationDeliveryUpdate) error {
doc, ok := r.byID[id]
if !ok || doc.TenantID != tenantID {
return notification.ErrNotFound
}
doc.Status = update.Status
doc.Attempts = update.Attempts
doc.Provider = update.Provider
doc.ProviderMessageID = update.ProviderMessageID
doc.LastError = update.LastError
doc.Body = update.Body
doc.DeliveredAt = update.DeliveredAt
return nil
}
func (r *MemoryNotificationRepository) Index20260520001UP(context.Context) error {
return nil
}