mirror of
https://github.com/Sendouc/sendou.ink.git
synced 2026-08-20 01:55:26 -05:00
SQL solution migration to Kysely + getting rid of routes folder (#1530)
* Kysely initial * Badges initial * Badge routes migrated * Badges migrated * Calendar work * Fix one type problem * Calendar work * findResultsByUserId work * Calendar reworking finished * PlusSuggestions work * Migrated suggestions * Builds progress * Migrated builds * Admin migrated * Migrate articles * User search * Faster getUser * Selectable/insertable as global * Refresh prod db script + patronTier index * identifierToUserId * updateProfile * findByIdentifier * More indexes * User upsert * upsertLite * findAllPlusMembers * updateResultHighlights * updateMany * User finished migration * Fix types * Fix PlusVotingResult typing * PlusVotingRepository WIP * Migrated resultsByMonthYear * Migrated plusVotes (done with db. related migrations) * Plus code to features folder * Fix TODOs * Export * Fix range * Migrate some user pages * Move rest user routes * Move /play * Map list generator * Front page * Move map list generation logic * Move plus voting logic * Info * API * Adjust TODOs * theme * Auth * Remove TODO
This commit is contained in:
113
app/features/admin/AdminRepository.server.ts
Normal file
113
app/features/admin/AdminRepository.server.ts
Normal file
@@ -0,0 +1,113 @@
|
||||
import { db, sql } from "~/db/sql";
|
||||
import { syncXPBadges } from "../badges";
|
||||
import type { Tables } from "~/db/tables";
|
||||
import { dateToDatabaseTimestamp } from "~/utils/dates";
|
||||
|
||||
const removeOldLikesStm = sql.prepare(/*sql*/ `
|
||||
delete from
|
||||
"GroupLike"
|
||||
where
|
||||
"GroupLike"."createdAt" < cast(strftime('%s', datetime('now', 'start of day', '-7 days')) as int)
|
||||
`);
|
||||
|
||||
const removeOldGroupStm = sql.prepare(/*sql*/ `
|
||||
delete from
|
||||
"Group"
|
||||
where "Group"."id" in (
|
||||
select "Group"."id"
|
||||
from "Group"
|
||||
left join "GroupMatch" on "Group"."id" = "GroupMatch"."alphaGroupId" or "Group"."id" = "GroupMatch"."bravoGroupId"
|
||||
where "Group"."status" = 'INACTIVE'
|
||||
and "GroupMatch"."id" is null
|
||||
)
|
||||
`);
|
||||
|
||||
const cleanUpStm = sql.prepare(/*sql*/ `
|
||||
vacuum
|
||||
`);
|
||||
|
||||
export const cleanUp = () => {
|
||||
removeOldLikesStm.run();
|
||||
removeOldGroupStm.run();
|
||||
cleanUpStm.run();
|
||||
};
|
||||
|
||||
export function migrate(args: { newUserId: number; oldUserId: number }) {
|
||||
return db.transaction().execute(async (trx) => {
|
||||
const deletedUser = await trx
|
||||
.deleteFrom("User")
|
||||
.where("User.id", "=", args.newUserId)
|
||||
.returning("discordId")
|
||||
.executeTakeFirstOrThrow();
|
||||
|
||||
await trx
|
||||
.updateTable("User")
|
||||
.set({ discordId: deletedUser.discordId })
|
||||
.where("User.id", "=", args.oldUserId)
|
||||
.execute();
|
||||
});
|
||||
}
|
||||
|
||||
export function refreshPlusTiers() {
|
||||
return db.transaction().execute(async (trx) => {
|
||||
await trx.deleteFrom("PlusTier").execute();
|
||||
|
||||
await trx
|
||||
.insertInto("PlusTier")
|
||||
.columns(["userId", "tier"])
|
||||
.expression((eb) =>
|
||||
eb
|
||||
.selectFrom("FreshPlusTier")
|
||||
.select(["FreshPlusTier.userId", "FreshPlusTier.tier"])
|
||||
.where("FreshPlusTier.tier", "is not", null),
|
||||
)
|
||||
.execute();
|
||||
});
|
||||
}
|
||||
|
||||
export function makeVideoAdderByUserId(userId: number) {
|
||||
return db
|
||||
.updateTable("User")
|
||||
.set({ isVideoAdder: 1 })
|
||||
.where("User.id", "=", userId)
|
||||
.execute();
|
||||
}
|
||||
|
||||
export async function linkUserAndPlayer({
|
||||
userId,
|
||||
playerId,
|
||||
}: {
|
||||
userId: number;
|
||||
playerId: number;
|
||||
}) {
|
||||
await db
|
||||
.updateTable("SplatoonPlayer")
|
||||
.set({ userId: null })
|
||||
.where("SplatoonPlayer.userId", "=", userId)
|
||||
.execute();
|
||||
|
||||
await db
|
||||
.updateTable("SplatoonPlayer")
|
||||
.set({ userId })
|
||||
.where("SplatoonPlayer.id", "=", playerId)
|
||||
.execute();
|
||||
|
||||
syncXPBadges();
|
||||
}
|
||||
|
||||
export function forcePatron(args: {
|
||||
id: number;
|
||||
patronTier: Tables["User"]["patronTier"];
|
||||
patronSince: Date;
|
||||
patronTill: Date;
|
||||
}) {
|
||||
return db
|
||||
.updateTable("User")
|
||||
.set({
|
||||
patronTier: args.patronTier,
|
||||
patronSince: dateToDatabaseTimestamp(args.patronSince),
|
||||
patronTill: dateToDatabaseTimestamp(args.patronTill),
|
||||
})
|
||||
.where("User.id", "=", args.id)
|
||||
.execute();
|
||||
}
|
||||
Reference in New Issue
Block a user