process_update_post

in src/zgoog_cl_content_repo_gcs.clas.abap [0:0]


  METHOD process_update_post.

    DATA: lo_contrep       TYPE REF TO data,
          lo_docid         TYPE REF TO data,
          lo_abap_sdk_excp TYPE REF TO /goog/cx_sdk,
          lo_entity        TYPE REF TO if_http_entity,
          lo_gcs           TYPE REF TO zgoog_cl_storage_cont_repo_v1.

    DATA: lv_pversion    TYPE string ##NEEDED,
          lv_seckey      TYPE string,
          lv_smand       TYPE c LENGTH 1,
          lv_signature   TYPE c LENGTH 1,
          lv_count       TYPE i,
          lv_mimetype    TYPE string,
          lv_compid      TYPE string,
          lv_data        TYPE xstring,
          lv_p_bucket    TYPE string,
          lv_object_name TYPE string,
          lv_ret_code    TYPE i,
          lv_err_text    TYPE string,
          lv_msg         TYPE string.

    DATA: ls_info            TYPE scms_acinf,
          ls_input_object    TYPE /goog/cl_storage_v1=>ty_013,
          ls_output_object   TYPE /goog/cl_storage_v1=>ty_013,
          ls_comp_data       TYPE gtyp_s_comp_data,
          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_bin       TYPE STANDARD TABLE OF sdokcntbin,
          lt_comp_data TYPE STANDARD TABLE OF gtyp_s_comp_data,
          lt_infos     TYPE STANDARD TABLE OF scms_acinf.

    FIELD-SYMBOLS: <lv_contrep>   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 ).
    get_parameter_c( EXPORTING iv_name      = 'docId'
                               iv_mandatory = 'S'
                     IMPORTING er_value     = lo_docid ).

    lv_pversion = get_parameter( iv_name      = 'pVersion'
                                 iv_mandatory = 'X' ).
    lv_seckey   = get_parameter( iv_name = 'secKey' ).

    ASSIGN lo_contrep->* TO <lv_contrep>.
    ASSIGN lo_docid->*   TO <lv_docid>.

    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.

    load_goog_repo_config( <lv_contrep> ).
    IF gs_error IS NOT INITIAL.
      RETURN.
    ENDIF.

    lv_count = go_server->request->num_multiparts( ).
    DO lv_count TIMES.
      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.

      IF lv_compid IS INITIAL. " workarround
        CONTINUE.
      ENDIF.

      lv_data = lo_entity->get_data( ).

      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.

    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_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 lo_gcs->is_success( lv_ret_code ) <> abap_true.
          set_error( iv_code = lv_ret_code
                     iv_text = lv_err_text ).
          RETURN.
        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_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 lo_gcs->is_success( lv_ret_code ) <> abap_true.
            set_error( iv_code = lv_ret_code
                       iv_text = lv_err_text ).
            RETURN.
          ENDIF.

        ENDLOOP.
      CATCH /goog/cx_sdk INTO lo_abap_sdk_excp.
        lv_msg = lo_abap_sdk_excp->get_text( ).
        set_error( iv_code = 400
                   iv_text = lv_msg ).
        RETURN.
    ENDTRY.

    go_server->response->set_status( code   = 200
                                     reason = 'ok' ).