From bce327698b01aeb096c3b82de73b61b99ef2d5fb Mon Sep 17 00:00:00 2001 From: ivarlovlie Date: Fri, 11 Nov 2022 16:14:58 +0700 Subject: refactor/feat: Update documentation/clarify project --- .gitignore | 2 + README.md | 72 ++++++++--- code/api/sql/quartz-create.sql | 156 ++++++++++++++++++++++++ code/api/sql/quartz-drop.sql | 23 ++++ code/api/src/Data/Models/AppConfiguration.cs | 5 +- code/api/src/Services/VaultService.cs | 59 ++++++--- code/app/src/lib/models/internal/ErrorResult.ts | 4 - sql/quartz-create.sql | 156 ------------------------ sql/quartz-drop.sql | 23 ---- 9 files changed, 281 insertions(+), 219 deletions(-) create mode 100644 code/api/sql/quartz-create.sql create mode 100644 code/api/sql/quartz-drop.sql delete mode 100644 code/app/src/lib/models/internal/ErrorResult.ts delete mode 100644 sql/quartz-create.sql delete mode 100644 sql/quartz-drop.sql diff --git a/.gitignore b/.gitignore index b640025..c07dab6 100644 --- a/.gitignore +++ b/.gitignore @@ -478,3 +478,5 @@ bin obj AppData secrets +.fleet +.vscode \ No newline at end of file diff --git a/README.md b/README.md index 8ed5fea..be9fe28 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,20 @@ -# Great Office +# Greatoffice -This codebase and all of its source code is licensed under the GNU General Public License v3.0, see [COPYING](COPYING) for more information. +> This codebase and all of its source code is licensed under the GNU General Public License v3.0, see [COPYING](COPYING) for more information. -## server +This repository contains all the code for greatoffice, a business management system. + +The platform aims to equip it's users with tools to do +- project management +- time tracking +- invoicing +- documenting +- ticketing +- task management + +See it live at https://dev.greatoffice.app + +## code/api Contains an ASP.NET Core Web API project using the [ApiEndpoints](https://github.com/ardalis/ApiEndpoints) paradigm. @@ -10,11 +22,36 @@ It handles all data operations (except administrative operations) for the platfo To run it you need .NET 6 and a PostgreSQL instance. -### Environment +### Database schemas + +The application schema is managed and described using entity framework core, to apply the latest migration use `dotnet ef database update` + +> This operation requires that you have the dotnet-ef tools installed, use `dotnet tool install -g dotnet-ef` to do so. +> +> In addition to that it requires you to have populated the required environment variables or enabled flight mode. + +Besides the application schema the api also needs a quartz database, sql scripts to create these in postgres is provided at `code/api/sql/quartz-*.sql`. + +I recommend using a seperate database for the quartz schema and app schema, since the app schema is managed by ef core and the quartz schema is not. +### Environment/Configuration -The server is configured through environments variables, in development [user-secret](https://docs.microsoft.com/en-us/aspnet/core/security/app-secrets) is a nifty tool. +The api uses Hashicorp's vault to manage it's configuration, environment variables is used to point the api in the direction of the vault json object that contains the configuration. -All environment variables the server needs to function properly is specified in [src/server/Data/Static/AppEnvironmentVariables.cs](./server/src/Data/Static/AppEnvironmentVariables.cs). +The configuration is described by [code/api/src/Data/Models/AppConfiguration.cs](./code/api/src/Data/Models/AppConfiguration.cs). + +I recommend using [user-secrets](https://docs.microsoft.com/en-us/aspnet/core/security/app-secrets) to set environment variables when developing. + +All environment variables the api needs to function properly is specified in [code/api/src/Data/Static/AppEnvironmentVariables.cs](./code/api/src/Data/Static/AppEnvironmentVariables.cs). + +#### Minimum required configuration + +The following configuration keys need valid values in order to start the api (regardless of environment): +- Starting with DB_ +- Starting with QUARTZ_DB_ +- Equal to APP_CERT + +#### Flight mode +If you need to skip the setup of vault or is unable to reach your vault instance, set isInFlightMode to true in [code/api/src/Services/VaultService.cs](./code/api/src/Services/VaultService.cs). ### Building and Developing @@ -22,21 +59,24 @@ To run the server in development mode use `dotnet run` (`dotnet watch` for hot-r To build the server locally use `dotnet build` or `dotnet build -c Release` for production builds. -## tests +A helper script is available at [`code/api/build_and_push.sh`](code/api/build_and_push.sh) that handles, +- Optionally commiting, taging and pushing latest changes to remote git source +- Building a docker image +- Pushing the docker image to the default registry at dr.ivar.systems +- Bumping version number -Contains integration tests for the web-app, written in .NET and xunit with Playwright for browser mocking. +## code/app -It automatically starts the server and expects the server to host the web-app at /index.html. +Contains an svelte kit application that acts as the frontend for greatoffice -Use `dotnet run` to run the tests. +### Environment -## apps/projects +The app reads environment variables from [`code/app/.env`](code/app/.env), keys need to start with `VITE_`. -The projects app is a svelte pwa that handles +### Building and Developing -- project management -- time tracking +To run the app in development mode use `pnpm run dev`. -## apps/web-shared +To build a production build use `pnpm run build`, the production build is placed in the `build` folder. -A source lib containing models, shared styles and shared components for all of great office's js clients/apps. +> Use `node build/index.js` (minimum v16) to run the app \ No newline at end of file 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; } + /// + /// A base64 string containing a passwordless pfx cert + /// 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 _logger; private int CACHE_TTL { get; set; } - public VaultService(HttpClient client, IConfiguration configuration, IMemoryCache cache, ILogger logger) { + public VaultService(HttpClient client, IConfiguration configuration, IMemoryCache cache, ILogger logger) + { var token = configuration.GetValue(AppEnvironmentVariables.VAULT_TOKEN); var vaultUrl = configuration.GetValue(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(string path) { + public T Get(string path) + { var result = _cache.GetOrCreate(AppConstants.VAULT_CACHE_KEY, - cacheEntry => { + cacheEntry => + { cacheEntry.AbsoluteExpirationRelativeToNow = TimeSpan.FromSeconds(CACHE_TTL); var getSecretResponse = _client.GetFromJsonAsync>("/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(string path) { + public T Refresh(string path) + { _cache.Remove(AppConstants.VAULT_CACHE_KEY); CACHE_TTL = _configuration.GetValue(AppEnvironmentVariables.VAULT_CACHE_TTL, 60 * 60 * 12); return Get(path); } - public async Task RenewTokenAsync(string token) { + public async Task RenewTokenAsync(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(); } 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(AppEnvironmentVariables.MAIN_CONFIG_SHEET); var result = Get(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(AppEnvironmentVariables.MAIN_CONFIG_SHEET); return Refresh(path); } diff --git a/code/app/src/lib/models/internal/ErrorResult.ts b/code/app/src/lib/models/internal/ErrorResult.ts deleted file mode 100644 index 930b9f3..0000000 --- a/code/app/src/lib/models/internal/ErrorResult.ts +++ /dev/null @@ -1,4 +0,0 @@ -export type ErrorResult = { - title: string, - text: string -} diff --git a/sql/quartz-create.sql b/sql/quartz-create.sql deleted file mode 100644 index d0dc298..0000000 --- a/sql/quartz-create.sql +++ /dev/null @@ -1,156 +0,0 @@ -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/sql/quartz-drop.sql b/sql/quartz-drop.sql deleted file mode 100644 index 87b0797..0000000 --- a/sql/quartz-drop.sql +++ /dev/null @@ -1,23 +0,0 @@ -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; -- cgit v1.3