add api support

This commit is contained in:
Emily
2024-09-09 14:43:27 +02:00
parent be45448288
commit 5172ad4f4d
5 changed files with 162 additions and 57 deletions

View File

@@ -1,44 +1,27 @@
import { ApiSettingsModel } from '@schema/ApiSettingsSchema';
import { VisitModel } from '@schema/metrics/VisitSchema';
import { checkApiKey, checkAuthorization, visitsListApi } from '~/server/services/ApiService';
export default defineEventHandler(async event => {
const { row, from, to, limit } = getQuery(event);
const authorization = getHeader(event, 'Authorization');
if (!authorization) return setResponseStatus(event, 403, 'Authorization is required');
const token = checkAuthorization(event);
if (!token) return;
const [type, token] = authorization.split(' ');
if (type != 'Bearer') return setResponseStatus(event, 401, 'Malformed authorization');
const apiSettings = await ApiSettingsModel.findOne({ apiKey: token });
if (!apiSettings) return setResponseStatus(event, 401, 'ApiKey not valid');
if (!row) return setResponseStatus(event, 400, 'row is required');
const apiKeyResult = await checkApiKey(token);
if (!apiKeyResult.ok) return setResponseStatus(event, 401, 'ApiKey not valid');
if (Array.isArray(from)) return setResponseStatus(event, 400, 'Only one "from" is allowed');
if (Array.isArray(to)) return setResponseStatus(event, 400, 'Only one "to" is allowed');
const rows: string[] = Array.isArray(row) ? row as string[] : [row as string];
const projection: any = {};
const result = await visitsListApi(apiKeyResult.data.apiKey, apiKeyResult.data.project_id.toString(), rows, limit as string, from as string, to as string);
for (const row of rows) {
projection[row] = 1;
}
const limitNumber = parseInt((limit as string));
const limitValue = isNaN(limitNumber) ? 100 : limitNumber;
const visits = await VisitModel.find({
project_id: apiSettings.project_id,
created_at: {
$gte: from || new Date(2023, 0),
$lte: to || new Date(3000, 0)
}
}, { _id: 0, ...projection }, { limit: limitValue });
return visits.map(e => e.toJSON());
if (result.ok) return result;
return setResponseStatus(event, result.code, result.error);
});