in src/zgoog_cl_content_repo_gcs.clas.abap [0:0]
METHOD process_mcreate_post.
DATA: lo_contrep TYPE REF TO data,
lo_docprot TYPE REF TO data,
lo_docid TYPE REF TO data,
lo_gcs TYPE REF TO zgoog_cl_storage_cont_repo_v1,
lo_abap_sdk_excp TYPE REF TO /goog/cx_sdk,
lo_entity TYPE REF TO if_http_entity.
DATA: lv_docid TYPE string,
lv_pversion TYPE string ##NEEDED,
lv_seckey TYPE string,
lv_smand TYPE c LENGTH 1,
lv_signature TYPE c LENGTH 1,
lv_last_docid TYPE string,
lv_count TYPE i,
lv_subrc LIKE sy-subrc,
lv_error_descr TYPE string,
lv_mimetype TYPE string,
lv_compid TYPE string,
lv_data TYPE xstring,
lv_ret_code TYPE i,
lv_err_text TYPE string,
lv_code TYPE string,
lv_err_flag TYPE c LENGTH 1 VALUE '',
lv_msg TYPE string,
lv_len TYPE i,
lv_p_bucket TYPE string,
lv_object_name TYPE string.
DATA: ls_input_object TYPE /goog/cl_storage_v1=>ty_013,
ls_info TYPE scms_acinf,
ls_comp_data TYPE gtyp_s_comp_data,
ls_output_object TYPE /goog/cl_storage_v1=>ty_013,
ls_object_list TYPE /goog/cl_storage_v1=>ty_083,
ls_err_resp TYPE /goog/err_resp,
ls_managed_folders TYPE /goog/cl_storage_v1=>ty_082.
DATA: lt_infos TYPE STANDARD TABLE OF scms_acinf,
lt_comp_data TYPE STANDARD TABLE OF gtyp_s_comp_data,
lt_bin TYPE STANDARD TABLE OF sdokcntbin.
FIELD-SYMBOLS: <lv_contrep> TYPE c,
<lv_docprot> TYPE c,
<lv_docid> TYPE c,
<ls_comp_data> TYPE gtyp_s_comp_data,
<ls_info> TYPE scms_acinf.
get_parameter_c( EXPORTING iv_name = 'contRep'
iv_mandatory = 'S'
IMPORTING er_value = lo_contrep ).
lv_docid = get_parameter( iv_name = 'docId'
iv_mandatory = 'S' ).
lv_pversion = get_parameter( iv_name = 'pVersion'
iv_mandatory = 'X' ).
lv_seckey = get_parameter( iv_name = 'secKey' ).
get_parameter_c( EXPORTING iv_name = 'docProt'
iv_default = gv_docprot
iv_mandatory = 's'
IMPORTING er_value = lo_docprot ).
ASSIGN lo_contrep->* TO <lv_contrep>.
ASSIGN lo_docprot->* TO <lv_docprot>.
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 = 'c' ).
IF gs_error IS NOT INITIAL.
RETURN.
ENDIF.
CLEAR lv_last_docid.
lv_count = go_server->request->num_multiparts( ).
load_goog_repo_config( <lv_contrep> ).
IF gs_error IS NOT INITIAL.
RETURN.
ENDIF.
lv_subrc = 0.
lv_count = lv_count + 1.
DO lv_count TIMES.
IF sy-index < lv_count.
lo_entity = go_server->request->get_multipart( index = sy-index ).
lv_mimetype = lo_entity->get_header_field( name = 'Content-Type' ) ##NO_TEXT.
lv_compid = lo_entity->get_header_field( name = 'X-compId' ) ##NO_TEXT.
lv_docid = lo_entity->get_header_field( name = 'X-docId' ) ##NO_TEXT.
IF lv_compid IS INITIAL. " workarround
CONTINUE.
ENDIF.
lv_data = lo_entity->get_data( ).
ELSE.
CLEAR lv_docid.
ENDIF.
IF lt_infos IS INITIAL.
lv_last_docid = lv_docid.
ENDIF.
IF lv_docid <> lv_last_docid.
lv_len = strlen( lv_last_docid ).
IF lv_len = 0. lv_len = 1. ENDIF.
CREATE DATA lo_docid TYPE c LENGTH lv_len.
ASSIGN lo_docid->* TO <lv_docid>.
<lv_docid> = lv_last_docid.
lv_p_bucket = gs_repo_config-bucket.
TRY.
CREATE OBJECT lo_gcs
EXPORTING
iv_key_name = gs_repo_config-keyname.
lv_object_name = <lv_docid> && '/' && <lv_docid>.
GET REFERENCE OF lt_infos INTO ls_input_object-metadata.
lo_gcs->insert_objects( EXPORTING iv_q_ifgenerationmatch = '0'
iv_q_name = lv_object_name
iv_p_bucket = lv_p_bucket
is_input = ls_input_object
IMPORTING es_output = ls_output_object
ev_ret_code = lv_ret_code
ev_err_text = lv_err_text ).
IF lv_ret_code = 412.
sy-subrc = 0.
lv_subrc = 403.
lv_code = 403.
ELSEIF lo_gcs->is_success( lv_ret_code ) = abap_true.
lv_code = 201.
ELSE.
lv_err_flag = 'X'.
lv_msg = lv_err_text.
ENDIF.
IF lv_err_flag IS NOT INITIAL.
CONTINUE.
ENDIF.
LOOP AT lt_comp_data ASSIGNING <ls_comp_data>.
lv_object_name = <lv_docid> && '/' && <lv_docid> && '-' && <ls_comp_data>-comp_id.
READ TABLE lt_infos ASSIGNING <ls_info>
WITH KEY comp_id = <ls_comp_data>-comp_id. "#EC CI_STDSEQ
IF sy-subrc = 0.
GET REFERENCE OF <ls_info> INTO ls_input_object-metadata.
ENDIF.
lo_gcs->insert_objects( EXPORTING iv_q_ifgenerationmatch = '0'
iv_q_name = lv_object_name
iv_p_bucket = lv_p_bucket
is_input = ls_input_object
is_data = <ls_comp_data>-data
iv_content_type = <ls_comp_data>-mime_type
IMPORTING es_output = ls_output_object
ev_ret_code = lv_ret_code
ev_err_text = lv_err_text ).
IF lv_ret_code = 412.
sy-subrc = 0.
lv_subrc = 403.
lv_code = 403.
ELSEIF lo_gcs->is_success( lv_ret_code ) = abap_true.
lv_code = 201.
ELSE.
lv_err_flag = 'X'.
lv_msg = lv_err_text.
ENDIF.
ENDLOOP.
CATCH /goog/cx_sdk INTO lo_abap_sdk_excp.
lv_msg = lo_abap_sdk_excp->get_text( ).
lv_code = 400.
lv_err_flag = 'X'.
ENDTRY.
IF lv_err_flag = 'X'.
lv_code = sy-subrc.
lv_error_descr = lv_msg.
gs_error-status_code = 400.
sys_error_set( ).
ELSE.
CLEAR lv_error_descr.
ENDIF.
CONCATENATE 'errorDescription="' lv_error_descr '";'
INTO lv_error_descr.
CONCATENATE gv_body
'docId="' lv_last_docid
'";retCode="' lv_code '";'
lv_error_descr gv_nl
INTO gv_body.
CLEAR: lt_infos[],
lt_bin[],
lt_comp_data[],
lv_err_flag.
lv_last_docid = lv_docid.
ENDIF.
IF lv_compid IS INITIAL.
CONTINUE.
ENDIF.
DESCRIBE TABLE lt_bin LINES ls_info-first_line.
ls_info-first_line = ls_info-first_line + 1.
CALL FUNCTION 'SCMS_XSTRING_TO_BINARY'
EXPORTING
buffer = lv_data
append_to_table = 'X'
IMPORTING
output_length = ls_info-comp_size
TABLES
binary_tab = lt_bin.
ls_info-comp_id = lv_compid.
ls_info-mimetype = lv_mimetype.
ls_info-binary_flg = 'X'.
DESCRIBE TABLE lt_bin LINES ls_info-last_line.
APPEND ls_info TO lt_infos.
ls_comp_data-comp_id = lv_compid.
ls_comp_data-mime_type = lv_mimetype.
ls_comp_data-data = lv_data.
APPEND ls_comp_data TO lt_comp_data.
CLEAR ls_comp_data.
ENDDO.
IF lv_subrc = 403.
go_server->response->set_status( code = 250
reason = 'missing documents created' ) ##NO_TEXT.
ELSE.
go_server->response->set_status( code = 201
reason = 'created' ) ##NO_TEXT.
ENDIF.