aboutsummaryrefslogtreecommitdiffstats
path: root/code/api
diff options
context:
space:
mode:
Diffstat (limited to 'code/api')
-rw-r--r--code/api/sql/quartz-create.sql156
-rw-r--r--code/api/sql/quartz-drop.sql23
-rw-r--r--code/api/src/Data/Models/AppConfiguration.cs5
-rw-r--r--code/api/src/Services/VaultService.cs59
4 files changed, 223 insertions, 20 deletions
diff --git a/code/api/sql/quartz-create.sql b/code/api/sql/quartz-create.sql
new file mode 100644
index 0000000..d0dc298
--- /dev/null
+++ b/code/api/sql/quartz-create.sql
@@ -0,0 +1,156 @@
+CREATE TABLE IF NOT EXISTS qrtz_job_details
+(
+ sched_name TEXT NOT NULL,
+ job_name TEXT NOT NULL,
+ job_group TEXT NOT NULL,
+ description TEXT NULL,
+ job_class_name TEXT NOT NULL,
+ is_durable BOOL NOT NULL,
+ is_nonconcurrent BOOL NOT NULL,
+ is_update_data BOOL NOT NULL,
+ requests_recovery BOOL NOT NULL,
+ job_data BYTEA NULL,
+ PRIMARY KEY (sched_name, job_name, job_group)
+);
+
+CREATE TABLE IF NOT EXISTS qrtz_triggers
+(
+ sched_name TEXT NOT NULL,
+ trigger_name TEXT NOT NULL,
+ trigger_group TEXT NOT NULL,
+ job_name TEXT NOT NULL,
+ job_group TEXT NOT NULL,
+ description TEXT NULL,
+ next_fire_time BIGINT NULL,
+ prev_fire_time BIGINT NULL,
+ priority INTEGER NULL,
+ trigger_state TEXT NOT NULL,
+ trigger_type TEXT NOT NULL,
+ start_time BIGINT NOT NULL,
+ end_time BIGINT NULL,
+ calendar_name TEXT NULL,
+ misfire_instr SMALLINT NULL,
+ job_data BYTEA NULL,
+ PRIMARY KEY (sched_name, trigger_name, trigger_group),
+ FOREIGN KEY (sched_name, job_name, job_group)
+ REFERENCES qrtz_job_details (sched_name, job_name, job_group)
+);
+
+CREATE TABLE IF NOT EXISTS qrtz_simple_triggers
+(
+ sched_name TEXT NOT NULL,
+ trigger_name TEXT NOT NULL,
+ trigger_group TEXT NOT NULL,
+ repeat_count BIGINT NOT NULL,
+ repeat_interval BIGINT NOT NULL,
+ times_triggered BIGINT NOT NULL,
+ PRIMARY KEY (sched_name, trigger_name, trigger_group),
+ FOREIGN KEY (sched_name, trigger_name, trigger_group)
+ REFERENCES qrtz_triggers (sched_name, trigger_name, trigger_group) ON DELETE CASCADE
+);
+
+CREATE TABLE IF NOT EXISTS QRTZ_SIMPROP_TRIGGERS
+(
+ sched_name TEXT NOT NULL,
+ trigger_name TEXT NOT NULL,
+ trigger_group TEXT NOT NULL,
+ str_prop_1 TEXT NULL,
+ str_prop_2 TEXT NULL,
+ str_prop_3 TEXT NULL,
+ int_prop_1 INTEGER NULL,
+ int_prop_2 INTEGER NULL,
+ long_prop_1 BIGINT NULL,
+ long_prop_2 BIGINT NULL,
+ dec_prop_1 NUMERIC NULL,
+ dec_prop_2 NUMERIC NULL,
+ bool_prop_1 BOOL NULL,
+ bool_prop_2 BOOL NULL,
+ time_zone_id TEXT NULL,
+ PRIMARY KEY (sched_name, trigger_name, trigger_group),
+ FOREIGN KEY (sched_name, trigger_name, trigger_group)
+ REFERENCES qrtz_triggers (sched_name, trigger_name, trigger_group) ON DELETE CASCADE
+);
+
+CREATE TABLE IF NOT EXISTS qrtz_cron_triggers
+(
+ sched_name TEXT NOT NULL,
+ trigger_name TEXT NOT NULL,
+ trigger_group TEXT NOT NULL,
+ cron_expression TEXT NOT NULL,
+ time_zone_id TEXT,
+ PRIMARY KEY (sched_name, trigger_name, trigger_group),
+ FOREIGN KEY (sched_name, trigger_name, trigger_group)
+ REFERENCES qrtz_triggers (sched_name, trigger_name, trigger_group) ON DELETE CASCADE
+);
+
+CREATE TABLE IF NOT EXISTS qrtz_blob_triggers
+(
+ sched_name TEXT NOT NULL,
+ trigger_name TEXT NOT NULL,
+ trigger_group TEXT NOT NULL,
+ blob_data BYTEA NULL,
+ PRIMARY KEY (sched_name, trigger_name, trigger_group),
+ FOREIGN KEY (sched_name, trigger_name, trigger_group)
+ REFERENCES qrtz_triggers (sched_name, trigger_name, trigger_group) ON DELETE CASCADE
+);
+
+CREATE TABLE IF NOT EXISTS qrtz_calendars
+(
+ sched_name TEXT NOT NULL,
+ calendar_name TEXT NOT NULL,
+ calendar BYTEA NOT NULL,
+ PRIMARY KEY (sched_name, calendar_name)
+);
+
+CREATE TABLE IF NOT EXISTS qrtz_paused_trigger_grps
+(
+ sched_name TEXT NOT NULL,
+ trigger_group TEXT NOT NULL,
+ PRIMARY KEY (sched_name, trigger_group)
+);
+
+CREATE TABLE IF NOT EXISTS qrtz_fired_triggers
+(
+ sched_name TEXT NOT NULL,
+ entry_id TEXT NOT NULL,
+ trigger_name TEXT NOT NULL,
+ trigger_group TEXT NOT NULL,
+ instance_name TEXT NOT NULL,
+ fired_time BIGINT NOT NULL,
+ sched_time BIGINT NOT NULL,
+ priority INTEGER NOT NULL,
+ state TEXT NOT NULL,
+ job_name TEXT NULL,
+ job_group TEXT NULL,
+ is_nonconcurrent BOOL NOT NULL,
+ requests_recovery BOOL NULL,
+ PRIMARY KEY (sched_name, entry_id)
+);
+
+CREATE TABLE IF NOT EXISTS qrtz_scheduler_state
+(
+ sched_name TEXT NOT NULL,
+ instance_name TEXT NOT NULL,
+ last_checkin_time BIGINT NOT NULL,
+ checkin_interval BIGINT NOT NULL,
+ PRIMARY KEY (sched_name, instance_name)
+);
+
+CREATE TABLE IF NOT EXISTS qrtz_locks
+(
+ sched_name TEXT NOT NULL,
+ lock_name TEXT NOT NULL,
+ PRIMARY KEY (sched_name, lock_name)
+);
+
+CREATE INDEX IF NOT EXISTS idx_qrtz_j_req_recovery on qrtz_job_details (requests_recovery);
+CREATE INDEX IF NOT EXISTS idx_qrtz_t_next_fire_time on qrtz_triggers (next_fire_time);
+CREATE INDEX IF NOT EXISTS idx_qrtz_t_state on qrtz_triggers (trigger_state);
+CREATE INDEX IF NOT EXISTS idx_qrtz_t_nft_st on qrtz_triggers (next_fire_time, trigger_state);
+CREATE INDEX IF NOT EXISTS idx_qrtz_ft_trig_name on qrtz_fired_triggers (trigger_name);
+CREATE INDEX IF NOT EXISTS idx_qrtz_ft_trig_group on qrtz_fired_triggers (trigger_group);
+CREATE INDEX IF NOT EXISTS idx_qrtz_ft_trig_nm_gp on qrtz_fired_triggers (sched_name, trigger_name, trigger_group);
+CREATE INDEX IF NOT EXISTS idx_qrtz_ft_trig_inst_name on qrtz_fired_triggers (instance_name);
+CREATE INDEX IF NOT EXISTS idx_qrtz_ft_job_name on qrtz_fired_triggers (job_name);
+CREATE INDEX IF NOT EXISTS idx_qrtz_ft_job_group on qrtz_fired_triggers (job_group);
+CREATE INDEX IF NOT EXISTS idx_qrtz_ft_job_req_recovery on qrtz_fired_triggers (requests_recovery);
diff --git a/code/api/sql/quartz-drop.sql b/code/api/sql/quartz-drop.sql
new file mode 100644
index 0000000..87b0797
--- /dev/null
+++ b/code/api/sql/quartz-drop.sql
@@ -0,0 +1,23 @@
+DROP TABLE IF EXISTS qrtz_fired_triggers;
+DROP TABLE IF EXISTS qrtz_paused_trigger_grps;
+DROP TABLE IF EXISTS qrtz_scheduler_state;
+DROP TABLE IF EXISTS qrtz_locks;
+DROP TABLE IF EXISTS qrtz_simprop_triggers;
+DROP TABLE IF EXISTS qrtz_simple_triggers;
+DROP TABLE IF EXISTS qrtz_cron_triggers;
+DROP TABLE IF EXISTS qrtz_blob_triggers;
+DROP TABLE IF EXISTS qrtz_triggers;
+DROP TABLE IF EXISTS qrtz_job_details;
+DROP TABLE IF EXISTS qrtz_calendars;
+
+DROP INDEX IF EXISTS idx_qrtz_j_req_recovery;
+DROP INDEX IF EXISTS idx_qrtz_t_next_fire_time;
+DROP INDEX IF EXISTS idx_qrtz_t_state;
+DROP INDEX IF EXISTS idx_qrtz_t_nft_st;
+DROP INDEX IF EXISTS idx_qrtz_ft_trig_name;
+DROP INDEX IF EXISTS idx_qrtz_ft_trig_group;
+DROP INDEX IF EXISTS idx_qrtz_ft_trig_nm_gp;
+DROP INDEX IF EXISTS idx_qrtz_ft_trig_inst_name;
+DROP INDEX IF EXISTS idx_qrtz_ft_job_name;
+DROP INDEX IF EXISTS idx_qrtz_ft_job_group;
+DROP INDEX IF EXISTS idx_qrtz_ft_job_req_recovery;
diff --git a/code/api/src/Data/Models/AppConfiguration.cs b/code/api/src/Data/Models/AppConfiguration.cs
index f4346bb..6bd93d0 100644
--- a/code/api/src/Data/Models/AppConfiguration.cs
+++ b/code/api/src/Data/Models/AppConfiguration.cs
@@ -26,10 +26,13 @@ public class AppConfiguration
public string GITHUB_CLIENT_ID { get; set; }
public string GITHUB_CLIENT_SECRET { get; set; }
public string APP_AES_KEY { get; set; }
+ /// <summary>
+ /// A base64 string containing a passwordless pfx cert
+ /// </summary>
public string APP_CERT { get; set; }
public X509Certificate2 CERT1() => new (Convert.FromBase64String(APP_CERT));
-
+
public object GetPublicVersion() {
return new {
DB_HOST,
diff --git a/code/api/src/Services/VaultService.cs b/code/api/src/Services/VaultService.cs
index 3d58608..b64e6a2 100644
--- a/code/api/src/Services/VaultService.cs
+++ b/code/api/src/Services/VaultService.cs
@@ -10,7 +10,8 @@ public class VaultService
private readonly ILogger<VaultService> _logger;
private int CACHE_TTL { get; set; }
- public VaultService(HttpClient client, IConfiguration configuration, IMemoryCache cache, ILogger<VaultService> logger) {
+ public VaultService(HttpClient client, IConfiguration configuration, IMemoryCache cache, ILogger<VaultService> logger)
+ {
var token = configuration.GetValue<string>(AppEnvironmentVariables.VAULT_TOKEN);
var vaultUrl = configuration.GetValue<string>(AppEnvironmentVariables.VAULT_URL);
CACHE_TTL = configuration.GetValue(AppEnvironmentVariables.VAULT_CACHE_TTL, 60 * 60 * 12);
@@ -24,16 +25,20 @@ public class VaultService
_logger = logger;
}
- public T Get<T>(string path) {
+ public T Get<T>(string path)
+ {
var result = _cache.GetOrCreate(AppConstants.VAULT_CACHE_KEY,
- cacheEntry => {
+ cacheEntry =>
+ {
cacheEntry.AbsoluteExpirationRelativeToNow = TimeSpan.FromSeconds(CACHE_TTL);
var getSecretResponse = _client.GetFromJsonAsync<GetSecretResponse<T>>("/v1/kv/data/" + path).Result;
- if (getSecretResponse == null) {
+ if (getSecretResponse == null)
+ {
return default;
}
- Log.Debug("Setting new vault cache, " + new {
+ Log.Debug("Setting new vault cache, " + new
+ {
PATH = path,
CACHE_TTL,
Data = JsonSerializer.Serialize(getSecretResponse.Data.Data)
@@ -43,28 +48,36 @@ public class VaultService
return result;
}
- public T Refresh<T>(string path) {
+ public T Refresh<T>(string path)
+ {
_cache.Remove(AppConstants.VAULT_CACHE_KEY);
CACHE_TTL = _configuration.GetValue(AppEnvironmentVariables.VAULT_CACHE_TTL, 60 * 60 * 12);
return Get<T>(path);
}
- public async Task<RenewTokenResponse> RenewTokenAsync<T>(string token) {
+ public async Task<RenewTokenResponse> RenewTokenAsync<T>(string token)
+ {
var response = await _client.PostAsJsonAsync("v1/auth/token/renew",
- new {
+ new
+ {
Token = token
});
- if (response.IsSuccessStatusCode) {
+ if (response.IsSuccessStatusCode)
+ {
return await response.Content.ReadFromJsonAsync<RenewTokenResponse>();
}
return default;
}
- public AppConfiguration GetCurrentAppConfiguration() {
+ public AppConfiguration GetCurrentAppConfiguration()
+ {
+#if DEBUG
var isInFlightMode = true;
- if (isInFlightMode) {
- return new AppConfiguration() {
+ if (isInFlightMode)
+ {
+ return new AppConfiguration()
+ {
DB_HOST = "localhost",
DB_PORT = "5432",
DB_NAME = "greatoffice_ivar_dev",
@@ -78,10 +91,12 @@ public class VaultService
APP_CERT = "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"
};
}
+#endif
var path = _configuration.GetValue<string>(AppEnvironmentVariables.MAIN_CONFIG_SHEET);
var result = Get<AppConfiguration>(path);
- var overwrites = new {
+ var overwrites = new
+ {
DB_HOST = _configuration.GetValue("OVERWRITE_DB_HOST", string.Empty),
DB_PORT = _configuration.GetValue("OVERWRITE_DB_PORT", string.Empty),
DB_USER = _configuration.GetValue("OVERWRITE_DB_USER", string.Empty),
@@ -89,27 +104,32 @@ public class VaultService
DB_NAME = _configuration.GetValue("OVERWRITE_DB_NAME", string.Empty),
};
- if (overwrites.DB_HOST.HasValue()) {
+ if (overwrites.DB_HOST.HasValue())
+ {
_logger.LogInformation("OVERWRITE_DB_HOST is specified, using it's value: {DB_HOST}", overwrites.DB_HOST);
result.DB_HOST = overwrites.DB_HOST;
}
- if (overwrites.DB_PORT.HasValue()) {
+ if (overwrites.DB_PORT.HasValue())
+ {
_logger.LogInformation("OVERWRITE_DB_PORT is specified, using it's value: {DB_PORT}", overwrites.DB_PORT);
result.DB_PORT = overwrites.DB_PORT;
}
- if (overwrites.DB_USER.HasValue()) {
+ if (overwrites.DB_USER.HasValue())
+ {
_logger.LogInformation("OVERWRITE_DB_USER is specified, using it's value: {DB_USER}", overwrites.DB_USER);
result.DB_USER = overwrites.DB_USER;
}
- if (overwrites.DB_PASSWORD.HasValue()) {
+ if (overwrites.DB_PASSWORD.HasValue())
+ {
_logger.LogInformation("OVERWRITE_DB_PASSWORD is specified, using it's value: (redacted)");
result.DB_PASSWORD = overwrites.DB_PASSWORD;
}
- if (overwrites.DB_NAME.HasValue()) {
+ if (overwrites.DB_NAME.HasValue())
+ {
_logger.LogInformation("OVERWRITE_DB_NAME is specified, using it's value: {DB_NAME}", overwrites.DB_NAME);
result.DB_NAME = overwrites.DB_NAME;
}
@@ -117,7 +137,8 @@ public class VaultService
return result;
}
- public AppConfiguration RefreshCurrentAppConfiguration() {
+ public AppConfiguration RefreshCurrentAppConfiguration()
+ {
var path = _configuration.GetValue<string>(AppEnvironmentVariables.MAIN_CONFIG_SHEET);
return Refresh<AppConfiguration>(path);
}