From 1220fb52850a6fcc789bff1b9c8141f27db484d0 Mon Sep 17 00:00:00 2001 From: grimsi <9295182+grimsi@users.noreply.github.com> Date: Mon, 29 Sep 2025 13:52:46 +0200 Subject: [PATCH] Add Flyway Add baseline schema Add v2.1.0 db migration --- app/build.gradle.kts | 1 + app/src/main/resources/application.yml | 5 +- .../V2.0.0__Initial_schema_creation.sql | 349 ++++++++++++++++++ ...e_image_uniques_and_rename_constraints.sql | 122 ++++++ 4 files changed, 476 insertions(+), 1 deletion(-) create mode 100644 app/src/main/resources/db/migration/V2.0.0__Initial_schema_creation.sql create mode 100644 app/src/main/resources/db/migration/V2.1.0__Drop_game_image_uniques_and_rename_constraints.sql diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 54760e4..306f01e 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -54,6 +54,7 @@ dependencies { // Persistence & I/O implementation("org.springframework.boot:spring-boot-starter-data-jpa") implementation("com.github.paulcwarren:spring-content-fs-boot-starter:3.0.17") + implementation("org.flywaydb:flyway-core") implementation("commons-io:commons-io:2.18.0") // SSO diff --git a/app/src/main/resources/application.yml b/app/src/main/resources/application.yml index 33e4b67..29374e8 100644 --- a/app/src/main/resources/application.yml +++ b/app/src/main/resources/application.yml @@ -31,7 +31,7 @@ spring: jpa: # defer-datasource-initialization: true hibernate: - ddl-auto: update + ddl-auto: validate open-in-view: true mustache: check-template-location: false @@ -50,6 +50,9 @@ spring: virtual.enabled: true mvc: async.request-timeout: 0 + flyway: + baseline-on-migrate: true + baseline-version: 2.0.0 vaadin: # To improve the performance during development. diff --git a/app/src/main/resources/db/migration/V2.0.0__Initial_schema_creation.sql b/app/src/main/resources/db/migration/V2.0.0__Initial_schema_creation.sql new file mode 100644 index 0000000..b9c7c17 --- /dev/null +++ b/app/src/main/resources/db/migration/V2.0.0__Initial_schema_creation.sql @@ -0,0 +1,349 @@ +-- Flyway Migration: V2.0.0 +-- Purpose: Initial schema creation for Gameyfin application. + +/****************************************************************************************** + * 1. Sequences (hi/lo allocation size = 50 for performance) + ******************************************************************************************/ +create sequence COMPANY_SEQ + increment by 50; + +create sequence DIRECTORY_MAPPING_SEQ + increment by 50; + +create sequence GAME_FIELD_METADATA_SEQ + increment by 50; + +create sequence GAME_FIELD_SOURCE_SEQ + increment by 50; + +create sequence GAME_SEQ + increment by 50; + +create sequence IMAGE_SEQ + increment by 50; + +create sequence LIBRARY_SEQ + increment by 50; + +create sequence USERS_SEQ + increment by 50; + +/****************************************************************************************** + * 2. Tables + ******************************************************************************************/ +create table APP_CONFIG +( + "key" CHARACTER VARYING(255) not null + primary key, + "value" CHARACTER VARYING(255) +); + +create table COMPANY +( + ID BIGINT not null + primary key, + NAME CHARACTER VARYING(255), + TYPE TINYINT, + constraint UK4UCNYHR8I0URHWDUDFAHKOB9E + unique (NAME, TYPE), + check ("TYPE" BETWEEN 0 AND 1) +); + +create table DIRECTORY_MAPPING +( + ID BIGINT not null + primary key, + EXTERNAL_PATH CHARACTER VARYING(255), + INTERNAL_PATH CHARACTER VARYING(255) + constraint UKJ3GSATFAHEWFOLSEAJ29O3KYT + unique +); + +create table IMAGE +( + ID BIGINT not null + primary key, + CONTENT_ID CHARACTER VARYING(255), + CONTENT_LENGTH BIGINT, + MIME_TYPE CHARACTER VARYING(255), + ORIGINAL_URL CHARACTER VARYING(255), + TYPE TINYINT, + check ("TYPE" BETWEEN 0 AND 3) +); + +create table LIBRARY +( + ID BIGINT not null + primary key, + CREATED_AT TIMESTAMP WITH TIME ZONE not null, + NAME CHARACTER VARYING(255), + UPDATED_AT TIMESTAMP WITH TIME ZONE not null +); + +create table GAME +( + ID BIGINT not null + primary key, + COMMENT CHARACTER LARGE OBJECT, + CREATED_AT TIMESTAMP WITH TIME ZONE not null, + CRITIC_RATING INTEGER, + DOWNLOAD_COUNT INTEGER, + FILE_SIZE BIGINT, + MATCH_CONFIRMED BOOLEAN, + PATH CHARACTER VARYING(255) + constraint UK4WXN9FPXFQ8QXPSB7FY0O3NOA + unique, + RELEASE TIMESTAMP WITH TIME ZONE, + SUMMARY CHARACTER LARGE OBJECT, + TITLE CHARACTER VARYING(255), + UPDATED_AT TIMESTAMP WITH TIME ZONE not null, + USER_RATING INTEGER, + COVER_IMAGE_ID BIGINT + constraint UK52RQ62FLPBNTI77BYKM7UAHKQ + unique, + HEADER_IMAGE_ID BIGINT + constraint UK30B16LLQV54H40XIOGP7T9P35 + unique, + LIBRARY_ID BIGINT, + constraint FK6CVB43REAYSNYPI0XDY6HQTVF + foreign key (COVER_IMAGE_ID) references IMAGE, + constraint FK8N86NDPGKMOO7YOLX6HL8N84G + foreign key (HEADER_IMAGE_ID) references IMAGE, + constraint FKIUVR8XFB63T1K6T43EYYXVO2C + foreign key (LIBRARY_ID) references LIBRARY +); + +create table GAME_DEVELOPERS +( + GAME_ID BIGINT not null, + DEVELOPERS_ID BIGINT not null, + constraint FKB12PO9L2B9OJBAIHC82MM2QXB + foreign key (DEVELOPERS_ID) references COMPANY, + constraint FKS4IJSVPIJ53DSL143XVRGBS09 + foreign key (GAME_ID) references GAME +); + +create table GAME_FEATURES +( + GAME_ID BIGINT not null, + FEATURES TINYINT, + constraint FK63XLTCT60SCIMPM06K8BHBE4A + foreign key (GAME_ID) references GAME, + check ("FEATURES" BETWEEN 0 AND 23) +); + +create table GAME_GENRES +( + GAME_ID BIGINT not null, + GENRES TINYINT, + constraint FKDTSX09YOPD98E0LUEWRUSJD9E + foreign key (GAME_ID) references GAME, + check ("GENRES" BETWEEN 0 AND 25) +); + +create table GAME_IMAGES +( + GAME_ID BIGINT not null, + IMAGES_ID BIGINT not null + constraint UKBDE7M3TKHIEEYBINM2ED0B6X1 + unique, + constraint FK5YWV1DMXCM2VSQUEB7RHQ3JK9 + foreign key (IMAGES_ID) references IMAGE, + constraint FKOWCPUCV45OX8GT28TXGVHF1AA + foreign key (GAME_ID) references GAME +); + +create table GAME_KEYWORDS +( + GAME_ID BIGINT not null, + KEYWORDS CHARACTER VARYING(255), + constraint FKMVF6HNJ7ROMQQM2EX70A9NVAC + foreign key (GAME_ID) references GAME +); + +create table GAME_PERSPECTIVES +( + GAME_ID BIGINT not null, + PERSPECTIVES TINYINT, + constraint FKHUEENG29Y1GHBRDI5QHGUXH6E + foreign key (GAME_ID) references GAME, + check ("PERSPECTIVES" BETWEEN 0 AND 7) +); + +create table GAME_PUBLISHERS +( + GAME_ID BIGINT not null, + PUBLISHERS_ID BIGINT not null, + constraint FK49R2KB61LIJ54BQB4VNTST97N + foreign key (GAME_ID) references GAME, + constraint FKNGLD5ESGRBRH95J5BJF0HEF85 + foreign key (PUBLISHERS_ID) references COMPANY +); + +create table GAME_THEMES +( + GAME_ID BIGINT not null, + THEMES TINYINT, + constraint FKRV351JXLIOY0A17Y5BBJJ6FW4 + foreign key (GAME_ID) references GAME, + check ("THEMES" BETWEEN 0 AND 22) +); + +create table GAME_VIDEO_URLS +( + GAME_ID BIGINT not null, + VIDEO_URLS BINARY VARYING(255), + constraint FKJKKWO8WDS086AS7B2KSLSVKM6 + foreign key (GAME_ID) references GAME +); + +create table LIBRARY_DIRECTORIES +( + LIBRARY_ID BIGINT not null, + DIRECTORIES_ID BIGINT not null + constraint UKB5UM4CADBNC6UC8DVOMO81N5F + unique, + constraint FKFNCKIU58I9L89MLXV388DY13B + foreign key (LIBRARY_ID) references LIBRARY, + constraint FKJDXS58Q1IRTU0IDP6DXJHWAPM + foreign key (DIRECTORIES_ID) references DIRECTORY_MAPPING +); + +create table LIBRARY_GAMES +( + LIBRARY_ID BIGINT not null, + GAMES_ID BIGINT not null + constraint UK3E4VB9NQXPY27VMTA27GU5FY8 + unique, + constraint FK6C71EEDM0I2N1JXDE9BOBWG5M + foreign key (LIBRARY_ID) references LIBRARY, + constraint FKDKKKES3DAY0WJ1QMV42KMMFDK + foreign key (GAMES_ID) references GAME +); + +create table LIBRARY_UNMATCHED_PATHS +( + LIBRARY_ID BIGINT not null, + UNMATCHED_PATHS CHARACTER VARYING(255), + constraint FKSJ51WC2LBNNXY0LKLWELI6VSB + foreign key (LIBRARY_ID) references LIBRARY +); + +create table PLUGIN_CONFIG +( + "key" CHARACTER VARYING(255) not null, + PLUGIN_ID CHARACTER VARYING(255) not null, + "value" CHARACTER VARYING(255), + primary key ("key", PLUGIN_ID) +); + +create table PLUGIN_MANAGEMENT_ENTRY +( + PLUGIN_ID CHARACTER VARYING(255) not null + primary key, + ENABLED BOOLEAN not null, + PRIORITY INTEGER not null, + TRUST_LEVEL TINYINT, + check ("TRUST_LEVEL" BETWEEN 0 AND 4) +); + +create table GAME_ORIGINAL_IDS +( + GAME_ID BIGINT not null, + ORIGINAL_IDS CHARACTER VARYING(255), + ORIGINAL_IDS_KEY CHARACTER VARYING(255) not null, + primary key (GAME_ID, ORIGINAL_IDS_KEY), + constraint FK1CSD5QD7VJT7BTTA3G7HGYBUX + foreign key (GAME_ID) references GAME, + constraint FKMT0XWLPWPU9NP0Q289JBAHJRY + foreign key (ORIGINAL_IDS_KEY) references PLUGIN_MANAGEMENT_ENTRY +); + +create table USERS +( + ID BIGINT not null + primary key, + EMAIL CHARACTER VARYING(255) + constraint UK6DOTKOTT2KJSP8VW4D0M25FB7 + unique, + EMAIL_CONFIRMED BOOLEAN not null, + ENABLED BOOLEAN not null, + OIDC_PROVIDER_ID CHARACTER VARYING(255), + PASSWORD CHARACTER VARYING(255), + USERNAME CHARACTER VARYING(255) + constraint UKR43AF9AP4EDM43MMTQ01ODDJ6 + unique, + AVATAR_ID BIGINT + constraint UKRSULCN2GYNJY3CDDPWMOSV881 + unique, + constraint FK19LFLPG5SEIS4DWRM2LVJLXFV + foreign key (AVATAR_ID) references IMAGE +); + +create table GAME_FIELD_SOURCE +( + DTYPE CHARACTER VARYING(31) not null, + ID BIGINT not null + primary key, + PLUGIN_PLUGIN_ID CHARACTER VARYING(255), + USER_ID BIGINT, + constraint FKNJC4QSS5APFHTPWP42OAEAL5G + foreign key (PLUGIN_PLUGIN_ID) references PLUGIN_MANAGEMENT_ENTRY, + constraint FKSR1BGTX5XJVMAL7FEFGL982TP + foreign key (USER_ID) references USERS +); + +create table GAME_FIELD_METADATA +( + ID BIGINT not null + primary key, + UPDATED_AT TIMESTAMP WITH TIME ZONE, + SOURCE_ID BIGINT + constraint UKHW6U2Y9FLWPTI57QB7K0P27BL + unique, + constraint FKQ4RC409TP8FUBTTM733PMJD8F + foreign key (SOURCE_ID) references GAME_FIELD_SOURCE +); + +create table GAME_FIELDS +( + GAME_ID BIGINT not null, + FIELDS_ID BIGINT not null + constraint UK1L5OAH0UOOUV4V5A9P0PAK77X + unique, + FIELDS_KEY CHARACTER VARYING(255) not null, + primary key (GAME_ID, FIELDS_KEY), + constraint FKLNEPI7YWCI86YH21KO9WD9PYF + foreign key (GAME_ID) references GAME, + constraint FKT8FLOFDAPX5M746S5LW54C5B3 + foreign key (FIELDS_ID) references GAME_FIELD_METADATA +); + +create table TOKEN +( + SECRET CHARACTER VARYING(255) not null + primary key, + CREATED_ON TIMESTAMP WITH TIME ZONE, + PAYLOAD CHARACTER VARYING(255), + TYPE CHARACTER VARYING(255), + CREATOR_ID BIGINT, + constraint FKGHOIALAPTI5JFEJ506JBB1O8Y + foreign key (CREATOR_ID) references USERS + on delete cascade +); + +create table USER_PREFERENCE +( + "key" CHARACTER VARYING(255) not null, + USER_ID BIGINT not null, + "value" CHARACTER VARYING(255), + primary key ("key", USER_ID) +); + +create table USER_ROLES +( + USER_ID BIGINT not null, + ROLES ENUM ('ADMIN', 'SUPERADMIN', 'USER'), + constraint FKHFH9DX7W3UBF1CO1VDEV94G3F + foreign key (USER_ID) references USERS +); diff --git a/app/src/main/resources/db/migration/V2.1.0__Drop_game_image_uniques_and_rename_constraints.sql b/app/src/main/resources/db/migration/V2.1.0__Drop_game_image_uniques_and_rename_constraints.sql new file mode 100644 index 0000000..092f609 --- /dev/null +++ b/app/src/main/resources/db/migration/V2.1.0__Drop_game_image_uniques_and_rename_constraints.sql @@ -0,0 +1,122 @@ +-- Flyway Migration: V2.1.0 +-- Purpose: +-- 1. Drop unique constraints on GAME.COVER_IMAGE_ID and GAME.HEADER_IMAGE_ID +-- 2. Rename all remaining UK*/FK* constraints to human-readable names + +/****************************************************************************************** + * 1. Drop the two unwanted unique constraints on GAME + ******************************************************************************************/ +ALTER TABLE GAME + DROP CONSTRAINT UK52RQ62FLPBNTI77BYKM7UAHKQ; -- COVER_IMAGE_ID unique +ALTER TABLE GAME + DROP CONSTRAINT UK30B16LLQV54H40XIOGP7T9P35; +-- HEADER_IMAGE_ID unique + +/****************************************************************************************** + * 2. Rename remaining UNIQUE constraints (UK*) + ******************************************************************************************/ +ALTER TABLE COMPANY + RENAME CONSTRAINT UK4UCNYHR8I0URHWDUDFAHKOB9E TO UQ_COMPANY_NAME_TYPE; +ALTER TABLE DIRECTORY_MAPPING + RENAME CONSTRAINT UKJ3GSATFAHEWFOLSEAJ29O3KYT TO UQ_DIRECTORY_MAPPING_INTERNAL_PATH; +ALTER TABLE GAME + RENAME CONSTRAINT UK4WXN9FPXFQ8QXPSB7FY0O3NOA TO UQ_GAME_PATH; +ALTER TABLE GAME_IMAGES + RENAME CONSTRAINT UKBDE7M3TKHIEEYBINM2ED0B6X1 TO UQ_GAME_IMAGES_IMAGE_ID; +ALTER TABLE LIBRARY_DIRECTORIES + RENAME CONSTRAINT UKB5UM4CADBNC6UC8DVOMO81N5F TO UQ_LIBRARY_DIRECTORIES_DIRECTORY_ID; +ALTER TABLE LIBRARY_GAMES + RENAME CONSTRAINT UK3E4VB9NQXPY27VMTA27GU5FY8 TO UQ_LIBRARY_GAMES_GAME_ID; +ALTER TABLE USERS + RENAME CONSTRAINT UK6DOTKOTT2KJSP8VW4D0M25FB7 TO UQ_USERS_EMAIL; +ALTER TABLE USERS + RENAME CONSTRAINT UKR43AF9AP4EDM43MMTQ01ODDJ6 TO UQ_USERS_USERNAME; +ALTER TABLE USERS + RENAME CONSTRAINT UKRSULCN2GYNJY3CDDPWMOSV881 TO UQ_USERS_AVATAR_ID; +ALTER TABLE GAME_FIELD_METADATA + RENAME CONSTRAINT UKHW6U2Y9FLWPTI57QB7K0P27BL TO UQ_GAME_FIELD_METADATA_SOURCE_ID; +ALTER TABLE GAME_FIELDS + RENAME CONSTRAINT UK1L5OAH0UOOUV4V5A9P0PAK77X TO UQ_GAME_FIELDS_FIELD_METADATA_ID; + +/****************************************************************************************** + * 3. Rename FOREIGN KEY constraints (FK*) + ******************************************************************************************/ +ALTER TABLE GAME + RENAME CONSTRAINT FK6CVB43REAYSNYPI0XDY6HQTVF TO FK_GAME_COVER_IMAGE; +ALTER TABLE GAME + RENAME CONSTRAINT FK8N86NDPGKMOO7YOLX6HL8N84G TO FK_GAME_HEADER_IMAGE; +ALTER TABLE GAME + RENAME CONSTRAINT FKIUVR8XFB63T1K6T43EYYXVO2C TO FK_GAME_LIBRARY; + +ALTER TABLE GAME_DEVELOPERS + RENAME CONSTRAINT FKB12PO9L2B9OJBAIHC82MM2QXB TO FK_GAME_DEVELOPERS_COMPANY; +ALTER TABLE GAME_DEVELOPERS + RENAME CONSTRAINT FKS4IJSVPIJ53DSL143XVRGBS09 TO FK_GAME_DEVELOPERS_GAME; + +ALTER TABLE GAME_FEATURES + RENAME CONSTRAINT FK63XLTCT60SCIMPM06K8BHBE4A TO FK_GAME_FEATURES_GAME; +ALTER TABLE GAME_GENRES + RENAME CONSTRAINT FKDTSX09YOPD98E0LUEWRUSJD9E TO FK_GAME_GENRES_GAME; + +ALTER TABLE GAME_IMAGES + RENAME CONSTRAINT FK5YWV1DMXCM2VSQUEB7RHQ3JK9 TO FK_GAME_IMAGES_IMAGE; +ALTER TABLE GAME_IMAGES + RENAME CONSTRAINT FKOWCPUCV45OX8GT28TXGVHF1AA TO FK_GAME_IMAGES_GAME; + +ALTER TABLE GAME_KEYWORDS + RENAME CONSTRAINT FKMVF6HNJ7ROMQQM2EX70A9NVAC TO FK_GAME_KEYWORDS_GAME; +ALTER TABLE GAME_PERSPECTIVES + RENAME CONSTRAINT FKHUEENG29Y1GHBRDI5QHGUXH6E TO FK_GAME_PERSPECTIVES_GAME; + +ALTER TABLE GAME_PUBLISHERS + RENAME CONSTRAINT FK49R2KB61LIJ54BQB4VNTST97N TO FK_GAME_PUBLISHERS_GAME; +ALTER TABLE GAME_PUBLISHERS + RENAME CONSTRAINT FKNGLD5ESGRBRH95J5BJF0HEF85 TO FK_GAME_PUBLISHERS_COMPANY; + +ALTER TABLE GAME_THEMES + RENAME CONSTRAINT FKRV351JXLIOY0A17Y5BBJJ6FW4 TO FK_GAME_THEMES_GAME; +ALTER TABLE GAME_VIDEO_URLS + RENAME CONSTRAINT FKJKKWO8WDS086AS7B2KSLSVKM6 TO FK_GAME_VIDEO_URLS_GAME; + +ALTER TABLE LIBRARY_DIRECTORIES + RENAME CONSTRAINT FKFNCKIU58I9L89MLXV388DY13B TO FK_LIBRARY_DIRECTORIES_LIBRARY; +ALTER TABLE LIBRARY_DIRECTORIES + RENAME CONSTRAINT FKJDXS58Q1IRTU0IDP6DXJHWAPM TO FK_LIBRARY_DIRECTORIES_DIRECTORY_MAPPING; + +ALTER TABLE LIBRARY_GAMES + RENAME CONSTRAINT FK6C71EEDM0I2N1JXDE9BOBWG5M TO FK_LIBRARY_GAMES_LIBRARY; +ALTER TABLE LIBRARY_GAMES + RENAME CONSTRAINT FKDKKKES3DAY0WJ1QMV42KMMFDK TO FK_LIBRARY_GAMES_GAME; + +ALTER TABLE LIBRARY_UNMATCHED_PATHS + RENAME CONSTRAINT FKSJ51WC2LBNNXY0LKLWELI6VSB TO FK_LIBRARY_UNMATCHED_PATHS_LIBRARY; + +ALTER TABLE GAME_ORIGINAL_IDS + RENAME CONSTRAINT FK1CSD5QD7VJT7BTTA3G7HGYBUX TO FK_GAME_ORIGINAL_IDS_GAME; +ALTER TABLE GAME_ORIGINAL_IDS + RENAME CONSTRAINT FKMT0XWLPWPU9NP0Q289JBAHJRY TO FK_GAME_ORIGINAL_IDS_PLUGIN; + +ALTER TABLE USERS + RENAME CONSTRAINT FK19LFLPG5SEIS4DWRM2LVJLXFV TO FK_USERS_AVATAR_IMAGE; + +ALTER TABLE GAME_FIELD_SOURCE + RENAME CONSTRAINT FKNJC4QSS5APFHTPWP42OAEAL5G TO FK_GAME_FIELD_SOURCE_PLUGIN; +ALTER TABLE GAME_FIELD_SOURCE + RENAME CONSTRAINT FKSR1BGTX5XJVMAL7FEFGL982TP TO FK_GAME_FIELD_SOURCE_USER; + +ALTER TABLE GAME_FIELD_METADATA + RENAME CONSTRAINT FKQ4RC409TP8FUBTTM733PMJD8F TO FK_GAME_FIELD_METADATA_SOURCE; + +ALTER TABLE GAME_FIELDS + RENAME CONSTRAINT FKLNEPI7YWCI86YH21KO9WD9PYF TO FK_GAME_FIELDS_GAME; +ALTER TABLE GAME_FIELDS + RENAME CONSTRAINT FKT8FLOFDAPX5M746S5LW54C5B3 TO FK_GAME_FIELDS_METADATA; + +ALTER TABLE TOKEN + RENAME CONSTRAINT FKGHOIALAPTI5JFEJ506JBB1O8Y TO FK_TOKEN_CREATOR_USER; + +ALTER TABLE USER_ROLES + RENAME CONSTRAINT FKHFH9DX7W3UBF1CO1VDEV94G3F TO FK_USER_ROLES_USER; + +-- End of migration +