From cdf1ec26c324ba8d6ed34d52a91cd6c4a726abba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20Kr=C3=BChlmann?= Date: Fri, 9 Jan 2026 19:47:59 +0100 Subject: [PATCH] Add migrations --- pom.xml | 6 + src/main/resources/application.yml | 9 +- src/main/resources/db/migration/V1__init.sql | 113 +++++++++++++++++++ 3 files changed, 126 insertions(+), 2 deletions(-) create mode 100644 src/main/resources/db/migration/V1__init.sql diff --git a/pom.xml b/pom.xml index 7884e80..e9874af 100644 --- a/pom.xml +++ b/pom.xml @@ -86,6 +86,12 @@ spring-session-jdbc + + org.flywaydb + flyway-core + 11.20.1 + + org.xerial sqlite-jdbc diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 11bb4a1..ab1b38c 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -29,12 +29,17 @@ spring: jpa: open-in-view: false hibernate: - ddl-auto: update + ddl-auto: validate database-platform: org.hibernate.community.dialect.SQLiteDialect + flyway: + enabled: true + locations: classpath:db/migration + baseline-on-migrate: true + baseline-version: 1 session: store-type: jdbc jdbc: - initialize-schema: always + initialize-schema: never platform: sqlite security: oauth2: diff --git a/src/main/resources/db/migration/V1__init.sql b/src/main/resources/db/migration/V1__init.sql new file mode 100644 index 0000000..09fb599 --- /dev/null +++ b/src/main/resources/db/migration/V1__init.sql @@ -0,0 +1,113 @@ +CREATE TABLE IF NOT EXISTS assets ( + id TEXT PRIMARY KEY, + broadcaster TEXT NOT NULL, + asset_type TEXT NOT NULL, + created_at TIMESTAMP NOT NULL, + updated_at TIMESTAMP NOT NULL +); + +CREATE TABLE IF NOT EXISTS visual_assets ( + id TEXT PRIMARY KEY, + name TEXT NOT NULL, + preview TEXT, + x REAL NOT NULL, + y REAL NOT NULL, + width REAL NOT NULL, + height REAL NOT NULL, + rotation REAL NOT NULL, + speed REAL, + muted BOOLEAN, + media_type TEXT, + original_media_type TEXT, + z_index INTEGER, + audio_volume REAL, + hidden BOOLEAN NOT NULL +); + +CREATE TABLE IF NOT EXISTS audio_assets ( + id TEXT PRIMARY KEY, + name TEXT NOT NULL, + media_type TEXT, + original_media_type TEXT, + audio_loop BOOLEAN, + audio_delay_millis INTEGER, + audio_speed REAL, + audio_pitch REAL, + audio_volume REAL, + hidden BOOLEAN NOT NULL +); + +CREATE TABLE IF NOT EXISTS script_assets ( + id TEXT PRIMARY KEY, + name TEXT NOT NULL, + media_type TEXT, + original_media_type TEXT +); + +CREATE TABLE IF NOT EXISTS script_asset_attachments ( + id TEXT PRIMARY KEY, + script_asset_id TEXT NOT NULL, + name TEXT NOT NULL, + media_type TEXT, + original_media_type TEXT, + asset_type TEXT NOT NULL +); + +CREATE TABLE IF NOT EXISTS channels ( + broadcaster TEXT PRIMARY KEY, + canvas_width REAL NOT NULL, + canvas_height REAL NOT NULL, + created_at TIMESTAMP NOT NULL, + updated_at TIMESTAMP NOT NULL +); + +CREATE TABLE IF NOT EXISTS channel_admins ( + channel_id TEXT NOT NULL, + admin_username TEXT NOT NULL, + PRIMARY KEY (channel_id, admin_username), + FOREIGN KEY (channel_id) REFERENCES channels(broadcaster) ON DELETE CASCADE +); + +CREATE TABLE IF NOT EXISTS settings ( + id INTEGER PRIMARY KEY, + min_asset_playback_speed_fraction REAL NOT NULL, + max_asset_playback_speed_fraction REAL NOT NULL, + min_asset_audio_pitch_fraction REAL NOT NULL, + max_asset_audio_pitch_fraction REAL NOT NULL, + min_asset_volume_fraction REAL NOT NULL, + max_asset_volume_fraction REAL NOT NULL, + max_canvas_side_length_pixels INTEGER NOT NULL, + canvas_frames_per_second INTEGER NOT NULL, + created_at TIMESTAMP NOT NULL, + updated_at TIMESTAMP NOT NULL +); + +CREATE TABLE IF NOT EXISTS system_administrators ( + id TEXT PRIMARY KEY, + twitch_username TEXT NOT NULL UNIQUE, + created_at TIMESTAMP NOT NULL, + updated_at TIMESTAMP NOT NULL +); + +CREATE TABLE IF NOT EXISTS spring_session ( + primary_id TEXT NOT NULL, + session_id TEXT NOT NULL, + creation_time INTEGER NOT NULL, + last_access_time INTEGER NOT NULL, + max_inactive_interval INTEGER NOT NULL, + expiry_time INTEGER NOT NULL, + principal_name TEXT, + PRIMARY KEY (primary_id) +); + +CREATE UNIQUE INDEX IF NOT EXISTS spring_session_ix1 ON spring_session (session_id); +CREATE INDEX IF NOT EXISTS spring_session_ix2 ON spring_session (expiry_time); +CREATE INDEX IF NOT EXISTS spring_session_ix3 ON spring_session (principal_name); + +CREATE TABLE IF NOT EXISTS spring_session_attributes ( + session_primary_id TEXT NOT NULL, + attribute_name TEXT NOT NULL, + attribute_bytes BLOB NOT NULL, + PRIMARY KEY (session_primary_id, attribute_name), + FOREIGN KEY (session_primary_id) REFERENCES spring_session(primary_id) ON DELETE CASCADE +);