Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 14 additions & 0 deletions db/migration/V0008__Create_magic_link_tokens_table.sql
Original file line number Diff line number Diff line change
@@ -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,

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do we have any logic to delete these anywhere? Doesn't have to be now but having a bunch of single use tokens clogging the DB is not ideal.

May also be helpful to have expiry be an index as well so we can easily have some cleanup job that runs on however many expired tokens.

consumed_at TIMESTAMPTZ,
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
26 changes: 26 additions & 0 deletions db/migration/V0009__Create_spring_session_tables.sql
Original file line number Diff line number Diff line change
@@ -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
);
Loading