-- Replay-Schutz fuer Refresh-Tokens (Pentest R164-02).
--
-- Die bisherige Rotation bot keinen Replay-Schutz: der alte Token blieb bis exp
-- gueltig (7 Tage), ein gestohlener Token war also parallel zum legitimen
-- nutzbar. Jetzt traegt jeder Refresh-Token eine jti und gehoert zu einer
-- Sitzungsfamilie; beim Einloesen wird die jti verbraucht. Taucht sie erneut
-- auf, wird die gesamte Familie widerrufen und der Vorfall gemeldet.
CREATE TABLE IF NOT EXISTS `RefreshTokenRecord` (
  `id`               INT NOT NULL AUTO_INCREMENT,
  `jti`              VARCHAR(191) NOT NULL,
  `familyId`         VARCHAR(191) NOT NULL,
  `userId`           INT NULL,
  `customerId`       INT NULL,
  `isCustomerPortal` TINYINT(1) NOT NULL DEFAULT 0,
  `issuedAt`         DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
  `expiresAt`        DATETIME(3) NOT NULL,
  `usedAt`           DATETIME(3) NULL,
  `replacedByJti`    VARCHAR(191) NULL,
  `reuseCount`       INT NOT NULL DEFAULT 0,
  `revokedAt`        DATETIME(3) NULL,
  `revokedReason`    VARCHAR(191) NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `RefreshTokenRecord_jti_key` (`jti`),
  KEY `RefreshTokenRecord_familyId_idx` (`familyId`),
  KEY `RefreshTokenRecord_expiresAt_idx` (`expiresAt`),
  KEY `RefreshTokenRecord_userId_idx` (`userId`),
  KEY `RefreshTokenRecord_customerId_idx` (`customerId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
