diff --git a/db/migration/V0008__Create_magic_link_tokens_table.sql b/db/migration/V0008__Create_magic_link_tokens_table.sql new file mode 100644 index 0000000..9d3dea0 --- /dev/null +++ b/db/migration/V0008__Create_magic_link_tokens_table.sql @@ -0,0 +1,14 @@ +-- Single-use sign-in tokens emailed to users. Keyed by email (not member id) +-- because the member row is only created once the link is verified. +-- Lookups only ever happen by token_hash, which the UNIQUE constraint already +-- indexes; email is read out, never searched on, so it needs no index of its own. +-- For the same reason the surrogate key is a throwaway identity int rather than a +-- UUID: nothing ever reads it back, so it only has to be unique, not meaningful. +CREATE TABLE IF NOT EXISTS "magic_link_tokens" ( + id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY, + email TEXT NOT NULL, + token_hash TEXT UNIQUE NOT NULL, + expires_at TIMESTAMPTZ NOT NULL, + consumed_at TIMESTAMPTZ, + created_at TIMESTAMPTZ NOT NULL DEFAULT NOW() +); diff --git a/db/migration/V0009__Create_spring_session_tables.sql b/db/migration/V0009__Create_spring_session_tables.sql new file mode 100644 index 0000000..e3d5702 --- /dev/null +++ b/db/migration/V0009__Create_spring_session_tables.sql @@ -0,0 +1,26 @@ +-- Spring Session JDBC schema, copied verbatim from spring-session-jdbc's +-- org/springframework/session/jdbc/schema-postgresql.sql so Flyway owns it +-- (spring.session.jdbc.initialize-schema is set to "never" in application.yml). +CREATE TABLE SPRING_SESSION ( + PRIMARY_ID CHAR(36) NOT NULL, + SESSION_ID CHAR(36) NOT NULL, + CREATION_TIME BIGINT NOT NULL, + LAST_ACCESS_TIME BIGINT NOT NULL, + MAX_INACTIVE_INTERVAL INT NOT NULL, + EXPIRY_TIME BIGINT NOT NULL, + PRINCIPAL_NAME VARCHAR(100), + CONSTRAINT SPRING_SESSION_PK PRIMARY KEY (PRIMARY_ID) +); + +CREATE UNIQUE INDEX SPRING_SESSION_IX1 ON SPRING_SESSION (SESSION_ID); +CREATE INDEX SPRING_SESSION_IX2 ON SPRING_SESSION (EXPIRY_TIME); +CREATE INDEX SPRING_SESSION_IX3 ON SPRING_SESSION (PRINCIPAL_NAME); + +CREATE TABLE SPRING_SESSION_ATTRIBUTES ( + SESSION_PRIMARY_ID CHAR(36) NOT NULL, + ATTRIBUTE_NAME VARCHAR(200) NOT NULL, + ATTRIBUTE_BYTES BYTEA NOT NULL, + CONSTRAINT SPRING_SESSION_ATTRIBUTES_PK PRIMARY KEY (SESSION_PRIMARY_ID, ATTRIBUTE_NAME), + CONSTRAINT SPRING_SESSION_ATTRIBUTES_FK FOREIGN KEY (SESSION_PRIMARY_ID) + REFERENCES SPRING_SESSION (PRIMARY_ID) ON DELETE CASCADE +);