mirror of
https://github.com/Sendouc/sendou.ink.git
synced 2026-05-13 22:42:38 -05:00
* side layout initial * add elements to side nav * side buttons links * remove clog * calendar page initial * position sticky working * x trends page initial * new table * same mode selector * mobile friendly table * no underline for nav links * xsearch * x trends page outlined * sr initial * relocate calendar components * calendar fix flex * topnav fancier look * layout looking good edition * relocate xtrends * xtrends remove linecharts * x trends new * calender page new * delete headbanner, new login * remove calendar stuff from api * rename stuff in utils * fix user item margin * new home page initial * remove page concept * no pointer xtrends * remove xrank from app * xtrends service * move fa from app * move plus * maps tweaks * new table for plus history * navigational sidebar flex tweaks * builds page * analyzer * user page * free agents * plans * remove mx * tweaks * change layout to grid * home page finalized * mobile nav * restrict main content width * tweaks style * language switcher * container in css * sticky nav * use duplicate icons for now * change mapsketch width to old * chara tour vid * borzoic icons
107 lines
2.3 KiB
TypeScript
107 lines
2.3 KiB
TypeScript
import { Prisma } from "@prisma/client";
|
|
import { httpError } from "@trpc/server";
|
|
import prisma from "prisma/client";
|
|
import { ADMIN_ID, TAGS } from "utils/constants";
|
|
import { userBasicSelection } from "utils/prisma";
|
|
import { eventSchema } from "utils/validators/event";
|
|
import * as z from "zod";
|
|
|
|
export type Events = Prisma.PromiseReturnType<typeof events>;
|
|
|
|
const events = async () => {
|
|
const dateSixHoursAgo = new Date(new Date().getTime() - 21600000);
|
|
const result = await prisma.calendarEvent.findMany({
|
|
select: {
|
|
date: true,
|
|
description: true,
|
|
discordInviteUrl: true,
|
|
eventUrl: true,
|
|
format: true,
|
|
id: true,
|
|
name: true,
|
|
tags: true,
|
|
poster: {
|
|
select: userBasicSelection,
|
|
},
|
|
},
|
|
where: { date: { gt: dateSixHoursAgo } },
|
|
orderBy: { date: "asc" },
|
|
});
|
|
|
|
return result.map((e) => ({
|
|
...e,
|
|
tags: e.tags.sort(
|
|
(a, b) =>
|
|
TAGS.findIndex((t) => t.code === a) -
|
|
TAGS.findIndex((t) => t.code === b)
|
|
),
|
|
}));
|
|
};
|
|
|
|
const addEvent = async ({
|
|
input,
|
|
userId,
|
|
}: {
|
|
input: z.infer<typeof eventSchema>;
|
|
userId: number;
|
|
}) => {
|
|
return prisma.calendarEvent.create({
|
|
data: {
|
|
...input,
|
|
isTournament: true,
|
|
date: new Date(input.date),
|
|
posterId: userId,
|
|
},
|
|
});
|
|
};
|
|
|
|
const editEvent = async ({
|
|
event,
|
|
userId,
|
|
eventId,
|
|
}: {
|
|
event: z.infer<typeof eventSchema>;
|
|
eventId: number;
|
|
userId: number;
|
|
}) => {
|
|
const existingEvent = await prisma.calendarEvent.findFirst({
|
|
where: { AND: [{ id: eventId }, { posterId: userId }] },
|
|
});
|
|
if (!existingEvent && userId !== ADMIN_ID) {
|
|
throw httpError.badRequest("no event to edit");
|
|
}
|
|
|
|
return prisma.calendarEvent.update({
|
|
where: { id: eventId },
|
|
data: {
|
|
...event,
|
|
isTournament: true,
|
|
date: new Date(event.date),
|
|
},
|
|
});
|
|
};
|
|
|
|
const deleteEvent = async ({
|
|
userId,
|
|
eventId,
|
|
}: {
|
|
eventId: number;
|
|
userId: number;
|
|
}) => {
|
|
const existingEvent = await prisma.calendarEvent.findFirst({
|
|
where: { AND: [{ id: eventId }, { posterId: userId }] },
|
|
});
|
|
if (!existingEvent && userId !== ADMIN_ID) {
|
|
throw httpError.badRequest("no event to delete");
|
|
}
|
|
|
|
return prisma.calendarEvent.delete({ where: { id: eventId } });
|
|
};
|
|
|
|
export default {
|
|
events,
|
|
addEvent,
|
|
editEvent,
|
|
deleteEvent,
|
|
};
|