diff --git a/packages/archive/src/lib/activity.ts b/packages/archive/src/lib/activity.ts index 9860e23..4cb459b 100644 --- a/packages/archive/src/lib/activity.ts +++ b/packages/archive/src/lib/activity.ts @@ -21,11 +21,11 @@ interface Body { }; } -export default async function saveActivities( +export async function saveActivityPage( logger: BaseLogger, prisma: PrismaClient, - page = 1, - operations: Array> = [], + page: number, + operations: Array>, ) { const res = await getResponse( logger, @@ -48,11 +48,23 @@ export default async function saveActivities( }), ); }); + return res; +} + +export default async function saveActivities( + logger: BaseLogger, + prisma: PrismaClient, +) { + let res: Body; + let page = 0; + const operations: Array> = []; const last = await prisma.activity.findFirst({ orderBy: { id: "desc" } }); - if ( - res.feeds.result.length !== res.feeds.perPage || - (last && res.feeds.result[res.feeds.result.length - 1].id <= last.id) - ) - return prisma.$transaction(operations); - return saveActivities(logger, prisma, page + 1, operations); + do + // eslint-disable-next-line no-plusplus, no-await-in-loop + res = await saveActivityPage(logger, prisma, ++page, operations); + while ( + res.feeds.result.length === res.feeds.perPage && + (!last || res.feeds.result[res.feeds.result.length - 1].id > last.id) + ); + await prisma.$transaction(operations); } diff --git a/packages/archive/src/plugins/routes.ts b/packages/archive/src/plugins/routes.ts index 935383b..e17fad3 100644 --- a/packages/archive/src/plugins/routes.ts +++ b/packages/archive/src/plugins/routes.ts @@ -1,9 +1,10 @@ import { once } from "node:events"; import type { FastifyPluginCallback } from "fastify"; +import type { PrismaPromise } from "@prisma/client"; import { emitters, startTask } from "../lib/discussion"; import saveJudgements from "../lib/judgement"; import savePaste from "../lib/paste"; -import saveActivities from "../lib/activity"; +import saveActivities, { saveActivityPage } from "../lib/activity"; export default (function routes(fastify, options, done) { fastify.get("/", () => ({ tasks: Object.keys(emitters) })); @@ -46,14 +47,27 @@ export default (function routes(fastify, options, done) { .catch((err: Error) => reply.code(500).send({ error: err.message })); }); + /* + fastify.get("/activity", (request, reply) => + saveActivities(fastify.log, fastify.prisma).then(() => + reply.code(201).send({}), + ), + ); + */ + fastify.get<{ Params: { page: string } }>( "/activity/:page(\\d+)", - (request, reply) => - saveActivities( + async (request, reply) => { + const operations: Array> = []; + const res = await saveActivityPage( fastify.log, fastify.prisma, parseInt(request.params.page, 10), - ).then(() => reply.code(201).send({})), + operations, + ); + await fastify.prisma.$transaction(operations); + return reply.code(201).send(res); + }, ); done();