process_append

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' ).