Задача
Инженерная документация стареет иначе, чем маркетинговая. Документ о совместимости действителен для конкретной пары «железо — прошивка». Уведомление о снятии с производства должно оставаться доступным и после прекращения выпуска, потому что у клиента это оборудование ещё работает. Техподдержка показывает заказчику документ и отвечает за то, что он утверждён, а не найден в чьей-то папке.
Файловое хранилище на эти вопросы не отвечает. Оно не знает, последняя ли это версия, прошла ли она проверку, можно ли отдать её дистрибьютору и кто скачал её в прошлом квартале. Отсюда обычный набор последствий: у поддержки и у инженеров расходятся представления о том, какой документ актуален; обучающие материалы собираются копированием файлов и перестают обновляться; закрытый документ уходит наружу вместе со ссылкой.
Нужна была система, где структура библиотеки, метаданные, версии, согласование и права заданы одной моделью.
Решение
Структура библиотеки. Разделы построены под содержимое заказчика: Applications, Delivery Status, Development information, Products и Training Material. Development information внутри разложена по направлениям Hardware, Firmware, IDE и NC. Хлебные крошки показывают, к какому продукту и разделу относится документ, так что определять смысл по имени файла не нужно.
Один актив — несколько коллекций. Материал включается в разные подборки без копирования оригинала. Одно и то же описание релиза может лежать и в продуктовой ветке, и в обучающем наборе, оставаясь одним активом с одной историей версий: обновление в одном месте не оставляет за собой устаревшие дубликаты в других.
Карточка актива. Связывает оригинальный файл, предпросмотр, метаданные, версии, владельца, права, статус и историю действий. При загрузке заполняются название, описание, тип, продукт, категория и теги; формат и дата создания подтягиваются автоматически. Часто используемое добавляется в избранное, несколько файлов выбираются для группового скачивания или передачи.
Поиск. Глобальный поиск идёт по названию и индексируемым метаданным, результаты сужаются по типу контента — Photos, Documents, Videos — и по структуре библиотеки. Для технической базы важны поиск по части имени файла и по идентификатору продукта, приоритет точного совпадения и хлебные крошки до исходной папки. Права сохраняются в выдаче: закрытый файл не появляется в результатах и не открывается по прямому URL.
Предпросмотр как производное представление. Поддерживаемые документы открываются во встроенном просмотрщике без обязательного скачивания, оригинал при этом не меняется. Ошибка конвертации не уничтожает загрузку: файл получает понятный статус обработки, и её можно запустить повторно. Загружать документ заново не нужно.
Версии и утверждение. Обновление технического документа создаёт новую версию существующего актива: в истории остаются автор, время, комментарий, статус и связь с предыдущим вариантом. Жизненный цикл: Draft → In review → Changes requested или Approved → Published → Superseded или Archived. Утверждение относится к конкретной версии, поэтому новая загрузка не подменяет незаметно ранее утверждённый материал. Критичные документы вроде уведомлений о снятии с производства сохраняют опубликованную историю и связь с заменяющим продуктом или последующей версией.
Права. Задаются на раздел, папку, коллекцию или отдельный актив, и для каждого действия отдельно: просмотр, загрузка, изменение метаданных, создание версии. Свои права есть и на утверждение, скачивание, передачу и администрирование. Отдел продаж, дистрибьютор или партнёр видят разрешённое, инженер публикует в своё направление, проверяющий утверждает, администратор управляет справочниками и обработкой файлов.
Общий доступ и Delivery Status. Передача файла или набора фиксирует инициатора, получателей и выбранную версию. Права проверяются при каждом открытии ссылки, а не один раз при отправке. Delivery Status — отдельное операционное представление для материалов и пакетов, ожидающих публикации, передачи или другого следующего действия. Уведомления сообщают о новой версии, запросе на проверку, возврате на доработку, утверждении и публикации. Они же приходят при выдаче доступа, смене статуса в Delivery Status и ошибке фоновой обработки.
Асинхронная обработка. Symfony-приложение разделено на доменный слой DAMS, файловое хранилище, поисковый индекс, фоновые обработчики предпросмотра, маршруты согласований, уведомления и административный модуль. Крупные загрузки и конвертация выполняются в фоне, чтобы интерфейс не ждал обработку тяжёлого файла.
Аудит. Журнал входов, загрузок, скачиваний, изменений и решений позволяет восстановить, кто загрузил, изменил, утвердил, скачал или передал конкретную версию.
Результат
У технической документации появился один адрес. Поддержка, инженеры, обучение и партнёры смотрят на одну библиотеку и на одну и ту же утверждённую версию документа, а не на почтовые вложения разной свежести.
Публикация стала контролируемой: материал проходит проверку и утверждается по версии, а прежняя версия получает статус Superseded и остаётся в истории. Это важно для документов, которые нужны и после снятия продукта с производства.
Периметр держится и при распространении: доступ проверяется при каждом открытии, передача именная, всё скачанное и переданное видно в журнале.