149 lines
12 KiB
Markdown
149 lines
12 KiB
Markdown
## О проекте
|
||
|
||
Tanabata File Manager или сокращенно TFM — многопользовательский веб-файловый менеджер, организующий файлы по тегам. Работает на клиент-серверной архитектуре, управляется через веб-интерфейс. Главная цель проекта — обеспечить централизованное хранение файлов на сервере, доступ к ним и управление ими через веб как с компьютера, так и со смартфона. В первую очередь данное приложение ориентировано на изображения и видео.
|
||
|
||
## Общая архитектура
|
||
|
||
- File storage
|
||
- Relational database (PostgreSQL)
|
||
- REST API service (Go)
|
||
- Frontend (SvelteKit)
|
||
|
||
Приложение предполагается разворачивать внутри контейнера Docker. Фронтенд и бэкенд - в одном контейнере, СУБД - отдельно (на моем сервере планируется подключать к СУБД на хосте). Все файлы, управляемые Танабатой, будут храниться кучей в одной папке. Имя файла на диске совпадает с его UUID в БД.
|
||
|
||
Приложение является PWA, которое можно установить на компьютер или смартфон.
|
||
|
||
В будущих версиях планируется введение поддержки других СУБД.
|
||
|
||
## Основные понятия
|
||
|
||
**Файл** — один файл на сервере. Может иметь сколько угодно тегов, может принадлежать скольким угодно пулам. Имеет автора, а также может иметь настройки доступа (пользователь (может быть null - таким образом можно делать файл публичным), флаг права на чтение, флаг права на изменение). Имеет оригинальное название и метаданные (ключ-значение, в том числе все данные EXIF).
|
||
|
||
**Тег** — метка файла. Может быть привязан к скольким угодно файлам, может быть привязан к одной категории. Имеет название, описание, метаданные (ключ-значение). Может иметь автотеги.
|
||
|
||
**Автотег** — правило, согласно которому при привязке к файлу условного тега А к этому же файлу автоматически привязывается условный тег Б.
|
||
|
||
**Категория** — сущность, логически объединяющая собой несколько тегов. Имеет название, описание, метаданные (ключ-значение).
|
||
|
||
**Пул** — логическое объединение файлов. Имеет название, описание, метаданные (ключ-значение). Файлы внутри могут быть как отсортированы автоматически, так и расположены в порядке, заданном пользователем вручную.
|
||
|
||
## Функциональные требования
|
||
|
||
1. Управление файлами
|
||
1. Просмотр списка файлов (lazy load, pagination)
|
||
2. Фильтрация файлов по тегам и метаданным
|
||
3. Просмотр и редактирование настроек сортировки (сохраняется для каждого пользователя)
|
||
4. Выделение нескольких файлов (Ctrl, Shift) и действия с ними
|
||
1. Привязка/отвязка тегов
|
||
2. Копирование/вставка тегов
|
||
3. Добавление в пул
|
||
4. Просмотр и редактирование настроек доступа
|
||
5. Удаление (с запросом подтверждения)
|
||
5. Просмотр одного файла
|
||
6. Действия с одним файлом
|
||
1. Привязка/отвязка тегов
|
||
2. Копирование/вставка тегов
|
||
3. Добавление в пул
|
||
4. Просмотр и редактирование настроек доступа
|
||
5. Замена файла (загрузка нового под таким же ID)
|
||
6. Удаление (с запросом подтверждения)
|
||
7. Листание файлов, как в галерее
|
||
8. Загрузка новых файлов через веб-интерфейс (через форму или drag-n-drop прямо на список)
|
||
9. Импорт новых файлов из папки на сервере
|
||
10. Выявление дубликатов, в частности, изображений и видео
|
||
1. Отображение групп дубликатов
|
||
2. Возможность отвязывания фальшивых дубликатов (чтобы приложение запомнило, что изображение А не является дубликатом изображения Б)
|
||
3. Возможность выбора дубликата для удаления/сохранения
|
||
4. Возможность выбора, какие поля от какого дубликата подтягивать
|
||
11. Корзина
|
||
1. Просмотр файлов в корзине
|
||
2. Восстановление из корзины
|
||
3. Окончательное удаление
|
||
2. Управление тегами
|
||
1. Просмотр списка тегов (lazy load, pagination)
|
||
2. Поиск по названию
|
||
3. Просмотр и редактирование настроек сортировки (сохраняется для каждого пользователя)
|
||
4. Выделение нескольких тегов (Ctrl, Shift) и действия с ними
|
||
1. Назначение автотегов
|
||
2. Изменение категории
|
||
3. Удаление (с запросом подтверждения)
|
||
5. Просмотр одного тега
|
||
6. Действия с одним тегом
|
||
1. Редактирование названия, описания и метаданных (ключ-значение)
|
||
2. Изменение категории
|
||
3. Назначение автотегов
|
||
4. Удаление (с запросом подтверждения)
|
||
7. Создание тега
|
||
1. Внесение названия, описания и метаданных (ключ-значение)
|
||
2. Назначение категории (опционально)
|
||
3. Назначение автотегов
|
||
3. Управление категориями
|
||
1. Просмотр списка категорий (lazy load, pagination)
|
||
2. Поиск по названию
|
||
3. Просмотр и редактирование настроек сортировки (сохраняется для каждого пользователя)
|
||
4. Выделение нескольких категорий (Ctrl, Shift) и действия с ними
|
||
1. Просмотр привязанных общих тегов и тегов, привязанных к некоторым, но не ко всем
|
||
2. Привязка/отвязка тегов
|
||
3. Удаление (с запросом подтверждения)
|
||
5. Просмотр одной категории
|
||
6. Действия с одной категорией
|
||
1. Редактирование названия, описания и метаданных (ключ-значение)
|
||
2. Просмотр привязанных тегов
|
||
3. Привязка/отвязка тегов
|
||
4. Удаление (с запросом подтверждения)
|
||
7. Создание категории
|
||
1. Внесение названия, описания и метаданных (ключ-значение)
|
||
2. Привязка тегов
|
||
4. Управление пулами
|
||
1. Просмотр списка пулов (lazy load, pagination)
|
||
2. Поиск по названию
|
||
3. Просмотр и редактирование настроек сортировки (сохраняется для каждого пользователя)
|
||
4. Выделение нескольких пулов (Ctrl, Shift) и действия с ними
|
||
1. Просмотр и редактирование настроек доступа
|
||
2. Удаление (с запросом подтверждения)
|
||
5. Просмотр одного пула
|
||
6. Действия с одним пулом
|
||
1. Редактирование названия, описания и метаданных (ключ-значение)
|
||
2. Просмотр и редактирование настроек доступа
|
||
3. Просмотр всех файлов, входящих в пул
|
||
4. Фильтрация файлов по тегам
|
||
5. Изменение настройки сортировки файлов (в том числе можно отключить автоматическую сортировку)
|
||
6. Ручное изменение порядка файлов (при отключенной сортировке)
|
||
7. Удаление (с запросом подтверждения)
|
||
7. Создание категории
|
||
1. Внесение названия, описания и метаданных (ключ-значение)
|
||
2. Привязка тегов
|
||
5. Управление пользовательскими настройками
|
||
1. Имя пользователя
|
||
2. Пароль
|
||
3. Сессии
|
||
1. Завершение сессии
|
||
4. Путь к папке на сервере, которая будет сканироваться при импорта файлов
|
||
6. Управление настройками сервера (админка)
|
||
1. Пользователи
|
||
1. Просмотр списка
|
||
2. Просмотр одного
|
||
3. Создание
|
||
4. Удаление
|
||
5. Блокировка/разблокировка
|
||
6. Установка роли (читатель/редактор)
|
||
7. Журналирование пользовательских действий в БД
|
||
1. Просмотры файлов
|
||
2. Смены настроек доступа к файлам
|
||
3. Создание/редактирование/удаление файла, тега, категории, пула, связи файл-тег
|
||
4. Создание/блокировка/разблокировка/удаление пользователя
|
||
5. Смена роли пользователя
|
||
6. Авторизация/логаут пользователя
|
||
7. Завершение сессии
|
||
|
||
## Нефункциональные требования
|
||
|
||
1. Интерфейс должен быть максимально простым и удобным, все необходимое должно быть под рукой, доступным за минимальное количество действий
|
||
2. Интерфейс должен быть адаптирован под десктоп и под мобильные устройства
|
||
3. Интерфейс должен иметь темную и светлую темы
|
||
4. Использование технологии PWA (также должна быть кнопка, при нажатии которой PWA будет полностью сбрасываться (кроме кэша) и заново загружаться с сервера)
|
||
5. Возможность сохранять некоторые файлы в кэш и просматривать их оффлайн при использовании установленного PWA
|
||
6. При первичном запуске приложение должно требовать минимума действий: автоматическая миграция БД, заранее готовый файл docker compose, файл .env с настраиваемыми параметрами установки
|
||
7. Использование подхода DDD для сервера API
|
||
8. Не принимать файлы, чей MIME отсутствует в БД (нет в БД — нет поддержки)
|