TopicFile Sync with ActiveStorage
Nessuno ha ancora preso questa issue.
Valutazione
- Difficoltà
- 5/5
- Tempo stimato
- Più di una settimana
- Idoneità per principianti
- 35/100
Direzione di ricerca
Inizia individuando TopicFileSync e il modello TopicFile, quindi esamina la configurazione di ActiveStorage e le migrazioni del database esistenti. Definisci il modello SyncProgress e la migrazione a partire dai campi indicati nell’issue, collega gli aggiornamenti dell’avanzamento a ogni download di file e verifica che una sincronizzazione interrotta possa riprendere registrando i file completati e quelli non riusciti.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
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
- Lingua principale
- HTML
- Stelle
- 4
- Fork
- 0
- Metriche di merge delle PR
- Nessuna PR unita negli ultimi 30g
Preparare l'ambiente
- Include un Dockerfile o un file Docker Compose
- Ha un modello di pull request
- Leggi la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di rubyforgood/skillrx-beacon
-
cross-app sync
Difficoltà 3/5 1-2 giorni Idoneità per principianti 35/100
-
Error handlingApertacross-app sync
Difficoltà 4/5 3-5 giorni Idoneità per principianti 35/100
-
cross-app sync
Difficoltà 5/5 Più di una settimana Idoneità per principianti 30/100
-
Sync OrchestratorApertacross-app sync
Difficoltà 5/5 Più di una settimana Idoneità per principianti 25/100
-
Orphan Cleanup ServiceApertacross-app sync
Difficoltà 3/5 1-2 giorni Idoneità per principianti 45/100
Tutte le issue di rubyforgood/skillrx-beacon
Issue simili
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 68/100
I maintainer di solito rispondono entro 1 giorno
-
`contacts.create` posts to `/audiences/undefined/contacts` when `audienceId` is undefinedForse già presa @RaphaelFakhri l’ha presa oggi. Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 70/100
resend/resend-node#1176 ·
I maintainer di solito rispondono entro 1 giorno
-
EntitlementInfo.originalPurchaseDate returns the latest purchase date for subscriptionsForse già presa @RaphaelFakhri l’ha presa oggi. Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 82/100
RevenueCat/purchases-js#1295 ·
I maintainer di solito rispondono entro 1 giorno
-
2022 2023 AR
Difficoltà 2/5 1-3 ore Idoneità per principianti 70/100
PolicyEngine/policyengine-taxsim#1506 ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 85/100
DiamondLightSource/fastcs#443 ·