import PocketBase, { RecordModel } from "pocketbase"; // Определяем, на сервере мы или в браузере const isServer = typeof window === "undefined"; // Фикс для Node.js (серверная часть) if (isServer) { // Позволяет серверу игнорировать проблемы с сертификатами при локальных запросах process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0"; } /** * ЛОГИКА URL: * 1. На сервере: используем локальный IP (быстро, внутри сети). * 2. В браузере: используем публичный URL (через Nginx/SSL). */ export const PB_URL = isServer ? process.env.PB_INTERNAL_URL || "http://127.0.0.1:8090" : process.env.NEXT_PUBLIC_PB_URL || "https://netrunner-vpn.com/cms"; export const pb = new PocketBase(PB_URL); /** * Базовый интерфейс для записей PocketBase. * Наследуемся от RecordModel, чтобы иметь системные поля (id, created, updated, и т.д.) */ export interface BaseRecord extends RecordModel { id: string; collectionId: string; collectionName: string; created: string; updated: string; } /** * Типизация для постов блога */ export interface PBPost extends BaseRecord { title: string; slug: string; excerpt: string; content: string; image: string; // имя файла lang: "ru" | "en"; published: boolean; } /** * Типизация для FAQ */ export interface PBFaq extends BaseRecord { question: string; answer: string; order: number; lang: string; } /** * Функция для генерации ссылки на картинку из PB * @param record - Объект записи (должен содержать id и collectionId) * @param filename - Имя файла из поля записи */ export function getPbImage( record: Pick, filename: string | undefined, ): string { if (!filename) return ""; return `${PB_URL}/api/files/${record.collectionId}/${record.id}/${filename}`; } // lib/pb.ts (добавь в конец файла) export interface PBDownload extends BaseRecord { name: string; // Имя (напр. "Windows 11") platformId: "windows" | "android" | "linux" | "macos" | "ios"; // Строгий ID для иконок version: string; // Строка версии status: "active" | "dev"; // Статус разработки file: string; // Сам бинарник (файл) storeLink: string; // URL на магазин или github order: number; // Для сортировки (1, 2, 3...) } export function getPbFileUrl( record: Pick, filename: string | undefined, ): string { if (!filename) return ""; // Если мы на сервере, для ссылок на файлы всё равно используем ПУБЛИЧНЫЙ адрес, // так как эти ссылки рендерятся в HTML и уходят клиенту. const baseUrl = isServer ? process.env.NEXT_PUBLIC_PB_URL || "https://netrunner-vpn.com/cms" : PB_URL; return `${baseUrl}/api/files/${record.collectionId}/${record.id}/${filename}`; }