using System.Data; using Database.Common; using Insight.Database; namespace Database.Core.DataControlLanguage { /// /// Only a superadmin or similar can create Application Users /// public class SetupApplicationUser { IDbConnection _db; string _schema; string _user; string _password; public SetupApplicationUser(IDbConnection db) { _db = db; } public void CreateUserWithSchemaInDatabase(string schema, string user, string password) { _schema = schema; _password = password; _user = user; if (!Validations.IsValidSchemaName(_schema)) throw new ArgumentException("Invalid schema name", _schema); using (var transaction = _db.BeginTransaction()) { try { CreateSchema(); CreateRole(); GrantSchemaRights(); transaction.Commit(); } catch (Exception ex) { transaction.Rollback(); throw new InvalidOperationException("Failed to SetupApplicationUser in Database", ex); } } } private void ExecuteSql(string sql) { _db.ExecuteSql(sql); } private void CreateSchema() { var sql = $"CREATE SCHEMA IF NOT EXISTS {_schema}"; ExecuteSql(sql); } private void CreateRole() { var sql = $"CREATE ROLE {_user} WITH CREATEDB CREATEROLE LOGIN PASSWORD '{_password}';"; ExecuteSql(sql); var sql1 = $"ALTER ROLE {_user} SET search_path='{_schema}';"; ExecuteSql(sql1); } private void GrantSchemaRights() { var sql = $"GRANT USAGE ON SCHEMA {_schema} TO {_user};"; ExecuteSql(sql); var sql1 = $"ALTER DEFAULT PRIVILEGES IN SCHEMA {_schema} " + $"GRANT INSERT, SELECT, UPDATE PRIVILEGES ON TABLES TO {_user};"; ExecuteSql(sql1); var sql2 = $"GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA {_schema} TO {_user};"; ExecuteSql(sql2); } } }