## О проекте

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 отсутствует в БД (нет в БД — нет поддержки)
