All files / src/ui/pages/dlg zcl_abapgit_gui_page_cr_repo.clas.abap

28.37% Statements 61/215
50% Branches 1/2
50% Functions 1/2
28.37% Lines 61/215

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 2161x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x                                                                                                                                                                                                                                                                                                                      
CLASS zcl_abapgit_gui_page_cr_repo DEFINITION
  PUBLIC
  INHERITING FROM zcl_abapgit_gui_component
  FINAL
  CREATE PUBLIC.
 
  PUBLIC SECTION.
 
    INTERFACES zif_abapgit_gui_event_handler.
    INTERFACES zif_abapgit_gui_renderable.
 
    CLASS-METHODS create
      IMPORTING
        !iv_url        TYPE string
      RETURNING
        VALUE(ri_page) TYPE REF TO zif_abapgit_gui_renderable
      RAISING
        zcx_abapgit_exception.
 
    METHODS constructor
      IMPORTING
        !iv_url TYPE string
      RAISING
        zcx_abapgit_exception.
 
  PROTECTED SECTION.
 
  PRIVATE SECTION.
 
    DATA mo_form           TYPE REF TO zcl_abapgit_html_form.
    DATA mo_form_data      TYPE REF TO zcl_abapgit_string_map.
    DATA mo_validation_log TYPE REF TO zcl_abapgit_string_map.
    DATA mo_form_util      TYPE REF TO zcl_abapgit_html_form_utils.
    DATA mv_url TYPE string.
 
    CONSTANTS:
      BEGIN OF c_id,
        repo_type   TYPE string VALUE 'repo_type',
        user_or_org TYPE string VALUE 'user_or_org',
        name        TYPE string VALUE 'name',
        description TYPE string VALUE 'description',
        private     TYPE string VALUE 'private',
      END OF c_id.
 
    CONSTANTS:
      BEGIN OF c_event,
        create TYPE string VALUE 'create',
      END OF c_event.
 
    METHODS get_form_schema
      RETURNING
        VALUE(ro_form) TYPE REF TO zcl_abapgit_html_form.
 
    METHODS set_defaults
      RAISING
        zcx_abapgit_exception.
 
ENDCLASS.
 
 
 
CLASS zcl_abapgit_gui_page_cr_repo IMPLEMENTATION.


  METHOD constructor.

    super->constructor( ).

    CREATE OBJECT mo_validation_log.
    CREATE OBJECT mo_form_data.

    mo_form = get_form_schema( ).
    mo_form_util = zcl_abapgit_html_form_utils=>create( mo_form ).

    mv_url = iv_url.

    set_defaults( ).

  ENDMETHOD.


  METHOD create.

    DATA lo_component TYPE REF TO zcl_abapgit_gui_page_cr_repo.

    CREATE OBJECT lo_component
      EXPORTING
        iv_url = iv_url.

    ri_page = zcl_abapgit_gui_page_hoc=>create(
      iv_page_title         = 'Create GitHub Repository'
      ii_child_component    = lo_component ).

  ENDMETHOD.


  METHOD get_form_schema.

    ro_form = zcl_abapgit_html_form=>create( iv_form_id = 'create-github-repository' ).

    ro_form->radio(
      iv_name          = c_id-repo_type
      iv_default_value = abap_false
      iv_label         = 'Type of Repository'
    )->option(
      iv_label         = 'User'
      iv_value         = abap_false
    )->option(
      iv_label         = 'Organization'
      iv_value         = abap_true
    )->text(
      iv_label       = 'User or Organization'
      iv_name        = c_id-user_or_org
      iv_required    = abap_true
    )->text(
      iv_label       = 'Repository Name'
      iv_name        = c_id-name
      iv_required    = abap_true
    )->text(
      iv_label       = 'Description'
      iv_name        = c_id-description
    )->checkbox(
      iv_label       = 'Private'
      iv_name        = c_id-private
      iv_hint        = 'Set visibility to private (organization) or public'
    )->command(
      iv_label       = 'Create GitHub Repository'
      iv_cmd_type    = zif_abapgit_html_form=>c_cmd_type-input_main
      iv_action      = c_event-create
    )->command(
      iv_label       = 'Back'
      iv_action      = zif_abapgit_definitions=>c_action-go_back ).

  ENDMETHOD.


  METHOD set_defaults.

    DATA lv_rest TYPE string ##NEEDED.
    DATA lv_org TYPE string.
    DATA lv_name TYPE string.

    FIND ALL OCCURRENCES OF REGEX 'github\.com\/([^\/]+)\/([^\/]+)'
      IN mv_url
      SUBMATCHES lv_org lv_name ##REGEX_POSIX.
    IF sy-subrc = 0.
      mo_form_data->set(
        iv_key = c_id-user_or_org
        iv_val = lv_org ).

      mo_form_data->set(
        iv_key = c_id-name
        iv_val = lv_name ).
    ENDIF.

    mo_form_data->set(
      iv_key = c_id-private
      iv_val = abap_true ).

  ENDMETHOD.


  METHOD zif_abapgit_gui_event_handler~on_event.

    DATA lv_url TYPE string.
    DATA lv_msg TYPE string.

    mo_form_data = mo_form_util->normalize( ii_event->form_data( ) ).

    CASE ii_event->mv_action.
      WHEN c_event-create.
        mo_validation_log = mo_form_util->validate( mo_form_data ).

        IF mo_validation_log->is_empty( ) = abap_true.

          " So far, this is only implemented for GitHub
          " The following trigges a login which is required for the API call to work
          zcl_abapgit_http=>create_by_url( 'https://api.github.com/user/repos' ).

          lv_url = |https://github.com/{ mo_form_data->get( c_id-user_or_org ) }/{ mo_form_data->get( c_id-name ) }|.

          zcl_abapgit_pr_enumerator=>new( lv_url )->create_repository(
            iv_description = mo_form_data->get( c_id-description )
            iv_is_org      = |{ mo_form_data->get( c_id-repo_type ) }|
            iv_private     = |{ mo_form_data->get( c_id-private ) }| ).

          lv_msg = |GitHub repository { lv_url } created successfully|.

          MESSAGE lv_msg TYPE 'S'.

          rs_handled-state = zcl_abapgit_gui=>c_event_state-go_back.
        ELSE.
          rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
        ENDIF.
      WHEN OTHERS.
        " do nothing
    ENDCASE.

  ENDMETHOD.


  METHOD zif_abapgit_gui_renderable~render.

    register_handlers( ).

    ri_html = zcl_abapgit_html=>create( ).

    ri_html->add( '<div class="form-container">' ).
    ri_html->add( mo_form->render(
      io_values         = mo_form_data
      io_validation_log = mo_validation_log ) ).
    ri_html->add( '</div>' ).

  ENDMETHOD.
ENDCLASS.