@@ -55,6 +55,7 @@ use common::{
5555 errors:: { BuckError , MegaError } ,
5656 utils:: MEGA_BRANCH_NAME ,
5757} ;
58+ use futures:: { StreamExt , stream} ;
5859use git_internal:: {
5960 DiffItem ,
6061 diff:: Diff as GitDiff ,
@@ -69,6 +70,7 @@ use git_internal::{
6970 } ,
7071 } ,
7172} ;
73+ use io_orbit:: object_storage:: { ObjectKey , ObjectMeta , ObjectNamespace } ;
7274use jupiter:: {
7375 service:: buck_service:: {
7476 CommitArtifacts , CompletePayload as SvcCompletePayload ,
@@ -130,6 +132,8 @@ impl From<&ImportRepo> for MonoApiService {
130132 }
131133 }
132134}
135+ // Key for storing the current CLA content in the object storage
136+ const CLA_CONTENT_OBJECT_KEY : & str = "cla/content/current.txt" ;
133137
134138pub struct TreeUpdateResult {
135139 pub updated_trees : Vec < Tree > ,
@@ -1300,6 +1304,60 @@ impl MonoApiService {
13001304 Ok ( ( model. cla_signed , model. cla_signed_at ) )
13011305 }
13021306
1307+ pub async fn get_cla_content ( & self ) -> Result < String , MegaError > {
1308+ let key = ObjectKey {
1309+ namespace : ObjectNamespace :: Log ,
1310+ key : CLA_CONTENT_OBJECT_KEY . to_string ( ) ,
1311+ } ;
1312+
1313+ let stream = self
1314+ . storage
1315+ . git_service
1316+ . obj_storage
1317+ . inner
1318+ . get_stream ( & key)
1319+ . await ;
1320+ let ( mut stream, _meta) = match stream {
1321+ Ok ( result) => result,
1322+ Err ( MegaError :: ObjStorageNotFound ( _) ) => return Ok ( String :: new ( ) ) ,
1323+ Err ( e) => return Err ( e) ,
1324+ } ;
1325+
1326+ let mut data = Vec :: new ( ) ;
1327+ while let Some ( chunk) = stream. next ( ) . await {
1328+ let chunk = chunk?;
1329+ data. extend_from_slice ( & chunk) ;
1330+ }
1331+
1332+ String :: from_utf8 ( data) . map_err ( |e| {
1333+ MegaError :: Other ( format ! (
1334+ "Invalid UTF-8 in CLA content from object storage: {e}"
1335+ ) )
1336+ } )
1337+ }
1338+
1339+ pub async fn update_cla_content ( & self , content : & str ) -> Result < ( ) , MegaError > {
1340+ let key = ObjectKey {
1341+ namespace : ObjectNamespace :: Log ,
1342+ key : CLA_CONTENT_OBJECT_KEY . to_string ( ) ,
1343+ } ;
1344+
1345+ let bytes = Bytes :: from ( content. as_bytes ( ) . to_vec ( ) ) ;
1346+ let stream = stream:: once ( async move { Ok :: < Bytes , std:: io:: Error > ( bytes) } ) ;
1347+ let meta = ObjectMeta {
1348+ size : content. len ( ) as i64 ,
1349+ content_type : Some ( "text/plain; charset=utf-8" . to_string ( ) ) ,
1350+ ..Default :: default ( )
1351+ } ;
1352+
1353+ self . storage
1354+ . git_service
1355+ . obj_storage
1356+ . inner
1357+ . put_stream ( & key, Box :: pin ( stream) , meta)
1358+ . await
1359+ }
1360+
13031361 pub async fn change_cla_sign_status (
13041362 & self ,
13051363 username : & str ,
0 commit comments