astro_avtourist/frontend/src/pages/api/increment-views.ts

63 lines
1.9 KiB
TypeScript
Raw Normal View History

import type { APIRoute } from 'astro';
const PB_POCKETBASE_URL = import.meta.env.PB_POCKETBASE_URL || 'http://127.0.0.1:8090';
const POCKETBASE_ID_REGEX = /^[a-z0-9]{15}$/;
2026-04-27 20:55:33 +05:00
function jsonResponse(data: object, status = 200): Response {
return new Response(JSON.stringify(data), {
status,
headers: { 'Content-Type': 'application/json', 'Access-Control-Allow-Origin': '*' }
});
}
export const GET: APIRoute = async ({ url }) => {
try {
const postId = url.searchParams.get('postId');
if (!postId || !POCKETBASE_ID_REGEX.test(postId)) {
2026-04-27 20:55:33 +05:00
return jsonResponse({ error: 'Некорректный postId' }, 400);
}
// Получаем пост
2026-04-27 01:04:06 +05:00
let post;
try {
post = await fetch(`${PB_POCKETBASE_URL}/api/collections/posts/records/${postId}`, {
headers: { 'Content-Type': 'application/json' }
}).then(r => r.json());
2026-04-27 01:04:06 +05:00
} catch {
2026-04-27 20:55:33 +05:00
return jsonResponse({ error: 'Пост не найден' }, 404);
}
if (!post || !post.id) {
return jsonResponse({ error: 'Пост не найден' }, 404);
2026-04-27 01:04:06 +05:00
}
const now = new Date();
const todayStr = now.toISOString().split('T')[0];
let { views = 0, today_views = 0, last_reset = '' } = post;
2026-04-27 01:04:06 +05:00
// Если новый день - сбрасываем today_views
if (last_reset !== todayStr) {
today_views = 0;
last_reset = todayStr;
}
// Инкремент
views++;
today_views++;
// Обновляем пост
await fetch(`${PB_POCKETBASE_URL}/api/collections/posts/records/${postId}`, {
method: 'PATCH',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ views, today_views, last_reset })
});
return jsonResponse({ views, today_views }, 200);
} catch (error) {
2026-04-27 01:04:06 +05:00
console.error('[Increment Views] Error:', error);
2026-04-27 20:55:33 +05:00
return jsonResponse({ error: 'Внутренняя ошибка сервера' }, 500);
}
2026-04-27 01:04:06 +05:00
};