TopicFile Sync with ActiveStorage
Nadie ha tomado este issue todavía.
Evaluación
- Dificultad
- 5/5
- Tiempo estimado
- Más de una semana
- Aptitud para principiantes
- 35/100
Línea de trabajo
Empieza por localizar TopicFileSync y el modelo TopicFile; después, inspecciona la configuración de ActiveStorage y las migraciones de base de datos existentes. Define el modelo SyncProgress y la migración a partir de los campos indicados en el issue, vincula las actualizaciones de progreso con cada descarga de archivo y verifica que una sincronización interrumpida pueda reanudarse mientras se registran los archivos completados y fallidos.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
Sync files and attach using ActiveStorage
class TopicFileSync
def sync(file_data, topic)
topic_file = TopicFile.find_or_initialize_by(external_id: file_data["id"])
# Skip if checksum unchanged (file hasn't changed on server)
return topic_file if topic_file.external_checksum == file_data["checksum"]
# Download and verify
downloaded_path = downloader.download(file_data["id"], expected_checksum: file_data["checksum"])
verifier.verify!(downloaded_path, file_data["checksum"])
# Attach via ActiveStorage
File.open(downloaded_path, "rb") do |io|
topic_file.file.attach(
io: io,
filename: file_data["filename"],
content_type: file_data["content_type"]
)
end
topic_file.update!(
topic: topic,
filename: file_data["filename"],
file_type: extract_file_type(file_data["content_type"]),
file_size: file_data["size_bytes"],
external_checksum: file_data["checksum"]
)
topic_file
ensure
FileUtils.rm_f(downloaded_path) if downloaded_path
end
end
Track and persist download progress for resume
- Create SyncProgress model:
create_table :sync_progress do |t|
t.string :manifest_version
t.string :status # pending, downloading, completed, failed
t.integer :total_files
t.integer :completed_files
t.integer :total_bytes
t.integer :downloaded_bytes
t.json :pending_file_ids # files remaining to download
t.json :failed_file_ids # files that failed
t.timestamps
end
- Update progress after each file download
- Use for resume after interruption/restart
- Lenguaje dominante
- HTML
- Estrellas
- 4
- Forks
- 0
- Métricas de merge de PR
- Sin PR fusionados en 30 d
Preparar el entorno
- Incluye un Dockerfile o un archivo de Docker Compose
- Tiene una plantilla de pull request
- Leer la guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Más de rubyforgood/skillrx-beacon
-
cross-app sync
Dificultad 3/5 1-2 días Aptitud para principiantes 35/100
-
Error handlingAbiertocross-app sync
Dificultad 4/5 3-5 días Aptitud para principiantes 35/100
-
cross-app sync
Dificultad 5/5 Más de una semana Aptitud para principiantes 30/100
-
Sync OrchestratorAbiertocross-app sync
Dificultad 5/5 Más de una semana Aptitud para principiantes 25/100
-
Orphan Cleanup ServiceAbiertocross-app sync
Dificultad 3/5 1-2 días Aptitud para principiantes 45/100
Todos los issues de rubyforgood/skillrx-beacon
Issues similares
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 68/100
Los mantenedores suelen responder en 1 día
-
`contacts.create` posts to `/audiences/undefined/contacts` when `audienceId` is undefinedPosiblemente ocupada @RaphaelFakhri la tomó hoy. Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 70/100
resend/resend-node#1176 ·
Los mantenedores suelen responder en 1 día
-
EntitlementInfo.originalPurchaseDate returns the latest purchase date for subscriptionsPosiblemente ocupada @RaphaelFakhri la tomó hoy. Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 82/100
RevenueCat/purchases-js#1295 ·
Los mantenedores suelen responder en 1 día
-
2022 2023 AR
Dificultad 2/5 1-3 horas Aptitud para principiantes 70/100
PolicyEngine/policyengine-taxsim#1506 ·
Los mantenedores suelen responder en 1 día
-
Dificultad 1/5 Menos de una hora Aptitud para principiantes 85/100
DiamondLightSource/fastcs#443 ·