all repos — stealth-developers @ fde303d6daf3ee22a4b0c2982dff0719a0c68529

src/utils/queries.ts (view raw)

 1
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
 100
 101
 102
 103
 104
 105
 106
 107
 108
 109
 110
 111
 112
 113
import {
	type Guild,
	type Ticket,
	db,
	guild,
	manager,
	tickets,
} from "@/database";
import type { Snowflake } from "discord.js";
import { and, eq, sql } from "drizzle-orm";

type QueryResult<T, WillCreate extends boolean = false> =
	| { exists: true; data: T }
	| (WillCreate extends true
			? { exists: false; data: T }
			: { exists: false; data: T | null });

export async function getGuild(
	guildId: Snowflake,
): Promise<QueryResult<Guild, true>> {
	const result = await db
		.select()
		.from(guild)
		.where(eq(guild.guildId, guildId))
		.execute();

	if (!result || result.length === 0) {
		const newGuild = await db
			.insert(guild)
			.values({ guildId })
			.returning()
			.execute();
		return {
			exists: false,
			data: newGuild[0],
		};
	}

	return {
		exists: true,
		data: result[0],
	};
}

export async function getTicketMessage(
	guildId: Snowflake,
): Promise<QueryResult<string, false>> {
	const guild = await getGuild(guildId);
	if (!guild || !guild.data.ticket_message) {
		return {
			exists: false,
			data: null,
		};
	}

	return {
		exists: true,
		data: guild.data.ticket_message,
	};
}

export async function getTicket(
	guildId: Snowflake,
	channelId: Snowflake,
): Promise<QueryResult<Ticket, false>> {
	const guild = await getGuild(guildId);
	if (!guild || !guild.data.ticket_message) {
		return {
			exists: false,
			data: null,
		};
	}

	const ticket = await db
		.selectDistinct()
		.from(tickets)
		.where(and(eq(tickets.guildId, guildId), eq(tickets.channelId, channelId)))
		.execute();

	if (!ticket || ticket.length === 0) {
		return {
			exists: false,
			data: null,
		};
	}

	return {
		exists: true,
		data: ticket[0],
	};
}

export async function getManagerRoleIds(
	guildId: Snowflake,
): Promise<Snowflake[]> {
	const rows = await db
		.select({ roleId: manager.roleId })
		.from(manager)
		.where(eq(manager.guildId, guildId))
		.execute();

	return rows.map((r) => r.roleId);
}

export async function countTickets(guildId: Snowflake) {
	const result = await db
		.select({ count: sql<number>`COUNT(*)` })
		.from(tickets)
		.where(eq(tickets.guildId, guildId))
		.execute();

	return result[0].count;
}