mirror of
https://github.com/umami-software/umami.git
synced 2026-02-04 12:47:13 +01:00
Refactored batch route.
This commit is contained in:
parent
3f00d88668
commit
a8835f385e
4 changed files with 42 additions and 44 deletions
39
src/app/api/batch/route.ts
Normal file
39
src/app/api/batch/route.ts
Normal file
|
|
@ -0,0 +1,39 @@
|
|||
import { z } from 'zod';
|
||||
import * as send from '@/app/api/send/route';
|
||||
import { parseRequest } from '@/lib/request';
|
||||
import { json, serverError } from '@/lib/response';
|
||||
|
||||
const schema = z.array(z.object({}).passthrough());
|
||||
|
||||
export async function POST(request: Request) {
|
||||
try {
|
||||
const { body, error } = await parseRequest(request, schema, { skipAuth: true });
|
||||
|
||||
if (error) {
|
||||
return error();
|
||||
}
|
||||
|
||||
const errors = [];
|
||||
|
||||
let index = 0;
|
||||
for (const data of body) {
|
||||
const newRequest = new Request(request, { body: JSON.stringify(data) });
|
||||
const response = await send.POST(newRequest);
|
||||
|
||||
if (!response.ok) {
|
||||
errors.push({ index, response: await response.json() });
|
||||
}
|
||||
|
||||
index++;
|
||||
}
|
||||
|
||||
return json({
|
||||
size: body.length,
|
||||
processed: body.length - errors.length,
|
||||
errors: errors.length,
|
||||
details: errors,
|
||||
});
|
||||
} catch (e) {
|
||||
return serverError(e);
|
||||
}
|
||||
}
|
||||
|
|
@ -21,7 +21,7 @@ const schema = z.object({
|
|||
referrer: urlOrPathParam.optional(),
|
||||
screen: z.string().max(11).optional(),
|
||||
title: z.string().optional(),
|
||||
url: urlOrPathParam,
|
||||
url: urlOrPathParam.optional(),
|
||||
name: z.string().max(50).optional(),
|
||||
tag: z.string().max(50).optional(),
|
||||
ip: z.string().ip().optional(),
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
import { ZodObject } from 'zod';
|
||||
import { ZodSchema } from 'zod';
|
||||
import { FILTER_COLUMNS } from '@/lib/constants';
|
||||
import { badRequest, unauthorized } from '@/lib/response';
|
||||
import { getAllowedUnits, getMinimumUnit } from '@/lib/date';
|
||||
|
|
@ -15,7 +15,7 @@ export async function getJsonBody(request: Request) {
|
|||
|
||||
export async function parseRequest(
|
||||
request: Request,
|
||||
schema?: ZodObject<any>,
|
||||
schema?: ZodSchema,
|
||||
options?: { skipAuth: boolean },
|
||||
): Promise<any> {
|
||||
const url = new URL(request.url);
|
||||
|
|
|
|||
|
|
@ -1,41 +0,0 @@
|
|||
import sendHandler from './send';
|
||||
|
||||
export default async function handler(req, res) {
|
||||
if (req.method !== 'POST') {
|
||||
res.setHeader('Allow', ['POST']);
|
||||
return res.status(405).end(`Method ${req.method} Not Allowed`);
|
||||
}
|
||||
|
||||
const events = req.body;
|
||||
|
||||
if (!Array.isArray(events)) {
|
||||
return res.status(400).json({ error: 'Invalid payload, expected an array.' });
|
||||
}
|
||||
|
||||
try {
|
||||
for (const event of events) {
|
||||
const mockReq = {
|
||||
...req,
|
||||
body: event,
|
||||
headers: { ...req.headers, origin: req.headers.origin || 'http://localhost:3000' },
|
||||
};
|
||||
|
||||
const mockRes = {
|
||||
...res,
|
||||
status: (code) => {
|
||||
res.status(code);
|
||||
return mockRes;
|
||||
},
|
||||
json: (data) => res.json(data),
|
||||
setHeader: (key, value) => res.setHeader(key, value),
|
||||
end: () => {},
|
||||
};
|
||||
|
||||
await sendHandler(mockReq, mockRes);
|
||||
}
|
||||
|
||||
return res.status(200).json({ success: true, message: `${events.length} events processed.` });
|
||||
} catch (error) {
|
||||
return res.status(500).json({ error: 'Internal Server Error' });
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue