@@ -16,13 +16,14 @@ use axum::{
1616 Router ,
1717} ;
1818use futures:: StreamExt ;
19- use std:: path:: PathBuf ;
2019use std:: sync:: Arc ;
20+ use std:: { collections:: HashMap , path:: PathBuf } ;
2121use tempfile:: NamedTempFile ;
2222use tokio:: io:: AsyncWriteExt ;
2323use url:: Url ;
2424use warg_api:: v1:: package:: {
25- ContentSource , PackageError , PackageRecord , PackageRecordState , PublishRecordRequest ,
25+ ContentSource , MissingContent , PackageError , PackageRecord , PackageRecordState ,
26+ PublishRecordRequest , UploadEndpoint ,
2627} ;
2728use warg_crypto:: hash:: { AnyHash , Sha256 } ;
2829use warg_protocol:: {
@@ -91,6 +92,26 @@ impl Config {
9192 . unwrap ( )
9293 . to_string ( )
9394 }
95+
96+ fn build_missing_content < ' a > (
97+ & self ,
98+ log_id : & LogId ,
99+ record_id : & RecordId ,
100+ missing_digests : impl IntoIterator < Item = & ' a AnyHash > ,
101+ ) -> HashMap < AnyHash , MissingContent > {
102+ missing_digests
103+ . into_iter ( )
104+ . map ( |digest| {
105+ let url = format ! ( "v1/package/{log_id}/record/{record_id}/content/{digest}" ) ;
106+ (
107+ digest. clone ( ) ,
108+ MissingContent {
109+ upload : vec ! [ UploadEndpoint :: HttpPost { url } ] ,
110+ } ,
111+ )
112+ } )
113+ . collect ( )
114+ }
94115}
95116
96117struct PackageApiError ( PackageError ) ;
@@ -231,13 +252,12 @@ async fn publish_record(
231252 ) ) ;
232253 }
233254
255+ let missing_content = config. build_missing_content ( & log_id, & record_id, missing) ;
234256 Ok ( (
235257 StatusCode :: ACCEPTED ,
236258 Json ( PackageRecord {
237259 id : record_id,
238- state : PackageRecordState :: Sourcing {
239- missing_content : missing. into_iter ( ) . cloned ( ) . collect ( ) ,
240- } ,
260+ state : PackageRecordState :: Sourcing { missing_content } ,
241261 } ) ,
242262 ) )
243263}
@@ -254,12 +274,13 @@ async fn get_record(
254274 . await ?;
255275
256276 match record. status {
257- RecordStatus :: MissingContent ( missing) => Ok ( Json ( PackageRecord {
258- id : record_id,
259- state : PackageRecordState :: Sourcing {
260- missing_content : missing,
261- } ,
262- } ) ) ,
277+ RecordStatus :: MissingContent ( missing) => {
278+ let missing_content = config. build_missing_content ( & log_id, & record_id, & missing) ;
279+ Ok ( Json ( PackageRecord {
280+ id : record_id,
281+ state : PackageRecordState :: Sourcing { missing_content } ,
282+ } ) )
283+ }
263284 // Validated is considered still processing until included in a checkpoint
264285 RecordStatus :: Pending | RecordStatus :: Validated => Ok ( Json ( PackageRecord {
265286 id : record_id,
@@ -275,11 +296,11 @@ async fn get_record(
275296 . as_ref ( )
276297 . contents ( )
277298 . into_iter ( )
278- . map ( |d | {
299+ . map ( |digest | {
279300 (
280- d . clone ( ) ,
301+ digest . clone ( ) ,
281302 vec ! [ ContentSource :: Http {
282- url: config. content_url( d ) ,
303+ url: config. content_url( digest ) ,
283304 } ] ,
284305 )
285306 } )
@@ -363,7 +384,7 @@ async fn upload_content(
363384 {
364385 config
365386 . core_service
366- . submit_package_record ( log_id, record_id. clone ( ) )
387+ . submit_package_record ( log_id, record_id)
367388 . await ;
368389 }
369390
0 commit comments