2025-01-14 23:10:30 +01:00
|
|
|
|
using System;
|
|
|
|
|
|
using System.Data;
|
|
|
|
|
|
using System.Text.RegularExpressions;
|
|
|
|
|
|
using Insight.Database;
|
|
|
|
|
|
namespace Database.Tenants
|
|
|
|
|
|
{
|
|
|
|
|
|
|
2025-02-06 16:58:13 +01:00
|
|
|
|
public class Setup
|
|
|
|
|
|
{
|
|
|
|
|
|
private readonly IDbConnection _db;
|
|
|
|
|
|
|
|
|
|
|
|
public Setup(IDbConnection db)
|
|
|
|
|
|
{
|
|
|
|
|
|
_db = db;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public async Task CreateTenantInDatabase(string schema, string user, string password)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (!Regex.IsMatch(schema, "^[a-zA-Z0-9_]+$"))
|
|
|
|
|
|
throw new ArgumentException("Invalid schema name");
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
await CreateUser(user, password);
|
|
|
|
|
|
await CreateSchema(schema);
|
|
|
|
|
|
await GrantSchemaRights(schema, user);
|
|
|
|
|
|
|
|
|
|
|
|
await CreateNavigationLinkTemplatesTable(schema);
|
|
|
|
|
|
await CreateNavigationLinkTemplateTranslationsTable(schema);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private async Task CreateSchema(string schema)
|
|
|
|
|
|
{
|
|
|
|
|
|
var sql = $"CREATE SCHEMA IF NOT EXISTS {schema}";
|
|
|
|
|
|
await _db.ExecuteAsync(sql);
|
|
|
|
|
|
}
|
|
|
|
|
|
private async Task CreateUser(string user, string password)
|
|
|
|
|
|
{
|
|
|
|
|
|
var sql = $"CREATE USER {user} WITH PASSWORD '{password}';";
|
|
|
|
|
|
await _db.ExecuteAsync(sql);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private async Task GrantSchemaRights(string schema, string user)
|
|
|
|
|
|
{
|
|
|
|
|
|
var sql = $"GRANT USAGE ON SCHEMA {schema} TO {user};";
|
|
|
|
|
|
await _db.ExecuteAsync(sql);
|
|
|
|
|
|
|
|
|
|
|
|
var sql1 = $"ALTER DEFAULT PRIVILEGES IN SCHEMA {schema} " +
|
|
|
|
|
|
$"GRANT ALL PRIVILEGES ON TABLES TO {user};";
|
|
|
|
|
|
await _db.ExecuteAsync(sql1);
|
|
|
|
|
|
|
|
|
|
|
|
var sql2 = $"GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA {schema} TO {user};";
|
|
|
|
|
|
await _db.ExecuteAsync(sql2);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
//private async Task CreatePermissionTypesTable(string schema)
|
|
|
|
|
|
//{
|
|
|
|
|
|
// var sql = $@"
|
|
|
|
|
|
// CREATE TABLE IF NOT EXISTS {schema}.permission_types (
|
|
|
|
|
|
// id SERIAL PRIMARY KEY,
|
|
|
|
|
|
// name VARCHAR(100) NOT NULL UNIQUE
|
|
|
|
|
|
// )";
|
|
|
|
|
|
// await _db.ExecuteAsync(sql);
|
|
|
|
|
|
//}
|
|
|
|
|
|
|
|
|
|
|
|
//private async Task CreatePermissionsTable(string schema)
|
|
|
|
|
|
//{
|
|
|
|
|
|
// 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)
|
|
|
|
|
|
// )";
|
|
|
|
|
|
// await _db.ExecuteAsync(sql);
|
|
|
|
|
|
//}
|
|
|
|
|
|
|
|
|
|
|
|
//private async Task CreateRolesTable(string schema)
|
|
|
|
|
|
//{
|
|
|
|
|
|
// var sql = $@"
|
|
|
|
|
|
// CREATE TABLE IF NOT EXISTS {schema}.roles (
|
|
|
|
|
|
// id SERIAL PRIMARY KEY,
|
|
|
|
|
|
// name VARCHAR(100) NOT NULL UNIQUE
|
|
|
|
|
|
// )";
|
|
|
|
|
|
// await _db.ExecuteAsync(sql);
|
|
|
|
|
|
//}
|
|
|
|
|
|
|
|
|
|
|
|
//private async Task CreateRolePermissionsTable(string schema)
|
|
|
|
|
|
//{
|
|
|
|
|
|
// 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)
|
|
|
|
|
|
// )";
|
|
|
|
|
|
// await _db.ExecuteAsync(sql);
|
|
|
|
|
|
//}
|
|
|
|
|
|
|
|
|
|
|
|
private async Task CreateNavigationLinkTemplatesTable(string schema)
|
|
|
|
|
|
{
|
|
|
|
|
|
var sql = $@"
|
2025-01-16 14:27:05 +01:00
|
|
|
|
CREATE TABLE IF NOT EXISTS {schema}.navigation_link_templates (
|
|
|
|
|
|
id SERIAL PRIMARY KEY,
|
|
|
|
|
|
parent_id INTEGER NULL,
|
|
|
|
|
|
url VARCHAR(500) NOT NULL,
|
|
|
|
|
|
permission_id INTEGER NULL,
|
|
|
|
|
|
icon VARCHAR(100) NULL,
|
|
|
|
|
|
default_order INTEGER NOT NULL,
|
|
|
|
|
|
FOREIGN KEY (permission_id) REFERENCES {schema}.permissions(id),
|
|
|
|
|
|
FOREIGN KEY (parent_id) REFERENCES {schema}.navigation_link_templates(id)
|
|
|
|
|
|
)";
|
2025-02-06 16:58:13 +01:00
|
|
|
|
await _db.ExecuteAsync(sql);
|
|
|
|
|
|
}
|
2025-01-14 23:10:30 +01:00
|
|
|
|
|
2025-02-06 16:58:13 +01:00
|
|
|
|
private async Task CreateNavigationLinkTemplateTranslationsTable(string schema)
|
|
|
|
|
|
{
|
|
|
|
|
|
var sql = $@"
|
2025-01-16 14:27:05 +01:00
|
|
|
|
CREATE TABLE IF NOT EXISTS {schema}.navigation_link_template_translations (
|
|
|
|
|
|
id SERIAL PRIMARY KEY,
|
|
|
|
|
|
template_id INTEGER NOT NULL,
|
|
|
|
|
|
language VARCHAR(10) NOT NULL,
|
|
|
|
|
|
display_name VARCHAR(100) NOT NULL,
|
|
|
|
|
|
FOREIGN KEY (template_id) REFERENCES {schema}.navigation_link_templates(id)
|
|
|
|
|
|
)";
|
2025-02-06 16:58:13 +01:00
|
|
|
|
await _db.ExecuteAsync(sql);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2025-01-14 23:10:30 +01:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|