sendou.ink/app/features/sendouq-streams/QStreamsRepository.server.ts

40 lines
1.3 KiB
TypeScript

import { jsonObjectFrom } from "kysely/helpers/sqlite";
import { db } from "~/db/sql";
import { dateToDatabaseTimestamp } from "~/utils/dates";
import { COMMON_USER_FIELDS } from "~/utils/kysely.server";
import type { Unwrapped } from "~/utils/types";
export type ActiveMatchPlayersItem = Unwrapped<typeof activeMatchPlayers>;
export function activeMatchPlayers() {
const oneHourAgo = new Date(Date.now() - 1000 * 60 * 60);
return db
.selectFrom("Group")
.innerJoin("GroupMatch", (join) =>
join.on((eb) =>
eb.or([
eb("GroupMatch.alphaGroupId", "=", eb.ref("Group.id")),
eb("GroupMatch.bravoGroupId", "=", eb.ref("Group.id")),
]),
),
)
.innerJoin("GroupMember", "GroupMember.groupId", "Group.id")
.innerJoin("LiveStream", "LiveStream.userId", "GroupMember.userId")
.select(({ eb }) => [
"GroupMatch.id as groupMatchId",
"GroupMatch.createdAt as groupMatchCreatedAt",
"LiveStream.twitch as streamTwitch",
"LiveStream.viewerCount as streamViewerCount",
"LiveStream.thumbnailUrl as streamThumbnailUrl",
jsonObjectFrom(
eb
.selectFrom("User")
.select([...COMMON_USER_FIELDS, "User.twitch"])
.whereRef("GroupMember.userId", "=", "User.id"),
).as("user"),
])
.where("Group.status", "=", "ACTIVE")
.where("GroupMatch.createdAt", ">", dateToDatabaseTimestamp(oneHourAgo))
.execute();
}