diff --git a/.opencode/skills/minivan/SKILL.md b/.opencode/skills/minivan/SKILL.md index d99f392..46f841b 100644 --- a/.opencode/skills/minivan/SKILL.md +++ b/.opencode/skills/minivan/SKILL.md @@ -169,15 +169,27 @@ frontend/ ## API-эндпоинты -- `/api/auth/login` — вход -- `/api/auth/register` — регистрация -- `/api/auth/logout` — выход -- `/api/auth/check-auth` — проверка авторизации -- `/api/auth/google/*` — Google OAuth -- `/api/contact` — контактная форма -- `/api/reviews` — отзывы (GET/POST/DELETE) -- `/api/send-booking` — бронирование -- `/api/files-proxy/*` — прокси файлов +### Auth +- `/api/auth/login` — вход (POST) +- `/api/auth/register` — регистрация (POST) +- `/api/auth/logout` — выход (POST) +- `/api/auth/sign-out` — выход (POST, alias) +- `/api/auth/check-auth` — проверка авторизации (GET) +- `/api/auth/send-email` — отправка email (POST) +- `/api/auth/send-admin-notification` — уведомление админа (POST) +- `/api/auth/send-booking-confirmation` — подтверждение брони (POST) +- `/api/auth/google/index` — Google OAuth инициация (GET) +- `/api/auth/google/callback` — Google OAuth callback (GET) + +### Public +- `/api/contact` — контактная форма (POST) +- `/api/send-booking` — бронирование (POST) +- `/api/files-proxy/[collectionName]/[recordId]/[filename]` — прокси файлов (GET) + +### Reviews +- `/api/reviews` — GET все отзывы, POST создать, DELETE удалить +- `/api/reviews/[id]` — GET/DELETE один отзыв +- `/api/reviews/latest-reviews` — GET последние отзывы ## Переменные окружения diff --git a/frontend/package.json b/frontend/package.json index 598ec56..ac9180d 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -5,6 +5,7 @@ "scripts": { "dev": "astro dev", "build": "astro build", + "postbuild": "node scripts/copy-sitemap.mjs", "preview": "astro preview", "astro": "astro" }, diff --git a/frontend/public/robots.txt b/frontend/public/robots.txt index 69dce68..1b826aa 100644 --- a/frontend/public/robots.txt +++ b/frontend/public/robots.txt @@ -8,4 +8,5 @@ Disallow: /email-verified Disallow: /profile Disallow: /auth/ -Sitemap: https://minivan-berlin.de/sitemap-index.xml \ No newline at end of file +Sitemap: https://minivan-berlin.de/sitemap-index.xml +Sitemap: https://minivan-berlin.de/sitemap.xml \ No newline at end of file diff --git a/frontend/scripts/copy-sitemap.mjs b/frontend/scripts/copy-sitemap.mjs new file mode 100644 index 0000000..39d1920 --- /dev/null +++ b/frontend/scripts/copy-sitemap.mjs @@ -0,0 +1,16 @@ +import { cpSync, existsSync } from 'node:fs'; +import { resolve, dirname } from 'node:path'; +import { fileURLToPath } from 'node:url'; + +const __dirname = dirname(fileURLToPath(import.meta.url)); +const distDir = resolve(__dirname, '..', 'dist', 'client'); + +const source = resolve(distDir, 'sitemap-0.xml'); +const target = resolve(distDir, 'sitemap.xml'); + +if (existsSync(source)) { + cpSync(source, target); + console.log('✅ sitemap.xml created'); +} else { + console.error('❌ sitemap-0.xml not found'); +} \ No newline at end of file diff --git a/frontend/src/env.d.ts b/frontend/src/env.d.ts index 33147fa..3171bab 100644 --- a/frontend/src/env.d.ts +++ b/frontend/src/env.d.ts @@ -12,6 +12,8 @@ interface ImportMetaEnv { readonly MAIL_PORT: string; readonly MAIL_FROM: string; readonly ADMIN_EMAIL: string; + readonly SENDER_EMAIL: string; + readonly PROD: string; } interface ImportMeta { @@ -22,6 +24,14 @@ interface ImportMeta { declare namespace App { interface Locals { pb: PocketBase; - user: RecordModel | undefined; + user: RecordModel | null; + } +} + +// 3. Расширение window для глобальных функций +declare global { + interface Window { + closeModal?: (modalId: string) => void; + currentSelectedCar?: unknown; } } \ No newline at end of file diff --git a/frontend/src/types/globalInterfaces.ts b/frontend/src/types/globalInterfaces.ts index 4e2806c..3c3993a 100644 --- a/frontend/src/types/globalInterfaces.ts +++ b/frontend/src/types/globalInterfaces.ts @@ -27,6 +27,37 @@ export interface Car extends BaseRecord { max_passengers: number; } +// Интерфейсы для пользователей +export interface User extends BaseRecord { + username: string; + email: string; + name: string; + avatar?: string; + phone?: string; + is_verified: boolean; + emailVisibility?: boolean; +} + +// Интерфейсы для бронирований +export interface Booking extends BaseRecord { + customer_name: string; + customer_email: string; + customer_phone: string; + pickup_location: string; + dropoff_location: string; + pickup_date: string; + pickup_time: string; + dropoff_date?: string; + dropoff_time?: string; + passengers: number; + vehicle_id?: string; + vehicle_name?: string; + message?: string; + status: 'pending' | 'confirmed' | 'cancelled' | 'completed'; + total_price?: string; + created: string; +} + export interface SliderCar extends BaseRecord { brand: string; model: string; @@ -132,6 +163,43 @@ export interface Review extends BaseRecord { createdAt: string; } +// Интерфейсы для постов блога +export interface BlogPost extends BaseRecord { + title: string; + slug: string; + excerpt: string; + content: string; + content_html?: string; + image: string; + alt_text?: string; + author: string; + author_name?: string; + author_avatar?: string; + published: boolean; + publish_date: string; + views: number; + tags: string[]; + category?: string; + featured: boolean; +} + +export type Post = BlogPost; + +// Интерфейсы для комментариев блога +export interface Comment extends BaseRecord { + post_id: string; + author_name: string; + author_email: string; + author_avatar?: string; + content: string; + parent_id?: string; + reply_to?: string; + is_verified: boolean; + is_spam: boolean; + is_published: boolean; + created: string; +} + // Интерфейс для отзыва в LatestReviews export interface LatestReview { id: string;