He estado viendo emojis que fallan en un sitio público que opero; el ACL está configurado como privado y está marcado como seguro con la razón access control post dictates security | source: post creator.
Ejecutar la tarea uploads:secure_upload_analyse_and_update soluciona el problema, pero luego vuelve a ocurrir unos días después. Esto también sucedió una vez con el logo del sitio, pero nunca volvió a ocurrir.
Hola @Wolftallemo , este es un problema un tanto complicado cuando los emojis personalizados (o cualquier carga accesible públicamente que pueda usarse en una publicación) y las cargas seguras se combinan. Hace un tiempo empezamos a usar una tabla UploadReference para ver qué está vinculado a qué carga, sin embargo, cuando migramos a esta tabla, establecimos todas las fechas y horas de created_at de la misma manera. La consecuencia de esto es que, cuando verificamos si el primer uso de una carga es público o no por motivos de seguridad, a veces el orden es incorrecto y usamos lo incorrecto, ya que si ambas cosas tienen exactamente el mismo created_at, entonces PostgreSQL simplemente hace lo suyo:
Tu mención de esto me hizo reexaminar esto una vez más, y creo que podemos manejar esto mejor ordenando por created_at ASCluego por id ASC, de modo que si hay alguno de estos conflictos, se use el registro real que fue primero.
Si los problemas persisten después de que esto se fusione (intentaré que se fusione hoy) y hayas cargado tu sitio, entonces podremos discutir más opciones, pero sospecho que este es el problema para ti. Puedes confirmarlo haciendo esto y comparando los resultados en tu sitio:
CustomEmoji.find_by(name: "success").upload.upload_references.order("created_at ASC")
CustomEmoji.find_by(name: "success").upload.upload_references.order("created_at ASC, id ASC")
El primero debería tener un Post como target_type, el segundo debería tener CustomEmoji como tipo de destino.
Interesante, entonces está devolviendo lo correcto. Para la carga enlazada, ¿puedes publicar los valores de security_last_changed_reason y security_last_changed_at y ver si access_control_post_id está relleno? No debería estar marcando esa carga como segura cuando la primera referencia es el emoji personalizado. Prueba esto también:
Upload.find(ID)
.upload_references
.joins(<<~SQL)
LEFT JOIN posts ON upload_references.target_type = 'Post' AND upload_references.target_id = posts.id
SQL
.where("posts.deleted_at IS NULL")
.order("upload_references.created_at ASC, upload_references.id ASC")
.first
Interesante, ¿y se usó el emoji personalizado en esa publicación? ¿Qué se devuelve cuando ejecutas el código de referencia de carga anterior con ese ID de carga? Ejecutar esto con el registro de carga y publicar el resultado también sería útil:
Si la publicación tiene referencias pero no parece tener ninguna carga en la interfaz de usuario, ¿entonces tal vez ha habido un problema de migración?
upload
.upload_references
.joins(<<~SQL)
LEFT JOIN posts ON upload_references.target_type = 'Post' AND upload_references.target_id = posts.id
SQL
.where("posts.deleted_at IS NULL")
.order("upload_references.created_at ASC, upload_references.id ASC")
.first
Si realmente necesitamos hacerlo, podrías simplemente establecer la fecha y hora de creación del registro UploadReference de CustomEmoji a una fecha anterior a cualquiera de los otros registros UploadReference para esa carga, pero no deberías tener que hacerlo.
Debería haberlo aclarado. El ID de carga era correcto, el ID de la publicación no lo era (que es como terminé con la publicación sin el emoji; el que pegué aquí era correcto, pero lo escribí mal al intentar encontrarlo).
Todos los demás comandos siguen devolviendo lo mismo.
Y debería resolverse… Realmente creo que esto será principalmente un problema con cargas más antiguas desde esta migración. Otra cosa que podrías hacer es eliminar el emoji personalizado, volver a cargarlo y luego ejecutar: