90 lines
2.6 KiB
Go
90 lines
2.6 KiB
Go
package repository
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
"time"
|
|
|
|
"gateway/internal/library/mongo"
|
|
"gateway/internal/model/notification"
|
|
domentity "gateway/internal/model/notification/domain/entity"
|
|
domrepo "gateway/internal/model/notification/domain/repository"
|
|
|
|
"go.mongodb.org/mongo-driver/v2/bson"
|
|
mongodriver "go.mongodb.org/mongo-driver/v2/mongo"
|
|
"go.mongodb.org/mongo-driver/v2/mongo/options"
|
|
)
|
|
|
|
// NotificationDLQRepositoryParam configures the Mongo DLQ repository.
|
|
type NotificationDLQRepositoryParam struct {
|
|
Conf *mongo.Conf
|
|
}
|
|
|
|
type notificationDLQRepository struct {
|
|
db mongo.DocumentDBUseCase
|
|
}
|
|
|
|
// NewNotificationDLQRepository creates a Mongo-backed NotificationDLQRepository.
|
|
func NewNotificationDLQRepository(param NotificationDLQRepositoryParam) domrepo.NotificationDLQRepository {
|
|
e := domentity.NotificationDLQ{}
|
|
documentDB, err := mongo.NewDocumentDB(param.Conf, e.CollectionName())
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
return ¬ificationDLQRepository{db: documentDB}
|
|
}
|
|
|
|
func (r *notificationDLQRepository) Insert(ctx context.Context, data *domentity.NotificationDLQ) error {
|
|
now := time.Now().UTC().UnixNano()
|
|
if data.ID.IsZero() {
|
|
data.ID = bson.NewObjectID()
|
|
}
|
|
if data.CreateAt == nil {
|
|
data.CreateAt = &now
|
|
}
|
|
if data.OccurredAt == nil {
|
|
data.OccurredAt = &now
|
|
}
|
|
|
|
_, err := r.db.GetClient().InsertOne(ctx, data)
|
|
return err
|
|
}
|
|
|
|
func (r *notificationDLQRepository) FindByID(ctx context.Context, tenantID, id string) (*domentity.NotificationDLQ, error) {
|
|
oid, err := bson.ObjectIDFromHex(id)
|
|
if err != nil {
|
|
return nil, notification.ErrInvalidObjectID
|
|
}
|
|
var doc domentity.NotificationDLQ
|
|
filter := bson.M{notification.BSONFieldID: oid, notification.BSONFieldTenantID: tenantID}
|
|
if err := r.db.GetClient().FindOne(ctx, &doc, filter); err != nil {
|
|
if errors.Is(err, mongodriver.ErrNoDocuments) {
|
|
return nil, notification.ErrNotFound
|
|
}
|
|
return nil, err
|
|
}
|
|
return &doc, nil
|
|
}
|
|
|
|
func (r *notificationDLQRepository) ListByTenant(ctx context.Context, tenantID string, limit int64) ([]*domentity.NotificationDLQ, error) {
|
|
if limit <= 0 {
|
|
limit = 50
|
|
}
|
|
if limit > 200 {
|
|
limit = 200
|
|
}
|
|
filter := bson.M{notification.BSONFieldTenantID: tenantID}
|
|
opts := options.Find().SetSort(bson.M{notification.BSONFieldOccurredAt: -1}).SetLimit(limit)
|
|
var docs []*domentity.NotificationDLQ
|
|
if err := r.db.GetClient().Find(ctx, &docs, filter, opts); err != nil {
|
|
return nil, err
|
|
}
|
|
return docs, nil
|
|
}
|
|
|
|
func (r *notificationDLQRepository) Index20260520001UP(ctx context.Context) error {
|
|
return r.db.PopulateMultiIndex(ctx, []string{
|
|
notification.BSONFieldTenantID, notification.BSONFieldOccurredAt,
|
|
}, []int32{1, -1}, false)
|
|
}
|