Added mutations and queries for DaiailyStats and TotalStats. Updated Schema. Added scalar package.

This commit is contained in:
2025-11-11 20:17:14 -05:00
parent ff334a7f0d
commit 834900f9bb
25 changed files with 2483 additions and 4532 deletions

View File

@@ -1,23 +1,144 @@
import prisma from "@/lib/prismaClient";
import { BigIntResolver } from "graphql-scalars";
// Prisma
export const resolvers = {
// scalars
BigInt: BigIntResolver,
Query: {
getTotalGroups: () => prisma.group.count()
getTotalGroups: async () => await prisma.groups.count(),
getTodayStats: async () =>
await prisma.dailyStats.findFirst({
orderBy: {
createdAt: "desc"
}
}),
getStatsRange: async (
_parent: unknown,
data: { startDate: Date; endDate: Date }
// _ctx: unknown
) => {
const { startDate, endDate } = data;
return await prisma.dailyStats.findMany({
where: {
createdAt: {
gt: startDate,
lte: endDate
}
},
orderBy: {
createdAt: "asc"
}
});
},
getTotalStats: async () =>
await prisma.totalStats.findFirst({
orderBy: {
createdAt: "asc"
}
})
},
Mutation: {
init: async () =>
// _parent: unknown,
// data: { newWeek: boolean; newMonth: boolean }
// _ctx: unknown
{
const date = new Date().toISOString();
let count = 0;
if ((await prisma.dailyStats.count()) === 0) {
await prisma.dailyStats.create({ data: { createdAt: date } });
count++;
}
if ((await prisma.totalStats.count()) === 0) {
await prisma.totalStats.create({ data: { createdAt: date } });
count++;
}
return `${count} tables have been initialized with data.`;
},
cronJob: async () =>
// _parent: unknown,
// data: { newWeek: boolean; newMonth: boolean }
// _ctx: unknown
{
const date = new Date().toISOString();
await prisma.dailyStats.create({ data: { createdAt: date } });
const allStats = await prisma.dailyStats.findMany({});
const calculatedStats = allStats.reduce(
(acc, curr) => {
const links = (acc.linksDeleted += curr.linksDeleted);
const commands = (acc.commandResponses += curr.commandResponses);
const triggers = (acc.timesTriggered += curr.timesTriggered);
return {
linksDeleted: links,
commandResponses: commands,
timesTriggered: triggers
};
},
{
linksDeleted: 0,
commandResponses: 0,
timesTriggered: 0
}
);
const totalStats = await prisma.totalStats.findFirst({
orderBy: {
createdAt: "desc"
}
});
return await prisma.totalStats.update({
where: {
createdAt: totalStats?.createdAt
},
data: {
...calculatedStats
}
});
},
addGroup: async (
_parent: unknown,
data: { groupID: number; groupName: string }
// _ctx: unknown
) => {
const { groupID, groupName } = data;
return await prisma.group.create({
return await prisma.groups.create({
data: {
telegramID: groupID,
name: groupName
}
});
},
increment: async (
_parent: unknown,
data: { link: boolean; command: boolean; trigger: boolean }
// _ctx: unknown
) => {
const { link, command, trigger } = data;
return await prisma.dailyStats
.findFirst({
orderBy: {
createdAt: "desc"
}
})
.then(async (todayStat) => {
return await prisma.dailyStats.update({
where: { createdAt: todayStat?.createdAt },
data: {
linksDeleted: { increment: link ? 1 : 0 },
commandResponses: { increment: command ? 1 : 0 },
timesTriggered: { increment: trigger ? 1 : 0 }
}
});
});
}
}
};

View File

@@ -1,16 +1,41 @@
import { BigIntTypeDefinition } from "graphql-scalars";
const typeDefs = /* GraphQL */ `
${BigIntTypeDefinition}
scalar Date
type Query {
getTotalGroups: Int!
getTodayStats: DailyStats!
getStatsRange(startDate: Date, endDate: Date): [DailyStats]
getTotalStats: TotalStats!
}
type Mutation {
addGroup(groupID: Int, groupName: String): Group!
init: String!
cronJob: TotalStats!
addGroup(groupID: Int, groupName: String): Groups!
increment(link: Boolean, command: Boolean, trigger: Boolean): DailyStats!
}
type Group {
type Groups {
telegramID: Int
name: String
createdAt: Date
updatedAt: Date
}
scalar Date
type TotalStats {
createdAt: String
updatedAt: Date
linksDeleted: BigInt
commandResponses: BigInt
timesTriggered: BigInt
}
type DailyStats {
createdAt: String
updatedAt: Date
linksDeleted: Int
commandResponses: Int
timesTriggered: Int
}
`;
export default typeDefs;