Существуют ситуации, когда пользователям нужно сохранять загрузки в Discourse, которые не строго связаны с существующими моделями и свойствами Discourse, поддерживающими загрузки, то есть «белые списки» сиротских загрузок.
Например, некоторые люди хотят использовать плагин Custom Wizard для загрузки контента, связанного с темой (но не с конкретным сообщением).
Проблема заключается в том, что задача clean_up_uploads удаляет все сиротские загрузки. Исключения ограничены URL-адресами в конкретных настройках сайта.
Конечно, можно отключить clean_up_uploads или увеличить clean_orphan_uploads_grace_period_hours, что иногда приходится делать мне. Но это не идеальный вариант.
Возможно, существует другой способ «белого списка» сиротских загрузок из плагина, который я не вижу, но если нет, было бы здорово добавить какой-то механизм для этого в процесс очистки загрузок.
Я был бы рад подготовить PR в этом направлении, но мне интересно, считают ли другие это проблемой.
Для reviewables @eviltrout внедрил общий механизм, позволяющий связывать произвольные объекты с reviewable.
Переход к аналогичной системе для загрузок был бы равносилен перемещению целых гор. Тем не менее, это была бы полезная задача, поскольку текущая система довольно хрупкая.
Самый простой обходной путь на данный момент — создать скрытую настройку сайта с типом данных :upload, а затем добавить её в таблицу настроек сайта.
Да, я об этом тоже думал. Мне не очень нравится это решение, так как мне пришлось бы создавать отдельную настройку для каждой загрузки, что кажется злоупотреблением таблицей site_settings.
Как временное решение, прежде чем мы решим эту проблему, не возражаете ли вы, если я создам PR, чтобы добавить ещё одно исключение в большой запрос «исключений», который использует plugin_store_row с plugin_name вроде whitelisted_orphan_upload_id?
Этот запрос уже ОЧЕНЬ медленный, и я переживаю, что ещё одно соединение здесь сделает его крайне болезненным.
Не уверен, но, возможно, стоит начать с подготовки новой таблицы в ядре для UploadReference(object_id, object_type, upload_id) и соединения с ней — по крайней мере, это недорого, а затем мы сможем перенести туда данные. Есть довольно много простых переносов, только загрузки постов будут сложнее…
Думаю, эту работу я бы предпочёл доверить команде здесь, она очень кропотливая.
Вы имеете в виду наследование по единой таблице (single table inheritance) в Rails? single table inheritance? Это отличное решение для reviewables, так как у них есть общая базовая логика, но также и дополнительные поля.
В данном же случае, похоже, проблема в том, что мы раскидываем идентификаторы загрузок (upload ids) повсюду и не удаляем загрузки, когда они удаляются?
Небезопасно ли удалять загрузку, если пользователь удалил её из своего профиля, потому что тот же самый sha1 загрузки может использоваться в другом месте приложения? Если это так, то предложение @sam о создании таблицы UploadReference кажется хорошим решением.
Если загрузки никогда не используются совместно таким образом, то, на мой взгляд, лучшим решением будет удалять их, когда соответствующие поля устанавливаются в NULL.
На самом деле я считаю, что это отличная задача, чтобы больше узнать о внутреннем устройстве Discourse. Это может быть хорошим заданием для @cvx, начиная с начала октября. Мы займёмся парным программированием, чтобы начать работу и правильно разбить её на несколько «маленьких» задач.
Меня очень интересует таблица UploadReference. У нас сложилась ситуация, когда в плагинах накопилось много загрузок, которые считаются «сиротами». Наше решение пока заключается в том, чтобы просто отключить clean_up_uploads. На днях я проверил, и у нас уже 10 ГБ таких загрузок, которые нужно удалить вручную с помощью скрипта, который также должен определить, ссылаются ли на них наши плагины. Решение, подобное обсуждаемому здесь, очень бы нам помогло.
Кстати, по поводу темы. В некоторых случаях мы ссылаемся на загрузки исключительно с помощью тегов HTML img. Это, похоже, нарушает процесс «выпечки» этих постов, и другие элементы, такие как гиперссылки, не «готовятся». Я заметил, что на загрузки обычно ссылаются в формате upload://.png. Мой вопрос: где можно найти строку ? Насколько я вижу, она не хранится в самой загрузке.