diff --git a/src/main/resources/application-postgres.yml b/src/main/resources/application-postgres.yml new file mode 100644 index 0000000..223718f --- /dev/null +++ b/src/main/resources/application-postgres.yml @@ -0,0 +1,10 @@ +spring: + datasource: + url: ${SLOTLINE_DB_URL:jdbc:postgresql://localhost:5432/slotline} + username: ${SLOTLINE_DB_USERNAME:slotline} + password: ${SLOTLINE_DB_PASSWORD:slotline} + driver-class-name: org.postgresql.Driver + jpa: + properties: + hibernate: + dialect: org.hibernate.dialect.PostgreSQLDialect diff --git a/src/main/resources/db/migration/h2/V1__init.sql b/src/main/resources/db/migration/h2/V1__init.sql new file mode 100644 index 0000000..bd91eb2 --- /dev/null +++ b/src/main/resources/db/migration/h2/V1__init.sql @@ -0,0 +1,32 @@ +CREATE TABLE app_user ( + id BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, + username VARCHAR(64) NOT NULL, + password_hash VARCHAR(100) NOT NULL, + role VARCHAR(16) NOT NULL, + created_at TIMESTAMP NOT NULL, + CONSTRAINT uq_app_user_username UNIQUE (username) +); + +CREATE TABLE resource ( + id BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, + name VARCHAR(128) NOT NULL, + description VARCHAR(512), + created_at TIMESTAMP NOT NULL, + version BIGINT NOT NULL DEFAULT 0 +); + +CREATE TABLE reservation ( + id BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, + resource_id BIGINT NOT NULL, + user_id BIGINT NOT NULL, + start_time TIMESTAMP NOT NULL, + end_time TIMESTAMP NOT NULL, + status VARCHAR(16) NOT NULL, + created_at TIMESTAMP NOT NULL, + version BIGINT NOT NULL DEFAULT 0, + CONSTRAINT fk_reservation_resource FOREIGN KEY (resource_id) REFERENCES resource (id), + CONSTRAINT fk_reservation_user FOREIGN KEY (user_id) REFERENCES app_user (id) +); + +CREATE INDEX idx_reservation_resource_status ON reservation (resource_id, status); +CREATE INDEX idx_reservation_user ON reservation (user_id); diff --git a/src/main/resources/db/migration/postgresql/V1__init.sql b/src/main/resources/db/migration/postgresql/V1__init.sql new file mode 100644 index 0000000..753360a --- /dev/null +++ b/src/main/resources/db/migration/postgresql/V1__init.sql @@ -0,0 +1,36 @@ +CREATE TABLE app_user ( + id BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, + username VARCHAR(64) NOT NULL, + password_hash VARCHAR(100) NOT NULL, + role VARCHAR(16) NOT NULL, + created_at TIMESTAMPTZ NOT NULL, + CONSTRAINT uq_app_user_username UNIQUE (username) +); + +CREATE TABLE resource ( + id BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, + name VARCHAR(128) NOT NULL, + description VARCHAR(512), + created_at TIMESTAMPTZ NOT NULL, + version BIGINT NOT NULL DEFAULT 0 +); + +CREATE TABLE reservation ( + id BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, + resource_id BIGINT NOT NULL, + user_id BIGINT NOT NULL, + start_time TIMESTAMPTZ NOT NULL, + end_time TIMESTAMPTZ NOT NULL, + status VARCHAR(16) NOT NULL, + created_at TIMESTAMPTZ NOT NULL, + version BIGINT NOT NULL DEFAULT 0, + CONSTRAINT fk_reservation_resource FOREIGN KEY (resource_id) REFERENCES resource (id), + CONSTRAINT fk_reservation_user FOREIGN KEY (user_id) REFERENCES app_user (id) +); + +CREATE INDEX idx_reservation_resource_status ON reservation (resource_id, status); +CREATE INDEX idx_reservation_user ON reservation (user_id); + +CREATE UNIQUE INDEX uq_reservation_active_slot + ON reservation (resource_id, start_time, end_time) + WHERE status = 'ACTIVE';