service backend
All checks were successful
ci/woodpecker/push/db Pipeline was successful
ci/woodpecker/push/nats Pipeline was successful

This commit is contained in:
Stephan D
2025-11-07 18:35:26 +01:00
parent 20e8f9acc4
commit 62a6631b9a
537 changed files with 48453 additions and 0 deletions

View File

@@ -0,0 +1,104 @@
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
}