Compare commits

...

18 Commits

Author SHA1 Message Date
f9769ca79c Fixed Cron
All checks were successful
Main / build-and-push-docker-image (20.x) (push) Successful in 5m23s
2025-12-18 22:05:09 -05:00
06e01b42e6 Updated bot name.
All checks were successful
Main / build-and-push-docker-image (20.x) (push) Successful in 4m55s
Daily Cron (Make New DailyStats Document) / cron (push) Successful in 1s
2025-12-16 21:29:18 -05:00
cfa823a390 fix contrast with rainbow background
All checks were successful
Main / build-and-push-docker-image (20.x) (push) Successful in 5m19s
2025-12-16 20:49:51 -05:00
2204e957e1 Removed unused import.
All checks were successful
Main / build-and-push-docker-image (20.x) (push) Successful in 4m43s
Daily Cron (Make New DailyStats Document) / cron (push) Successful in 1s
2025-12-16 17:14:48 -05:00
07aa4ff6b5 Removed image. Added gradient. Removed unnecessary logic in resolvers. Added line chart label.
Some checks are pending
Main / build-and-push-docker-image (20.x) (push) Waiting to run
2025-12-16 17:11:44 -05:00
0b0039ce01 Update groupID in queries and mutations to be a string.
All checks were successful
Main / build-and-push-docker-image (20.x) (push) Successful in 12m1s
2025-12-16 15:21:56 -05:00
d84496aad6 Update .github/workflows/cron.yml
All checks were successful
Main / build-and-push-docker-image (20.x) (push) Successful in 4m54s
Daily Cron (Make New DailyStats Document) / cron (push) Successful in 1s
2025-12-14 10:11:42 -05:00
935331e825 Added metadata and favicon
All checks were successful
Main / build-and-push-docker-image (20.x) (push) Successful in 4m47s
Hourly cron job / cron (push) Successful in 1s
2025-12-13 15:27:06 -05:00
58e3fb73b1 Fix initial load breaking. 2025-12-13 15:26:56 -05:00
a1fc19b202 added cron install into cron actions file
All checks were successful
Main / build-and-push-docker-image (20.x) (push) Successful in 5m0s
Hourly cron job / cron (push) Successful in 4s
2025-12-12 09:42:06 -05:00
b6f1b6f3e4 Added query to graphql types.
Some checks failed
Main / build-and-push-docker-image (20.x) (push) Successful in 4m47s
Hourly cron job / cron (push) Failing after 0s
2025-12-10 19:16:27 -05:00
80730ab549 update secrets key
Some checks are pending
Main / build-and-push-docker-image (20.x) (push) Waiting to run
2025-12-10 19:12:46 -05:00
f37f781d4e Added failsafe in increment function that will create a new DailyStat document if the latest one is not the current day. Added a check in the cron function to check that it won't create a new document if the latest DailyStat is for the current date.
Some checks failed
Main / build-and-push-docker-image (20.x) (push) Failing after 4m14s
2025-12-10 19:05:34 -05:00
8748a1d978 Added cronjob for creating new dailyStats document at midnight every night.
Some checks failed
Main / build-and-push-docker-image (20.x) (push) Successful in 4m44s
Hourly cron job / cron (push) Failing after 0s
2025-12-10 18:34:14 -05:00
30b4f65ec6 Secured mutations with an api-key. When in production mode it should return null if an API key is not provided or is incorrect.
All checks were successful
Main / build-and-push-docker-image (20.x) (push) Successful in 5m6s
2025-12-10 16:42:21 -05:00
678d1e7b5e fixed conditional rendering logic
All checks were successful
Main / build-and-push-docker-image (20.x) (push) Successful in 7m27s
2025-12-06 23:46:04 -05:00
9146a0c340 Fixed env variables
All checks were successful
Main / build-and-push-docker-image (20.x) (push) Successful in 11m57s
2025-12-06 22:19:22 -05:00
9a37330ede Fixed production issues, fixed render issues, added secret and env variables into dockerfile and gihub actions files, remade dockerfile and github actions 2025-12-06 22:18:46 -05:00
28 changed files with 670 additions and 5302 deletions

18
.github/workflows/cron.yml vendored Normal file
View File

@@ -0,0 +1,18 @@
name: Daily Cron (Make New DailyStats Document)
on:
schedule:
- cron: "0 0 * * *"
jobs:
cron:
runs-on: ubuntu-24.04
steps:
- name: Install curl
run: apk add --no-cache curl
- name: Daily cron job | Create new dailyStats document.
run: |
curl --request POST \
--url 'https://bot-stats.lucids-cove.duckdns.org/api/graphql' \
--header 'x-api-key: ${{ secrets.NEXT_PUBLIC_API_TOKEN }}' \
--header 'Content-Type: application/json' \
--data '{ "query": "mutation Cron { cronJob ( mutationKey: \"${{ secrets.GRAPHQL_MUTATION_KEY }}\" ) { commandResponses createdAt linksDeleted timesTriggered updatedAt } }" }' \

View File

@@ -53,6 +53,10 @@ jobs:
context: .
push: ${{ !github.event.pull_request.head.repo.fork }}
tags: ${{ steps.meta.outputs.tags }}
build-args: |
DATABASE_URL=${{ secrets.DATABASE_URL }}
NEXT_PUBLIC_API_TOKEN=${{ secrets.NEXT_PUBLIC_API_TOKEN }}
NEXT_PUBLIC_GRAPHQL_URL=${{ secrets.NEXT_PUBLIC_GRAPHQL_URL }}
- name: Build and Push Latest Docker Image
id: build-and-push-latest
uses: docker/build-push-action@v4
@@ -61,3 +65,7 @@ jobs:
context: .
push: true
tags: ${{ env.REGISTRY }}/${{ env.OWNER }}/${{ env.IMAGE_NAME }}:latest
build-args: |
DATABASE_URL=${{ secrets.DATABASE_URL }}
NEXT_PUBLIC_API_TOKEN=${{ secrets.NEXT_PUBLIC_API_TOKEN }}
NEXT_PUBLIC_GRAPHQL_URL=${{ secrets.NEXT_PUBLIC_GRAPHQL_URL }}

2
.gitignore vendored
View File

@@ -40,4 +40,4 @@ yarn-error.log*
*.tsbuildinfo
next-env.d.ts
/generated/prisma
/src/prisma/generated

View File

@@ -1,72 +1,49 @@
# syntax=docker.io/docker/dockerfile:1
FROM node:20-alpine AS base
# Enable Corepack
# --- Stage 1: Dependencies ---
FROM node:20-alpine AS dependencies
RUN corepack enable
# Set Yarn to the latest stable version
RUN yarn set version stable
# Install dependencies only when needed
FROM base AS deps
# Check https://github.com/nodejs/docker-node/tree/b4117f9333da4138b03a546ec926ef50a31506c3#nodealpine to understand why libc6-compat might be needed.
RUN apk add --no-cache libc6-compat
RUN corepack prepare yarn@stable --activate
WORKDIR /app
COPY package.json yarn.lock .yarnrc.yml ./
RUN yarn install
# Install dependencies based on the preferred package manager
COPY package.json yarn.lock* package-lock.json* pnpm-lock.yaml* .npmrc* ./
RUN \
if [ -f yarn.lock ]; then yarn --frozen-lockfile; \
elif [ -f package-lock.json ]; then npm ci; \
elif [ -f pnpm-lock.yaml ]; then corepack enable pnpm && pnpm i --frozen-lockfile; \
else echo "Lockfile not found." && exit 1; \
fi
# Rebuild the source code only when needed
FROM base AS builder
# --- Stage 2: Builder ---
FROM node:20-alpine AS builder
RUN corepack enable
RUN corepack prepare yarn@stable --activate
ARG DATABASE_URL
ENV DATABASE_URL=${DATABASE_URL}
ENV DATABASE_URL=${DATABASE_URL}
ARG NEXT_PUBLIC_GRAPHQL_URL
ENV NEXT_PUBLIC_GRAPHQL_URL=${NEXT_PUBLIC_GRAPHQL_URL}
ARG NEXT_PUBLIC_API_TOKEN
ENV NEXT_PUBLIC_API_TOKEN=${NEXT_PUBLIC_API_TOKEN}
RUN corepack enable
RUN corepack prepare yarn@stable --activate
WORKDIR /app
COPY --from=deps /app/node_modules ./node_modules
COPY . .
COPY --from=dependencies /app/node_modules ./node_modules
COPY . ./
RUN yarn prisma-gen
RUN yarn build
# Next.js collects completely anonymous telemetry data about general usage.
# Learn more here: https://nextjs.org/telemetry
# Uncomment the following line in case you want to disable telemetry during the build.
# ENV NEXT_TELEMETRY_DISABLED=1
RUN \
if [ -f yarn.lock ]; then yarn run build; \
elif [ -f package-lock.json ]; then npm run build; \
elif [ -f pnpm-lock.yaml ]; then corepack enable pnpm && pnpm run build; \
else echo "Lockfile not found." && exit 1; \
fi
# Production image, copy all the files and run next
FROM base AS runner
# --- Stage 3: Runner ---
FROM node:20-alpine AS runner
RUN corepack enable
RUN corepack prepare yarn@stable --activate
ARG DATABASE_URL
ENV DATABASE_URL=${DATABASE_URL}
ARG NEXT_PUBLIC_GRAPHQL_URL
ENV NEXT_PUBLIC_GRAPHQL_URL=${NEXT_PUBLIC_GRAPHQL_URL}
ARG NEXT_PUBLIC_API_TOKEN
ENV NEXT_PUBLIC_API_TOKEN=${NEXT_PUBLIC_API_TOKEN}
RUN corepack enable
RUN corepack prepare yarn@stable --activate
WORKDIR /app
ENV NODE_ENV=production
# Uncomment the following line in case you want to disable telemetry during runtime.
# ENV NEXT_TELEMETRY_DISABLED=1
RUN addgroup --system --gid 1001 nodejs
RUN adduser --system --uid 1001 nextjs
COPY --from=builder /app/public ./public
# Automatically leverage output traces to reduce image size
# https://nextjs.org/docs/advanced-features/output-file-tracing
COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./
COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static
USER nextjs
COPY --from=dependencies /app/node_modules ./node_modules
COPY --from=builder /app/src/prisma/generated ./src/prisma/generated
COPY --from=builder /app/.next ./.next
COPY --from=builder /app/.yarn ./.yarn
COPY . ./
EXPOSE 3000
ENV PORT=3000
# server.js is created by next build from the standalone output
# https://nextjs.org/docs/pages/api-reference/config/next-config-js/output
ENV HOSTNAME="0.0.0.0"
CMD ["node", "server.js"]
CMD ["yarn", "start"]

View File

@@ -3,8 +3,7 @@ import type { NextConfig } from "next";
const nextConfig: NextConfig = {
experimental: {
optimizePackageImports: ["@chakra-ui/react"]
},
output: "standalone"
}
};
export default nextConfig;

View File

@@ -15,6 +15,7 @@
"@chakra-ui/charts": "^3.30.0",
"@chakra-ui/react": "^3.30.0",
"@emotion/react": "^11.14.0",
"@escape.tech/graphql-armor": "^3.1.7",
"@prisma/client": "^6.19.0",
"@prisma/extension-accelerate": "^2.0.2",
"@urql/next": "^2.0.0",

View File

@@ -0,0 +1,13 @@
<svg
id="svg2"
version="1.1"
width="409.96661"
height="409.98404"
viewBox="0 0 409.96661 409.98404"
xmlns="http://www.w3.org/2000/svg"
>
<path
d="m 198.43447,409.88349 c -16.87402,-0.52429 -33.96148,-3.20112 -50.15064,-7.85635 -16.89988,-4.85959 -33.4194,-12.04085 -48.45,-21.06187 C 89.057412,374.49751 79.188152,367.3017 69.836023,359.09346 63.443873,353.48316 56.486693,346.52267 50.841584,340.09001 23.882655,309.37001 6.733496,271.34323 1.6401223,230.99002 -3.0267695,194.01569 2.3071672,156.75191 17.114155,122.88582 c 2.83776,-6.49044 6.63732,-14.00102 10.21694,-20.1958 C 42.991144,75.589277 64.616853,52.405411 90.533832,34.933461 108.33243,22.934523 127.85299,13.821763 148.38383,7.9274153 c 26.15516,-7.50907673 53.79077,-9.7183097 81.05,-6.4792629 50.21751,5.9670387 96.51852,30.4672236 130.00448,68.7918786 26.75943,30.626139 43.81786,68.571209 48.88922,108.749989 4.86563,38.54882 -1.15232,77.44493 -17.37657,112.31081 -8.98481,19.30835 -20.76424,36.8569 -35.46819,52.83918 -2.44277,2.65514 -8.7281,8.94409 -11.35114,11.35768 -14.70283,13.5288 -30.43046,24.37645 -48.03196,33.12859 -4.05332,2.01546 -5.5776,2.72668 -9.56585,4.46335 -27.56473,12.00295 -57.65906,17.73965 -88.09935,16.79386 z m 13.44936,-34.9928 c 25.01212,-1.07439 48.36413,-7.17806 70.34385,-18.38623 19.2632,-9.82294 36.50092,-23.26822 50.87783,-39.6843 7.86352,-8.97886 15.0508,-19.24676 20.93747,-29.91169 1.47754,-2.67687 4.04205,-7.75113 5.39976,-10.6842 8.41325,-18.17525 13.5806,-38.08598 15.08733,-58.13425 0.35814,-4.76539 0.40375,-6.24526 0.40375,-13.1 0,-7.80507 -0.13553,-10.87819 -0.75413,-17.1 -3.3773,-33.96857 -16.9036,-65.97946 -39.00164,-92.299992 -4.83753,-5.76189 -10.83367,-11.955826 -16.62603,-17.174494 -16.89903,-15.22529 -37.39974,-27.226947 -58.91819,-34.492262 -15.49468,-5.231496 -31.10132,-8.118781 -47.75,-8.833924 -2.89874,-0.124515 -10.90126,-0.124515 -13.8,0 -16.64507,0.714988 -32.25869,3.603565 -47.75,8.833924 -22.42114,7.57009 -43.37752,20.065402 -60.949998,36.341643 -2.01749,1.868667 -6.68465,6.525563 -8.64412,8.625113 -18.522729,19.846862 -31.943938,43.538062 -39.299728,69.372092 -3.13635,11.01509 -5.12484,22.15786 -6.00108,33.6279 -0.35666,4.6688 -0.40507,6.2343 -0.40507,13.1 0,6.8657 0.04841,8.4312 0.40507,13.1 1.22839,16.0797 4.67357,31.67931 10.32477,46.75 5.59407,14.91838 13.591089,29.46979 23.231919,42.27293 12.532319,16.64308 28.020458,30.89004 45.549847,41.8996 16.73723,10.51204 34.82788,17.91208 54.08839,22.12504 9.16278,2.00422 19.45487,3.32848 29.1,3.74422 2.65778,0.11456 11.5597,0.12015 14.15,0.009 z m -37.2,-46.83768 v -30.8126 l 9.28842,9.28802 9.28842,9.28802 76.72486,-76.72488 76.72486,-76.72488 12.28672,12.28673 12.28673,12.28673 -76.64997,76.64993 c -42.15747,42.15746 -76.64998,76.71734 -76.65,76.79973 -2e-5,0.0824 4.12343,4.27345 9.16323,9.31347 l 9.16327,9.16368 -30.81327,-0.001 -30.81327,-10e-4 v -30.81259 z m -61.7,-31.04633 c -0.0664,-0.0221 -0.1,-10.37788 -0.1,-30.79993 v -30.7666 l 9.2544,9.2544 9.2544,9.2544 76.72511,-76.72511 76.7251,-76.72511 12.29318,12.29349 12.29318,12.29349 -76.64567,76.64613 c -42.15513,42.15537 -76.66344,76.6994 -76.68514,76.7645 -0.0217,0.0651 4.0948,4.25282 9.14779,9.30603 5.05298,5.0532 9.16483,9.1914 9.13745,9.19599 -0.1628,0.0273 -61.31804,0.0356 -61.3998,0.008 z M 51.026084,235.09894 c -0.02324,-0.0232 -0.04225,-13.88347 -0.04225,-30.80052 v -30.75827 l 9.266339,9.26634 9.26633,9.26634 76.638487,-76.63848 c 42.15116,-42.151155 76.68658,-76.668199 76.74537,-76.704532 0.06,-0.03707 5.49452,5.321436 12.38275,12.209497 l 12.27587,12.275559 -76.68758,76.687446 c -42.17816,42.1781 -76.687569,76.72116 -76.687569,76.76237 0,0.0412 4.140059,4.21517 9.200129,9.27546 l 9.20013,9.20054 H 81.826212 c -16.916829,0 -30.776888,-0.0188 -30.800128,-0.042 z"
id="path3338"
/>
</svg>

After

Width:  |  Height:  |  Size: 3.7 KiB

View File

@@ -29,17 +29,23 @@ const StatsList = ({
{title}
</Heading>
<Text textAlign="center" fontSize="sm" color="whiteAlpha.800">
{groups ? "Updates every 24 hours" : "At time of page load"}
{groups !== undefined
? groups >= 0
? "Updates every 24 hours"
: ""
: "At time of page load"}
</Text>
</VStack>
<Flex w="80%" flexDirection={{ base: "column", md: "row" }} gap={4}>
{groups ? (
<SingleStatComponent
loading={loading}
title="Groups Bot Helped"
error={error}
stat={groups}
/>
{groups !== undefined ? (
groups >= 0 ? (
<SingleStatComponent
loading={loading}
title="Groups Bot Helped"
error={error}
stat={groups}
/>
) : null
) : null}
<SingleStatComponent
loading={loading}

View File

@@ -1,11 +1,54 @@
/* eslint-disable react-hooks/rules-of-hooks */
import { createYoga, Plugin, createSchema } from "graphql-yoga";
import { EnvelopArmorPlugin } from "@escape.tech/graphql-armor";
import resolvers from "@/graphql/resolvers";
import typeDefs from "@/graphql/types";
import { createSchema, createYoga } from "graphql-yoga";
interface NextContext {
params: Promise<Record<string, string>>;
}
const environment = process.env.NODE_ENV || "development";
const isValidApiKey = (apiKey: string): boolean => {
const envApiKey =
process.env.API_TOKEN || process.env.NEXT_PUBLIC_API_TOKEN || "";
return apiKey === envApiKey;
};
function useApiKey(): Plugin {
return {
async onRequest({ request, endResponse, fetchAPI }) {
const apiKey = await request.headers.get("x-api-key");
if (environment === "production") {
if (!apiKey || apiKey == null) {
endResponse(
new fetchAPI.Response(
JSON.stringify({
message: "No API Key provided"
}),
{ status: 401, headers: { "Content-Type": "application/json" } }
)
);
}
if (apiKey !== null && !(await isValidApiKey(apiKey))) {
endResponse(
new fetchAPI.Response(
JSON.stringify({
message: "Invalid API Key"
}),
{ status: 403, headers: { "Content-Type": "application/json" } }
)
);
}
}
}
};
}
const { handleRequest } = createYoga<NextContext>({
schema: createSchema({
typeDefs: typeDefs,
@@ -16,7 +59,10 @@ const { handleRequest } = createYoga<NextContext>({
graphqlEndpoint: "/api/graphql",
// Yoga needs to know how to create a valid Next response
fetchAPI: { Response }
fetchAPI: { Response },
plugins: [useApiKey(), EnvelopArmorPlugin()],
graphiql: environment !== "production" ? true : false
});
export {

View File

@@ -20,16 +20,58 @@ export default function RootLayout({
isClient: typeof window !== "undefined"
});
const client = createClient({
url: process.env.NEXT_PUBLIC_GRAPHQL_URL || "",
url: "/api/graphql",
exchanges: [cacheExchange, ssr, fetchExchange],
suspense: true
suspense: true,
fetchOptions: {
headers: {
"x-api-key":
process.env?.API_TOKEN || process.env?.NEXT_PUBLIC_API_TOKEN || ""
}
}
});
return [client, ssr];
}, []);
const title = "Nazi Site Patrol Stats";
const description =
"A website to display various stats for the Nazi Site Patrol bot for Telegram. Developed and maintained by Werewolf Kid Creations.";
const url = "https://bot-stats.werewolfkid.monster";
const img = "/images/SPD-arrows.svg";
const domain = "werewolfkid.monster";
return (
<html lang="en" suppressHydrationWarning>
<title>{title}</title>
<meta name="description" content={description} />
<meta property="title" content={title} />
<meta name="theme-color" content="#00ffff" />
<link rel="icon" href={img} sizes="any" type="image/png" />
<meta property="image" content={img} />
<meta property="image:type" content="image/png" />
<meta property="image:width" content="653px" />
<meta property="og:title" content={title} />
<meta property="og:description" content={description} />
<meta property="og:url" content={url} />
<meta property="og:type" content="website" />
<meta property="og:image" content={img} />
<meta property="og:image:type" content="image/png" />
<meta property="og:image:width" content="653px" />
<meta property="og:image:height" content="651px" />
<meta property="image:height" content="651px" />
<meta name="twitter:title" content={title} />
<meta property="twitter:domain" content={domain} />
<meta property="twitter:url" content={url} />
<meta name="twitter:description" content={description} />
<meta name="twitter:image" content={img} />
<meta name="twitter:card" content="summary_large_image" />
<meta httpEquiv="content-language" content="en_US" />
<meta charSet="UTF-8" />
<link rel="icon" type="image/svg+xml" href={img} />
<link rel="shortcut icon" href={img} />
<link rel="apple-touch-icon" sizes="180x180" href={img} />
<link rel="manifest" href={img} />
<body>
<UrqlProvider client={client} ssr={ssr}>
<Provider>{children}</Provider>

View File

@@ -18,12 +18,11 @@ import LinksDeletedChart from "./LinksDeletedChart";
import { LineChartArr } from "@/types/LineChartStats";
import CommandResponsesChart from "./CommandResponsesChart";
import TimedTriggeredChart from "./TimesTriggeredChart";
import GetStatsRange from "@/graphql/queries/getStatsRange";
import StatsList from "./StatsList";
import GetTotalGroupsQuery from "@/graphql/queries/getTotalGroups";
import GetTotalStatsQuery from "@/graphql/queries/getTotalStats";
import GetTodaysStatsQuery from "@/graphql/queries/getTodaysStats";
import Image from "next/image";
import GetStatsRange from "@/graphql/queries/getStatsRange";
export default function Home() {
// * Total Groups * //
@@ -57,12 +56,14 @@ export default function Home() {
// * 30 Day Stats * //
// Dates
const [currDate, setCurrDate] = useState<Date>();
const [date30DaysAgo, setDate30DaysAgo] = useState<Date>();
const [currDate, setCurrDate] = useState<String>();
const [date30DaysAgo, setDate30DaysAgo] = useState<String>();
useEffect(() => {
setCurrDate(new Date());
setDate30DaysAgo(new Date(new Date().setDate(new Date().getDay() - 30)));
setCurrDate(new Date().toJSON());
setDate30DaysAgo(
new Date(new Date().setDate(new Date().getDay() - 30)).toJSON()
);
}, []);
const [
@@ -74,8 +75,8 @@ export default function Home() {
] = useQuery({
query: GetStatsRange,
variables: {
stateDate: currDate,
endDate: date30DaysAgo
startDate: currDate || "",
endDate: date30DaysAgo || ""
}
});
@@ -85,25 +86,14 @@ export default function Home() {
);
useEffect(() => {
if (!thirtyDayStatsFetching && thirtyDayStats.getStatsRange) {
if (!thirtyDayStatsFetching && thirtyDayStats && !thirtyDayStatsError) {
setLineChartArrState(lineChartArr(thirtyDayStats.getStatsRange));
}
}, [
thirtyDayStats.getStatsRange,
thirtyDayStatsError,
thirtyDayStatsFetching
]);
}, [thirtyDayStats, thirtyDayStatsError, thirtyDayStatsFetching]);
return (
<Fragment>
<VStack
bg="cyan.950"
w="100vw"
minH="100vh"
h="100%"
py="5vh"
minW="fit-content"
>
<VStack bg="cyan.950" minH="100vh" h="100%" py="5vh" minW="fit-content">
<VStack w={{ base: "100%", md: "90%" }} gap={10} minW="fit-content">
<VStack w="80%" gap={10}>
<Icon h="7.5rem" color="whiteAlpha">
@@ -123,9 +113,9 @@ export default function Home() {
</g>
</svg>
</Icon>
<VStack gap={4} maxW="30rem">
<VStack gap={4} maxW="34rem">
<Heading as="h1" fontSize="5xl">
{"Nazi Site Patrol Stats"}
{"Anti Nazi Sites Bot Stats"}
</Heading>
<Heading
as="h2"
@@ -152,23 +142,46 @@ export default function Home() {
</VStack>
</VStack>
<VStack gap={10} w="100%">
<StatsList
title="Total Stats"
loading={totalStatsFetching || totalGroupsFetching}
error={totalStatsError || totalGroupsError}
groups={totalGroups.getTotalGroups}
links={totalStats.getTotalStats.linksDeleted}
commands={totalStats.getTotalStats.commandResponses}
triggers={totalStats.getTotalStats.timesTriggered}
/>
<StatsList
title="Today's Stats"
loading={todaysStatsFetching}
error={todaysStatsError}
links={todayStats.getTodayStats.linksDeleted}
commands={todayStats.getTodayStats.commandResponses}
triggers={todayStats.getTodayStats.timesTriggered}
/>
{totalGroups ? (
<StatsList
title="Total Stats"
loading={totalStatsFetching || totalGroupsFetching}
error={totalStatsError || totalGroupsError}
groups={totalGroups.getTotalGroups}
links={totalStats.getTotalStats.linksDeleted}
commands={totalStats.getTotalStats.commandResponses}
triggers={totalStats.getTotalStats.timesTriggered}
/>
) : (
<StatsList
title="Total Stats"
loading={totalStatsFetching || totalGroupsFetching}
error={totalStatsError || totalGroupsError}
groups={0}
links={0}
commands={0}
triggers={0}
/>
)}
{todayStats ? (
<StatsList
title="Today's Stats"
loading={todaysStatsFetching}
error={todaysStatsError}
links={todayStats.getTodayStats.linksDeleted}
commands={todayStats.getTodayStats.commandResponses}
triggers={todayStats.getTodayStats.timesTriggered}
/>
) : (
<StatsList
title="Today's Stats"
loading={todaysStatsFetching}
error={todaysStatsError}
links={0}
commands={0}
triggers={0}
/>
)}
</VStack>
<VStack w="95%" gap="5vh">
<VStack gap={1}>
@@ -189,29 +202,66 @@ export default function Home() {
</VStack>
</VStack>
</VStack>
<VStack
w="100vw"
<Box
bgImage={`linear-gradient(
to right,
rgb(85, 205, 252),
rgb(179, 157, 233),
rgb(247, 168, 184),
rgb(246, 216, 221),
rgb(255, 255, 255) 10%,
rgb(0, 0, 0),
rgb(54, 35, 18),
rgb(120, 79, 23),
rgb(181, 63, 27),
rgb(237, 34, 36),
rgb(243, 91, 34),
rgb(249, 150, 33),
rgb(245, 193, 30),
rgb(241, 235, 27) 48%,
rgb(241, 235, 27),
rgb(241, 235, 27) 52%,
rgb(99, 199, 32),
rgb(12, 155, 73),
rgb(33, 135, 141),
rgb(57, 84, 165),
rgb(97, 55, 155),
rgb(147, 40, 142)
)`}
w="100%"
py="5vh"
textAlign="center"
color="white"
textShadow="0px 0px 5px black;"
gap={6}
>
<Text fontSize="3xl" w="auto" bg="blackAlpha.400" maxW="62vw">
{"Down with fascism! Fuck MAGA! Fuck Trump! Fuck Nazis!"}
</Text>
<Text fontSize="3xl" w="auto" bg="blackAlpha.400" maxW="62vw">
{
"Trans rights are human rights! Trans women are women! Trans men are men! Never let them take away your happiness!"
}
</Text>
</VStack>
<Box w="100vw" h="100vh" position="fixed" bottom="-510px" zIndex={-1}>
<Image
fill
alt="intersex inclusive pride flag"
src="https://upload.wikimedia.org/wikipedia/commons/6/60/Intersex-inclusive_pride_flag.svg"
/>
<VStack
color="white"
textShadow="0px 0px 5px black;"
WebkitTextStroke="0.3px black;"
gap={6}
w="100%"
>
<Text
fontSize="3xl"
minW="fit-content"
w={{ base: "100%", sm: "auto" }}
bg="blackAlpha.600"
maxW={{ base: "", sm: "62vw" }}
px={2}
>
{"Down with fascism! Fuck MAGA! Fuck Trump! Fuck Nazis!"}
</Text>
<Text
fontSize="3xl"
minW="fit-content"
w={{ base: "100%", sm: "auto" }}
bg="blackAlpha.600"
maxW={{ base: "", sm: "62vw" }}
px={2}
>
{
"Trans rights are human rights! Trans women are women! Trans men are men! Never let them take away your happiness!"
}
</Text>
</VStack>
</Box>
</Fragment>
);

View File

@@ -32,7 +32,7 @@ const LineChartComponent = ({
axisLine={false}
dataKey={chart.key("day")}
stroke={chart.color("border")}
// label={{ value: "Day", position: "bottom" }}
label={{ value: "Date", position: "bottom" }}
/>
<YAxis
width="auto"
@@ -40,7 +40,7 @@ const LineChartComponent = ({
tickLine={false}
tickMargin={10}
stroke={chart.color("border")}
// label={{ value: label, position: "left", angle: -90 }}
// label={{ value: label, position: "left", angle: -90 }}
/>
<Tooltip
animationDuration={100}

View File

@@ -1,7 +1,7 @@
import { gql } from "@urql/next";
const GetStatsRange = gql`
query getStatsRange($startDate: Date, $endDate: Date) {
query getStatsRange($startDate: String!, $endDate: String!) {
getStatsRange(endDate: $startDate, startDate: $endDate) {
commandResponses
createdAt

View File

@@ -1,6 +1,24 @@
import prisma from "@/lib/prismaClient";
import { BigIntResolver } from "graphql-scalars";
const envMutationKey = process.env.MUTATION_KEY || "";
const env = process.env.NODE_ENV || "development";
const isDailyStatToday = (date: string): boolean => {
const today = new Date().setHours(0, 0, 0, 0);
const dailyStatCreated = new Date(date).setHours(0, 0, 0, 0);
return today == dailyStatCreated;
};
const getLatestDailyStat = async () => {
return await prisma.dailyStats.findFirst({
orderBy: {
createdAt: "desc"
}
});
};
// Prisma
export const resolvers = {
// scalars
@@ -19,6 +37,11 @@ export const resolvers = {
// _ctx: unknown
) => {
const { startDate, endDate } = data;
if (!startDate || !endDate) {
return null;
}
return await prisma.dailyStats.findMany({
where: {
createdAt: {
@@ -36,82 +59,140 @@ export const resolvers = {
orderBy: {
createdAt: "asc"
}
}),
getGroupStats: async (
_parent: unknown,
data: { groupID: number }
// _ctx: unknown
) =>
await prisma.groups.findUnique({
where: {
telegramID: BigInt(data.groupID)
}
})
},
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 (
init: async (
_parent: unknown,
data: { groupID: number; groupName: string; groupUsername: string }
data: { mutationKey?: string }
// _ctx: unknown
) => {
const { groupID, groupName, groupUsername } = data;
const { mutationKey } = data;
const existingGroup = await prisma.groups.findFirst({
where: { telegramID: groupID }
if (env !== "development") {
if (!mutationKey) {
return null;
}
if (mutationKey !== envMutationKey) {
return null;
}
}
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: { mutationKey?: string }
// _ctx: unknown
) => {
const { mutationKey } = data;
if (env !== "development") {
if (!mutationKey) {
return null;
}
if (mutationKey !== envMutationKey) {
return null;
}
}
const latestDailyStats = await getLatestDailyStat();
if (latestDailyStats !== null) {
if (isDailyStatToday(String(latestDailyStats.createdAt))) {
return null;
}
}
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: string;
groupName: string;
groupUsername: string;
mutationKey?: string;
}
// _ctx: unknown
) => {
const { groupID, groupName, groupUsername, mutationKey } = data;
const groupIDInt = BigInt(groupID);
if (env !== "development") {
if (!mutationKey) {
return null;
}
if (mutationKey !== envMutationKey) {
return null;
}
}
const existingGroup = await prisma.groups.findUnique({
where: { telegramID: groupIDInt }
});
if (existingGroup !== null) {
@@ -132,46 +213,81 @@ export const resolvers = {
return await prisma.groups.create({
data: {
telegramID: groupID,
telegramID: groupIDInt,
name: groupName
}
});
},
incrementGroup: async (
_parent: unknown,
data: { groupID: number; linksDeleted: number }
data: { groupID: number; linksDeleted: number; mutationKey?: string }
// _ctx: unknown
) => {
const { groupID, linksDeleted } = data;
const { groupID, linksDeleted, mutationKey } = data;
if (env !== "development") {
if (!mutationKey) {
return null;
}
if (mutationKey !== envMutationKey) {
return null;
}
}
return await prisma.groups.update({
where: { telegramID: groupID },
where: { telegramID: BigInt(groupID) },
data: { linksDeleted: { increment: linksDeleted } }
});
},
increment: async (
_parent: unknown,
data: { link: boolean; command: boolean; trigger: boolean }
data: {
link: boolean;
command: boolean;
trigger: boolean;
mutationKey?: string;
}
// _ctx: unknown
) => {
const { link, command, trigger } = data;
const { link, command, trigger, mutationKey } = data;
return await prisma.dailyStats
.findFirst({
orderBy: {
createdAt: "desc"
if (env !== "development") {
if (!mutationKey) {
return null;
}
if (mutationKey !== envMutationKey) {
return null;
}
}
let latestDailyStats = await getLatestDailyStat();
if (latestDailyStats !== null) {
if (!isDailyStatToday(String(latestDailyStats.createdAt))) {
const date = new Date().toISOString();
await prisma.dailyStats
.create({ data: { createdAt: date } })
.then(async () => {
latestDailyStats = await prisma.dailyStats.findFirst({
orderBy: {
createdAt: "desc"
}
});
});
}
return await prisma.dailyStats.update({
where: { createdAt: latestDailyStats.createdAt },
data: {
linksDeleted: { increment: link ? 1 : 0 },
commandResponses: { increment: command ? 1 : 0 },
timesTriggered: { increment: trigger ? 1 : 0 }
}
})
.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

@@ -7,15 +7,30 @@ const typeDefs = /* GraphQL */ `
type Query {
getTotalGroups: Int!
getTodayStats: DailyStats!
getStatsRange(startDate: Date, endDate: Date): [DailyStats]
getStatsRange(startDate: String!, endDate: String!): [DailyStats]
getTotalStats: TotalStats!
getGroupStats(groupID: String!): Groups
}
type Mutation {
init: String!
cronJob: TotalStats!
addGroup(groupID: BigInt, groupName: String, groupUsername: String): Groups!
incrementGroup(groupID: BigInt, linksDeleted: Int): Groups!
increment(link: Boolean, command: Boolean, trigger: Boolean): DailyStats!
init(mutationKey: String): String!
cronJob(mutationKey: String): TotalStats!
addGroup(
groupID: String!
groupName: String!
groupUsername: String
mutationKey: String
): Groups!
incrementGroup(
groupID: String!
linksDeleted: Int!
mutationKey: String
): Groups!
increment(
link: Boolean
command: Boolean
trigger: Boolean
mutationKey: String
): DailyStats!
}
type Groups {

View File

@@ -1,34 +0,0 @@
/* !!! This is code generated by Prisma. Do not edit directly. !!! */
/* eslint-disable */
// biome-ignore-all lint: generated file
// @ts-nocheck
/*
* This file should be your main import to use Prisma-related types and utilities in a browser.
* Use it to get access to models, enums, and input types.
*
* This file does not contain a `PrismaClient` class, nor several other helpers that are intended as server-side only.
* See `client.ts` for the standard, server-side entry point.
*
* 🟢 You can import this file directly.
*/
import * as Prisma from './internal/prismaNamespaceBrowser'
export { Prisma }
export * as $Enums from './enums'
export * from './enums';
/**
* Model Groups
*
*/
export type Groups = Prisma.GroupsModel
/**
* Model TotalStats
*
*/
export type TotalStats = Prisma.TotalStatsModel
/**
* Model DailyStats
*
*/
export type DailyStats = Prisma.DailyStatsModel

View File

@@ -1,61 +0,0 @@
/* !!! This is code generated by Prisma. Do not edit directly. !!! */
/* eslint-disable */
// biome-ignore-all lint: generated file
// @ts-nocheck
/*
* This file should be your main import to use Prisma. Through it you get access to all the models, enums, and input types.
* If you're looking for something you can import in the client-side of your application, please refer to the `browser.ts` file instead.
*
* 🟢 You can import this file directly.
*/
import * as process from 'node:process'
import * as path from 'node:path'
import { fileURLToPath } from 'node:url'
globalThis['__dirname'] = path.dirname(fileURLToPath(import.meta.url))
import * as runtime from "@prisma/client/runtime/library"
import * as $Enums from "./enums"
import * as $Class from "./internal/class"
import * as Prisma from "./internal/prismaNamespace"
export * as $Enums from './enums'
export * from "./enums"
/**
* ## Prisma Client
*
* Type-safe database client for TypeScript
* @example
* ```
* const prisma = new PrismaClient()
* // Fetch zero or more Groups
* const groups = await prisma.groups.findMany()
* ```
*
* Read more in our [docs](https://www.prisma.io/docs/reference/tools-and-interfaces/prisma-client).
*/
export const PrismaClient = $Class.getPrismaClientClass(__dirname)
export type PrismaClient<LogOpts extends Prisma.LogLevel = never, OmitOpts extends Prisma.PrismaClientOptions["omit"] = Prisma.PrismaClientOptions["omit"], ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs> = $Class.PrismaClient<LogOpts, OmitOpts, ExtArgs>
export { Prisma }
// file annotations for bundling tools to include these files
path.join(__dirname, "libquery_engine-debian-openssl-3.0.x.so.node")
path.join(process.cwd(), "src/prisma/generated/libquery_engine-debian-openssl-3.0.x.so.node")
/**
* Model Groups
*
*/
export type Groups = Prisma.GroupsModel
/**
* Model TotalStats
*
*/
export type TotalStats = Prisma.TotalStatsModel
/**
* Model DailyStats
*
*/
export type DailyStats = Prisma.DailyStatsModel

View File

@@ -1,250 +0,0 @@
/* !!! This is code generated by Prisma. Do not edit directly. !!! */
/* eslint-disable */
// biome-ignore-all lint: generated file
// @ts-nocheck
/*
* This file exports various common sort, input & filter types that are not directly linked to a particular model.
*
* 🟢 You can import this file directly.
*/
import type * as runtime from "@prisma/client/runtime/library"
import * as $Enums from "./enums"
import type * as Prisma from "./internal/prismaNamespace"
export type BigIntFilter<$PrismaModel = never> = {
equals?: bigint | number | Prisma.BigIntFieldRefInput<$PrismaModel>
in?: bigint[] | number[] | Prisma.ListBigIntFieldRefInput<$PrismaModel>
notIn?: bigint[] | number[] | Prisma.ListBigIntFieldRefInput<$PrismaModel>
lt?: bigint | number | Prisma.BigIntFieldRefInput<$PrismaModel>
lte?: bigint | number | Prisma.BigIntFieldRefInput<$PrismaModel>
gt?: bigint | number | Prisma.BigIntFieldRefInput<$PrismaModel>
gte?: bigint | number | Prisma.BigIntFieldRefInput<$PrismaModel>
not?: Prisma.NestedBigIntFilter<$PrismaModel> | bigint | number
}
export type StringFilter<$PrismaModel = never> = {
equals?: string | Prisma.StringFieldRefInput<$PrismaModel>
in?: string[] | Prisma.ListStringFieldRefInput<$PrismaModel>
notIn?: string[] | Prisma.ListStringFieldRefInput<$PrismaModel>
lt?: string | Prisma.StringFieldRefInput<$PrismaModel>
lte?: string | Prisma.StringFieldRefInput<$PrismaModel>
gt?: string | Prisma.StringFieldRefInput<$PrismaModel>
gte?: string | Prisma.StringFieldRefInput<$PrismaModel>
contains?: string | Prisma.StringFieldRefInput<$PrismaModel>
startsWith?: string | Prisma.StringFieldRefInput<$PrismaModel>
endsWith?: string | Prisma.StringFieldRefInput<$PrismaModel>
mode?: Prisma.QueryMode
not?: Prisma.NestedStringFilter<$PrismaModel> | string
}
export type DateTimeFilter<$PrismaModel = never> = {
equals?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel>
in?: Date[] | string[] | Prisma.ListDateTimeFieldRefInput<$PrismaModel>
notIn?: Date[] | string[] | Prisma.ListDateTimeFieldRefInput<$PrismaModel>
lt?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel>
lte?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel>
gt?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel>
gte?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel>
not?: Prisma.NestedDateTimeFilter<$PrismaModel> | Date | string
}
export type BigIntWithAggregatesFilter<$PrismaModel = never> = {
equals?: bigint | number | Prisma.BigIntFieldRefInput<$PrismaModel>
in?: bigint[] | number[] | Prisma.ListBigIntFieldRefInput<$PrismaModel>
notIn?: bigint[] | number[] | Prisma.ListBigIntFieldRefInput<$PrismaModel>
lt?: bigint | number | Prisma.BigIntFieldRefInput<$PrismaModel>
lte?: bigint | number | Prisma.BigIntFieldRefInput<$PrismaModel>
gt?: bigint | number | Prisma.BigIntFieldRefInput<$PrismaModel>
gte?: bigint | number | Prisma.BigIntFieldRefInput<$PrismaModel>
not?: Prisma.NestedBigIntWithAggregatesFilter<$PrismaModel> | bigint | number
_count?: Prisma.NestedIntFilter<$PrismaModel>
_avg?: Prisma.NestedFloatFilter<$PrismaModel>
_sum?: Prisma.NestedBigIntFilter<$PrismaModel>
_min?: Prisma.NestedBigIntFilter<$PrismaModel>
_max?: Prisma.NestedBigIntFilter<$PrismaModel>
}
export type StringWithAggregatesFilter<$PrismaModel = never> = {
equals?: string | Prisma.StringFieldRefInput<$PrismaModel>
in?: string[] | Prisma.ListStringFieldRefInput<$PrismaModel>
notIn?: string[] | Prisma.ListStringFieldRefInput<$PrismaModel>
lt?: string | Prisma.StringFieldRefInput<$PrismaModel>
lte?: string | Prisma.StringFieldRefInput<$PrismaModel>
gt?: string | Prisma.StringFieldRefInput<$PrismaModel>
gte?: string | Prisma.StringFieldRefInput<$PrismaModel>
contains?: string | Prisma.StringFieldRefInput<$PrismaModel>
startsWith?: string | Prisma.StringFieldRefInput<$PrismaModel>
endsWith?: string | Prisma.StringFieldRefInput<$PrismaModel>
mode?: Prisma.QueryMode
not?: Prisma.NestedStringWithAggregatesFilter<$PrismaModel> | string
_count?: Prisma.NestedIntFilter<$PrismaModel>
_min?: Prisma.NestedStringFilter<$PrismaModel>
_max?: Prisma.NestedStringFilter<$PrismaModel>
}
export type DateTimeWithAggregatesFilter<$PrismaModel = never> = {
equals?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel>
in?: Date[] | string[] | Prisma.ListDateTimeFieldRefInput<$PrismaModel>
notIn?: Date[] | string[] | Prisma.ListDateTimeFieldRefInput<$PrismaModel>
lt?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel>
lte?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel>
gt?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel>
gte?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel>
not?: Prisma.NestedDateTimeWithAggregatesFilter<$PrismaModel> | Date | string
_count?: Prisma.NestedIntFilter<$PrismaModel>
_min?: Prisma.NestedDateTimeFilter<$PrismaModel>
_max?: Prisma.NestedDateTimeFilter<$PrismaModel>
}
export type IntFilter<$PrismaModel = never> = {
equals?: number | Prisma.IntFieldRefInput<$PrismaModel>
in?: number[] | Prisma.ListIntFieldRefInput<$PrismaModel>
notIn?: number[] | Prisma.ListIntFieldRefInput<$PrismaModel>
lt?: number | Prisma.IntFieldRefInput<$PrismaModel>
lte?: number | Prisma.IntFieldRefInput<$PrismaModel>
gt?: number | Prisma.IntFieldRefInput<$PrismaModel>
gte?: number | Prisma.IntFieldRefInput<$PrismaModel>
not?: Prisma.NestedIntFilter<$PrismaModel> | number
}
export type IntWithAggregatesFilter<$PrismaModel = never> = {
equals?: number | Prisma.IntFieldRefInput<$PrismaModel>
in?: number[] | Prisma.ListIntFieldRefInput<$PrismaModel>
notIn?: number[] | Prisma.ListIntFieldRefInput<$PrismaModel>
lt?: number | Prisma.IntFieldRefInput<$PrismaModel>
lte?: number | Prisma.IntFieldRefInput<$PrismaModel>
gt?: number | Prisma.IntFieldRefInput<$PrismaModel>
gte?: number | Prisma.IntFieldRefInput<$PrismaModel>
not?: Prisma.NestedIntWithAggregatesFilter<$PrismaModel> | number
_count?: Prisma.NestedIntFilter<$PrismaModel>
_avg?: Prisma.NestedFloatFilter<$PrismaModel>
_sum?: Prisma.NestedIntFilter<$PrismaModel>
_min?: Prisma.NestedIntFilter<$PrismaModel>
_max?: Prisma.NestedIntFilter<$PrismaModel>
}
export type NestedBigIntFilter<$PrismaModel = never> = {
equals?: bigint | number | Prisma.BigIntFieldRefInput<$PrismaModel>
in?: bigint[] | number[] | Prisma.ListBigIntFieldRefInput<$PrismaModel>
notIn?: bigint[] | number[] | Prisma.ListBigIntFieldRefInput<$PrismaModel>
lt?: bigint | number | Prisma.BigIntFieldRefInput<$PrismaModel>
lte?: bigint | number | Prisma.BigIntFieldRefInput<$PrismaModel>
gt?: bigint | number | Prisma.BigIntFieldRefInput<$PrismaModel>
gte?: bigint | number | Prisma.BigIntFieldRefInput<$PrismaModel>
not?: Prisma.NestedBigIntFilter<$PrismaModel> | bigint | number
}
export type NestedStringFilter<$PrismaModel = never> = {
equals?: string | Prisma.StringFieldRefInput<$PrismaModel>
in?: string[] | Prisma.ListStringFieldRefInput<$PrismaModel>
notIn?: string[] | Prisma.ListStringFieldRefInput<$PrismaModel>
lt?: string | Prisma.StringFieldRefInput<$PrismaModel>
lte?: string | Prisma.StringFieldRefInput<$PrismaModel>
gt?: string | Prisma.StringFieldRefInput<$PrismaModel>
gte?: string | Prisma.StringFieldRefInput<$PrismaModel>
contains?: string | Prisma.StringFieldRefInput<$PrismaModel>
startsWith?: string | Prisma.StringFieldRefInput<$PrismaModel>
endsWith?: string | Prisma.StringFieldRefInput<$PrismaModel>
not?: Prisma.NestedStringFilter<$PrismaModel> | string
}
export type NestedDateTimeFilter<$PrismaModel = never> = {
equals?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel>
in?: Date[] | string[] | Prisma.ListDateTimeFieldRefInput<$PrismaModel>
notIn?: Date[] | string[] | Prisma.ListDateTimeFieldRefInput<$PrismaModel>
lt?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel>
lte?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel>
gt?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel>
gte?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel>
not?: Prisma.NestedDateTimeFilter<$PrismaModel> | Date | string
}
export type NestedBigIntWithAggregatesFilter<$PrismaModel = never> = {
equals?: bigint | number | Prisma.BigIntFieldRefInput<$PrismaModel>
in?: bigint[] | number[] | Prisma.ListBigIntFieldRefInput<$PrismaModel>
notIn?: bigint[] | number[] | Prisma.ListBigIntFieldRefInput<$PrismaModel>
lt?: bigint | number | Prisma.BigIntFieldRefInput<$PrismaModel>
lte?: bigint | number | Prisma.BigIntFieldRefInput<$PrismaModel>
gt?: bigint | number | Prisma.BigIntFieldRefInput<$PrismaModel>
gte?: bigint | number | Prisma.BigIntFieldRefInput<$PrismaModel>
not?: Prisma.NestedBigIntWithAggregatesFilter<$PrismaModel> | bigint | number
_count?: Prisma.NestedIntFilter<$PrismaModel>
_avg?: Prisma.NestedFloatFilter<$PrismaModel>
_sum?: Prisma.NestedBigIntFilter<$PrismaModel>
_min?: Prisma.NestedBigIntFilter<$PrismaModel>
_max?: Prisma.NestedBigIntFilter<$PrismaModel>
}
export type NestedIntFilter<$PrismaModel = never> = {
equals?: number | Prisma.IntFieldRefInput<$PrismaModel>
in?: number[] | Prisma.ListIntFieldRefInput<$PrismaModel>
notIn?: number[] | Prisma.ListIntFieldRefInput<$PrismaModel>
lt?: number | Prisma.IntFieldRefInput<$PrismaModel>
lte?: number | Prisma.IntFieldRefInput<$PrismaModel>
gt?: number | Prisma.IntFieldRefInput<$PrismaModel>
gte?: number | Prisma.IntFieldRefInput<$PrismaModel>
not?: Prisma.NestedIntFilter<$PrismaModel> | number
}
export type NestedFloatFilter<$PrismaModel = never> = {
equals?: number | Prisma.FloatFieldRefInput<$PrismaModel>
in?: number[] | Prisma.ListFloatFieldRefInput<$PrismaModel>
notIn?: number[] | Prisma.ListFloatFieldRefInput<$PrismaModel>
lt?: number | Prisma.FloatFieldRefInput<$PrismaModel>
lte?: number | Prisma.FloatFieldRefInput<$PrismaModel>
gt?: number | Prisma.FloatFieldRefInput<$PrismaModel>
gte?: number | Prisma.FloatFieldRefInput<$PrismaModel>
not?: Prisma.NestedFloatFilter<$PrismaModel> | number
}
export type NestedStringWithAggregatesFilter<$PrismaModel = never> = {
equals?: string | Prisma.StringFieldRefInput<$PrismaModel>
in?: string[] | Prisma.ListStringFieldRefInput<$PrismaModel>
notIn?: string[] | Prisma.ListStringFieldRefInput<$PrismaModel>
lt?: string | Prisma.StringFieldRefInput<$PrismaModel>
lte?: string | Prisma.StringFieldRefInput<$PrismaModel>
gt?: string | Prisma.StringFieldRefInput<$PrismaModel>
gte?: string | Prisma.StringFieldRefInput<$PrismaModel>
contains?: string | Prisma.StringFieldRefInput<$PrismaModel>
startsWith?: string | Prisma.StringFieldRefInput<$PrismaModel>
endsWith?: string | Prisma.StringFieldRefInput<$PrismaModel>
not?: Prisma.NestedStringWithAggregatesFilter<$PrismaModel> | string
_count?: Prisma.NestedIntFilter<$PrismaModel>
_min?: Prisma.NestedStringFilter<$PrismaModel>
_max?: Prisma.NestedStringFilter<$PrismaModel>
}
export type NestedDateTimeWithAggregatesFilter<$PrismaModel = never> = {
equals?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel>
in?: Date[] | string[] | Prisma.ListDateTimeFieldRefInput<$PrismaModel>
notIn?: Date[] | string[] | Prisma.ListDateTimeFieldRefInput<$PrismaModel>
lt?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel>
lte?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel>
gt?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel>
gte?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel>
not?: Prisma.NestedDateTimeWithAggregatesFilter<$PrismaModel> | Date | string
_count?: Prisma.NestedIntFilter<$PrismaModel>
_min?: Prisma.NestedDateTimeFilter<$PrismaModel>
_max?: Prisma.NestedDateTimeFilter<$PrismaModel>
}
export type NestedIntWithAggregatesFilter<$PrismaModel = never> = {
equals?: number | Prisma.IntFieldRefInput<$PrismaModel>
in?: number[] | Prisma.ListIntFieldRefInput<$PrismaModel>
notIn?: number[] | Prisma.ListIntFieldRefInput<$PrismaModel>
lt?: number | Prisma.IntFieldRefInput<$PrismaModel>
lte?: number | Prisma.IntFieldRefInput<$PrismaModel>
gt?: number | Prisma.IntFieldRefInput<$PrismaModel>
gte?: number | Prisma.IntFieldRefInput<$PrismaModel>
not?: Prisma.NestedIntWithAggregatesFilter<$PrismaModel> | number
_count?: Prisma.NestedIntFilter<$PrismaModel>
_avg?: Prisma.NestedFloatFilter<$PrismaModel>
_sum?: Prisma.NestedIntFilter<$PrismaModel>
_min?: Prisma.NestedIntFilter<$PrismaModel>
_max?: Prisma.NestedIntFilter<$PrismaModel>
}

View File

@@ -1,15 +0,0 @@
/* !!! This is code generated by Prisma. Do not edit directly. !!! */
/* eslint-disable */
// biome-ignore-all lint: generated file
// @ts-nocheck
/*
* This file exports all enum related types from the schema.
*
* 🟢 You can import this file directly.
*/
// This file is empty because there are no enums in the schema.
export {}

View File

@@ -1,206 +0,0 @@
/* !!! This is code generated by Prisma. Do not edit directly. !!! */
/* eslint-disable */
// biome-ignore-all lint: generated file
// @ts-nocheck
/*
* WARNING: This is an internal file that is subject to change!
*
* 🛑 Under no circumstances should you import this file directly! 🛑
*
* Please import the `PrismaClient` class from the `client.ts` file instead.
*/
import * as runtime from "@prisma/client/runtime/library"
import type * as Prisma from "./prismaNamespace"
const config: runtime.GetPrismaClientConfig = {
"generator": {
"name": "client",
"provider": {
"fromEnvVar": null,
"value": "prisma-client"
},
"output": {
"value": "/home/lucid/work/cove-gitea/no-twitter-bot-stats/src/prisma/generated",
"fromEnvVar": null
},
"config": {
"engineType": "library"
},
"binaryTargets": [
{
"fromEnvVar": null,
"value": "debian-openssl-3.0.x",
"native": true
}
],
"previewFeatures": [],
"sourceFilePath": "/home/lucid/work/cove-gitea/no-twitter-bot-stats/src/prisma/schema.prisma",
"isCustomOutput": true
},
"relativePath": "..",
"clientVersion": "6.19.0",
"engineVersion": "2ba551f319ab1df4bc874a89965d8b3641056773",
"datasourceNames": [
"db"
],
"activeProvider": "mongodb",
"postinstall": false,
"inlineDatasources": {
"db": {
"url": {
"fromEnvVar": "DATABASE_URL",
"value": null
}
}
},
"inlineSchema": "// This is your Prisma schema file,\n// learn more about it in the docs: https://pris.ly/d/prisma-schema\n\n// Looking for ways to speed up your queries, or scale easily with your serverless or edge functions?\n// Try Prisma Accelerate: https://pris.ly/cli/accelerate-init\n\ngenerator client {\n provider = \"prisma-client\"\n output = \"generated\"\n}\n\ndatasource db {\n provider = \"mongodb\"\n url = env(\"DATABASE_URL\")\n}\n\nmodel Groups {\n telegramID BigInt @id @map(\"_id\") @db.Long\n name String\n username String @default(\"\")\n linksDeleted BigInt @default(0) @db.Long\n createdAt DateTime @default(now())\n updatedAt DateTime @default(now()) @updatedAt\n}\n\nmodel TotalStats {\n createdAt DateTime @id @default(now()) @map(\"_id\")\n updatedAt DateTime @default(now()) @updatedAt\n linksDeleted BigInt @default(0) @db.Long\n commandResponses BigInt @default(0) @db.Long\n timesTriggered BigInt @default(0) @db.Long\n}\n\nmodel DailyStats {\n createdAt DateTime @id @default(now()) @map(\"_id\")\n updatedAt DateTime @default(now()) @updatedAt\n linksDeleted Int @default(0) @db.Int\n commandResponses Int @default(0) @db.Int\n timesTriggered Int @default(0) @db.Int\n}\n",
"inlineSchemaHash": "7ad3413e48bf8457ce655de4b457d4b5629952ca6a037b0fe084bc063b32d97d",
"copyEngine": true,
"runtimeDataModel": {
"models": {},
"enums": {},
"types": {}
},
"dirname": ""
}
config.runtimeDataModel = JSON.parse("{\"models\":{\"Groups\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"telegramID\",\"dbName\":\"_id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"BigInt\",\"nativeType\":[\"Long\",[]],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"name\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"username\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":\"\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"linksDeleted\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"BigInt\",\"nativeType\":[\"Long\",[]],\"default\":\"0\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":true}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"TotalStats\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"createdAt\",\"dbName\":\"_id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":true},{\"name\":\"linksDeleted\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"BigInt\",\"nativeType\":[\"Long\",[]],\"default\":\"0\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"commandResponses\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"BigInt\",\"nativeType\":[\"Long\",[]],\"default\":\"0\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"timesTriggered\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"BigInt\",\"nativeType\":[\"Long\",[]],\"default\":\"0\",\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"DailyStats\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"createdAt\",\"dbName\":\"_id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":true},{\"name\":\"linksDeleted\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"nativeType\":[\"Int\",[]],\"default\":0,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"commandResponses\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"nativeType\":[\"Int\",[]],\"default\":0,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"timesTriggered\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"nativeType\":[\"Int\",[]],\"default\":0,\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false}},\"enums\":{},\"types\":{}}")
config.engineWasm = undefined
config.compilerWasm = undefined
export type LogOptions<ClientOptions extends Prisma.PrismaClientOptions> =
'log' extends keyof ClientOptions ? ClientOptions['log'] extends Array<Prisma.LogLevel | Prisma.LogDefinition> ? Prisma.GetEvents<ClientOptions['log']> : never : never
export interface PrismaClientConstructor {
/**
* ## Prisma Client
*
* Type-safe database client for TypeScript
* @example
* ```
* const prisma = new PrismaClient()
* // Fetch zero or more Groups
* const groups = await prisma.groups.findMany()
* ```
*
* Read more in our [docs](https://www.prisma.io/docs/reference/tools-and-interfaces/prisma-client).
*/
new <
Options extends Prisma.PrismaClientOptions = Prisma.PrismaClientOptions,
LogOpts extends LogOptions<Options> = LogOptions<Options>,
OmitOpts extends Prisma.PrismaClientOptions['omit'] = Options extends { omit: infer U } ? U : Prisma.PrismaClientOptions['omit'],
ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs
>(options?: Prisma.Subset<Options, Prisma.PrismaClientOptions> ): PrismaClient<LogOpts, OmitOpts, ExtArgs>
}
/**
* ## Prisma Client
*
* Type-safe database client for TypeScript
* @example
* ```
* const prisma = new PrismaClient()
* // Fetch zero or more Groups
* const groups = await prisma.groups.findMany()
* ```
*
* Read more in our [docs](https://www.prisma.io/docs/reference/tools-and-interfaces/prisma-client).
*/
export interface PrismaClient<
in LogOpts extends Prisma.LogLevel = never,
in out OmitOpts extends Prisma.PrismaClientOptions['omit'] = Prisma.PrismaClientOptions['omit'],
in out ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs
> {
[K: symbol]: { types: Prisma.TypeMap<ExtArgs>['other'] }
$on<V extends LogOpts>(eventType: V, callback: (event: V extends 'query' ? Prisma.QueryEvent : Prisma.LogEvent) => void): PrismaClient;
/**
* Connect with the database
*/
$connect(): runtime.Types.Utils.JsPromise<void>;
/**
* Disconnect from the database
*/
$disconnect(): runtime.Types.Utils.JsPromise<void>;
/**
* Allows the running of a sequence of read/write operations that are guaranteed to either succeed or fail as a whole.
* @example
* ```
* const [george, bob, alice] = await prisma.$transaction([
* prisma.user.create({ data: { name: 'George' } }),
* prisma.user.create({ data: { name: 'Bob' } }),
* prisma.user.create({ data: { name: 'Alice' } }),
* ])
* ```
*
* Read more in our [docs](https://www.prisma.io/docs/concepts/components/prisma-client/transactions).
*/
$transaction<P extends Prisma.PrismaPromise<any>[]>(arg: [...P]): runtime.Types.Utils.JsPromise<runtime.Types.Utils.UnwrapTuple<P>>
$transaction<R>(fn: (prisma: Omit<PrismaClient, runtime.ITXClientDenyList>) => runtime.Types.Utils.JsPromise<R>, options?: { maxWait?: number, timeout?: number }): runtime.Types.Utils.JsPromise<R>
/**
* Executes a raw MongoDB command and returns the result of it.
* @example
* ```
* const user = await prisma.$runCommandRaw({
* aggregate: 'User',
* pipeline: [{ $match: { name: 'Bob' } }, { $project: { email: true, _id: false } }],
* explain: false,
* })
* ```
*
* Read more in our [docs](https://www.prisma.io/docs/reference/tools-and-interfaces/prisma-client/raw-database-access).
*/
$runCommandRaw(command: Prisma.InputJsonObject): Prisma.PrismaPromise<Prisma.JsonObject>
$extends: runtime.Types.Extensions.ExtendsHook<"extends", Prisma.TypeMapCb<OmitOpts>, ExtArgs, runtime.Types.Utils.Call<Prisma.TypeMapCb<OmitOpts>, {
extArgs: ExtArgs
}>>
/**
* `prisma.groups`: Exposes CRUD operations for the **Groups** model.
* Example usage:
* ```ts
* // Fetch zero or more Groups
* const groups = await prisma.groups.findMany()
* ```
*/
get groups(): Prisma.GroupsDelegate<ExtArgs, { omit: OmitOpts }>;
/**
* `prisma.totalStats`: Exposes CRUD operations for the **TotalStats** model.
* Example usage:
* ```ts
* // Fetch zero or more TotalStats
* const totalStats = await prisma.totalStats.findMany()
* ```
*/
get totalStats(): Prisma.TotalStatsDelegate<ExtArgs, { omit: OmitOpts }>;
/**
* `prisma.dailyStats`: Exposes CRUD operations for the **DailyStats** model.
* Example usage:
* ```ts
* // Fetch zero or more DailyStats
* const dailyStats = await prisma.dailyStats.findMany()
* ```
*/
get dailyStats(): Prisma.DailyStatsDelegate<ExtArgs, { omit: OmitOpts }>;
}
export function getPrismaClientClass(dirname: string): PrismaClientConstructor {
config.dirname = dirname
return runtime.getPrismaClient(config) as unknown as PrismaClientConstructor
}

View File

@@ -1,930 +0,0 @@
/* !!! This is code generated by Prisma. Do not edit directly. !!! */
/* eslint-disable */
// biome-ignore-all lint: generated file
// @ts-nocheck
/*
* WARNING: This is an internal file that is subject to change!
*
* 🛑 Under no circumstances should you import this file directly! 🛑
*
* All exports from this file are wrapped under a `Prisma` namespace object in the client.ts file.
* While this enables partial backward compatibility, it is not part of the stable public API.
*
* If you are looking for your Models, Enums, and Input Types, please import them from the respective
* model files in the `model` directory!
*/
import * as runtime from "@prisma/client/runtime/library"
import type * as Prisma from "../models"
import { type PrismaClient } from "./class"
export type * from '../models'
export type DMMF = typeof runtime.DMMF
export type PrismaPromise<T> = runtime.Types.Public.PrismaPromise<T>
/**
* Prisma Errors
*/
export const PrismaClientKnownRequestError = runtime.PrismaClientKnownRequestError
export type PrismaClientKnownRequestError = runtime.PrismaClientKnownRequestError
export const PrismaClientUnknownRequestError = runtime.PrismaClientUnknownRequestError
export type PrismaClientUnknownRequestError = runtime.PrismaClientUnknownRequestError
export const PrismaClientRustPanicError = runtime.PrismaClientRustPanicError
export type PrismaClientRustPanicError = runtime.PrismaClientRustPanicError
export const PrismaClientInitializationError = runtime.PrismaClientInitializationError
export type PrismaClientInitializationError = runtime.PrismaClientInitializationError
export const PrismaClientValidationError = runtime.PrismaClientValidationError
export type PrismaClientValidationError = runtime.PrismaClientValidationError
/**
* Re-export of sql-template-tag
*/
export const sql = runtime.sqltag
export const empty = runtime.empty
export const join = runtime.join
export const raw = runtime.raw
export const Sql = runtime.Sql
export type Sql = runtime.Sql
/**
* Decimal.js
*/
export const Decimal = runtime.Decimal
export type Decimal = runtime.Decimal
export type DecimalJsLike = runtime.DecimalJsLike
/**
* Metrics
*/
export type Metrics = runtime.Metrics
export type Metric<T> = runtime.Metric<T>
export type MetricHistogram = runtime.MetricHistogram
export type MetricHistogramBucket = runtime.MetricHistogramBucket
/**
* Extensions
*/
export type Extension = runtime.Types.Extensions.UserArgs
export const getExtensionContext = runtime.Extensions.getExtensionContext
export type Args<T, F extends runtime.Operation> = runtime.Types.Public.Args<T, F>
export type Payload<T, F extends runtime.Operation = never> = runtime.Types.Public.Payload<T, F>
export type Result<T, A, F extends runtime.Operation> = runtime.Types.Public.Result<T, A, F>
export type Exact<A, W> = runtime.Types.Public.Exact<A, W>
export type PrismaVersion = {
client: string
engine: string
}
/**
* Prisma Client JS version: 6.19.0
* Query Engine version: 2ba551f319ab1df4bc874a89965d8b3641056773
*/
export const prismaVersion: PrismaVersion = {
client: "6.19.0",
engine: "2ba551f319ab1df4bc874a89965d8b3641056773"
}
/**
* Utility Types
*/
export type Bytes = runtime.Bytes
export type JsonObject = runtime.JsonObject
export type JsonArray = runtime.JsonArray
export type JsonValue = runtime.JsonValue
export type InputJsonObject = runtime.InputJsonObject
export type InputJsonArray = runtime.InputJsonArray
export type InputJsonValue = runtime.InputJsonValue
export const NullTypes = {
DbNull: runtime.objectEnumValues.classes.DbNull as (new (secret: never) => typeof runtime.objectEnumValues.instances.DbNull),
JsonNull: runtime.objectEnumValues.classes.JsonNull as (new (secret: never) => typeof runtime.objectEnumValues.instances.JsonNull),
AnyNull: runtime.objectEnumValues.classes.AnyNull as (new (secret: never) => typeof runtime.objectEnumValues.instances.AnyNull),
}
/**
* Helper for filtering JSON entries that have `null` on the database (empty on the db)
*
* @see https://www.prisma.io/docs/concepts/components/prisma-client/working-with-fields/working-with-json-fields#filtering-on-a-json-field
*/
export const DbNull = runtime.objectEnumValues.instances.DbNull
/**
* Helper for filtering JSON entries that have JSON `null` values (not empty on the db)
*
* @see https://www.prisma.io/docs/concepts/components/prisma-client/working-with-fields/working-with-json-fields#filtering-on-a-json-field
*/
export const JsonNull = runtime.objectEnumValues.instances.JsonNull
/**
* Helper for filtering JSON entries that are `Prisma.DbNull` or `Prisma.JsonNull`
*
* @see https://www.prisma.io/docs/concepts/components/prisma-client/working-with-fields/working-with-json-fields#filtering-on-a-json-field
*/
export const AnyNull = runtime.objectEnumValues.instances.AnyNull
type SelectAndInclude = {
select: any
include: any
}
type SelectAndOmit = {
select: any
omit: any
}
/**
* From T, pick a set of properties whose keys are in the union K
*/
type Prisma__Pick<T, K extends keyof T> = {
[P in K]: T[P];
};
export type Enumerable<T> = T | Array<T>;
/**
* Subset
* @desc From `T` pick properties that exist in `U`. Simple version of Intersection
*/
export type Subset<T, U> = {
[key in keyof T]: key extends keyof U ? T[key] : never;
};
/**
* SelectSubset
* @desc From `T` pick properties that exist in `U`. Simple version of Intersection.
* Additionally, it validates, if both select and include are present. If the case, it errors.
*/
export type SelectSubset<T, U> = {
[key in keyof T]: key extends keyof U ? T[key] : never
} &
(T extends SelectAndInclude
? 'Please either choose `select` or `include`.'
: T extends SelectAndOmit
? 'Please either choose `select` or `omit`.'
: {})
/**
* Subset + Intersection
* @desc From `T` pick properties that exist in `U` and intersect `K`
*/
export type SubsetIntersection<T, U, K> = {
[key in keyof T]: key extends keyof U ? T[key] : never
} &
K
type Without<T, U> = { [P in Exclude<keyof T, keyof U>]?: never };
/**
* XOR is needed to have a real mutually exclusive union type
* https://stackoverflow.com/questions/42123407/does-typescript-support-mutually-exclusive-types
*/
export type XOR<T, U> =
T extends object ?
U extends object ?
(Without<T, U> & U) | (Without<U, T> & T)
: U : T
/**
* Is T a Record?
*/
type IsObject<T extends any> = T extends Array<any>
? False
: T extends Date
? False
: T extends Uint8Array
? False
: T extends BigInt
? False
: T extends object
? True
: False
/**
* If it's T[], return T
*/
export type UnEnumerate<T extends unknown> = T extends Array<infer U> ? U : T
/**
* From ts-toolbelt
*/
type __Either<O extends object, K extends Key> = Omit<O, K> &
{
// Merge all but K
[P in K]: Prisma__Pick<O, P & keyof O> // With K possibilities
}[K]
type EitherStrict<O extends object, K extends Key> = Strict<__Either<O, K>>
type EitherLoose<O extends object, K extends Key> = ComputeRaw<__Either<O, K>>
type _Either<
O extends object,
K extends Key,
strict extends Boolean
> = {
1: EitherStrict<O, K>
0: EitherLoose<O, K>
}[strict]
export type Either<
O extends object,
K extends Key,
strict extends Boolean = 1
> = O extends unknown ? _Either<O, K, strict> : never
export type Union = any
export type PatchUndefined<O extends object, O1 extends object> = {
[K in keyof O]: O[K] extends undefined ? At<O1, K> : O[K]
} & {}
/** Helper Types for "Merge" **/
export type IntersectOf<U extends Union> = (
U extends unknown ? (k: U) => void : never
) extends (k: infer I) => void
? I
: never
export type Overwrite<O extends object, O1 extends object> = {
[K in keyof O]: K extends keyof O1 ? O1[K] : O[K];
} & {};
type _Merge<U extends object> = IntersectOf<Overwrite<U, {
[K in keyof U]-?: At<U, K>;
}>>;
type Key = string | number | symbol;
type AtStrict<O extends object, K extends Key> = O[K & keyof O];
type AtLoose<O extends object, K extends Key> = O extends unknown ? AtStrict<O, K> : never;
export type At<O extends object, K extends Key, strict extends Boolean = 1> = {
1: AtStrict<O, K>;
0: AtLoose<O, K>;
}[strict];
export type ComputeRaw<A extends any> = A extends Function ? A : {
[K in keyof A]: A[K];
} & {};
export type OptionalFlat<O> = {
[K in keyof O]?: O[K];
} & {};
type _Record<K extends keyof any, T> = {
[P in K]: T;
};
// cause typescript not to expand types and preserve names
type NoExpand<T> = T extends unknown ? T : never;
// this type assumes the passed object is entirely optional
export type AtLeast<O extends object, K extends string> = NoExpand<
O extends unknown
? | (K extends keyof O ? { [P in K]: O[P] } & O : O)
| {[P in keyof O as P extends K ? P : never]-?: O[P]} & O
: never>;
type _Strict<U, _U = U> = U extends unknown ? U & OptionalFlat<_Record<Exclude<Keys<_U>, keyof U>, never>> : never;
export type Strict<U extends object> = ComputeRaw<_Strict<U>>;
/** End Helper Types for "Merge" **/
export type Merge<U extends object> = ComputeRaw<_Merge<Strict<U>>>;
export type Boolean = True | False
export type True = 1
export type False = 0
export type Not<B extends Boolean> = {
0: 1
1: 0
}[B]
export type Extends<A1 extends any, A2 extends any> = [A1] extends [never]
? 0 // anything `never` is false
: A1 extends A2
? 1
: 0
export type Has<U extends Union, U1 extends Union> = Not<
Extends<Exclude<U1, U>, U1>
>
export type Or<B1 extends Boolean, B2 extends Boolean> = {
0: {
0: 0
1: 1
}
1: {
0: 1
1: 1
}
}[B1][B2]
export type Keys<U extends Union> = U extends unknown ? keyof U : never
export type GetScalarType<T, O> = O extends object ? {
[P in keyof T]: P extends keyof O
? O[P]
: never
} : never
type FieldPaths<
T,
U = Omit<T, '_avg' | '_sum' | '_count' | '_min' | '_max'>
> = IsObject<T> extends True ? U : T
export type GetHavingFields<T> = {
[K in keyof T]: Or<
Or<Extends<'OR', K>, Extends<'AND', K>>,
Extends<'NOT', K>
> extends True
? // infer is only needed to not hit TS limit
// based on the brilliant idea of Pierre-Antoine Mills
// https://github.com/microsoft/TypeScript/issues/30188#issuecomment-478938437
T[K] extends infer TK
? GetHavingFields<UnEnumerate<TK> extends object ? Merge<UnEnumerate<TK>> : never>
: never
: {} extends FieldPaths<T[K]>
? never
: K
}[keyof T]
/**
* Convert tuple to union
*/
type _TupleToUnion<T> = T extends (infer E)[] ? E : never
type TupleToUnion<K extends readonly any[]> = _TupleToUnion<K>
export type MaybeTupleToUnion<T> = T extends any[] ? TupleToUnion<T> : T
/**
* Like `Pick`, but additionally can also accept an array of keys
*/
export type PickEnumerable<T, K extends Enumerable<keyof T> | keyof T> = Prisma__Pick<T, MaybeTupleToUnion<K>>
/**
* Exclude all keys with underscores
*/
export type ExcludeUnderscoreKeys<T extends string> = T extends `_${string}` ? never : T
export type FieldRef<Model, FieldType> = runtime.FieldRef<Model, FieldType>
type FieldRefInputType<Model, FieldType> = Model extends never ? never : FieldRef<Model, FieldType>
export const ModelName = {
Groups: 'Groups',
TotalStats: 'TotalStats',
DailyStats: 'DailyStats'
} as const
export type ModelName = (typeof ModelName)[keyof typeof ModelName]
export interface TypeMapCb<GlobalOmitOptions = {}> extends runtime.Types.Utils.Fn<{extArgs: runtime.Types.Extensions.InternalArgs }, runtime.Types.Utils.Record<string, any>> {
returns: TypeMap<this['params']['extArgs'], GlobalOmitOptions>
}
export type TypeMap<ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs, GlobalOmitOptions = {}> = {
globalOmitOptions: {
omit: GlobalOmitOptions
}
meta: {
modelProps: "groups" | "totalStats" | "dailyStats"
txIsolationLevel: never
}
model: {
Groups: {
payload: Prisma.$GroupsPayload<ExtArgs>
fields: Prisma.GroupsFieldRefs
operations: {
findUnique: {
args: Prisma.GroupsFindUniqueArgs<ExtArgs>
result: runtime.Types.Utils.PayloadToResult<Prisma.$GroupsPayload> | null
}
findUniqueOrThrow: {
args: Prisma.GroupsFindUniqueOrThrowArgs<ExtArgs>
result: runtime.Types.Utils.PayloadToResult<Prisma.$GroupsPayload>
}
findFirst: {
args: Prisma.GroupsFindFirstArgs<ExtArgs>
result: runtime.Types.Utils.PayloadToResult<Prisma.$GroupsPayload> | null
}
findFirstOrThrow: {
args: Prisma.GroupsFindFirstOrThrowArgs<ExtArgs>
result: runtime.Types.Utils.PayloadToResult<Prisma.$GroupsPayload>
}
findMany: {
args: Prisma.GroupsFindManyArgs<ExtArgs>
result: runtime.Types.Utils.PayloadToResult<Prisma.$GroupsPayload>[]
}
create: {
args: Prisma.GroupsCreateArgs<ExtArgs>
result: runtime.Types.Utils.PayloadToResult<Prisma.$GroupsPayload>
}
createMany: {
args: Prisma.GroupsCreateManyArgs<ExtArgs>
result: BatchPayload
}
delete: {
args: Prisma.GroupsDeleteArgs<ExtArgs>
result: runtime.Types.Utils.PayloadToResult<Prisma.$GroupsPayload>
}
update: {
args: Prisma.GroupsUpdateArgs<ExtArgs>
result: runtime.Types.Utils.PayloadToResult<Prisma.$GroupsPayload>
}
deleteMany: {
args: Prisma.GroupsDeleteManyArgs<ExtArgs>
result: BatchPayload
}
updateMany: {
args: Prisma.GroupsUpdateManyArgs<ExtArgs>
result: BatchPayload
}
upsert: {
args: Prisma.GroupsUpsertArgs<ExtArgs>
result: runtime.Types.Utils.PayloadToResult<Prisma.$GroupsPayload>
}
aggregate: {
args: Prisma.GroupsAggregateArgs<ExtArgs>
result: runtime.Types.Utils.Optional<Prisma.AggregateGroups>
}
groupBy: {
args: Prisma.GroupsGroupByArgs<ExtArgs>
result: runtime.Types.Utils.Optional<Prisma.GroupsGroupByOutputType>[]
}
findRaw: {
args: Prisma.GroupsFindRawArgs<ExtArgs>
result: Prisma.JsonObject
}
aggregateRaw: {
args: Prisma.GroupsAggregateRawArgs<ExtArgs>
result: Prisma.JsonObject
}
count: {
args: Prisma.GroupsCountArgs<ExtArgs>
result: runtime.Types.Utils.Optional<Prisma.GroupsCountAggregateOutputType> | number
}
}
}
TotalStats: {
payload: Prisma.$TotalStatsPayload<ExtArgs>
fields: Prisma.TotalStatsFieldRefs
operations: {
findUnique: {
args: Prisma.TotalStatsFindUniqueArgs<ExtArgs>
result: runtime.Types.Utils.PayloadToResult<Prisma.$TotalStatsPayload> | null
}
findUniqueOrThrow: {
args: Prisma.TotalStatsFindUniqueOrThrowArgs<ExtArgs>
result: runtime.Types.Utils.PayloadToResult<Prisma.$TotalStatsPayload>
}
findFirst: {
args: Prisma.TotalStatsFindFirstArgs<ExtArgs>
result: runtime.Types.Utils.PayloadToResult<Prisma.$TotalStatsPayload> | null
}
findFirstOrThrow: {
args: Prisma.TotalStatsFindFirstOrThrowArgs<ExtArgs>
result: runtime.Types.Utils.PayloadToResult<Prisma.$TotalStatsPayload>
}
findMany: {
args: Prisma.TotalStatsFindManyArgs<ExtArgs>
result: runtime.Types.Utils.PayloadToResult<Prisma.$TotalStatsPayload>[]
}
create: {
args: Prisma.TotalStatsCreateArgs<ExtArgs>
result: runtime.Types.Utils.PayloadToResult<Prisma.$TotalStatsPayload>
}
createMany: {
args: Prisma.TotalStatsCreateManyArgs<ExtArgs>
result: BatchPayload
}
delete: {
args: Prisma.TotalStatsDeleteArgs<ExtArgs>
result: runtime.Types.Utils.PayloadToResult<Prisma.$TotalStatsPayload>
}
update: {
args: Prisma.TotalStatsUpdateArgs<ExtArgs>
result: runtime.Types.Utils.PayloadToResult<Prisma.$TotalStatsPayload>
}
deleteMany: {
args: Prisma.TotalStatsDeleteManyArgs<ExtArgs>
result: BatchPayload
}
updateMany: {
args: Prisma.TotalStatsUpdateManyArgs<ExtArgs>
result: BatchPayload
}
upsert: {
args: Prisma.TotalStatsUpsertArgs<ExtArgs>
result: runtime.Types.Utils.PayloadToResult<Prisma.$TotalStatsPayload>
}
aggregate: {
args: Prisma.TotalStatsAggregateArgs<ExtArgs>
result: runtime.Types.Utils.Optional<Prisma.AggregateTotalStats>
}
groupBy: {
args: Prisma.TotalStatsGroupByArgs<ExtArgs>
result: runtime.Types.Utils.Optional<Prisma.TotalStatsGroupByOutputType>[]
}
findRaw: {
args: Prisma.TotalStatsFindRawArgs<ExtArgs>
result: Prisma.JsonObject
}
aggregateRaw: {
args: Prisma.TotalStatsAggregateRawArgs<ExtArgs>
result: Prisma.JsonObject
}
count: {
args: Prisma.TotalStatsCountArgs<ExtArgs>
result: runtime.Types.Utils.Optional<Prisma.TotalStatsCountAggregateOutputType> | number
}
}
}
DailyStats: {
payload: Prisma.$DailyStatsPayload<ExtArgs>
fields: Prisma.DailyStatsFieldRefs
operations: {
findUnique: {
args: Prisma.DailyStatsFindUniqueArgs<ExtArgs>
result: runtime.Types.Utils.PayloadToResult<Prisma.$DailyStatsPayload> | null
}
findUniqueOrThrow: {
args: Prisma.DailyStatsFindUniqueOrThrowArgs<ExtArgs>
result: runtime.Types.Utils.PayloadToResult<Prisma.$DailyStatsPayload>
}
findFirst: {
args: Prisma.DailyStatsFindFirstArgs<ExtArgs>
result: runtime.Types.Utils.PayloadToResult<Prisma.$DailyStatsPayload> | null
}
findFirstOrThrow: {
args: Prisma.DailyStatsFindFirstOrThrowArgs<ExtArgs>
result: runtime.Types.Utils.PayloadToResult<Prisma.$DailyStatsPayload>
}
findMany: {
args: Prisma.DailyStatsFindManyArgs<ExtArgs>
result: runtime.Types.Utils.PayloadToResult<Prisma.$DailyStatsPayload>[]
}
create: {
args: Prisma.DailyStatsCreateArgs<ExtArgs>
result: runtime.Types.Utils.PayloadToResult<Prisma.$DailyStatsPayload>
}
createMany: {
args: Prisma.DailyStatsCreateManyArgs<ExtArgs>
result: BatchPayload
}
delete: {
args: Prisma.DailyStatsDeleteArgs<ExtArgs>
result: runtime.Types.Utils.PayloadToResult<Prisma.$DailyStatsPayload>
}
update: {
args: Prisma.DailyStatsUpdateArgs<ExtArgs>
result: runtime.Types.Utils.PayloadToResult<Prisma.$DailyStatsPayload>
}
deleteMany: {
args: Prisma.DailyStatsDeleteManyArgs<ExtArgs>
result: BatchPayload
}
updateMany: {
args: Prisma.DailyStatsUpdateManyArgs<ExtArgs>
result: BatchPayload
}
upsert: {
args: Prisma.DailyStatsUpsertArgs<ExtArgs>
result: runtime.Types.Utils.PayloadToResult<Prisma.$DailyStatsPayload>
}
aggregate: {
args: Prisma.DailyStatsAggregateArgs<ExtArgs>
result: runtime.Types.Utils.Optional<Prisma.AggregateDailyStats>
}
groupBy: {
args: Prisma.DailyStatsGroupByArgs<ExtArgs>
result: runtime.Types.Utils.Optional<Prisma.DailyStatsGroupByOutputType>[]
}
findRaw: {
args: Prisma.DailyStatsFindRawArgs<ExtArgs>
result: Prisma.JsonObject
}
aggregateRaw: {
args: Prisma.DailyStatsAggregateRawArgs<ExtArgs>
result: Prisma.JsonObject
}
count: {
args: Prisma.DailyStatsCountArgs<ExtArgs>
result: runtime.Types.Utils.Optional<Prisma.DailyStatsCountAggregateOutputType> | number
}
}
}
}
} & {
other: {
payload: any
operations: {
$runCommandRaw: {
args: Prisma.InputJsonObject,
result: JsonObject
}
}
}
}
/**
* Enums
*/
export const GroupsScalarFieldEnum = {
telegramID: 'telegramID',
name: 'name',
username: 'username',
linksDeleted: 'linksDeleted',
createdAt: 'createdAt',
updatedAt: 'updatedAt'
} as const
export type GroupsScalarFieldEnum = (typeof GroupsScalarFieldEnum)[keyof typeof GroupsScalarFieldEnum]
export const TotalStatsScalarFieldEnum = {
createdAt: 'createdAt',
updatedAt: 'updatedAt',
linksDeleted: 'linksDeleted',
commandResponses: 'commandResponses',
timesTriggered: 'timesTriggered'
} as const
export type TotalStatsScalarFieldEnum = (typeof TotalStatsScalarFieldEnum)[keyof typeof TotalStatsScalarFieldEnum]
export const DailyStatsScalarFieldEnum = {
createdAt: 'createdAt',
updatedAt: 'updatedAt',
linksDeleted: 'linksDeleted',
commandResponses: 'commandResponses',
timesTriggered: 'timesTriggered'
} as const
export type DailyStatsScalarFieldEnum = (typeof DailyStatsScalarFieldEnum)[keyof typeof DailyStatsScalarFieldEnum]
export const SortOrder = {
asc: 'asc',
desc: 'desc'
} as const
export type SortOrder = (typeof SortOrder)[keyof typeof SortOrder]
export const QueryMode = {
default: 'default',
insensitive: 'insensitive'
} as const
export type QueryMode = (typeof QueryMode)[keyof typeof QueryMode]
/**
* Field references
*/
/**
* Reference to a field of type 'BigInt'
*/
export type BigIntFieldRefInput<$PrismaModel> = FieldRefInputType<$PrismaModel, 'BigInt'>
/**
* Reference to a field of type 'BigInt[]'
*/
export type ListBigIntFieldRefInput<$PrismaModel> = FieldRefInputType<$PrismaModel, 'BigInt[]'>
/**
* Reference to a field of type 'String'
*/
export type StringFieldRefInput<$PrismaModel> = FieldRefInputType<$PrismaModel, 'String'>
/**
* Reference to a field of type 'String[]'
*/
export type ListStringFieldRefInput<$PrismaModel> = FieldRefInputType<$PrismaModel, 'String[]'>
/**
* Reference to a field of type 'DateTime'
*/
export type DateTimeFieldRefInput<$PrismaModel> = FieldRefInputType<$PrismaModel, 'DateTime'>
/**
* Reference to a field of type 'DateTime[]'
*/
export type ListDateTimeFieldRefInput<$PrismaModel> = FieldRefInputType<$PrismaModel, 'DateTime[]'>
/**
* Reference to a field of type 'Int'
*/
export type IntFieldRefInput<$PrismaModel> = FieldRefInputType<$PrismaModel, 'Int'>
/**
* Reference to a field of type 'Int[]'
*/
export type ListIntFieldRefInput<$PrismaModel> = FieldRefInputType<$PrismaModel, 'Int[]'>
/**
* Reference to a field of type 'Float'
*/
export type FloatFieldRefInput<$PrismaModel> = FieldRefInputType<$PrismaModel, 'Float'>
/**
* Reference to a field of type 'Float[]'
*/
export type ListFloatFieldRefInput<$PrismaModel> = FieldRefInputType<$PrismaModel, 'Float[]'>
/**
* Batch Payload for updateMany & deleteMany & createMany
*/
export type BatchPayload = {
count: number
}
export type Datasource = {
url?: string
}
export type Datasources = {
db?: Datasource
}
export const defineExtension = runtime.Extensions.defineExtension as unknown as runtime.Types.Extensions.ExtendsHook<"define", TypeMapCb, runtime.Types.Extensions.DefaultArgs>
export type DefaultPrismaClient = PrismaClient
export type ErrorFormat = 'pretty' | 'colorless' | 'minimal'
export interface PrismaClientOptions {
/**
* Overwrites the datasource url from your schema.prisma file
*/
datasources?: Datasources
/**
* Overwrites the datasource url from your schema.prisma file
*/
datasourceUrl?: string
/**
* @default "colorless"
*/
errorFormat?: ErrorFormat
/**
* @example
* ```
* // Shorthand for `emit: 'stdout'`
* log: ['query', 'info', 'warn', 'error']
*
* // Emit as events only
* log: [
* { emit: 'event', level: 'query' },
* { emit: 'event', level: 'info' },
* { emit: 'event', level: 'warn' }
* { emit: 'event', level: 'error' }
* ]
*
* / Emit as events and log to stdout
* og: [
* { emit: 'stdout', level: 'query' },
* { emit: 'stdout', level: 'info' },
* { emit: 'stdout', level: 'warn' }
* { emit: 'stdout', level: 'error' }
*
* ```
* Read more in our [docs](https://www.prisma.io/docs/reference/tools-and-interfaces/prisma-client/logging#the-log-option).
*/
log?: (LogLevel | LogDefinition)[]
/**
* The default values for transactionOptions
* maxWait ?= 2000
* timeout ?= 5000
*/
transactionOptions?: {
maxWait?: number
timeout?: number
}
/**
* Instance of a Driver Adapter, e.g., like one provided by `@prisma/adapter-planetscale`
*/
adapter?: runtime.SqlDriverAdapterFactory | null
/**
* Global configuration for omitting model fields by default.
*
* @example
* ```
* const prisma = new PrismaClient({
* omit: {
* user: {
* password: true
* }
* }
* })
* ```
*/
omit?: GlobalOmitConfig
}
export type GlobalOmitConfig = {
groups?: Prisma.GroupsOmit
totalStats?: Prisma.TotalStatsOmit
dailyStats?: Prisma.DailyStatsOmit
}
/* Types for Logging */
export type LogLevel = 'info' | 'query' | 'warn' | 'error'
export type LogDefinition = {
level: LogLevel
emit: 'stdout' | 'event'
}
export type CheckIsLogLevel<T> = T extends LogLevel ? T : never;
export type GetLogType<T> = CheckIsLogLevel<
T extends LogDefinition ? T['level'] : T
>;
export type GetEvents<T extends any[]> = T extends Array<LogLevel | LogDefinition>
? GetLogType<T[number]>
: never;
export type QueryEvent = {
timestamp: Date
query: string
params: string
duration: number
target: string
}
export type LogEvent = {
timestamp: Date
message: string
target: string
}
/* End Types for Logging */
export type PrismaAction =
| 'findUnique'
| 'findUniqueOrThrow'
| 'findMany'
| 'findFirst'
| 'findFirstOrThrow'
| 'create'
| 'createMany'
| 'createManyAndReturn'
| 'update'
| 'updateMany'
| 'updateManyAndReturn'
| 'upsert'
| 'delete'
| 'deleteMany'
| 'executeRaw'
| 'queryRaw'
| 'aggregate'
| 'count'
| 'runCommandRaw'
| 'findRaw'
| 'groupBy'
/**
* `PrismaClient` proxy available in interactive transactions.
*/
export type TransactionClient = Omit<DefaultPrismaClient, runtime.ITXClientDenyList>

View File

@@ -1,111 +0,0 @@
/* !!! This is code generated by Prisma. Do not edit directly. !!! */
/* eslint-disable */
// biome-ignore-all lint: generated file
// @ts-nocheck
/*
* WARNING: This is an internal file that is subject to change!
*
* 🛑 Under no circumstances should you import this file directly! 🛑
*
* All exports from this file are wrapped under a `Prisma` namespace object in the browser.ts file.
* While this enables partial backward compatibility, it is not part of the stable public API.
*
* If you are looking for your Models, Enums, and Input Types, please import them from the respective
* model files in the `model` directory!
*/
import * as runtime from "@prisma/client/runtime/index-browser"
export type * from '../models'
export type * from './prismaNamespace'
export const Decimal = runtime.Decimal
export const NullTypes = {
DbNull: runtime.objectEnumValues.classes.DbNull as (new (secret: never) => typeof runtime.objectEnumValues.instances.DbNull),
JsonNull: runtime.objectEnumValues.classes.JsonNull as (new (secret: never) => typeof runtime.objectEnumValues.instances.JsonNull),
AnyNull: runtime.objectEnumValues.classes.AnyNull as (new (secret: never) => typeof runtime.objectEnumValues.instances.AnyNull),
}
/**
* Helper for filtering JSON entries that have `null` on the database (empty on the db)
*
* @see https://www.prisma.io/docs/concepts/components/prisma-client/working-with-fields/working-with-json-fields#filtering-on-a-json-field
*/
export const DbNull = runtime.objectEnumValues.instances.DbNull
/**
* Helper for filtering JSON entries that have JSON `null` values (not empty on the db)
*
* @see https://www.prisma.io/docs/concepts/components/prisma-client/working-with-fields/working-with-json-fields#filtering-on-a-json-field
*/
export const JsonNull = runtime.objectEnumValues.instances.JsonNull
/**
* Helper for filtering JSON entries that are `Prisma.DbNull` or `Prisma.JsonNull`
*
* @see https://www.prisma.io/docs/concepts/components/prisma-client/working-with-fields/working-with-json-fields#filtering-on-a-json-field
*/
export const AnyNull = runtime.objectEnumValues.instances.AnyNull
export const ModelName = {
Groups: 'Groups',
TotalStats: 'TotalStats',
DailyStats: 'DailyStats'
} as const
export type ModelName = (typeof ModelName)[keyof typeof ModelName]
/*
* Enums
*/
export const GroupsScalarFieldEnum = {
telegramID: 'telegramID',
name: 'name',
username: 'username',
linksDeleted: 'linksDeleted',
createdAt: 'createdAt',
updatedAt: 'updatedAt'
} as const
export type GroupsScalarFieldEnum = (typeof GroupsScalarFieldEnum)[keyof typeof GroupsScalarFieldEnum]
export const TotalStatsScalarFieldEnum = {
createdAt: 'createdAt',
updatedAt: 'updatedAt',
linksDeleted: 'linksDeleted',
commandResponses: 'commandResponses',
timesTriggered: 'timesTriggered'
} as const
export type TotalStatsScalarFieldEnum = (typeof TotalStatsScalarFieldEnum)[keyof typeof TotalStatsScalarFieldEnum]
export const DailyStatsScalarFieldEnum = {
createdAt: 'createdAt',
updatedAt: 'updatedAt',
linksDeleted: 'linksDeleted',
commandResponses: 'commandResponses',
timesTriggered: 'timesTriggered'
} as const
export type DailyStatsScalarFieldEnum = (typeof DailyStatsScalarFieldEnum)[keyof typeof DailyStatsScalarFieldEnum]
export const SortOrder = {
asc: 'asc',
desc: 'desc'
} as const
export type SortOrder = (typeof SortOrder)[keyof typeof SortOrder]
export const QueryMode = {
default: 'default',
insensitive: 'insensitive'
} as const
export type QueryMode = (typeof QueryMode)[keyof typeof QueryMode]

View File

@@ -1,14 +0,0 @@
/* !!! This is code generated by Prisma. Do not edit directly. !!! */
/* eslint-disable */
// biome-ignore-all lint: generated file
// @ts-nocheck
/*
* This is a barrel export file for all models and their related types.
*
* 🟢 You can import this file directly.
*/
export type * from './models/Groups'
export type * from './models/TotalStats'
export type * from './models/DailyStats'
export type * from './commonInputTypes'

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

143
yarn.lock
View File

@@ -458,6 +458,18 @@ __metadata:
languageName: node
linkType: hard
"@envelop/core@npm:^5.2.3":
version: 5.4.0
resolution: "@envelop/core@npm:5.4.0"
dependencies:
"@envelop/instrumentation": "npm:^1.0.0"
"@envelop/types": "npm:^5.2.1"
"@whatwg-node/promise-helpers": "npm:^1.2.4"
tslib: "npm:^2.5.0"
checksum: 10c0/e8f87c68ce80984f0127afe8c6786468b18db91e8cb2335468dbef8c8b32d0ff10121dc53dde56d6f6acbcad74798807258799864c398d15bd547c49839445d1
languageName: node
linkType: hard
"@envelop/core@npm:^5.3.0":
version: 5.3.2
resolution: "@envelop/core@npm:5.3.2"
@@ -672,6 +684,134 @@ __metadata:
languageName: node
linkType: hard
"@escape.tech/graphql-armor-block-field-suggestions@npm:3.0.1":
version: 3.0.1
resolution: "@escape.tech/graphql-armor-block-field-suggestions@npm:3.0.1"
dependencies:
"@envelop/core": "npm:^5.2.3"
graphql: "npm:^16.10.0"
dependenciesMeta:
"@envelop/core":
optional: true
checksum: 10c0/b90c32530d6d7ad5bf713f3f6f864d214fbdf9b3930eead5511009f2926a3804ed3c9c6bbe08e12db794e9fe4745aeb620b4e96fd3416c958c1d2580e2d19e1a
languageName: node
linkType: hard
"@escape.tech/graphql-armor-cost-limit@npm:2.4.3":
version: 2.4.3
resolution: "@escape.tech/graphql-armor-cost-limit@npm:2.4.3"
dependencies:
"@envelop/core": "npm:^5.2.3"
"@escape.tech/graphql-armor-types": "npm:0.7.0"
graphql: "npm:^16.10.0"
dependenciesMeta:
"@envelop/core":
optional: true
"@escape.tech/graphql-armor-types":
optional: true
checksum: 10c0/89dc54b68a29d572b98be66f9e4629a51c78d0c72f8b62aa5bbe071356bed7951611f226e71bb9bf1f83e322585f7b51982e454a49b0cd4f81c7fe4c0b822893
languageName: node
linkType: hard
"@escape.tech/graphql-armor-max-aliases@npm:2.6.2":
version: 2.6.2
resolution: "@escape.tech/graphql-armor-max-aliases@npm:2.6.2"
dependencies:
"@envelop/core": "npm:^5.2.3"
"@escape.tech/graphql-armor-types": "npm:0.7.0"
graphql: "npm:^16.10.0"
dependenciesMeta:
"@envelop/core":
optional: true
"@escape.tech/graphql-armor-types":
optional: true
checksum: 10c0/7a49bfa9faa68a4a8fad7beab40f7ccc6dc01d28dc6238a335e77aa0fc1ff1aab7a2207d11e5341b7c48e473a485ed2cdc98bd7d134bc8ae157945d77675bdb5
languageName: node
linkType: hard
"@escape.tech/graphql-armor-max-depth@npm:2.4.2":
version: 2.4.2
resolution: "@escape.tech/graphql-armor-max-depth@npm:2.4.2"
dependencies:
"@envelop/core": "npm:^5.2.3"
"@escape.tech/graphql-armor-types": "npm:0.7.0"
graphql: "npm:^16.10.0"
dependenciesMeta:
"@envelop/core":
optional: true
"@escape.tech/graphql-armor-types":
optional: true
checksum: 10c0/e38612e5bb0ed5db1d36100ca0701d32cc22a28f0418b56106a756683d86c1eef56d6987965748f1dbf386c19f7d693ae6a9b1416104cc63795e3dcb6ee0e27a
languageName: node
linkType: hard
"@escape.tech/graphql-armor-max-directives@npm:2.3.1":
version: 2.3.1
resolution: "@escape.tech/graphql-armor-max-directives@npm:2.3.1"
dependencies:
"@envelop/core": "npm:^5.2.3"
"@escape.tech/graphql-armor-types": "npm:0.7.0"
graphql: "npm:^16.10.0"
dependenciesMeta:
"@envelop/core":
optional: true
"@escape.tech/graphql-armor-types":
optional: true
checksum: 10c0/2f14c1bc4356087db30fd4c83b762383999f70e7fd289f6954d26ae62790ffe65c5aa279cbcb08d4aca666e671306eb97c43a514ef574cc6d81dea33963fc048
languageName: node
linkType: hard
"@escape.tech/graphql-armor-max-tokens@npm:2.5.1":
version: 2.5.1
resolution: "@escape.tech/graphql-armor-max-tokens@npm:2.5.1"
dependencies:
"@envelop/core": "npm:^5.2.3"
"@escape.tech/graphql-armor-types": "npm:0.7.0"
graphql: "npm:^16.10.0"
dependenciesMeta:
"@envelop/core":
optional: true
"@escape.tech/graphql-armor-types":
optional: true
checksum: 10c0/db9e5cbdbd66a1aa031e2398fdf507bb9cb51321e9bb9c75dc668c6a250c6e7b5bc8d499487973184af0dd6fc2c150f88e008b1badfe01e6690397763765de7f
languageName: node
linkType: hard
"@escape.tech/graphql-armor-types@npm:0.7.0":
version: 0.7.0
resolution: "@escape.tech/graphql-armor-types@npm:0.7.0"
dependencies:
graphql: "npm:^16.0.0"
checksum: 10c0/555d8ce8c364b31dfd8239cfb3cac3b44307950df457ce7f3585aa30d112edb9332ea6aa417f9e9fb245ed913004f8350ba9abbc60847fde75d4c006fd5c68b7
languageName: node
linkType: hard
"@escape.tech/graphql-armor@npm:^3.1.7":
version: 3.1.7
resolution: "@escape.tech/graphql-armor@npm:3.1.7"
dependencies:
"@escape.tech/graphql-armor-block-field-suggestions": "npm:3.0.1"
"@escape.tech/graphql-armor-cost-limit": "npm:2.4.3"
"@escape.tech/graphql-armor-max-aliases": "npm:2.6.2"
"@escape.tech/graphql-armor-max-depth": "npm:2.4.2"
"@escape.tech/graphql-armor-max-directives": "npm:2.3.1"
"@escape.tech/graphql-armor-max-tokens": "npm:2.5.1"
graphql: "npm:^16.10.0"
peerDependencies:
"@apollo/server": ^4.0.0
"@envelop/core": ^5.0.0
"@escape.tech/graphql-armor-types": 0.7.0
peerDependenciesMeta:
"@apollo/server":
optional: true
"@envelop/core":
optional: true
"@escape.tech/graphql-armor-types":
optional: true
checksum: 10c0/0795987bbfc1d79e22c1701fd53ef8a6b3da3b0bb03b1881f738040173a0c0e676d7a907076ca2a5827b1f1bf8e541b34f6c18d2600dac38cf9c7c6ea97aa9ac
languageName: node
linkType: hard
"@eslint-community/eslint-utils@npm:^4.7.0, @eslint-community/eslint-utils@npm:^4.8.0":
version: 4.9.0
resolution: "@eslint-community/eslint-utils@npm:4.9.0"
@@ -4997,7 +5137,7 @@ __metadata:
languageName: node
linkType: hard
"graphql@npm:^16.12.0":
"graphql@npm:^16.0.0, graphql@npm:^16.10.0, graphql@npm:^16.12.0":
version: 16.12.0
resolution: "graphql@npm:16.12.0"
checksum: 10c0/b6fffa4e8a4e4a9933ebe85e7470b346dbf49050c1a482fac5e03e4a1a7bed2ecd3a4c97e29f04457af929464bc5e4f2aac991090c2f320111eef26e902a5c75
@@ -5947,6 +6087,7 @@ __metadata:
"@chakra-ui/charts": "npm:^3.30.0"
"@chakra-ui/react": "npm:^3.30.0"
"@emotion/react": "npm:^11.14.0"
"@escape.tech/graphql-armor": "npm:^3.1.7"
"@eslint/eslintrc": "npm:^3.3.3"
"@eslint/js": "npm:^9.39.1"
"@iconify/react": "npm:^6.0.2"