91 lines
1.9 KiB
JavaScript
91 lines
1.9 KiB
JavaScript
import { pool } from '../db.js';
|
|
|
|
export async function createAuthSession({
|
|
userId,
|
|
refreshTokenHash,
|
|
csrfTokenHash,
|
|
userAgent,
|
|
ipAddress,
|
|
expiresAt,
|
|
}) {
|
|
const sql = `
|
|
INSERT INTO uno_bff.auth_sessions
|
|
(
|
|
user_id,
|
|
refresh_token_hash,
|
|
csrf_token_hash,
|
|
status,
|
|
user_agent,
|
|
ip_address,
|
|
expires_at,
|
|
last_seen_at
|
|
)
|
|
VALUES
|
|
(
|
|
$1, $2, $3, 'active', $4, $5, $6, now()
|
|
)
|
|
RETURNING
|
|
id,
|
|
user_id,
|
|
refresh_token_hash,
|
|
csrf_token_hash,
|
|
status,
|
|
user_agent,
|
|
ip_address,
|
|
expires_at,
|
|
last_seen_at,
|
|
revoked_at,
|
|
created_at,
|
|
updated_at
|
|
`;
|
|
|
|
const params = [
|
|
userId,
|
|
refreshTokenHash,
|
|
csrfTokenHash,
|
|
userAgent || null,
|
|
ipAddress || null,
|
|
expiresAt,
|
|
];
|
|
|
|
const { rows } = await pool.query(sql, params);
|
|
return rows[0];
|
|
}
|
|
|
|
export async function revokeSession(sessionId) {
|
|
const sql = `
|
|
UPDATE uno_bff.auth_sessions
|
|
SET
|
|
status = 'revoked',
|
|
revoked_at = now(),
|
|
updated_at = now()
|
|
WHERE id = $1
|
|
AND status = 'active'
|
|
`;
|
|
|
|
await pool.query(sql, [sessionId]);
|
|
}
|
|
|
|
export async function getAuthSession(sessionId) {
|
|
const sql = `
|
|
SELECT id, user_id, refresh_token_hash, csrf_token_hash, status, expires_at
|
|
FROM uno_bff.auth_sessions
|
|
WHERE id = $1 AND status = 'active' AND expires_at > now()
|
|
`;
|
|
const result = await pool.query(sql, [sessionId]);
|
|
return result.rows[0] || null;
|
|
}
|
|
|
|
export async function rotateSessionTokens(sessionId, newRefreshTokenHash, newCsrfTokenHash) {
|
|
const sql = `
|
|
UPDATE uno_bff.auth_sessions
|
|
SET
|
|
refresh_token_hash = $2,
|
|
csrf_token_hash = $3,
|
|
updated_at = now()
|
|
WHERE id = $1 AND status = 'active'
|
|
RETURNING id, user_id
|
|
`;
|
|
const result = await pool.query(sql, [sessionId, newRefreshTokenHash, newCsrfTokenHash]);
|
|
return result.rows[0] || null;
|
|
} |