CLASS zcl_abapgit_persistence_user DEFINITION PUBLIC CREATE PRIVATE . PUBLIC SECTION. INTERFACES zif_abapgit_persist_user . CLASS-METHODS get_instance IMPORTING !iv_user TYPE sy-uname DEFAULT sy-uname RETURNING VALUE(ri_user) TYPE REF TO zif_abapgit_persist_user RAISING zcx_abapgit_exception . METHODS constructor IMPORTING !iv_user TYPE sy-uname DEFAULT sy-uname RAISING zcx_abapgit_exception . PROTECTED SECTION. PRIVATE SECTION. TYPES: BEGIN OF ty_repo_config, url TYPE zif_abapgit_persistence=>ty_repo-url, login TYPE string, git_user TYPE zif_abapgit_git_definitions=>ty_git_user, last_change_seen TYPE string, END OF ty_repo_config . TYPES: ty_repo_configs TYPE STANDARD TABLE OF ty_repo_config WITH DEFAULT KEY . TYPES: BEGIN OF ty_user, default_git_user TYPE zif_abapgit_git_definitions=>ty_git_user, repo_show TYPE zif_abapgit_persistence=>ty_repo-key, hide_files TYPE abap_bool, changes_only TYPE abap_bool, order_by TYPE string, order_descending TYPE abap_bool, diff_first TYPE abap_bool, diff_unified TYPE abap_bool, favorites TYPE zif_abapgit_persist_user=>ty_favorites, repo_config TYPE ty_repo_configs, settings TYPE zif_abapgit_definitions=>ty_s_user_settings, show_folders TYPE abap_bool, list_settings TYPE zif_abapgit_definitions=>ty_list_settings, END OF ty_user . DATA mv_user TYPE sy-uname . DATA ms_user TYPE ty_user. CLASS-DATA gi_current_user TYPE REF TO zif_abapgit_persist_user . METHODS from_xml IMPORTING !iv_xml TYPE string RETURNING VALUE(rs_user) TYPE ty_user RAISING zcx_abapgit_exception . METHODS read RAISING zcx_abapgit_exception . METHODS read_repo_config IMPORTING !iv_url TYPE zif_abapgit_persistence=>ty_repo-url RETURNING VALUE(rs_repo_config) TYPE ty_repo_config RAISING zcx_abapgit_exception . METHODS to_xml IMPORTING !is_user TYPE ty_user RETURNING VALUE(rv_xml) TYPE string . METHODS update RAISING zcx_abapgit_exception . METHODS update_repo_config IMPORTING !iv_url TYPE zif_abapgit_persistence=>ty_repo-url !is_repo_config TYPE ty_repo_config RAISING zcx_abapgit_exception . ENDCLASS. CLASS zcl_abapgit_persistence_user IMPLEMENTATION. METHOD constructor. mv_user = iv_user. read( ). ENDMETHOD. METHOD from_xml. DATA: lv_xml TYPE string. lv_xml = iv_xml. * fix downward compatibility REPLACE ALL OCCURRENCES OF '<_--28C_TYPE_USER_--29>' IN lv_xml WITH ''. REPLACE ALL OCCURRENCES OF '' IN lv_xml WITH ''. CALL TRANSFORMATION id OPTIONS value_handling = 'accept_data_loss' SOURCE XML lv_xml RESULT user = rs_user. ENDMETHOD. METHOD get_instance. IF iv_user = sy-uname ##USER_OK. IF gi_current_user IS NOT BOUND. CREATE OBJECT gi_current_user TYPE zcl_abapgit_persistence_user. ENDIF. ri_user = gi_current_user. ELSE. CREATE OBJECT ri_user TYPE zcl_abapgit_persistence_user EXPORTING iv_user = iv_user. ENDIF. ENDMETHOD. METHOD read. DATA: lv_xml TYPE string. TRY. lv_xml = zcl_abapgit_persistence_db=>get_instance( )->read( iv_type = zcl_abapgit_persistence_db=>c_type_user iv_value = mv_user ). CATCH zcx_abapgit_not_found. RETURN. ENDTRY. ms_user = from_xml( lv_xml ). ENDMETHOD. METHOD read_repo_config. DATA lv_url TYPE string. lv_url = to_lower( iv_url ). READ TABLE ms_user-repo_config INTO rs_repo_config WITH KEY url = lv_url. ENDMETHOD. METHOD to_xml. CALL TRANSFORMATION id SOURCE user = is_user RESULT XML rv_xml. ENDMETHOD. METHOD update. DATA: lv_xml TYPE string. lv_xml = to_xml( ms_user ). zcl_abapgit_persistence_db=>get_instance( )->modify( iv_type = zcl_abapgit_persistence_db=>c_type_user iv_value = mv_user iv_data = lv_xml ). COMMIT WORK AND WAIT. ENDMETHOD. METHOD update_repo_config. DATA: lv_key TYPE string. FIELD-SYMBOLS TYPE ty_repo_config. lv_key = to_lower( iv_url ). READ TABLE ms_user-repo_config ASSIGNING WITH KEY url = lv_key. IF sy-subrc IS NOT INITIAL. APPEND INITIAL LINE TO ms_user-repo_config ASSIGNING . ENDIF. = is_repo_config. -url = lv_key. update( ). ENDMETHOD. METHOD zif_abapgit_persist_user~get_changes_only. rv_changes_only = ms_user-changes_only. ENDMETHOD. METHOD zif_abapgit_persist_user~get_default_git_user_email. rv_email = ms_user-default_git_user-email. ENDMETHOD. METHOD zif_abapgit_persist_user~get_default_git_user_name. rv_username = ms_user-default_git_user-name. ENDMETHOD. METHOD zif_abapgit_persist_user~get_diff_first. rv_diff_first = ms_user-diff_first. ENDMETHOD. METHOD zif_abapgit_persist_user~get_diff_unified. rv_diff_unified = ms_user-diff_unified. ENDMETHOD. METHOD zif_abapgit_persist_user~get_favorites. rt_favorites = ms_user-favorites. ENDMETHOD. METHOD zif_abapgit_persist_user~get_hide_files. rv_hide = ms_user-hide_files. ENDMETHOD. METHOD zif_abapgit_persist_user~get_list_settings. rs_list_settings = ms_user-list_settings. IF rs_list_settings IS INITIAL. " for performance reasons, set "only favorites" as a default IF zcl_abapgit_repo_srv=>get_instance( )->list_favorites( ) IS NOT INITIAL. rs_list_settings-only_favorites = abap_true. ENDIF. rs_list_settings-order_by = |NAME|. ENDIF. ENDMETHOD. METHOD zif_abapgit_persist_user~get_order_by. rv_order_by = ms_user-order_by. ENDMETHOD. METHOD zif_abapgit_persist_user~get_order_descending. rv_order_descending = ms_user-order_descending. ENDMETHOD. METHOD zif_abapgit_persist_user~get_repo_git_user_email. rv_email = read_repo_config( iv_url )-git_user-email. ENDMETHOD. METHOD zif_abapgit_persist_user~get_repo_git_user_name. rv_username = read_repo_config( iv_url )-git_user-name. ENDMETHOD. METHOD zif_abapgit_persist_user~get_repo_last_change_seen. rv_version = read_repo_config( iv_url )-last_change_seen. ENDMETHOD. METHOD zif_abapgit_persist_user~get_repo_login. rv_login = read_repo_config( iv_url )-login. ENDMETHOD. METHOD zif_abapgit_persist_user~get_repo_show. rv_key = ms_user-repo_show. IF rv_key IS INITIAL. RETURN. ENDIF. " Check if repo exists TRY. zcl_abapgit_persistence_db=>get_instance( )->read( iv_type = zcl_abapgit_persistence_db=>c_type_repo iv_value = rv_key ). CATCH zcx_abapgit_not_found. " remove invalid key CLEAR rv_key. zif_abapgit_persist_user~set_repo_show( rv_key ). ENDTRY. ENDMETHOD. METHOD zif_abapgit_persist_user~get_settings. rs_user_settings = ms_user-settings. ENDMETHOD. METHOD zif_abapgit_persist_user~get_show_folders. rv_folders = ms_user-show_folders. ENDMETHOD. METHOD zif_abapgit_persist_user~is_favorite_repo. READ TABLE ms_user-favorites TRANSPORTING NO FIELDS WITH KEY table_line = iv_repo_key. rv_yes = boolc( sy-subrc = 0 ). ENDMETHOD. METHOD zif_abapgit_persist_user~set_default_git_user_email. ms_user-default_git_user-email = iv_email. update( ). ENDMETHOD. METHOD zif_abapgit_persist_user~set_default_git_user_name. ms_user-default_git_user-name = iv_username. update( ). ENDMETHOD. METHOD zif_abapgit_persist_user~set_diff_first. ms_user-diff_first = iv_diff_first. update( ). rv_diff_first = ms_user-diff_first. ENDMETHOD. METHOD zif_abapgit_persist_user~set_list_settings. ms_user-list_settings = is_list_settings. update( ). ENDMETHOD. METHOD zif_abapgit_persist_user~set_order_by. ms_user-order_by = iv_order_by. update( ). rv_order_by = ms_user-order_by. ENDMETHOD. METHOD zif_abapgit_persist_user~set_order_descending. ms_user-order_descending = iv_order_descending. update( ). rv_order_descending = ms_user-order_descending. ENDMETHOD. METHOD zif_abapgit_persist_user~set_repo_git_user_email. DATA: ls_repo_config TYPE ty_repo_config. ls_repo_config = read_repo_config( iv_url ). ls_repo_config-git_user-email = iv_email. update_repo_config( iv_url = iv_url is_repo_config = ls_repo_config ). ENDMETHOD. METHOD zif_abapgit_persist_user~set_repo_git_user_name. DATA: ls_repo_config TYPE ty_repo_config. ls_repo_config = read_repo_config( iv_url ). ls_repo_config-git_user-name = iv_username. update_repo_config( iv_url = iv_url is_repo_config = ls_repo_config ). ENDMETHOD. METHOD zif_abapgit_persist_user~set_repo_last_change_seen. DATA: ls_repo_config TYPE ty_repo_config. ls_repo_config = read_repo_config( iv_url ). ls_repo_config-last_change_seen = iv_version. update_repo_config( iv_url = iv_url is_repo_config = ls_repo_config ). ENDMETHOD. METHOD zif_abapgit_persist_user~set_repo_login. DATA: ls_repo_config TYPE ty_repo_config. ls_repo_config = read_repo_config( iv_url ). ls_repo_config-login = iv_login. update_repo_config( iv_url = iv_url is_repo_config = ls_repo_config ). ENDMETHOD. METHOD zif_abapgit_persist_user~set_repo_show. ms_user-repo_show = iv_key. update( ). ENDMETHOD. METHOD zif_abapgit_persist_user~set_settings. ms_user-settings = is_user_settings. update( ). ENDMETHOD. METHOD zif_abapgit_persist_user~toggle_changes_only. ms_user-changes_only = boolc( ms_user-changes_only = abap_false ). update( ). rv_changes_only = ms_user-changes_only. ENDMETHOD. METHOD zif_abapgit_persist_user~toggle_diff_unified. ms_user-diff_unified = boolc( ms_user-diff_unified = abap_false ). update( ). rv_diff_unified = ms_user-diff_unified. ENDMETHOD. METHOD zif_abapgit_persist_user~toggle_favorite. READ TABLE ms_user-favorites TRANSPORTING NO FIELDS WITH KEY table_line = iv_repo_key. IF sy-subrc = 0. DELETE ms_user-favorites INDEX sy-tabix. ELSE. APPEND iv_repo_key TO ms_user-favorites. ENDIF. update( ). ENDMETHOD. METHOD zif_abapgit_persist_user~toggle_hide_files. ms_user-hide_files = boolc( ms_user-hide_files = abap_false ). update( ). rv_hide = ms_user-hide_files. ENDMETHOD. METHOD zif_abapgit_persist_user~toggle_show_folders. ms_user-show_folders = boolc( ms_user-show_folders = abap_false ). update( ). rv_folders = ms_user-show_folders. ENDMETHOD. ENDCLASS.