adds db.php
This commit is contained in:
@@ -0,0 +1,11 @@
|
||||
<?php namespace JoeacNet\Http\Config;
|
||||
|
||||
function dbScheme(): string|null
|
||||
{
|
||||
return (string) getenv("DB_SCHEME");
|
||||
}
|
||||
|
||||
function dbPath(): string|null
|
||||
{
|
||||
return (string) getenv("DB_PATH");
|
||||
}
|
||||
+205
@@ -0,0 +1,205 @@
|
||||
<?php namespace JoeacNet\Http\Db;
|
||||
|
||||
use JoeacNet\Http\Config;
|
||||
|
||||
use PDO;
|
||||
|
||||
require_once __DIR__ . "/config.php";
|
||||
|
||||
function connectDb(): PDO
|
||||
{
|
||||
$pdo = new PDO(Config\dbScheme() . ":" . Config\dbPath());
|
||||
$pdo = createTables($pdo);
|
||||
return $pdo;
|
||||
}
|
||||
|
||||
function createTables(PDO $pdo): PDO
|
||||
{
|
||||
$pdo->exec(
|
||||
<<<SQL
|
||||
CREATE TABLE IF NOT EXISTS otp (
|
||||
userId TEXT NOT NULL,
|
||||
value TEXT NOT NULL,
|
||||
createdAtUnixSecs INTEGER NOT NULL,
|
||||
validUntilUnixSecs INTEGER NOT NULL
|
||||
);
|
||||
SQL
|
||||
,
|
||||
);
|
||||
|
||||
$pdo->exec(
|
||||
<<<SQL
|
||||
CREATE TABLE IF NOT EXISTS send_email_token (
|
||||
userId TEXT NOT NULL,
|
||||
value TEXT NOT NULL,
|
||||
createdAtUnixSecs INTEGER NOT NULL,
|
||||
validUntilUnixSecs INTEGER NOT NULL
|
||||
);
|
||||
SQL
|
||||
,
|
||||
);
|
||||
|
||||
$pdo->exec(
|
||||
<<<SQL
|
||||
CREATE TABLE IF NOT EXISTS sent_emails (
|
||||
messageId TEXT NOT NULL,
|
||||
sentAtUnixSecs INTEGER NOT NULL
|
||||
);
|
||||
SQL
|
||||
,
|
||||
);
|
||||
|
||||
return $pdo;
|
||||
}
|
||||
|
||||
function countEmailsSentLast24Hours(PDO $db): int
|
||||
{
|
||||
$twentyFourHoursAgo = time() - 24 * 60 * 60;
|
||||
return (int) $db
|
||||
->query(
|
||||
<<<SQL
|
||||
SELECT COUNT(*) as count
|
||||
FROM sent_emails
|
||||
WHERE sentAtUnixSecs >= $twentyFourHoursAgo;
|
||||
SQL
|
||||
,
|
||||
)
|
||||
->fetchColumn(0);
|
||||
}
|
||||
|
||||
function insertSendEmailToken(PDO $db, string $userId, string $token)
|
||||
{
|
||||
$createdAtUnixSecs = time();
|
||||
$validUntilUnixSecs = $createdAtUnixSecs + 60;
|
||||
$db
|
||||
->prepare(
|
||||
<<<SQL
|
||||
INSERT
|
||||
INTO send_email_token
|
||||
(userId, value, createdAtUnixSecs, validUntilUnixSecs)
|
||||
VALUES
|
||||
(:userId, :token, :createdAtUnixSecs, :validUntilUnixSecs);
|
||||
SQL
|
||||
,
|
||||
)
|
||||
->execute([
|
||||
"userId" => $userId,
|
||||
"token" => $token,
|
||||
"createdAtUnixSecs" => $createdAtUnixSecs,
|
||||
"validUntilUnixSecs" => $validUntilUnixSecs,
|
||||
]);
|
||||
}
|
||||
|
||||
function isTokenValid(PDO $db, string $userId, string $token): int
|
||||
{
|
||||
$now = time();
|
||||
$stmt = $db->prepare(
|
||||
<<<SQL
|
||||
SELECT COUNT(*) AS count
|
||||
FROM send_email_token
|
||||
WHERE userId = :userId
|
||||
AND value = :token
|
||||
AND validUntilUnixSecs >= :validUntilUnixSecs;
|
||||
SQL
|
||||
,
|
||||
);
|
||||
$stmt->execute([
|
||||
"userId" => $userId,
|
||||
"token" => $token,
|
||||
"validUntilUnixSecs" => $now,
|
||||
]);
|
||||
$validTokenCount = (int) $stmt->fetchColumn(0);
|
||||
return $validTokenCount > 0;
|
||||
}
|
||||
|
||||
function deleteAllTokensForUser(PDO $db, string $userId)
|
||||
{
|
||||
$db
|
||||
->prepare(
|
||||
<<<SQL
|
||||
DELETE
|
||||
FROM send_email_token
|
||||
WHERE userId = :userId;
|
||||
SQL
|
||||
,
|
||||
)
|
||||
->execute(["userId" => $userId]);
|
||||
}
|
||||
|
||||
function deleteAllOtpsForUser(PDO $db, string $userId)
|
||||
{
|
||||
$db
|
||||
->prepare(
|
||||
<<<SQL
|
||||
DELETE
|
||||
FROM otp
|
||||
WHERE userId = :userId;
|
||||
SQL
|
||||
,
|
||||
)
|
||||
->execute(["userId" => $userId]);
|
||||
}
|
||||
|
||||
function recordSentEmail(PDO $db, string $messageId)
|
||||
{
|
||||
$now = time();
|
||||
$stmt = $db->prepare(
|
||||
<<<SQL
|
||||
INSERT
|
||||
INTO sent_emails
|
||||
(messageId, sentAtUnixSecs)
|
||||
VALUES
|
||||
(:messageId, :now);
|
||||
SQL
|
||||
,
|
||||
);
|
||||
$stmt->execute(["messageId" => $messageId, "now" => $now]);
|
||||
}
|
||||
|
||||
function insertOtp(PDO $db, string $userId, string $otp)
|
||||
{
|
||||
$createdAtUnixSecs = time();
|
||||
$validUntilUnixSecs = $createdAtUnixSecs + 60 * 5;
|
||||
$db
|
||||
->prepare(
|
||||
<<<SQL
|
||||
INSERT
|
||||
INTO otp
|
||||
(userId, value, createdAtUnixSecs, validUntilUnixSecs)
|
||||
VALUES
|
||||
(:userId, :otp, :createdAtUnixSecs, :validUntilUnixSecs)
|
||||
SQL
|
||||
,
|
||||
)
|
||||
->execute([
|
||||
"userId" => $userId,
|
||||
"otp" => $otp,
|
||||
"createdAtUnixSecs" => $createdAtUnixSecs,
|
||||
"validUntilUnixSecs" => $validUntilUnixSecs,
|
||||
]);
|
||||
}
|
||||
|
||||
function isOtpCorrect(
|
||||
PDO $db,
|
||||
string $userId,
|
||||
string $guess,
|
||||
int $leniencySecs,
|
||||
): bool {
|
||||
$stmt = $db->prepare(
|
||||
<<<SQL
|
||||
SELECT
|
||||
COUNT(*) as count
|
||||
FROM otp
|
||||
WHERE userId = :userId
|
||||
AND value = :guess
|
||||
AND validUntilUnixSecs >= :validUntilUnixSecs
|
||||
SQL
|
||||
,
|
||||
);
|
||||
$stmt->execute([
|
||||
"userId" => $userId,
|
||||
"guess" => $guess,
|
||||
"validUntilUnixSecs" => time() - $leniencySecs,
|
||||
]);
|
||||
return $stmt->fetchColumn(0);
|
||||
}
|
||||
Reference in New Issue
Block a user