-- +goose Up CREATE TABLE IF NOT EXISTS user_auth ( id TEXT PRIMARY KEY DEFAULT gen_random_uuid()::text, username TEXT NOT NULL UNIQUE, email TEXT NOT NULL UNIQUE, password_hash TEXT NOT NULL, created_at TIMESTAMPTZ NOT NULL DEFAULT now(), updated_at TIMESTAMPTZ NOT NULL DEFAULT now() ); -- created_at is Unix seconds, not a timestamp: internal/auth/session.go writes -- now.Unix() and scans the column straight into an int64. CREATE TABLE IF NOT EXISTS user_session ( id TEXT PRIMARY KEY, secret_hash BYTEA NOT NULL, user_id TEXT NOT NULL REFERENCES user_auth (id) ON DELETE CASCADE, created_at BIGINT NOT NULL ); CREATE INDEX IF NOT EXISTS idx_user_session_user_id ON user_session (user_id); -- +goose StatementBegin CREATE FUNCTION set_updated_at() RETURNS trigger AS $$ BEGIN NEW.updated_at = now(); RETURN NEW; END; $$ LANGUAGE plpgsql; -- +goose StatementEnd CREATE TRIGGER user_auth_set_updated_at BEFORE UPDATE ON user_auth FOR EACH ROW EXECUTE FUNCTION set_updated_at(); -- +goose Down DROP TRIGGER IF EXISTS user_auth_set_updated_at ON user_auth; DROP FUNCTION IF EXISTS set_updated_at(); DROP TABLE IF EXISTS user_session; DROP TABLE IF EXISTS user_auth;