Refactor user persistence (#4003)

* Refactor user persistence

Instead of selecting the settings from the DB for each "get", user settings are now kept in instance memory. Simplifies code, too.

* Lint

* Replace commit work

* Change risk level

Co-authored-by: Lars Hvam <larshp@hotmail.com>
This commit is contained in:
Marc Bernard 2020-10-16 03:18:01 -04:00 committed by GitHub
parent 9ac7630711
commit e6fb4e45a4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 160 additions and 99 deletions

View File

@ -4,18 +4,22 @@ CLASS zcl_abapgit_persistence_user DEFINITION
PUBLIC SECTION.
INTERFACES zif_abapgit_persist_user.
INTERFACES zif_abapgit_persist_user .
TYPES ty_favorites TYPE zif_abapgit_persistence=>ty_repo_keys .
CLASS-METHODS get_instance
IMPORTING
!iv_user TYPE xubname DEFAULT sy-uname
!iv_user TYPE sy-uname DEFAULT sy-uname
RETURNING
VALUE(ri_user) TYPE REF TO zif_abapgit_persist_user .
VALUE(ri_user) TYPE REF TO zif_abapgit_persist_user
RAISING
zcx_abapgit_exception .
METHODS constructor
IMPORTING
!iv_user TYPE xubname DEFAULT sy-uname .
!iv_user TYPE sy-uname DEFAULT sy-uname
RAISING
zcx_abapgit_exception .
PROTECTED SECTION.
PRIVATE SECTION.
@ -40,7 +44,8 @@ CLASS zcl_abapgit_persistence_user DEFINITION
settings TYPE zif_abapgit_definitions=>ty_s_user_settings,
END OF ty_user .
DATA mv_user TYPE xubname .
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
@ -51,8 +56,6 @@ CLASS zcl_abapgit_persistence_user DEFINITION
RAISING
zcx_abapgit_exception .
METHODS read
RETURNING
VALUE(rs_user) TYPE ty_user
RAISING
zcx_abapgit_exception .
METHODS read_repo_config
@ -68,8 +71,6 @@ CLASS zcl_abapgit_persistence_user DEFINITION
RETURNING
VALUE(rv_xml) TYPE string .
METHODS update
IMPORTING
!is_user TYPE ty_user
RAISING
zcx_abapgit_exception .
METHODS update_repo_config
@ -87,6 +88,7 @@ CLASS ZCL_ABAPGIT_PERSISTENCE_USER IMPLEMENTATION.
METHOD constructor.
mv_user = iv_user.
read( ).
ENDMETHOD.
@ -135,19 +137,13 @@ CLASS ZCL_ABAPGIT_PERSISTENCE_USER IMPLEMENTATION.
RETURN.
ENDTRY.
rs_user = from_xml( lv_xml ).
ms_user = from_xml( lv_xml ).
ENDMETHOD.
METHOD read_repo_config.
DATA: lt_repo_config TYPE ty_repo_configs,
lv_key TYPE string.
lv_key = to_lower( iv_url ).
lt_repo_config = read( )-repo_config.
READ TABLE lt_repo_config INTO rs_repo_config WITH KEY url = lv_key.
READ TABLE ms_user-repo_config INTO rs_repo_config WITH KEY url = to_lower( iv_url ).
ENDMETHOD.
@ -162,79 +158,76 @@ CLASS ZCL_ABAPGIT_PERSISTENCE_USER IMPLEMENTATION.
DATA: lv_xml TYPE string.
lv_xml = to_xml( is_user ).
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: ls_user TYPE ty_user,
lv_key TYPE string.
DATA: lv_key TYPE string.
FIELD-SYMBOLS <ls_repo_config> TYPE ty_repo_config.
ls_user = read( ).
lv_key = to_lower( iv_url ).
READ TABLE ls_user-repo_config ASSIGNING <ls_repo_config> WITH KEY url = lv_key.
READ TABLE ms_user-repo_config ASSIGNING <ls_repo_config> WITH KEY url = lv_key.
IF sy-subrc IS NOT INITIAL.
APPEND INITIAL LINE TO ls_user-repo_config ASSIGNING <ls_repo_config>.
APPEND INITIAL LINE TO ms_user-repo_config ASSIGNING <ls_repo_config>.
ENDIF.
<ls_repo_config> = is_repo_config.
<ls_repo_config>-url = lv_key.
update( ls_user ).
COMMIT WORK AND WAIT.
update( ).
ENDMETHOD.
METHOD zif_abapgit_persist_user~get_changes_only.
rv_changes_only = read( )-changes_only.
rv_changes_only = ms_user-changes_only.
ENDMETHOD.
METHOD zif_abapgit_persist_user~get_default_git_user_email.
rv_email = read( )-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 = read( )-default_git_user-name.
rv_username = ms_user-default_git_user-name.
ENDMETHOD.
METHOD zif_abapgit_persist_user~get_diff_unified.
rv_diff_unified = read( )-diff_unified.
rv_diff_unified = ms_user-diff_unified.
ENDMETHOD.
METHOD zif_abapgit_persist_user~get_favorites.
rt_favorites = read( )-favorites.
rt_favorites = ms_user-favorites.
ENDMETHOD.
METHOD zif_abapgit_persist_user~get_hide_files.
rv_hide = read( )-hide_files.
rv_hide = ms_user-hide_files.
ENDMETHOD.
@ -271,7 +264,7 @@ CLASS ZCL_ABAPGIT_PERSISTENCE_USER IMPLEMENTATION.
DATA lo_repo TYPE REF TO zcl_abapgit_repo.
rv_key = read( )-repo_show.
rv_key = ms_user-repo_show.
" Check if repo exists
TRY.
@ -287,22 +280,14 @@ CLASS ZCL_ABAPGIT_PERSISTENCE_USER IMPLEMENTATION.
METHOD zif_abapgit_persist_user~get_settings.
DATA: ls_user TYPE ty_user.
ls_user = read( ).
rs_user_settings = ls_user-settings.
rs_user_settings = ms_user-settings.
ENDMETHOD.
METHOD zif_abapgit_persist_user~is_favorite_repo.
DATA: lt_favorites TYPE ty_favorites.
lt_favorites = zif_abapgit_persist_user~get_favorites( ).
READ TABLE lt_favorites TRANSPORTING NO FIELDS
READ TABLE ms_user-favorites TRANSPORTING NO FIELDS
WITH KEY table_line = iv_repo_key.
rv_yes = boolc( sy-subrc = 0 ).
@ -312,26 +297,16 @@ CLASS ZCL_ABAPGIT_PERSISTENCE_USER IMPLEMENTATION.
METHOD zif_abapgit_persist_user~set_default_git_user_email.
DATA: ls_user TYPE ty_user.
ls_user = read( ).
ls_user-default_git_user-email = iv_email.
update( ls_user ).
ms_user-default_git_user-email = iv_email.
update( ).
ENDMETHOD.
METHOD zif_abapgit_persist_user~set_default_git_user_name.
DATA: ls_user TYPE ty_user.
ls_user = read( ).
ls_user-default_git_user-name = iv_username.
update( ls_user ).
ms_user-default_git_user-name = iv_username.
update( ).
ENDMETHOD.
@ -386,86 +361,62 @@ CLASS ZCL_ABAPGIT_PERSISTENCE_USER IMPLEMENTATION.
METHOD zif_abapgit_persist_user~set_repo_show.
DATA: ls_user TYPE ty_user.
ls_user = read( ).
ls_user-repo_show = iv_key.
update( ls_user ).
COMMIT WORK AND WAIT.
ms_user-repo_show = iv_key.
update( ).
ENDMETHOD.
METHOD zif_abapgit_persist_user~set_settings.
DATA: ls_user TYPE ty_user.
ls_user = read( ).
ls_user-settings = is_user_settings.
update( ls_user ).
ms_user-settings = is_user_settings.
update( ).
ENDMETHOD.
METHOD zif_abapgit_persist_user~toggle_changes_only.
DATA ls_user TYPE ty_user.
ms_user-changes_only = boolc( ms_user-changes_only = abap_false ).
update( ).
ls_user = read( ).
ls_user-changes_only = boolc( ls_user-changes_only = abap_false ).
update( ls_user ).
rv_changes_only = ls_user-changes_only.
rv_changes_only = ms_user-changes_only.
ENDMETHOD.
METHOD zif_abapgit_persist_user~toggle_diff_unified.
DATA ls_user TYPE ty_user.
ms_user-diff_unified = boolc( ms_user-diff_unified = abap_false ).
update( ).
ls_user = read( ).
ls_user-diff_unified = boolc( ls_user-diff_unified = abap_false ).
update( ls_user ).
rv_diff_unified = ls_user-diff_unified.
rv_diff_unified = ms_user-diff_unified.
ENDMETHOD.
METHOD zif_abapgit_persist_user~toggle_favorite.
DATA: ls_user TYPE ty_user.
ls_user = read( ).
READ TABLE ls_user-favorites TRANSPORTING NO FIELDS
READ TABLE ms_user-favorites TRANSPORTING NO FIELDS
WITH KEY table_line = iv_repo_key.
IF sy-subrc = 0.
DELETE ls_user-favorites INDEX sy-tabix.
DELETE ms_user-favorites INDEX sy-tabix.
ELSE.
APPEND iv_repo_key TO ls_user-favorites.
APPEND iv_repo_key TO ms_user-favorites.
ENDIF.
update( ls_user ).
COMMIT WORK AND WAIT.
update( ).
ENDMETHOD.
METHOD zif_abapgit_persist_user~toggle_hide_files.
DATA ls_user TYPE ty_user.
ms_user-hide_files = boolc( ms_user-hide_files = abap_false ).
update( ).
ls_user = read( ).
ls_user-hide_files = boolc( ls_user-hide_files = abap_false ).
update( ls_user ).
rv_hide = ls_user-hide_files.
rv_hide = ms_user-hide_files.
ENDMETHOD.
ENDCLASS.

View File

@ -0,0 +1,109 @@
CLASS ltcl_user DEFINITION
FOR TESTING
RISK LEVEL CRITICAL
DURATION SHORT FINAL.
PRIVATE SECTION.
CONSTANTS:
c_abap_user TYPE sy-uname VALUE 'ABAPGIT_TEST',
c_git_user TYPE string VALUE 'abapgit_tester',
c_repo_key TYPE zif_abapgit_persistence=>ty_repo-key VALUE '000000000001',
c_repo_url TYPE string VALUE 'https://github.com/abapGit/abapGit'.
DATA:
mi_user TYPE REF TO zif_abapgit_persist_user.
METHODS:
set_get_git_user FOR TESTING RAISING zcx_abapgit_exception,
set_get_repo_show FOR TESTING RAISING zcx_abapgit_exception,
set_get_settings FOR TESTING RAISING zcx_abapgit_exception,
set_get_repo_login FOR TESTING RAISING zcx_abapgit_exception,
teardown RAISING zcx_abapgit_exception.
ENDCLASS.
CLASS ltcl_user IMPLEMENTATION.
METHOD set_get_git_user.
DATA: lv_user TYPE string.
mi_user = zcl_abapgit_persistence_user=>get_instance( c_abap_user ).
mi_user->set_default_git_user_name( c_git_user ).
FREE mi_user.
mi_user = zcl_abapgit_persistence_user=>get_instance( c_abap_user ).
lv_user = mi_user->get_default_git_user_name( ).
cl_abap_unit_assert=>assert_equals(
act = lv_user
exp = c_git_user ).
ENDMETHOD.
METHOD set_get_repo_show.
DATA: lv_key TYPE zif_abapgit_persistence=>ty_repo-key.
mi_user = zcl_abapgit_persistence_user=>get_instance( c_abap_user ).
mi_user->set_repo_show( c_repo_key ).
FREE mi_user.
mi_user = zcl_abapgit_persistence_user=>get_instance( c_abap_user ).
lv_key = mi_user->get_repo_show( ).
cl_abap_unit_assert=>assert_equals(
act = lv_key
exp = c_repo_key ).
ENDMETHOD.
METHOD set_get_repo_login.
DATA: lv_login TYPE string.
mi_user = zcl_abapgit_persistence_user=>get_instance( c_abap_user ).
mi_user->set_repo_login( iv_url = c_repo_url
iv_login = c_git_user ).
FREE mi_user.
mi_user = zcl_abapgit_persistence_user=>get_instance( c_abap_user ).
lv_login = mi_user->get_repo_login( c_repo_url ).
cl_abap_unit_assert=>assert_equals(
act = lv_login
exp = c_git_user ).
ENDMETHOD.
METHOD set_get_settings.
DATA: ls_settings TYPE zif_abapgit_definitions=>ty_s_user_settings.
ls_settings-show_default_repo = abap_true.
mi_user = zcl_abapgit_persistence_user=>get_instance( c_abap_user ).
mi_user->set_settings( ls_settings ).
FREE mi_user.
mi_user = zcl_abapgit_persistence_user=>get_instance( c_abap_user ).
ls_settings = mi_user->get_settings( ).
cl_abap_unit_assert=>assert_equals(
act = ls_settings-show_default_repo
exp = abap_true ).
ENDMETHOD.
METHOD teardown.
" Delete test user settings
zcl_abapgit_persistence_db=>get_instance( )->delete(
iv_type = zcl_abapgit_persistence_db=>c_type_user
iv_value = c_abap_user ).
CALL FUNCTION 'DB_COMMIT'.
ENDMETHOD.
ENDCLASS.

View File

@ -10,6 +10,7 @@
<CLSCCINCL>X</CLSCCINCL>
<FIXPT>X</FIXPT>
<UNICODE>X</UNICODE>
<WITH_UNIT_TESTS>X</WITH_UNIT_TESTS>
</VSEOCLASS>
</asx:values>
</asx:abap>