Added mutations and queries for DaiailyStats and TotalStats. Updated Schema. Added scalar package.
This commit is contained in:
@@ -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 }
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user