МожливостіСутності
Документація
    Ring Platform

    Децентралізоване самобудівне майбутнє

    Увійти
    Сутності
    Можливості
    Магазин
    Документація
    Концепції
    RING ЕкономікаSonoratek LLCГлобальний впливAI зустрічає Web3
    Розпочати
    Швидкий стартКалькуляторДорожня карта
    Конфіденційність|Контакти
    v1.104.17|Sonoratek LLC

    Documentation

    Концепції, цінність і типові сценарії

    Ласкаво просимо до Ring
    Швидкий довідник
    Початок роботи
    Передумови
    Встановлення
    Валідація першого успіху
    Наступні кроки
    Функції
    Магазин
    Склад і залишки
    Керування вендорами
    Комісії та розрахунки
    SubscriptionConductor
    PaymentConductor
    Ring Oracle
    Інтеграція платежів
    Публічні пули та DAO-банки
    Інтеграція WayForPay
    Web3 Гаманець
    WalletConductor
    Партнерська та реферальна підтримка
    Реферальні коди (Refcodes)
    NFT Exhibition Marketplace
    Solana NFT Gates
    Система Стейкінга Токенів
    Лабораторія проєкту власника (Owner Project Lab)
    Сутності
    Можливості
    Повідомлення
    Завдання Ring
    WebRTC-дзвінки та STUNner TURN
    Ігри з друзями
    Модуль Новин - Цифровий Газетний Досвід
    Блоги учасників
    Сторінки публічного профілю
    Віджети профілю облікового запису
    Ring File Cabinet
    Система Резервування Імен Користувачів
    Науковий редактор
    Notifications
    Push-сповіщення через FCM (Ring)
    Email AI-CRM
    Ring Mailer і RingdomX Mail
    Протокол Tunnel
    VideoConductor
    MediaConductor
    Generative Gallery
    Authentication
    Безпека та відповідність
    Консоль адміністратора
    Адмінська Wiki
    Керування через Telegram
    Система локалей
    Мобільний Досвід
    Паттерни Оптимізації Продуктивності
    Приклади
    Швидкий старт
    Базове налаштування
    Білий лейбл
    Користувацьке брендування
    Інтеграція Web3
    Реальні приклади
    Розширені функції
    Кастомізація
    Швидкий старт — ваш перший клон Ring
    Повний посібник налаштування
    Вертикальні пресети (SSOT)
    Ringization playbook
    Брендування
    Теми
    Функції
    Локалізація
    Налаштування токеноміки
    Інтеграція платіжних шлюзів
    Еталонні деплої Ring
    Конфігурація
    Публічні змінні середовища
    Секрети Order Lab
    Project ID WalletConnect (Reown Cloud)
    Підтримувані сервіси
    Вікі NODUS (знання проєкту)
    Плейбук конфігурації
    Web3
    Token launch jurisdictions
    Гаманець
    Поради з безпеки гаманця
    Інтеграції
    Ethereum гаманці (Wagmi v3)
    RingFileBase (API об’єктного сховища)
    Ring CDN (edge RingFileBase)
    Розгортання
    Self-hosted розгортання
    Vercel
    Docker
    Конфігурація Середовища
    Моніторинг та Аналітика
    Оптимізація продуктивності
    Резервне копіювання і відновлення
    Архітектура
    Data Model
    Security
    Real Time
    Синхронізація discovery після мутацій
    Архітектура PaymentConductor
    Архітектура WalletConductor
    Бекенд Сервіси
    Інтеграція Firebase
    Розробка
    Ring MCP Server

    Швидкий вхід (CTO · аудитори · агенти)

    Вітаємо — місія та аудиторії
    Швидкий довідник
    Початок роботи
    Архітектура та Auth.js
    Режими бекенду та БД (DB_BACKEND_MODE)
    Self-hosted
    Ring MCP Tools
    Ring MCP Server
    Token economics
    Token launch jurisdictions
    Деплой (Docker · k8s)
    Безпека та відповідність
    ringdom.org — база LegioX
    Код — ліцензія MIT (GitHub)

    Documentation

    Концепції, цінність і типові сценарії

    Ласкаво просимо до Ring
    Швидкий довідник
    Початок роботи
    Передумови
    Встановлення
    Валідація першого успіху
    Наступні кроки
    Функції
    Магазин
    Склад і залишки
    Керування вендорами
    Комісії та розрахунки
    SubscriptionConductor
    PaymentConductor
    Ring Oracle
    Інтеграція платежів
    Публічні пули та DAO-банки
    Інтеграція WayForPay
    Web3 Гаманець
    WalletConductor
    Партнерська та реферальна підтримка
    Реферальні коди (Refcodes)
    NFT Exhibition Marketplace
    Solana NFT Gates
    Система Стейкінга Токенів
    Лабораторія проєкту власника (Owner Project Lab)
    Сутності
    Можливості
    Повідомлення
    Завдання Ring
    WebRTC-дзвінки та STUNner TURN
    Ігри з друзями
    Модуль Новин - Цифровий Газетний Досвід
    Блоги учасників
    Сторінки публічного профілю
    Віджети профілю облікового запису
    Ring File Cabinet
    Система Резервування Імен Користувачів
    Науковий редактор
    Notifications
    Push-сповіщення через FCM (Ring)
    Email AI-CRM
    Ring Mailer і RingdomX Mail
    Протокол Tunnel
    VideoConductor
    MediaConductor
    Generative Gallery
    Authentication
    Безпека та відповідність
    Консоль адміністратора
    Адмінська Wiki
    Керування через Telegram
    Система локалей
    Мобільний Досвід
    Паттерни Оптимізації Продуктивності
    Приклади
    Швидкий старт
    Базове налаштування
    Білий лейбл
    Користувацьке брендування
    Інтеграція Web3
    Реальні приклади
    Розширені функції
    Кастомізація
    Швидкий старт — ваш перший клон Ring
    Повний посібник налаштування
    Вертикальні пресети (SSOT)
    Ringization playbook
    Брендування
    Теми
    Функції
    Локалізація
    Налаштування токеноміки
    Інтеграція платіжних шлюзів
    Еталонні деплої Ring
    Конфігурація
    Публічні змінні середовища
    Секрети Order Lab
    Project ID WalletConnect (Reown Cloud)
    Підтримувані сервіси
    Вікі NODUS (знання проєкту)
    Плейбук конфігурації
    Web3
    Token launch jurisdictions
    Гаманець
    Поради з безпеки гаманця
    Інтеграції
    Ethereum гаманці (Wagmi v3)
    RingFileBase (API об’єктного сховища)
    Ring CDN (edge RingFileBase)
    Розгортання
    Self-hosted розгортання
    Vercel
    Docker
    Конфігурація Середовища
    Моніторинг та Аналітика
    Оптимізація продуктивності
    Резервне копіювання і відновлення
    Архітектура
    Data Model
    Security
    Real Time
    Синхронізація discovery після мутацій
    Архітектура PaymentConductor
    Архітектура WalletConductor
    Бекенд Сервіси
    Інтеграція Firebase
    Розробка
    Ring MCP Server

    Швидкий вхід (CTO · аудитори · агенти)

    Вітаємо — місія та аудиторії
    Швидкий довідник
    Початок роботи
    Архітектура та Auth.js
    Режими бекенду та БД (DB_BACKEND_MODE)
    Self-hosted
    Ring MCP Tools
    Ring MCP Server
    Token economics
    Token launch jurisdictions
    Деплой (Docker · k8s)
    Безпека та відповідність
    ringdom.org — база LegioX
    Код — ліцензія MIT (GitHub)

    Documentation

    Концепції, цінність і типові сценарії

    Ласкаво просимо до Ring
    Швидкий довідник
    Початок роботи
    Передумови
    Встановлення
    Валідація першого успіху
    Наступні кроки
    Функції
    Магазин
    Склад і залишки
    Керування вендорами
    Комісії та розрахунки
    SubscriptionConductor
    PaymentConductor
    Ring Oracle
    Інтеграція платежів
    Публічні пули та DAO-банки
    Інтеграція WayForPay
    Web3 Гаманець
    WalletConductor
    Партнерська та реферальна підтримка
    Реферальні коди (Refcodes)
    NFT Exhibition Marketplace
    Solana NFT Gates
    Система Стейкінга Токенів
    Лабораторія проєкту власника (Owner Project Lab)
    Сутності
    Можливості
    Повідомлення
    Завдання Ring
    WebRTC-дзвінки та STUNner TURN
    Ігри з друзями
    Модуль Новин - Цифровий Газетний Досвід
    Блоги учасників
    Сторінки публічного профілю
    Віджети профілю облікового запису
    Ring File Cabinet
    Система Резервування Імен Користувачів
    Науковий редактор
    Notifications
    Push-сповіщення через FCM (Ring)
    Email AI-CRM
    Ring Mailer і RingdomX Mail
    Протокол Tunnel
    VideoConductor
    MediaConductor
    Generative Gallery
    Authentication
    Безпека та відповідність
    Консоль адміністратора
    Адмінська Wiki
    Керування через Telegram
    Система локалей
    Мобільний Досвід
    Паттерни Оптимізації Продуктивності
    Приклади
    Швидкий старт
    Базове налаштування
    Білий лейбл
    Користувацьке брендування
    Інтеграція Web3
    Реальні приклади
    Розширені функції
    Кастомізація
    Швидкий старт — ваш перший клон Ring
    Повний посібник налаштування
    Вертикальні пресети (SSOT)
    Ringization playbook
    Брендування
    Теми
    Функції
    Локалізація
    Налаштування токеноміки
    Інтеграція платіжних шлюзів
    Еталонні деплої Ring
    Конфігурація
    Публічні змінні середовища
    Секрети Order Lab
    Project ID WalletConnect (Reown Cloud)
    Підтримувані сервіси
    Вікі NODUS (знання проєкту)
    Плейбук конфігурації
    Web3
    Token launch jurisdictions
    Гаманець
    Поради з безпеки гаманця
    Інтеграції
    Ethereum гаманці (Wagmi v3)
    RingFileBase (API об’єктного сховища)
    Ring CDN (edge RingFileBase)
    Розгортання
    Self-hosted розгортання
    Vercel
    Docker
    Конфігурація Середовища
    Моніторинг та Аналітика
    Оптимізація продуктивності
    Резервне копіювання і відновлення
    Архітектура
    Data Model
    Security
    Real Time
    Синхронізація discovery після мутацій
    Архітектура PaymentConductor
    Архітектура WalletConductor
    Бекенд Сервіси
    Інтеграція Firebase
    Розробка
    Ring MCP Server

    Швидкий вхід (CTO · аудитори · агенти)

    Вітаємо — місія та аудиторії
    Швидкий довідник
    Початок роботи
    Архітектура та Auth.js
    Режими бекенду та БД (DB_BACKEND_MODE)
    Self-hosted
    Ring MCP Tools
    Ring MCP Server
    Token economics
    Token launch jurisdictions
    Деплой (Docker · k8s)
    Безпека та відповідність
    ringdom.org — база LegioX
    Код — ліцензія MIT (GitHub)
    Ring Logo

    Loading documentation...

    Preparing Ring content

    Ring Logo

    Loading documentation...

    Preparing Ring content

    Ring Logo

    Loading documentation...

    Preparing Ring content

    Ring File Cabinet

    Використовуйте вкладки Founder / Developer на бічній панелі документації, щоб відфільтрувати цю сторінку. Завантаження проходять через RingFileBase; байти публічної галереї — через Ring CDN /files/{uuid}.

    Ring File Cabinet — персональний файловий менеджер для клонів Ring: вкладені папки (максимальна глибина 3), робочий простір для комп’ютера з трьома колонками, ACL owner / trustee (trustee = лише перегляд і завантаження), робочий стіл shared-with-me для кожного subscriber+, приватне упорядкування галереї та lightbox /{username}/img для елементів із visibility=public.

    Гейти доступу (перевірено)

    ПоверхняХтоПоведінка
    /file-cabinetAuth; member+Власний менеджер — FileCabinetWrapper → FileCabinetDesktop. Нечлени бачать MemberUpgradeGate (той самий патерн, що й для add-entity).
    /profile/cabinet—Перенаправляє на /file-cabinet (ROUTES.PROFILE_CABINET — псевдонім FILE_CABINET).
    /profile/sharedsubscriber+Повноцінний drag-and-drop робочий стіл довірених поширень. Користувачі лише з рівнем subscriber також бачать CTA оновлення membersUpgrade → membership із returnTo=/profile/shared.
    /profile/galleryAuth; member+Упорядковування зображень/відео → private | unlisted | public (MemberUpgradeGate для нечленів).
    /{username}/imgPublicLightbox для елементів із visibility=public.
    /{username}/playerPublicMood player (перейменовано з /songs; старого редиректу немає). Приватне керування залишається на /profile/songs.

    Права ACL надаються одразу (без прийняття запрошення). Максимальний розмір завантаження — 25MB через getCabinetStorageConfig(). Публікації використовують окрему модель співавторів — це не ACL File Cabinet.

    Власний менеджер лише для member · спільний для всіх subscriber

    Власний File Cabinet (/file-cabinet) і керування галереєю (/profile/gallery) потребують привілеїв member (hasMemberPrivileges + MemberUpgradeGate). Усі subscriber (і рівні вище) відкривають /profile/shared для довірених поширень — вони не отримують власний робочий стіл або поверхню завантаження, доки не оновляться до member.

    Чому це важливо для вашого клону

    Учасникам потрібне місце для документів, сканів і медіа, яке не перетворюється на хаос вкладень у чаті й не є сховищем Admin Wiki. File Cabinet — це персональне сховище з довіреними переглядачами, спільна скринька для співпрацівників і публічне обличчя-галерея — корисно для маркетплейсів, сервісних кілець і будь-якого клону, де довіра включає «покажи свою роботу».

    Кому що доступно (погляд оператора)

    Гейти доступу File Cabinet

    Власний файловий менеджер (member+)

    Учасники відкривають /file-cabinet — завантаження, папки, trustees через ContactPicker, розгортане дерево + рейка параметрів. Нечлени потрапляють на гейт оновлення membership.

    Спільний для всіх subscriber

    Кожен subscriber+ використовує /profile/shared для довірених поширень (робочий стіл перегляду/завантаження). CTA оновлення в рейці веде до membership для отримання власного менеджера.

    Архітектура

    Рольові гейти в коді (перевірено)

    ПоверхняГейт
    app/.../file-cabinet/page.tsxauth → hasMemberPrivileges, інакше MemberUpgradeGate (returnTo = ROUTES.FILE_CABINET)
    app/.../profile/shared/page.tsxauth → hasRoleAtLeast(..., subscriber), інакше unauthorized
    app/.../profile/gallery/page.tsxauth → hasMemberPrivileges, інакше MemberUpgradeGate
    app/.../profile/cabinet/page.tsxRedirect → ROUTES.FILE_CABINET

    Пов’язана документація

    Related documentation

    RingFileBase (object storage API)

    Залежність: завантаження кабінету проходять через file() / RingBaseAdapter і getCabinetStorageConfig.

    Ring CDN (RingFileBase edge)

    Залежність: елементи публічної галереї використовують стабільний CDN /files/{uuid} (+ похідні _v_*).

    Public Profile Pages

    Наступний крок: публічні поверхні /img, /player і /games розташовані під /{username}.

    Peer Games

    Див. також: публічна доступність /games — споріднена поверхня профілю (не ACL File Cabinet).

    Ring File Cabinet

    Використовуйте вкладки Founder / Developer на бічній панелі документації, щоб відфільтрувати цю сторінку. Завантаження проходять через RingFileBase; байти публічної галереї — через Ring CDN /files/{uuid}.

    Ring File Cabinet — персональний файловий менеджер для клонів Ring: вкладені папки (максимальна глибина 3), робочий простір для комп’ютера з трьома колонками, ACL owner / trustee (trustee = лише перегляд і завантаження), робочий стіл shared-with-me для кожного subscriber+, приватне упорядкування галереї та lightbox /{username}/img для елементів із visibility=public.

    Гейти доступу (перевірено)

    ПоверхняХтоПоведінка
    /file-cabinetAuth; member+Власний менеджер — FileCabinetWrapper → FileCabinetDesktop. Нечлени бачать MemberUpgradeGate (той самий патерн, що й для add-entity).
    /profile/cabinet—Перенаправляє на /file-cabinet (ROUTES.PROFILE_CABINET — псевдонім FILE_CABINET).
    /profile/sharedsubscriber+Повноцінний drag-and-drop робочий стіл довірених поширень. Користувачі лише з рівнем subscriber також бачать CTA оновлення membersUpgrade → membership із returnTo=/profile/shared.
    /profile/galleryAuth; member+Упорядковування зображень/відео → private | unlisted | public (MemberUpgradeGate для нечленів).
    /{username}/imgPublicLightbox для елементів із visibility=public.
    /{username}/playerPublicMood player (перейменовано з /songs; старого редиректу немає). Приватне керування залишається на /profile/songs.

    Права ACL надаються одразу (без прийняття запрошення). Максимальний розмір завантаження — 25MB через getCabinetStorageConfig(). Публікації використовують окрему модель співавторів — це не ACL File Cabinet.

    Власний менеджер лише для member · спільний для всіх subscriber

    Власний File Cabinet (/file-cabinet) і керування галереєю (/profile/gallery) потребують привілеїв member (hasMemberPrivileges + MemberUpgradeGate). Усі subscriber (і рівні вище) відкривають /profile/shared для довірених поширень — вони не отримують власний робочий стіл або поверхню завантаження, доки не оновляться до member.

    Чому це важливо для вашого клону

    Учасникам потрібне місце для документів, сканів і медіа, яке не перетворюється на хаос вкладень у чаті й не є сховищем Admin Wiki. File Cabinet — це персональне сховище з довіреними переглядачами, спільна скринька для співпрацівників і публічне обличчя-галерея — корисно для маркетплейсів, сервісних кілець і будь-якого клону, де довіра включає «покажи свою роботу».

    Кому що доступно (погляд оператора)

    Гейти доступу File Cabinet

    Власний файловий менеджер (member+)

    Учасники відкривають /file-cabinet — завантаження, папки, trustees через ContactPicker, розгортане дерево + рейка параметрів. Нечлени потрапляють на гейт оновлення membership.

    Спільний для всіх subscriber

    Кожен subscriber+ використовує /profile/shared для довірених поширень (робочий стіл перегляду/завантаження). CTA оновлення в рейці веде до membership для отримання власного менеджера.

    Архітектура

    Рольові гейти в коді (перевірено)

    ПоверхняГейт
    app/.../file-cabinet/page.tsxauth → hasMemberPrivileges, інакше MemberUpgradeGate (returnTo = ROUTES.FILE_CABINET)
    app/.../profile/shared/page.tsxauth → hasRoleAtLeast(..., subscriber), інакше unauthorized
    app/.../profile/gallery/page.tsxauth → hasMemberPrivileges, інакше MemberUpgradeGate
    app/.../profile/cabinet/page.tsxRedirect → ROUTES.FILE_CABINET

    Пов’язана документація

    Related documentation

    RingFileBase (object storage API)

    Залежність: завантаження кабінету проходять через file() / RingBaseAdapter і getCabinetStorageConfig.

    Ring CDN (RingFileBase edge)

    Залежність: елементи публічної галереї використовують стабільний CDN /files/{uuid} (+ похідні _v_*).

    Public Profile Pages

    Наступний крок: публічні поверхні /img, /player і /games розташовані під /{username}.

    Peer Games

    Див. також: публічна доступність /games — споріднена поверхня профілю (не ACL File Cabinet).

    Ring File Cabinet

    Використовуйте вкладки Founder / Developer на бічній панелі документації, щоб відфільтрувати цю сторінку. Завантаження проходять через RingFileBase; байти публічної галереї — через Ring CDN /files/{uuid}.

    Ring File Cabinet — персональний файловий менеджер для клонів Ring: вкладені папки (максимальна глибина 3), робочий простір для комп’ютера з трьома колонками, ACL owner / trustee (trustee = лише перегляд і завантаження), робочий стіл shared-with-me для кожного subscriber+, приватне упорядкування галереї та lightbox /{username}/img для елементів із visibility=public.

    Гейти доступу (перевірено)

    ПоверхняХтоПоведінка
    /file-cabinetAuth; member+Власний менеджер — FileCabinetWrapper → FileCabinetDesktop. Нечлени бачать MemberUpgradeGate (той самий патерн, що й для add-entity).
    /profile/cabinet—Перенаправляє на /file-cabinet (ROUTES.PROFILE_CABINET — псевдонім FILE_CABINET).
    /profile/sharedsubscriber+Повноцінний drag-and-drop робочий стіл довірених поширень. Користувачі лише з рівнем subscriber також бачать CTA оновлення membersUpgrade → membership із returnTo=/profile/shared.
    /profile/galleryAuth; member+Упорядковування зображень/відео → private | unlisted | public (MemberUpgradeGate для нечленів).
    /{username}/imgPublicLightbox для елементів із visibility=public.
    /{username}/playerPublicMood player (перейменовано з /songs; старого редиректу немає). Приватне керування залишається на /profile/songs.

    Права ACL надаються одразу (без прийняття запрошення). Максимальний розмір завантаження — 25MB через getCabinetStorageConfig(). Публікації використовують окрему модель співавторів — це не ACL File Cabinet.

    Власний менеджер лише для member · спільний для всіх subscriber

    Власний File Cabinet (/file-cabinet) і керування галереєю (/profile/gallery) потребують привілеїв member (hasMemberPrivileges + MemberUpgradeGate). Усі subscriber (і рівні вище) відкривають /profile/shared для довірених поширень — вони не отримують власний робочий стіл або поверхню завантаження, доки не оновляться до member.

    Чому це важливо для вашого клону

    Учасникам потрібне місце для документів, сканів і медіа, яке не перетворюється на хаос вкладень у чаті й не є сховищем Admin Wiki. File Cabinet — це персональне сховище з довіреними переглядачами, спільна скринька для співпрацівників і публічне обличчя-галерея — корисно для маркетплейсів, сервісних кілець і будь-якого клону, де довіра включає «покажи свою роботу».

    Кому що доступно (погляд оператора)

    Гейти доступу File Cabinet

    Власний файловий менеджер (member+)

    Учасники відкривають /file-cabinet — завантаження, папки, trustees через ContactPicker, розгортане дерево + рейка параметрів. Нечлени потрапляють на гейт оновлення membership.

    Спільний для всіх subscriber

    Кожен subscriber+ використовує /profile/shared для довірених поширень (робочий стіл перегляду/завантаження). CTA оновлення в рейці веде до membership для отримання власного менеджера.

    Архітектура

    Рольові гейти в коді (перевірено)

    ПоверхняГейт
    app/.../file-cabinet/page.tsxauth → hasMemberPrivileges, інакше MemberUpgradeGate (returnTo = ROUTES.FILE_CABINET)
    app/.../profile/shared/page.tsxauth → hasRoleAtLeast(..., subscriber), інакше unauthorized
    app/.../profile/gallery/page.tsxauth → hasMemberPrivileges, інакше MemberUpgradeGate
    app/.../profile/cabinet/page.tsxRedirect → ROUTES.FILE_CABINET

    Пов’язана документація

    Related documentation

    RingFileBase (object storage API)

    Залежність: завантаження кабінету проходять через file() / RingBaseAdapter і getCabinetStorageConfig.

    Ring CDN (RingFileBase edge)

    Залежність: елементи публічної галереї використовують стабільний CDN /files/{uuid} (+ похідні _v_*).

    Public Profile Pages

    Наступний крок: публічні поверхні /img, /player і /games розташовані під /{username}.

    Peer Games

    Див. також: публічна доступність /games — споріднена поверхня профілю (не ACL File Cabinet).

    Публічна галерея

    Упорядковуйте на /profile/gallery (member+); публічні елементи з’являються на /{username}/img через URL CDN.

    Рівень сховища

    Об’єкти зберігаються в RingFileBase / MinIO; для зображень галереї можна запитувати derivativesProfile: gallery.

    Generative Gallery із кабінету

    Image/Video chat на панелі деталей відкриває generative fs-modal (scope: cabinet); збереження створює сусідні файли під батьківською папкою джерела.

    Типові сценарії

    1. Медіакіт продавця — Member завантажує PDF і фотографії товарів на /file-cabinet; ділиться папкою з trustee (лише перегляд/завантаження, права надаються одразу).
    2. Альтернативна папка Store Agent Research — Product Research записує research-{runId}.md і зображення з цитатами в store/[storename]/[product-slug]/alt (глибина ≤3). Продавці відкривають ці зображення на панелі деталей → Image chat / Video chat, щоб покращити або оживити їх, а потім зберігають сусідній файл поруч із джерелом.
    3. Співпрацівник-subscriber — subscriber без membership усе одно відкриває /profile/shared, упорядковує довірені файли на своєму робочому столі й завантажує їх — без власного кабінету.
    4. Смужка публічного портфоліо — власник позначає вибрані зображення як public → відвідувачі відкривають /{username}/img.
    5. Конфіденційне проти спільного — порожній список trustee = конфіденційно; Share FsModal показує живий рядок Trustees (або «конфіденційно») і Make confidential, щоб відкликати всіх trustee.

    Чекліст оператора

    • Переконайтеся, що застосовано міграцію 042_file_cabinet.sql (таблиці file_cabinet_*) і образ застосунку містить UI File Cabinet.
    • Env: NEXT_PUBLIC_STORAGE_PROVIDER=ring_filebase (або еквівалент), RINGBASE_API_URL, RINGBASE_PUBLIC_URL, RINGBASE_API_TOKEN — див. RingFileBase.
    • Перевірте як member: завантаження на /file-cabinet → Share trustees → другий користувач (subscriber+) бачить елемент на /profile/shared.
    • Перевірте як subscriber (не member): /file-cabinet показує гейт оновлення; /profile/shared далі працює для спільних файлів; рейка показує «Members get their own file manager».
    • Перевірте галерею: додайте зображення → встановіть public → відкрийте /{username}/img.
    • Не очікуйте підписаних URL HMAC/TTL — публічна доставка сьогодні використовує стабільний CDN /files/{fileId}.
    Actions (listOwnCabinetAction, upload, own desktop)
    requireMember()
    Actions (listSharedCabinetAction, shared desktop)requireSubscriber(); scope: 'own' усе одно потребує member

    UX-оболонка (перевірено)

    FileCabinetWrapper — тонка клієнтська межа (components/wrappers/file-cabinet-wrapper.tsx), яка рендерить FileCabinetDesktop. Оболонка з трьома колонками (RingRightRailLayout + центральна панель Davinci) живе всередині компонента desktop.

    ЧастинаРоль
    Центральна панельХлібні крихти + New folder / Upload (праворуч) + робочий простір іконок (без картки desktop з рамкою)
    Права рейкаЗаголовок → розгортане дерево лише папок → параметри (DavinciGlassPanel, title = видиме ім’я файлу) → інформаційна панель без прокручування
    ДеревоРозгортання +/−; вибраний каталог використовує повністю заокруглену (rounded-[99px]) активну поверхню; стан розгортання у treeExpandedIds документа desktop
    Іконки desktopSSOT видимого імені у icons[].meta.filename (перейменування перезаписує; історії немає); іконки зображень використовують sync_thumb через download ?variant=
    Порожня папкаКонтрол видалення лише коли папка не має дочірніх елементів
    TrusteesРядок параметрів + Share FsModal (живі Trustees / конфіденційно, вбудований ContactPicker, Make confidential під час очищення trustee)
    ЗавантаженняSkeleton фіксованої висоти для рядка trustees, метаданих і прев’ю зображення (без стрибка макета)
    Оновлення sharedЛише subscriber + scope === 'shared' → CTA t('membersUpgrade') → /membership?returnTo=/profile/shared
    Image / Video chatПанель деталей (file-cabinet-detail-panel.tsx) на файлах зображень → GenerativeMediaEditorFsModal (scope="cabinet")
    Збереження поручsaveGeneratedMediaToDesktopAction під parentId джерела як {base}-enhanced-{ts}.{ext} або {base}-enlive-{ts}.{ext}

    Альтернативний шлях досліджень товару (знання Store Agent)

    Коли продавці запускають Research для товару, features/store/lib/product-cabinet-media.ts забезпечує три вкладені каталоги в кабінеті власника-продавця (концептуальний корінь files/ + MAX_FOLDER_DEPTH = 3):

    store/[storename]/[product-slug]/alt

    Артефакти: research-{runId}.md плюс завантажені зображення research-{runId}-N.{ext} (SSRF-перевірка HTTP(S) fetch → RingBase → createFileNode). Увімкнення галереї storefront залишається у формі товару (Use in gallery) — див. Multi-Vendor Store. Pipeline: cabinet.genmedia.sibling_save у scripts/PIPELINES.md.

    Карта модулів

    ШляхРоль
    features/file-cabinet/service.tsserver-only CRUD, ACL (включно з обходом предків для успадкованих trustee), desktop, gallery
    features/file-cabinet/acl.tsowner | trustee (legacy editor → trustee)
    features/file-cabinet/constants.tsFILE_CABINET_DESKTOP_CHANNEL, FILE_CABINET_DOWNLOAD_PATH, MAX_FOLDER_DEPTH = 3
    features/file-cabinet/desktop-filename.tsДопоміжні засоби видимого імені файлу
    features/file-cabinet/media-urls.tsДопоміжні засоби same-origin URL завантаження (?variant=)
    features/file-cabinet/components/*Desktop, дерево, параметри, деталі (Image/Video chat), FsModal поширення/перейменування, skeleton, gallery, public img
    app/_actions/file-cabinet.tsServer Actions + рольові гейти + saveGeneratedMediaToDesktopAction
    features/store/lib/product-cabinet-media.tsStore research → writer store/…/alt (SSRF-safe)
    app/api/file-cabinet/download/route.tsПеревірка ACL → потік байтів (inline=1, необов’язковий variant= для thumb/webp)
    lib/storage/storage-config.tsgetCabinetStorageConfig() — 25MB + allowlist MIME
    components/file-tree/tree-helpers.tsСпільні помічники дерева (адаптери Admin Wiki)
    data/migrations/042_file_cabinet.sqlСхема (+ дзеркало в data/schema.sql)

    Модель ACL

    РольМожливості
    ownerПовний CRUD, встановлення trustee через ContactPicker (setCabinetTrusteesAction)
    trusteeПерегляд / список / завантаження; макет shared desktop; не може змінювати або завантажувати

    Права одразу записуються в file_cabinet_acl — потоку прийняття запрошення немає. Під час переліку ACL для рейки параметрів виконується обхід предків, тому поширення папки відображаються і на вкладених файлах.

    Схема (колекції JSONB)

    Таблиці (id + data JSONB): file_cabinet_nodes, file_cabinet_acl, file_cabinet_desktop, file_cabinet_gallery_items.

    Документ desktop зберігає позиції іконок і treeExpandedIds для дерева папок лише з розгортанням/згортанням. Кеш макета для кожної папки зберігає позиції після перетягування під час переходу вкладеними папками.

    параметри id для createDoc

    Передавайте id документа як createDoc(collection, data, { id }). Якщо покласти id лише всередину data, PostgreSQLAdapter може розійтися з data.id, згенерувавши інший generateId().

    Завантаження у сховище (перевірено)

    Завантаження в кабінет використовують file().upload(...) з access: 'private', derivativesProfile: 'gallery' для зображень і перевірками MIME/розміру з getCabinetStorageConfig() (зображення, PDF, Office, text/csv/md, zip, а також video/mp4 / video/webm).

    Публічні елементи галереї зберігають CDN URL із завантаження (storageUrl). У поточному шляху RingBaseAdapter немає підписаних URL HMAC/TTL — доставка має вигляд {RINGBASE_PUBLIC_URL}/files/{fileId} (+ похідні _v_*). Приватні завантаження використовують ACL-проксі (/api/file-cabinet/download) із Content-Disposition з node.name / desktop meta.filename. У прямому CDN /files/{uuid} досі немає Content-Disposition — див. backlog.

    Desktop tunnel

    saveDesktop публікує дані в персональний tunnel учасника:

    Клієнт слухає через useTunnelChannel у file-cabinet-desktop.tsx.

    Кроки підключення

    1. 1

      Застосуйте міграцію

      Переконайтеся, що 042_file_cabinet.sql (і паритет schema.sql) застосовано до БД клону. Нові інсталяції отримують таблиці з data/schema.sql.

    2. 2

      Підтвердьте env сховища

      Зверніться до RingFileBase: NEXT_PUBLIC_STORAGE_PROVIDER=ring_filebase, RINGBASE_API_URL, RINGBASE_PUBLIC_URL, RINGBASE_API_TOKEN.

    3. 3

      Викликайте через Server Actions

      Віддавайте перевагу app/_actions/file-cabinet.ts із клієнтського UI — не обходьте ACL-помічники в service.ts. Власний список/завантаження потребує member; shared desktop потребує subscriber+; getDesktop / saveDesktop для scope: 'own' також потребують привілеїв member.

    4. 4

      Сторінка public img

      app/[locale]/[username]/img/page.tsx завантажує listPublicGalleryByOwner(ownerId) і рендерить PublicProfileImgGallery. Відображаються лише елементи з visibility=public.

    Маршрути (константи)

    КонстантаШлях
    ROUTES.FILE_CABINET/file-cabinet (канонічний власний менеджер)
    ROUTES.PROFILE_CABINET/file-cabinet (застарілий псевдонім; /profile/cabinet перенаправляє)
    ROUTES.PROFILE_SHARED/profile/shared
    ROUTES.PROFILE_GALLERY/profile/gallery
    ROUTES.PUBLIC_PROFILE_IMG(username)/{username}/img
    ROUTES.PUBLIC_PROFILE_PLAYER(username)/{username}/player

    Керування приватним mood-player залишається на /profile/songs (ROUTES.PROFILE_SONGS). Peer /games — споріднена поверхня public profile, а не сховище File Cabinet.

    SubscriptionConductor

    Той самий процес: member gate для /file-cabinet проти shared desktop для subscriber+.

    Tunnel Protocol

    Поглиблення: синхронізація іконок desktop використовує publishToUserTunnel на каналі file-cabinet:desktop-icons.

    Admin Wiki

    Див. також: спільні помічники FileTree і патерн колекції JSONB id+data.

    Multi-Vendor Store

    Той самий процес: Research Agent Knowledge записує markdown + зображення в store/product/alt.

    Generative Gallery

    Залежність: cabinet Image/Video chat повторно використовує GenerativeMediaEditorFsModal зі scope cabinet.

    Публічна галерея

    Упорядковуйте на /profile/gallery (member+); публічні елементи з’являються на /{username}/img через URL CDN.

    Рівень сховища

    Об’єкти зберігаються в RingFileBase / MinIO; для зображень галереї можна запитувати derivativesProfile: gallery.

    Generative Gallery із кабінету

    Image/Video chat на панелі деталей відкриває generative fs-modal (scope: cabinet); збереження створює сусідні файли під батьківською папкою джерела.

    Типові сценарії

    1. Медіакіт продавця — Member завантажує PDF і фотографії товарів на /file-cabinet; ділиться папкою з trustee (лише перегляд/завантаження, права надаються одразу).
    2. Альтернативна папка Store Agent Research — Product Research записує research-{runId}.md і зображення з цитатами в store/[storename]/[product-slug]/alt (глибина ≤3). Продавці відкривають ці зображення на панелі деталей → Image chat / Video chat, щоб покращити або оживити їх, а потім зберігають сусідній файл поруч із джерелом.
    3. Співпрацівник-subscriber — subscriber без membership усе одно відкриває /profile/shared, упорядковує довірені файли на своєму робочому столі й завантажує їх — без власного кабінету.
    4. Смужка публічного портфоліо — власник позначає вибрані зображення як public → відвідувачі відкривають /{username}/img.
    5. Конфіденційне проти спільного — порожній список trustee = конфіденційно; Share FsModal показує живий рядок Trustees (або «конфіденційно») і Make confidential, щоб відкликати всіх trustee.

    Чекліст оператора

    • Переконайтеся, що застосовано міграцію 042_file_cabinet.sql (таблиці file_cabinet_*) і образ застосунку містить UI File Cabinet.
    • Env: NEXT_PUBLIC_STORAGE_PROVIDER=ring_filebase (або еквівалент), RINGBASE_API_URL, RINGBASE_PUBLIC_URL, RINGBASE_API_TOKEN — див. RingFileBase.
    • Перевірте як member: завантаження на /file-cabinet → Share trustees → другий користувач (subscriber+) бачить елемент на /profile/shared.
    • Перевірте як subscriber (не member): /file-cabinet показує гейт оновлення; /profile/shared далі працює для спільних файлів; рейка показує «Members get their own file manager».
    • Перевірте галерею: додайте зображення → встановіть public → відкрийте /{username}/img.
    • Не очікуйте підписаних URL HMAC/TTL — публічна доставка сьогодні використовує стабільний CDN /files/{fileId}.
    Actions (listOwnCabinetAction, upload, own desktop)
    requireMember()
    Actions (listSharedCabinetAction, shared desktop)requireSubscriber(); scope: 'own' усе одно потребує member

    UX-оболонка (перевірено)

    FileCabinetWrapper — тонка клієнтська межа (components/wrappers/file-cabinet-wrapper.tsx), яка рендерить FileCabinetDesktop. Оболонка з трьома колонками (RingRightRailLayout + центральна панель Davinci) живе всередині компонента desktop.

    ЧастинаРоль
    Центральна панельХлібні крихти + New folder / Upload (праворуч) + робочий простір іконок (без картки desktop з рамкою)
    Права рейкаЗаголовок → розгортане дерево лише папок → параметри (DavinciGlassPanel, title = видиме ім’я файлу) → інформаційна панель без прокручування
    ДеревоРозгортання +/−; вибраний каталог використовує повністю заокруглену (rounded-[99px]) активну поверхню; стан розгортання у treeExpandedIds документа desktop
    Іконки desktopSSOT видимого імені у icons[].meta.filename (перейменування перезаписує; історії немає); іконки зображень використовують sync_thumb через download ?variant=
    Порожня папкаКонтрол видалення лише коли папка не має дочірніх елементів
    TrusteesРядок параметрів + Share FsModal (живі Trustees / конфіденційно, вбудований ContactPicker, Make confidential під час очищення trustee)
    ЗавантаженняSkeleton фіксованої висоти для рядка trustees, метаданих і прев’ю зображення (без стрибка макета)
    Оновлення sharedЛише subscriber + scope === 'shared' → CTA t('membersUpgrade') → /membership?returnTo=/profile/shared
    Image / Video chatПанель деталей (file-cabinet-detail-panel.tsx) на файлах зображень → GenerativeMediaEditorFsModal (scope="cabinet")
    Збереження поручsaveGeneratedMediaToDesktopAction під parentId джерела як {base}-enhanced-{ts}.{ext} або {base}-enlive-{ts}.{ext}

    Альтернативний шлях досліджень товару (знання Store Agent)

    Коли продавці запускають Research для товару, features/store/lib/product-cabinet-media.ts забезпечує три вкладені каталоги в кабінеті власника-продавця (концептуальний корінь files/ + MAX_FOLDER_DEPTH = 3):

    store/[storename]/[product-slug]/alt

    Артефакти: research-{runId}.md плюс завантажені зображення research-{runId}-N.{ext} (SSRF-перевірка HTTP(S) fetch → RingBase → createFileNode). Увімкнення галереї storefront залишається у формі товару (Use in gallery) — див. Multi-Vendor Store. Pipeline: cabinet.genmedia.sibling_save у scripts/PIPELINES.md.

    Карта модулів

    ШляхРоль
    features/file-cabinet/service.tsserver-only CRUD, ACL (включно з обходом предків для успадкованих trustee), desktop, gallery
    features/file-cabinet/acl.tsowner | trustee (legacy editor → trustee)
    features/file-cabinet/constants.tsFILE_CABINET_DESKTOP_CHANNEL, FILE_CABINET_DOWNLOAD_PATH, MAX_FOLDER_DEPTH = 3
    features/file-cabinet/desktop-filename.tsДопоміжні засоби видимого імені файлу
    features/file-cabinet/media-urls.tsДопоміжні засоби same-origin URL завантаження (?variant=)
    features/file-cabinet/components/*Desktop, дерево, параметри, деталі (Image/Video chat), FsModal поширення/перейменування, skeleton, gallery, public img
    app/_actions/file-cabinet.tsServer Actions + рольові гейти + saveGeneratedMediaToDesktopAction
    features/store/lib/product-cabinet-media.tsStore research → writer store/…/alt (SSRF-safe)
    app/api/file-cabinet/download/route.tsПеревірка ACL → потік байтів (inline=1, необов’язковий variant= для thumb/webp)
    lib/storage/storage-config.tsgetCabinetStorageConfig() — 25MB + allowlist MIME
    components/file-tree/tree-helpers.tsСпільні помічники дерева (адаптери Admin Wiki)
    data/migrations/042_file_cabinet.sqlСхема (+ дзеркало в data/schema.sql)

    Модель ACL

    РольМожливості
    ownerПовний CRUD, встановлення trustee через ContactPicker (setCabinetTrusteesAction)
    trusteeПерегляд / список / завантаження; макет shared desktop; не може змінювати або завантажувати

    Права одразу записуються в file_cabinet_acl — потоку прийняття запрошення немає. Під час переліку ACL для рейки параметрів виконується обхід предків, тому поширення папки відображаються і на вкладених файлах.

    Схема (колекції JSONB)

    Таблиці (id + data JSONB): file_cabinet_nodes, file_cabinet_acl, file_cabinet_desktop, file_cabinet_gallery_items.

    Документ desktop зберігає позиції іконок і treeExpandedIds для дерева папок лише з розгортанням/згортанням. Кеш макета для кожної папки зберігає позиції після перетягування під час переходу вкладеними папками.

    параметри id для createDoc

    Передавайте id документа як createDoc(collection, data, { id }). Якщо покласти id лише всередину data, PostgreSQLAdapter може розійтися з data.id, згенерувавши інший generateId().

    Завантаження у сховище (перевірено)

    Завантаження в кабінет використовують file().upload(...) з access: 'private', derivativesProfile: 'gallery' для зображень і перевірками MIME/розміру з getCabinetStorageConfig() (зображення, PDF, Office, text/csv/md, zip, а також video/mp4 / video/webm).

    Публічні елементи галереї зберігають CDN URL із завантаження (storageUrl). У поточному шляху RingBaseAdapter немає підписаних URL HMAC/TTL — доставка має вигляд {RINGBASE_PUBLIC_URL}/files/{fileId} (+ похідні _v_*). Приватні завантаження використовують ACL-проксі (/api/file-cabinet/download) із Content-Disposition з node.name / desktop meta.filename. У прямому CDN /files/{uuid} досі немає Content-Disposition — див. backlog.

    Desktop tunnel

    saveDesktop публікує дані в персональний tunnel учасника:

    Клієнт слухає через useTunnelChannel у file-cabinet-desktop.tsx.

    Кроки підключення

    1. 1

      Застосуйте міграцію

      Переконайтеся, що 042_file_cabinet.sql (і паритет schema.sql) застосовано до БД клону. Нові інсталяції отримують таблиці з data/schema.sql.

    2. 2

      Підтвердьте env сховища

      Зверніться до RingFileBase: NEXT_PUBLIC_STORAGE_PROVIDER=ring_filebase, RINGBASE_API_URL, RINGBASE_PUBLIC_URL, RINGBASE_API_TOKEN.

    3. 3

      Викликайте через Server Actions

      Віддавайте перевагу app/_actions/file-cabinet.ts із клієнтського UI — не обходьте ACL-помічники в service.ts. Власний список/завантаження потребує member; shared desktop потребує subscriber+; getDesktop / saveDesktop для scope: 'own' також потребують привілеїв member.

    4. 4

      Сторінка public img

      app/[locale]/[username]/img/page.tsx завантажує listPublicGalleryByOwner(ownerId) і рендерить PublicProfileImgGallery. Відображаються лише елементи з visibility=public.

    Маршрути (константи)

    КонстантаШлях
    ROUTES.FILE_CABINET/file-cabinet (канонічний власний менеджер)
    ROUTES.PROFILE_CABINET/file-cabinet (застарілий псевдонім; /profile/cabinet перенаправляє)
    ROUTES.PROFILE_SHARED/profile/shared
    ROUTES.PROFILE_GALLERY/profile/gallery
    ROUTES.PUBLIC_PROFILE_IMG(username)/{username}/img
    ROUTES.PUBLIC_PROFILE_PLAYER(username)/{username}/player

    Керування приватним mood-player залишається на /profile/songs (ROUTES.PROFILE_SONGS). Peer /games — споріднена поверхня public profile, а не сховище File Cabinet.

    SubscriptionConductor

    Той самий процес: member gate для /file-cabinet проти shared desktop для subscriber+.

    Tunnel Protocol

    Поглиблення: синхронізація іконок desktop використовує publishToUserTunnel на каналі file-cabinet:desktop-icons.

    Admin Wiki

    Див. також: спільні помічники FileTree і патерн колекції JSONB id+data.

    Multi-Vendor Store

    Той самий процес: Research Agent Knowledge записує markdown + зображення в store/product/alt.

    Generative Gallery

    Залежність: cabinet Image/Video chat повторно використовує GenerativeMediaEditorFsModal зі scope cabinet.

    Публічна галерея

    Упорядковуйте на /profile/gallery (member+); публічні елементи з’являються на /{username}/img через URL CDN.

    Рівень сховища

    Об’єкти зберігаються в RingFileBase / MinIO; для зображень галереї можна запитувати derivativesProfile: gallery.

    Generative Gallery із кабінету

    Image/Video chat на панелі деталей відкриває generative fs-modal (scope: cabinet); збереження створює сусідні файли під батьківською папкою джерела.

    Типові сценарії

    1. Медіакіт продавця — Member завантажує PDF і фотографії товарів на /file-cabinet; ділиться папкою з trustee (лише перегляд/завантаження, права надаються одразу).
    2. Альтернативна папка Store Agent Research — Product Research записує research-{runId}.md і зображення з цитатами в store/[storename]/[product-slug]/alt (глибина ≤3). Продавці відкривають ці зображення на панелі деталей → Image chat / Video chat, щоб покращити або оживити їх, а потім зберігають сусідній файл поруч із джерелом.
    3. Співпрацівник-subscriber — subscriber без membership усе одно відкриває /profile/shared, упорядковує довірені файли на своєму робочому столі й завантажує їх — без власного кабінету.
    4. Смужка публічного портфоліо — власник позначає вибрані зображення як public → відвідувачі відкривають /{username}/img.
    5. Конфіденційне проти спільного — порожній список trustee = конфіденційно; Share FsModal показує живий рядок Trustees (або «конфіденційно») і Make confidential, щоб відкликати всіх trustee.

    Чекліст оператора

    • Переконайтеся, що застосовано міграцію 042_file_cabinet.sql (таблиці file_cabinet_*) і образ застосунку містить UI File Cabinet.
    • Env: NEXT_PUBLIC_STORAGE_PROVIDER=ring_filebase (або еквівалент), RINGBASE_API_URL, RINGBASE_PUBLIC_URL, RINGBASE_API_TOKEN — див. RingFileBase.
    • Перевірте як member: завантаження на /file-cabinet → Share trustees → другий користувач (subscriber+) бачить елемент на /profile/shared.
    • Перевірте як subscriber (не member): /file-cabinet показує гейт оновлення; /profile/shared далі працює для спільних файлів; рейка показує «Members get their own file manager».
    • Перевірте галерею: додайте зображення → встановіть public → відкрийте /{username}/img.
    • Не очікуйте підписаних URL HMAC/TTL — публічна доставка сьогодні використовує стабільний CDN /files/{fileId}.
    Actions (listOwnCabinetAction, upload, own desktop)
    requireMember()
    Actions (listSharedCabinetAction, shared desktop)requireSubscriber(); scope: 'own' усе одно потребує member

    UX-оболонка (перевірено)

    FileCabinetWrapper — тонка клієнтська межа (components/wrappers/file-cabinet-wrapper.tsx), яка рендерить FileCabinetDesktop. Оболонка з трьома колонками (RingRightRailLayout + центральна панель Davinci) живе всередині компонента desktop.

    ЧастинаРоль
    Центральна панельХлібні крихти + New folder / Upload (праворуч) + робочий простір іконок (без картки desktop з рамкою)
    Права рейкаЗаголовок → розгортане дерево лише папок → параметри (DavinciGlassPanel, title = видиме ім’я файлу) → інформаційна панель без прокручування
    ДеревоРозгортання +/−; вибраний каталог використовує повністю заокруглену (rounded-[99px]) активну поверхню; стан розгортання у treeExpandedIds документа desktop
    Іконки desktopSSOT видимого імені у icons[].meta.filename (перейменування перезаписує; історії немає); іконки зображень використовують sync_thumb через download ?variant=
    Порожня папкаКонтрол видалення лише коли папка не має дочірніх елементів
    TrusteesРядок параметрів + Share FsModal (живі Trustees / конфіденційно, вбудований ContactPicker, Make confidential під час очищення trustee)
    ЗавантаженняSkeleton фіксованої висоти для рядка trustees, метаданих і прев’ю зображення (без стрибка макета)
    Оновлення sharedЛише subscriber + scope === 'shared' → CTA t('membersUpgrade') → /membership?returnTo=/profile/shared
    Image / Video chatПанель деталей (file-cabinet-detail-panel.tsx) на файлах зображень → GenerativeMediaEditorFsModal (scope="cabinet")
    Збереження поручsaveGeneratedMediaToDesktopAction під parentId джерела як {base}-enhanced-{ts}.{ext} або {base}-enlive-{ts}.{ext}

    Альтернативний шлях досліджень товару (знання Store Agent)

    Коли продавці запускають Research для товару, features/store/lib/product-cabinet-media.ts забезпечує три вкладені каталоги в кабінеті власника-продавця (концептуальний корінь files/ + MAX_FOLDER_DEPTH = 3):

    store/[storename]/[product-slug]/alt

    Артефакти: research-{runId}.md плюс завантажені зображення research-{runId}-N.{ext} (SSRF-перевірка HTTP(S) fetch → RingBase → createFileNode). Увімкнення галереї storefront залишається у формі товару (Use in gallery) — див. Multi-Vendor Store. Pipeline: cabinet.genmedia.sibling_save у scripts/PIPELINES.md.

    Карта модулів

    ШляхРоль
    features/file-cabinet/service.tsserver-only CRUD, ACL (включно з обходом предків для успадкованих trustee), desktop, gallery
    features/file-cabinet/acl.tsowner | trustee (legacy editor → trustee)
    features/file-cabinet/constants.tsFILE_CABINET_DESKTOP_CHANNEL, FILE_CABINET_DOWNLOAD_PATH, MAX_FOLDER_DEPTH = 3
    features/file-cabinet/desktop-filename.tsДопоміжні засоби видимого імені файлу
    features/file-cabinet/media-urls.tsДопоміжні засоби same-origin URL завантаження (?variant=)
    features/file-cabinet/components/*Desktop, дерево, параметри, деталі (Image/Video chat), FsModal поширення/перейменування, skeleton, gallery, public img
    app/_actions/file-cabinet.tsServer Actions + рольові гейти + saveGeneratedMediaToDesktopAction
    features/store/lib/product-cabinet-media.tsStore research → writer store/…/alt (SSRF-safe)
    app/api/file-cabinet/download/route.tsПеревірка ACL → потік байтів (inline=1, необов’язковий variant= для thumb/webp)
    lib/storage/storage-config.tsgetCabinetStorageConfig() — 25MB + allowlist MIME
    components/file-tree/tree-helpers.tsСпільні помічники дерева (адаптери Admin Wiki)
    data/migrations/042_file_cabinet.sqlСхема (+ дзеркало в data/schema.sql)

    Модель ACL

    РольМожливості
    ownerПовний CRUD, встановлення trustee через ContactPicker (setCabinetTrusteesAction)
    trusteeПерегляд / список / завантаження; макет shared desktop; не може змінювати або завантажувати

    Права одразу записуються в file_cabinet_acl — потоку прийняття запрошення немає. Під час переліку ACL для рейки параметрів виконується обхід предків, тому поширення папки відображаються і на вкладених файлах.

    Схема (колекції JSONB)

    Таблиці (id + data JSONB): file_cabinet_nodes, file_cabinet_acl, file_cabinet_desktop, file_cabinet_gallery_items.

    Документ desktop зберігає позиції іконок і treeExpandedIds для дерева папок лише з розгортанням/згортанням. Кеш макета для кожної папки зберігає позиції після перетягування під час переходу вкладеними папками.

    параметри id для createDoc

    Передавайте id документа як createDoc(collection, data, { id }). Якщо покласти id лише всередину data, PostgreSQLAdapter може розійтися з data.id, згенерувавши інший generateId().

    Завантаження у сховище (перевірено)

    Завантаження в кабінет використовують file().upload(...) з access: 'private', derivativesProfile: 'gallery' для зображень і перевірками MIME/розміру з getCabinetStorageConfig() (зображення, PDF, Office, text/csv/md, zip, а також video/mp4 / video/webm).

    Публічні елементи галереї зберігають CDN URL із завантаження (storageUrl). У поточному шляху RingBaseAdapter немає підписаних URL HMAC/TTL — доставка має вигляд {RINGBASE_PUBLIC_URL}/files/{fileId} (+ похідні _v_*). Приватні завантаження використовують ACL-проксі (/api/file-cabinet/download) із Content-Disposition з node.name / desktop meta.filename. У прямому CDN /files/{uuid} досі немає Content-Disposition — див. backlog.

    Desktop tunnel

    saveDesktop публікує дані в персональний tunnel учасника:

    Клієнт слухає через useTunnelChannel у file-cabinet-desktop.tsx.

    Кроки підключення

    1. 1

      Застосуйте міграцію

      Переконайтеся, що 042_file_cabinet.sql (і паритет schema.sql) застосовано до БД клону. Нові інсталяції отримують таблиці з data/schema.sql.

    2. 2

      Підтвердьте env сховища

      Зверніться до RingFileBase: NEXT_PUBLIC_STORAGE_PROVIDER=ring_filebase, RINGBASE_API_URL, RINGBASE_PUBLIC_URL, RINGBASE_API_TOKEN.

    3. 3

      Викликайте через Server Actions

      Віддавайте перевагу app/_actions/file-cabinet.ts із клієнтського UI — не обходьте ACL-помічники в service.ts. Власний список/завантаження потребує member; shared desktop потребує subscriber+; getDesktop / saveDesktop для scope: 'own' також потребують привілеїв member.

    4. 4

      Сторінка public img

      app/[locale]/[username]/img/page.tsx завантажує listPublicGalleryByOwner(ownerId) і рендерить PublicProfileImgGallery. Відображаються лише елементи з visibility=public.

    Маршрути (константи)

    КонстантаШлях
    ROUTES.FILE_CABINET/file-cabinet (канонічний власний менеджер)
    ROUTES.PROFILE_CABINET/file-cabinet (застарілий псевдонім; /profile/cabinet перенаправляє)
    ROUTES.PROFILE_SHARED/profile/shared
    ROUTES.PROFILE_GALLERY/profile/gallery
    ROUTES.PUBLIC_PROFILE_IMG(username)/{username}/img
    ROUTES.PUBLIC_PROFILE_PLAYER(username)/{username}/player

    Керування приватним mood-player залишається на /profile/songs (ROUTES.PROFILE_SONGS). Peer /games — споріднена поверхня public profile, а не сховище File Cabinet.

    SubscriptionConductor

    Той самий процес: member gate для /file-cabinet проти shared desktop для subscriber+.

    Tunnel Protocol

    Поглиблення: синхронізація іконок desktop використовує publishToUserTunnel на каналі file-cabinet:desktop-icons.

    Admin Wiki

    Див. також: спільні помічники FileTree і патерн колекції JSONB id+data.

    Multi-Vendor Store

    Той самий процес: Research Agent Knowledge записує markdown + зображення в store/product/alt.

    Generative Gallery

    Залежність: cabinet Image/Video chat повторно використовує GenerativeMediaEditorFsModal зі scope cabinet.

    1. Документація
    2. /Функції
    3. /Ring File Cabinet

    Оновлено 6 вер. 2026 р.8 хв прослуховування

    1. Документація
    2. /Функції
    3. /Ring File Cabinet

    Оновлено 6 вер. 2026 р.8 хв прослуховування

    1. Документація
    2. /Функції
    3. /Ring File Cabinet

    Оновлено 6 вер. 2026 р.8 хв прослуховування