sendou.ink/services/calendar.ts
Kalle 1589b84c4b
New layout (#427) closes #405
* 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
2021-04-21 17:26:50 +03:00

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,
};