mirror of
https://github.com/Sendouc/sendou.ink.git
synced 2026-04-30 11:17:12 -05:00
38 lines
1.0 KiB
TypeScript
38 lines
1.0 KiB
TypeScript
import { add } from "date-fns";
|
|
import { nanoid } from "nanoid";
|
|
import { db } from "~/db/sql";
|
|
import { databaseTimestampNow, dateToDatabaseTimestamp } from "~/utils/dates";
|
|
|
|
const LOG_IN_LINK_LENGTH = 12;
|
|
const LOG_IN_LINK_VALID_FOR_MINUTES = 10;
|
|
|
|
/** Creates a new login link for a user with 10-minute expiration */
|
|
export function create(userId: number) {
|
|
return db
|
|
.insertInto("LogInLink")
|
|
.values({
|
|
code: nanoid(LOG_IN_LINK_LENGTH),
|
|
expiresAt: dateToDatabaseTimestamp(
|
|
add(new Date(), { minutes: LOG_IN_LINK_VALID_FOR_MINUTES }),
|
|
),
|
|
userId,
|
|
})
|
|
.returningAll()
|
|
.executeTakeFirstOrThrow();
|
|
}
|
|
|
|
/** Deletes a login link by its code */
|
|
export function del(code: string) {
|
|
return db.deleteFrom("LogInLink").where("code", "=", code).execute();
|
|
}
|
|
|
|
/** Finds a valid (non-expired) login link by code, returns userId if valid */
|
|
export function findValidByCode(code: string) {
|
|
return db
|
|
.selectFrom("LogInLink")
|
|
.select("userId")
|
|
.where("code", "=", code)
|
|
.where("expiresAt", ">", databaseTimestampNow())
|
|
.executeTakeFirst();
|
|
}
|