package mongo import ( "context" "git.acooldomain.co/server-manager/backend-kubernetes-go/dbhandler" "git.acooldomain.co/server-manager/backend-kubernetes-go/models" "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/mongo" "go.mongodb.org/mongo-driver/mongo/options" ) type ServerPermissions struct { Username string `json:"username"` ServerId string `json:"server_id"` Permissions models.Permission `json:"permissions"` } type MongoDbAuthorizationHandler struct { dbhandler.AuthorizationDbHandler collection *mongo.Collection } func (self *MongoDbAuthorizationHandler) RemoveUser(username string) error { _, err := self.collection.DeleteMany( context.Background(), bson.D{ {Key: "username", Value: username}, }, ) return err } func (self *MongoDbAuthorizationHandler) RemoveServer(serverId string) error { _, err := self.collection.DeleteMany( context.Background(), bson.D{ {Key: "server_id", Value: serverId}, }, ) return err } func (self *MongoDbAuthorizationHandler) AddPermissions(username string, serverId string, permissions models.Permission) error { var serverPermissions ServerPermissions err := self.collection.FindOne( context.Background(), bson.D{ {Key: "username", Value: username}, {Key: "server_id", Value: serverId}, }, ).Decode(&serverPermissions) if err != nil { return err } newPermissions := serverPermissions.Permissions | permissions _, err = self.collection.UpdateOne( context.Background(), bson.D{ {Key: "username", Value: username}, {Key: "server_id", Value: serverId}, }, bson.M{"$set": bson.M{ "permissions": newPermissions, }, }, ) return err } func (self *MongoDbAuthorizationHandler) RemovePermissions(username string, serverId string, permissions models.Permission) error { var serverPermissions ServerPermissions err := self.collection.FindOne( context.Background(), bson.D{ {Key: "username", Value: username}, {Key: "server_id", Value: serverId}, }, ).Decode(&serverPermissions) if err != nil { return err } newPermissions := serverPermissions.Permissions | permissions ^ permissions _, err = self.collection.UpdateOne( context.Background(), bson.D{ {Key: "username", Value: username}, {Key: "server_id", Value: serverId}, }, bson.M{"$set": bson.M{ "permissions": newPermissions, }, }, ) return err } func (self *MongoDbAuthorizationHandler) SetPermissions(username string, serverId string, permissions models.Permission) error { _, err := self.collection.UpdateOne( context.Background(), bson.D{ {Key: "username", Value: username}, {Key: "server_id", Value: serverId}, }, bson.M{"$set": bson.M{ "permissions": permissions, }, }, ) return err } func (self *MongoDbAuthorizationHandler) GetPermissions(username string, serverId string) (models.Permission, error) { var serverPermissions ServerPermissions err := self.collection.FindOne( context.Background(), bson.D{ {Key: "username", Value: username}, {Key: "server_id", Value: serverId}, }, ).Decode(&serverPermissions) if err != nil { return 0, err } return serverPermissions.Permissions, nil } func NewAuthorizationHandler(config models.MongoDBConfig) (*MongoDbAuthorizationHandler, error) { clientOptions := options.Client().ApplyURI(config.Url).SetAuth(options.Credential{ Username: config.Username, Password: config.Password, }) client, err := mongo.Connect(context.TODO(), clientOptions) if err != nil { return nil, err } return &MongoDbAuthorizationHandler{ collection: client.Database(config.Database).Collection(config.Collection), }, nil }