in src/zgoog_cl_content_repo_gcs.clas.abap [0:0]
METHOD process_append.
DATA: lo_contrep TYPE REF TO data,
lo_docid TYPE REF TO data,
lo_compid TYPE REF TO data,
lo_gcs TYPE REF TO zgoog_cl_storage_cont_repo_v1,
lo_entity TYPE REF TO if_http_entity,
lo_abap_sdk_excp TYPE REF TO /goog/cx_sdk.
DATA: lv_pversion TYPE string ##NEEDED,
lv_seckey TYPE string,
lv_smand TYPE c LENGTH 1,
lv_signature TYPE c LENGTH 1,
lv_data TYPE xstring,
lv_mimetype TYPE string,
lv_compsize TYPE i,
lt_bin TYPE STANDARD TABLE OF sdokcntbin,
lv_p_bucket TYPE string,
lv_object_name TYPE string,
lv_object_apnd_name TYPE string.
DATA: ls_input_object TYPE /goog/cl_storage_v1=>ty_013,
ls_output_object TYPE /goog/cl_storage_v1=>ty_013,
ls_source_obj TYPE /goog/cl_storage_v1=>ty_067,
ls_compose_inp TYPE /goog/cl_storage_v1=>ty_006.
DATA: lt_source_obj TYPE /goog/cl_storage_v1=>ty_t_067.
FIELD-SYMBOLS: <lv_contrep> TYPE c,
<lv_docid> TYPE c,
<lv_compid> TYPE c.
get_parameter_c( EXPORTING iv_name = 'contRep'
iv_mandatory = 'S'
IMPORTING er_value = lo_contrep ).
get_parameter_c( EXPORTING iv_name = 'docId'
iv_mandatory = 'S'
IMPORTING er_value = lo_docid ).
get_parameter_c( EXPORTING iv_name = 'compId'
iv_mandatory = 'S'
IMPORTING er_value = lo_compid ).
ASSIGN lo_contrep->* TO <lv_contrep>.
ASSIGN lo_docid->* TO <lv_docid>.
ASSIGN lo_compid->* TO <lv_compid>.
lv_pversion = get_parameter( iv_name = 'pVersion'
iv_mandatory = 'X' ).
lv_seckey = get_parameter( iv_name = 'secKey' ).
IF lv_seckey IS NOT INITIAL.
lv_smand = 'S'.
get_parameter( iv_name = 'accessMode'
iv_mandatory = lv_smand ).
get_parameter( iv_name = 'authId'
iv_mandatory = lv_smand ).
get_parameter( iv_name = 'expiration'
iv_mandatory = lv_smand ).
ENDIF.
check_parameter_consistence( ).
IF gs_error IS NOT INITIAL.
RETURN.
ENDIF.
lv_signature = check_signature( iv_docprot = 'u' ).
IF gs_error IS NOT INITIAL.
RETURN.
ENDIF.
lo_entity = go_server->request.
lv_data = lo_entity->get_data( ).
load_goog_repo_config( <lv_contrep> ).
IF gs_error IS NOT INITIAL.
RETURN.
ENDIF.
lv_mimetype = lo_entity->get_header_field( name = 'Content-Type' ) ##NO_TEXT.
lv_p_bucket = gs_repo_config-bucket.
TRY.
CREATE OBJECT lo_gcs
EXPORTING
iv_key_name = gs_repo_config-keyname.
FIELD-SYMBOLS <ls_comp_data> TYPE gtyp_s_comp_data.
lv_object_name = <lv_docid> && '/' && <lv_docid> && '-' && <lv_compid>.
lv_object_apnd_name = lv_object_name && 'append' ##NO_TEXT.
DATA: lv_ret_code TYPE i.
DATA: lv_err_text TYPE string.
lo_gcs->insert_objects( EXPORTING iv_q_name = lv_object_apnd_name
iv_p_bucket = lv_p_bucket
is_input = ls_input_object
is_data = lv_data
iv_content_type = lv_mimetype
IMPORTING es_output = ls_output_object
ev_ret_code = lv_ret_code
ev_err_text = lv_err_text ).
IF lo_gcs->is_success( lv_ret_code ) <> abap_true.
set_error( iv_code = lv_ret_code
iv_text = lv_err_text ).
RETURN.
ENDIF.
ls_source_obj-name = lv_object_name.
APPEND ls_source_obj TO lt_source_obj.
ls_source_obj-name = lv_object_apnd_name.
APPEND ls_source_obj TO lt_source_obj.
APPEND LINES OF lt_source_obj TO ls_compose_inp-source_objects.
lv_object_name = cl_http_utility=>escape_url( unescaped = lv_object_name ).
DATA: ls_op TYPE /goog/cl_storage_v1=>ty_013.
lo_gcs->compose_objects( EXPORTING iv_p_destination_bucket = lv_p_bucket
iv_p_destination_object = lv_object_name
is_input = ls_compose_inp
IMPORTING es_output = ls_op
ev_ret_code = lv_ret_code
ev_err_text = lv_err_text ).
IF lo_gcs->is_success( lv_ret_code ) <> abap_true.
set_error( iv_code = lv_ret_code
iv_text = lv_err_text ).
RETURN.
ENDIF.
lv_object_apnd_name = cl_http_utility=>escape_url( unescaped = lv_object_apnd_name ).
lo_gcs->delete_objects( EXPORTING iv_p_bucket = lv_p_bucket
iv_p_object = lv_object_apnd_name
IMPORTING ev_ret_code = lv_ret_code
ev_err_text = lv_err_text ).
CATCH /goog/cx_sdk INTO lo_abap_sdk_excp.
lv_err_text = lo_abap_sdk_excp->get_text( ).
set_error( iv_code = lv_ret_code
iv_text = lv_err_text ).
RETURN.
ENDTRY.
go_server->response->set_status( code = 200
reason = 'ok' ).