113 lines
3.1 KiB
Go
113 lines
3.1 KiB
Go
package repository
|
|
|
|
import (
|
|
"context"
|
|
|
|
"haixun-backend/internal/library/clock"
|
|
app "haixun-backend/internal/library/errors"
|
|
"haixun-backend/internal/library/errors/code"
|
|
"haixun-backend/internal/model/permission/domain/entity"
|
|
domrepo "haixun-backend/internal/model/permission/domain/repository"
|
|
|
|
"go.mongodb.org/mongo-driver/bson"
|
|
"go.mongodb.org/mongo-driver/mongo"
|
|
"go.mongodb.org/mongo-driver/mongo/options"
|
|
)
|
|
|
|
type mongoPermissionRepository struct {
|
|
collection *mongo.Collection
|
|
}
|
|
|
|
func NewMongoPermissionRepository(db *mongo.Database) domrepo.PermissionRepository {
|
|
if db == nil {
|
|
return &mongoPermissionRepository{}
|
|
}
|
|
return &mongoPermissionRepository{collection: db.Collection(entity.PermissionCollectionName)}
|
|
}
|
|
|
|
func (r *mongoPermissionRepository) EnsureIndexes(ctx context.Context) error {
|
|
if r.collection == nil {
|
|
return nil
|
|
}
|
|
_, err := r.collection.Indexes().CreateMany(ctx, []mongo.IndexModel{
|
|
{Keys: bson.D{{Key: "name", Value: 1}}, Options: options.Index().SetUnique(true)},
|
|
{Keys: bson.D{{Key: "parent", Value: 1}}},
|
|
{Keys: bson.D{{Key: "status", Value: 1}}},
|
|
{Keys: bson.D{{Key: "type", Value: 1}}},
|
|
})
|
|
return err
|
|
}
|
|
|
|
func (r *mongoPermissionRepository) UpsertByName(ctx context.Context, permission *entity.Permission) error {
|
|
if r.collection == nil {
|
|
return app.For(code.Permission).DBUnavailable("Mongo is not configured")
|
|
}
|
|
now := clock.NowUnixNano()
|
|
if permission.Status == "" {
|
|
permission.Status = entity.StatusOpen
|
|
}
|
|
if permission.Type == "" {
|
|
permission.Type = entity.TypeBackendUser
|
|
}
|
|
_, err := r.collection.UpdateOne(
|
|
ctx,
|
|
bson.M{"name": permission.Name},
|
|
bson.M{
|
|
"$set": bson.M{
|
|
"parent": permission.Parent,
|
|
"name": permission.Name,
|
|
"http_methods": permission.HTTPMethods,
|
|
"http_path": permission.HTTPPath,
|
|
"status": permission.Status,
|
|
"type": permission.Type,
|
|
"update_at": now,
|
|
},
|
|
"$setOnInsert": bson.M{"create_at": now},
|
|
},
|
|
options.Update().SetUpsert(true),
|
|
)
|
|
return err
|
|
}
|
|
|
|
func (r *mongoPermissionRepository) List(ctx context.Context, filter domrepo.PermissionFilter) ([]*entity.Permission, error) {
|
|
if r.collection == nil {
|
|
return nil, app.For(code.Permission).DBUnavailable("Mongo is not configured")
|
|
}
|
|
query := bson.M{}
|
|
if filter.Status != "" {
|
|
query["status"] = filter.Status
|
|
}
|
|
if filter.Type != "" {
|
|
query["type"] = filter.Type
|
|
}
|
|
cursor, err := r.collection.Find(ctx, query, options.Find().SetSort(bson.D{{Key: "name", Value: 1}}))
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer cursor.Close(ctx)
|
|
var out []*entity.Permission
|
|
if err := cursor.All(ctx, &out); err != nil {
|
|
return nil, err
|
|
}
|
|
return out, nil
|
|
}
|
|
|
|
func (r *mongoPermissionRepository) ListByIDs(ctx context.Context, ids []string) ([]*entity.Permission, error) {
|
|
if r.collection == nil {
|
|
return nil, app.For(code.Permission).DBUnavailable("Mongo is not configured")
|
|
}
|
|
if len(ids) == 0 {
|
|
return nil, nil
|
|
}
|
|
cursor, err := r.collection.Find(ctx, bson.M{"_id": bson.M{"$in": objectIDs(ids)}})
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer cursor.Close(ctx)
|
|
var out []*entity.Permission
|
|
if err := cursor.All(ctx, &out); err != nil {
|
|
return nil, err
|
|
}
|
|
return out, nil
|
|
}
|