mirror of
https://github.com/Sendouc/sendou.ink.git
synced 2026-06-21 03:54:14 -05:00
81 lines
2.3 KiB
TypeScript
81 lines
2.3 KiB
TypeScript
import { db } from "~/db/sql";
|
|
import type { TablesInsertable } from "~/db/tables";
|
|
import { databaseTimestampNow } from "~/utils/dates";
|
|
import { concatUserSubmittedImagePrefix } from "~/utils/kysely.server";
|
|
|
|
/** Number of seconds an external stream keeps showing in the sidebar after its start time. */
|
|
const SIDEBAR_VISIBLE_SECONDS = 6 * 60 * 60;
|
|
/** Number of seconds after the start time before an external stream row is deleted. */
|
|
const RETENTION_SECONDS = 24 * 60 * 60;
|
|
|
|
/** Inserts a new admin-curated external stream. */
|
|
export function insert(
|
|
args: Pick<
|
|
TablesInsertable["ExternalStream"],
|
|
"name" | "url" | "avatarImgId" | "startTime"
|
|
>,
|
|
) {
|
|
return db.insertInto("ExternalStream").values(args).execute();
|
|
}
|
|
|
|
/** Deletes an external stream by its id. */
|
|
export function deleteById(id: number) {
|
|
return db.deleteFrom("ExternalStream").where("id", "=", id).execute();
|
|
}
|
|
|
|
/** Lists all external streams (for the admin management page), soonest start time first. */
|
|
export function all() {
|
|
return db
|
|
.selectFrom("ExternalStream")
|
|
.leftJoin(
|
|
"UserSubmittedImage",
|
|
"UserSubmittedImage.id",
|
|
"ExternalStream.avatarImgId",
|
|
)
|
|
.select((eb) => [
|
|
"ExternalStream.id",
|
|
"ExternalStream.name",
|
|
"ExternalStream.url",
|
|
"ExternalStream.startTime",
|
|
concatUserSubmittedImagePrefix(eb.ref("UserSubmittedImage.url")).as(
|
|
"avatarUrl",
|
|
),
|
|
])
|
|
.orderBy("ExternalStream.startTime", "asc")
|
|
.execute();
|
|
}
|
|
|
|
/** External streams that should currently show in the sidebar (started under 6h ago or upcoming). */
|
|
export function forSidebar() {
|
|
return db
|
|
.selectFrom("ExternalStream")
|
|
.leftJoin(
|
|
"UserSubmittedImage",
|
|
"UserSubmittedImage.id",
|
|
"ExternalStream.avatarImgId",
|
|
)
|
|
.select((eb) => [
|
|
"ExternalStream.id",
|
|
"ExternalStream.name",
|
|
"ExternalStream.url",
|
|
"ExternalStream.startTime",
|
|
concatUserSubmittedImagePrefix(eb.ref("UserSubmittedImage.url")).as(
|
|
"avatarUrl",
|
|
),
|
|
])
|
|
.where(
|
|
"ExternalStream.startTime",
|
|
">=",
|
|
databaseTimestampNow() - SIDEBAR_VISIBLE_SECONDS,
|
|
)
|
|
.execute();
|
|
}
|
|
|
|
/** Deletes external streams whose start time is more than 24h in the past. */
|
|
export function deleteOld() {
|
|
return db
|
|
.deleteFrom("ExternalStream")
|
|
.where("startTime", "<", databaseTimestampNow() - RETENTION_SECONDS)
|
|
.executeTakeFirst();
|
|
}
|