sendou.ink/app/features/sendouq-settings/QSettingsRepository.server.ts

136 lines
3.1 KiB
TypeScript

import { db } from "~/db/sql";
import type { QWeaponPool, Tables, UserMapModePreferences } from "~/db/tables";
import { modesShort } from "~/modules/in-game-lists/modes";
import { COMMON_USER_FIELDS } from "~/utils/kysely.server";
export async function settingsByUserId(userId: number) {
const preferences = await db
.selectFrom("User")
.select([
"User.mapModePreferences",
"User.vc",
"User.languages",
"User.qWeaponPool",
"User.noScreen",
])
.where("id", "=", userId)
.executeTakeFirstOrThrow();
return {
...preferences,
languages: preferences.languages?.split(","),
};
}
export async function updateUserMapModePreferences({
userId,
mapModePreferences,
}: {
userId: number;
mapModePreferences: UserMapModePreferences;
}) {
const modesExcluded = modesShort.filter(
(mode) => !mapModePreferences.pool.some((mp) => mp.mode === mode),
);
const currentPreferences = (
await db
.selectFrom("User")
.select("mapModePreferences")
.where("id", "=", userId)
.executeTakeFirstOrThrow()
).mapModePreferences;
for (const mode of modesExcluded) {
const previousModePreference = currentPreferences?.pool.filter(
(mp) => mp.mode === mode,
);
if (previousModePreference && previousModePreference.length > 0) {
mapModePreferences.pool.push(...previousModePreference);
}
}
return db
.updateTable("User")
.set({ mapModePreferences: JSON.stringify(mapModePreferences) })
.where("id", "=", userId)
.execute();
}
export function updateVoiceChat(args: {
userId: number;
vc: Tables["User"]["vc"];
languages: string[];
}) {
return db
.updateTable("User")
.set({
vc: args.vc,
languages: args.languages.length > 0 ? args.languages.join(",") : null,
})
.where("User.id", "=", args.userId)
.execute();
}
export function updateSendouQWeaponPool(args: {
userId: number;
weaponPool: QWeaponPool[];
}) {
return db
.updateTable("User")
.set({
qWeaponPool:
args.weaponPool.length > 0 ? JSON.stringify(args.weaponPool) : null,
})
.where("User.id", "=", args.userId)
.execute();
}
export function updateNoScreen({
noScreen,
userId,
}: {
noScreen: number;
userId: number;
}) {
return db
.updateTable("User")
.set({
noScreen,
})
.where("User.id", "=", userId)
.execute();
}
export function currentTeamByUserId(userId: number) {
return db
.selectFrom("TeamMember")
.innerJoin("Team", "Team.id", "TeamMember.teamId")
.select(["Team.name"])
.where("TeamMember.userId", "=", userId)
.executeTakeFirst();
}
export function findTrustedUsersByGiverId(trustGiverUserId: number) {
return db
.selectFrom("TrustRelationship")
.innerJoin("User", "User.id", "TrustRelationship.trustReceiverUserId")
.select(COMMON_USER_FIELDS)
.where("TrustRelationship.trustGiverUserId", "=", trustGiverUserId)
.execute();
}
export function deleteTrustedUser({
trustGiverUserId,
trustReceiverUserId,
}: {
trustGiverUserId: number;
trustReceiverUserId: number;
}) {
return db
.deleteFrom("TrustRelationship")
.where("TrustRelationship.trustGiverUserId", "=", trustGiverUserId)
.where("TrustRelationship.trustReceiverUserId", "=", trustReceiverUserId)
.execute();
}