105 lines
3.1 KiB
Go
105 lines
3.1 KiB
Go
package template
|
|
|
|
import (
|
|
"context"
|
|
|
|
"github.com/tech/sendico/pkg/db/repository"
|
|
"github.com/tech/sendico/pkg/db/repository/builder"
|
|
"github.com/tech/sendico/pkg/db/storable"
|
|
"github.com/tech/sendico/pkg/merrors"
|
|
"github.com/tech/sendico/pkg/mlogger"
|
|
"github.com/tech/sendico/pkg/model"
|
|
"github.com/tech/sendico/pkg/mservice"
|
|
"github.com/tech/sendico/pkg/mutil/mzap"
|
|
"go.mongodb.org/mongo-driver/bson/primitive"
|
|
"go.mongodb.org/mongo-driver/mongo"
|
|
)
|
|
|
|
type CascadeDeleterT = func(ctx context.Context, objectRef primitive.ObjectID) error
|
|
|
|
type DBImp[T storable.Storable] struct {
|
|
Logger mlogger.Logger
|
|
Repository repository.Repository
|
|
cdeleter CascadeDeleterT
|
|
}
|
|
|
|
func (db *DBImp[T]) Create(ctx context.Context, object T) error {
|
|
return db.Repository.Insert(ctx, object, nil)
|
|
}
|
|
|
|
func (db *DBImp[T]) InsertMany(ctx context.Context, objects []T) error {
|
|
if len(objects) == 0 {
|
|
return nil
|
|
}
|
|
|
|
storables := make([]storable.Storable, len(objects))
|
|
for i, obj := range objects {
|
|
storables[i] = obj
|
|
}
|
|
|
|
return db.Repository.InsertMany(ctx, storables)
|
|
}
|
|
|
|
func (db *DBImp[T]) Get(ctx context.Context, objectRef primitive.ObjectID, result T) error {
|
|
return db.Repository.Get(ctx, objectRef, result)
|
|
}
|
|
|
|
func (db *DBImp[T]) Update(ctx context.Context, object T) error {
|
|
return db.Repository.Update(ctx, object)
|
|
}
|
|
|
|
func (db *DBImp[T]) Patch(ctx context.Context, objectRef primitive.ObjectID, patch builder.Patch) error {
|
|
return db.Repository.Patch(ctx, objectRef, patch)
|
|
}
|
|
|
|
func (db *DBImp[T]) PatchMany(ctx context.Context, query builder.Query, patch builder.Patch) (int, error) {
|
|
return db.Repository.PatchMany(ctx, query, patch)
|
|
}
|
|
|
|
func (db *DBImp[T]) Delete(ctx context.Context, objectRef primitive.ObjectID) error {
|
|
return db.Repository.Delete(ctx, objectRef)
|
|
}
|
|
|
|
func (db *DBImp[T]) DeleteMany(ctx context.Context, query builder.Query) error {
|
|
return db.Repository.DeleteMany(ctx, query)
|
|
}
|
|
|
|
func (db *DBImp[T]) FindOne(ctx context.Context, query builder.Query, result T) error {
|
|
return db.Repository.FindOneByFilter(ctx, query, result)
|
|
}
|
|
|
|
func (db *DBImp[T]) ListIDs(ctx context.Context, query builder.Query) ([]primitive.ObjectID, error) {
|
|
return db.Repository.ListIDs(ctx, query)
|
|
}
|
|
|
|
func (db *DBImp[T]) ListPermissionBound(ctx context.Context, query builder.Query) ([]model.PermissionBoundStorable, error) {
|
|
return db.Repository.ListPermissionBound(ctx, query)
|
|
}
|
|
|
|
func (db *DBImp[T]) SetDeleter(deleter CascadeDeleterT) {
|
|
db.Logger.Debug("Custom cascade deletion method installed")
|
|
db.cdeleter = deleter
|
|
}
|
|
|
|
func (db *DBImp[T]) deleteCascadeStub(_ context.Context, objectRef primitive.ObjectID) error {
|
|
db.Logger.Warn("Unimplemented cascade delete call", mzap.ObjRef("object_ref", objectRef))
|
|
return merrors.NotImplemented("custom implementation required")
|
|
}
|
|
|
|
func (db *DBImp[T]) DeleteCascade(ctx context.Context, objectRef primitive.ObjectID) error {
|
|
return db.cdeleter(ctx, objectRef)
|
|
}
|
|
|
|
func Create[T storable.Storable](
|
|
logger mlogger.Logger,
|
|
collection mservice.Type,
|
|
db *mongo.Database,
|
|
) *DBImp[T] {
|
|
res := &DBImp[T]{
|
|
Logger: logger.Named(collection),
|
|
Repository: repository.CreateMongoRepository(db, collection),
|
|
}
|
|
res.cdeleter = res.deleteCascadeStub
|
|
return res
|
|
}
|