Добавление стабильного способа включения «сиротских» загрузок в плагине

Существуют ситуации, когда пользователям нужно сохранять загрузки в 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) и соединения с ней — по крайней мере, это недорого, а затем мы сможем перенести туда данные. Есть довольно много простых переносов, только загрузки постов будут сложнее…

Думаю, эту работу я бы предпочёл доверить команде здесь, она очень кропотливая.

Любопытно узнать, что думают @zogstrip и @eviltrout

Вы имеете в виду наследование по единой таблице (single table inheritance) в Rails? single table inheritance? Это отличное решение для reviewables, так как у них есть общая базовая логика, но также и дополнительные поля.

В данном же случае, похоже, проблема в том, что мы раскидываем идентификаторы загрузок (upload ids) повсюду и не удаляем загрузки, когда они удаляются?

Небезопасно ли удалять загрузку, если пользователь удалил её из своего профиля, потому что тот же самый sha1 загрузки может использоваться в другом месте приложения? Если это так, то предложение @sam о создании таблицы UploadReference кажется хорошим решением.

Если загрузки никогда не используются совместно таким образом, то, на мой взгляд, лучшим решением будет удалять их, когда соответствующие поля устанавливаются в NULL.

Именно поэтому нам нужна таблица UploadReference :+1:

На самом деле я считаю, что это отличная задача, чтобы больше узнать о внутреннем устройстве Discourse. Это может быть хорошим заданием для @cvx, начиная с начала октября. Мы займёмся парным программированием, чтобы начать работу и правильно разбить её на несколько «маленьких» задач.

Здравствуйте!

Меня очень интересует таблица UploadReference. У нас сложилась ситуация, когда в плагинах накопилось много загрузок, которые считаются «сиротами». Наше решение пока заключается в том, чтобы просто отключить clean_up_uploads. На днях я проверил, и у нас уже 10 ГБ таких загрузок, которые нужно удалить вручную с помощью скрипта, который также должен определить, ссылаются ли на них наши плагины. Решение, подобное обсуждаемому здесь, очень бы нам помогло.

Дэвид

Кстати, по поводу темы. В некоторых случаях мы ссылаемся на загрузки исключительно с помощью тегов HTML img. Это, похоже, нарушает процесс «выпечки» этих постов, и другие элементы, такие как гиперссылки, не «готовятся». Я заметил, что на загрузки обычно ссылаются в формате upload://.png. Мой вопрос: где можно найти строку ? Насколько я вижу, она не хранится в самой загрузке.

Это называется short url, и вы можете увидеть, как она вычисляется, в модели Upload.

О, спасибо! Видимо, я недостаточно внимательно посмотрел :slight_smile:

@angus
Недавно мы объединили этот PR, который добавляет таблицу upload_references для решения проблем, поднятых в оригинальном посте.

Просто заметка: это было реализовано в плагине Custom Wizard. Спасибо за внедрение этой системы!