using System.Data; using Database.Common; using Insight.Database; namespace Database.RolesPermissionSystem { public class Setup { IDbConnection _db; string _schema; public Setup(IDbConnection db) { _db = db; } /// /// Creates the system tables in the specified schema within a transaction. /// /// The schema name where the tables will be created. public void CreateSystem(string schema) { _schema = schema; if (!Validations.IsValidSchemaName(_schema)) throw new ArgumentException("Invalid schema name", _schema); using (var transaction = _db.BeginTransaction()) { try { CreateRolesTable(); CreatePermissionsTable(); CreatePermissionTypesTable(); CreateRolePermissionsTable(); transaction.Commit(); } catch (Exception ex) { transaction.Rollback(); throw new InvalidOperationException("Failed to create system tables.", ex); } } } private void ExecuteSql(string sql) { _db.ExecuteSql(sql); } private void CreatePermissionTypesTable() { var sql = $@" CREATE TABLE IF NOT EXISTS {_schema}.permission_types ( id SERIAL PRIMARY KEY, name VARCHAR(100) NOT NULL UNIQUE )"; ExecuteSql(sql); } private void CreatePermissionsTable() { var sql = $@" CREATE TABLE IF NOT EXISTS {_schema}.permissions ( id SERIAL PRIMARY KEY, name VARCHAR(100) NOT NULL UNIQUE, type_id INTEGER NOT NULL, FOREIGN KEY (type_id) REFERENCES {_schema}.permission_types(id) )"; ExecuteSql(sql); } private void CreateRolesTable() { var sql = $@" CREATE TABLE IF NOT EXISTS {_schema}.roles ( id SERIAL PRIMARY KEY, name VARCHAR(100) NOT NULL UNIQUE )"; ExecuteSql(sql); } private void CreateRolePermissionsTable() { var sql = $@" CREATE TABLE IF NOT EXISTS {_schema}.role_permissions ( role_id INTEGER NOT NULL, permission_id INTEGER NOT NULL, PRIMARY KEY (role_id, permission_id), FOREIGN KEY (role_id) REFERENCES {_schema}.roles(id), FOREIGN KEY (permission_id) REFERENCES {_schema}.permissions(id) )"; ExecuteSql(sql); } } }