...

Source file src/edge-infra.dev/pkg/edge/api/services/iam_settings_service.go

Documentation: edge-infra.dev/pkg/edge/api/services

     1  package services
     2  
     3  import (
     4  	"context"
     5  	"database/sql"
     6  	"errors"
     7  
     8  	sqlerror "edge-infra.dev/pkg/edge/api/apierror/sql"
     9  	"edge-infra.dev/pkg/edge/api/graph/model"
    10  	sqlquery "edge-infra.dev/pkg/edge/api/sql"
    11  )
    12  
    13  //go:generate mockgen -destination=../mocks/mock_iam_settings_service.go -package=mocks edge-infra.dev/pkg/edge/api/services IAMSettingsService
    14  type IAMSettingsService interface {
    15  	CreateSettings(ctx context.Context, bannerID string, providerSettings model.ProviderInput) (*model.Provider, error)
    16  	GetSettings(ctx context.Context, bannerID string) (*model.Provider, error)
    17  	UpdateSettings(ctx context.Context, bannerID string, providerSettings model.ProviderInput) (*model.Provider, error)
    18  	DeleteSettings(ctx context.Context, bannerID string) (*model.Provider, error)
    19  }
    20  
    21  type iamSettingService struct {
    22  	SQLDB *sql.DB
    23  }
    24  
    25  func (o *iamSettingService) CreateSettings(ctx context.Context, bannerID string, providerSettings model.ProviderInput) (*model.Provider, error) {
    26  	var ps model.Provider
    27  	tx, err := o.SQLDB.BeginTx(ctx, &sql.TxOptions{})
    28  	if err != nil {
    29  		return nil, err
    30  	}
    31  
    32  	defer func() {
    33  		if err != nil {
    34  			err = errors.Join(err, tx.Rollback())
    35  		}
    36  	}()
    37  
    38  	_, errID := o.getProviderSettingsID(ctx, bannerID)
    39  	if errID == nil {
    40  		return o.UpdateSettings(ctx, bannerID, providerSettings)
    41  	}
    42  
    43  	row := tx.QueryRowContext(ctx, sqlquery.InsertProviderSettings, providerSettings.PinAttempts, providerSettings.PinExpire, providerSettings.PinHistory,
    44  		providerSettings.PinLength, providerSettings.BarcodeExpire, providerSettings.BarcodePrefix, providerSettings.BarcodeLength, providerSettings.BcryptCost,
    45  		providerSettings.ProfileExpire)
    46  
    47  	err = row.Scan(&ps.ProviderSettingsID)
    48  	if err != nil {
    49  		return nil, sqlerror.Wrap(err)
    50  	}
    51  
    52  	err = o.createProviderOwner(ctx, bannerID, ps.ProviderSettingsID, tx)
    53  	if err != nil {
    54  		return nil, sqlerror.Wrap(err)
    55  	}
    56  
    57  	if err = tx.Commit(); err != nil {
    58  		return nil, err
    59  	}
    60  
    61  	settings, err := o.GetSettings(ctx, bannerID)
    62  	if err != nil {
    63  		return nil, sqlerror.Wrap(err)
    64  	}
    65  
    66  	return settings, err
    67  }
    68  
    69  func (o *iamSettingService) GetSettings(ctx context.Context, bannerID string) (*model.Provider, error) {
    70  	//use provider settings edge id to get configuration
    71  	var settings model.Provider
    72  
    73  	providerSettingsID, errID := o.getProviderSettingsID(ctx, bannerID)
    74  	if errID != nil {
    75  		return nil, sqlerror.Wrap(errID)
    76  	}
    77  
    78  	row := o.SQLDB.QueryRowContext(ctx, sqlquery.GetProviderSettings, providerSettingsID)
    79  	err := row.Scan(&settings.ProviderSettingsID, &settings.PinAttempts, &settings.PinHistory, &settings.PinLength,
    80  		&settings.BarcodePrefix, &settings.BarcodeLength, &settings.BcryptCost, &settings.PinExpire, &settings.BarcodeExpire, &settings.ProfileExpire)
    81  
    82  	//return settings with provided id
    83  	return &settings, err
    84  }
    85  
    86  //nolint:gocyclo
    87  func (o *iamSettingService) UpdateSettings(ctx context.Context, bannerID string, providerSettings model.ProviderInput) (*model.Provider, error) {
    88  	tx, err := o.SQLDB.BeginTx(ctx, &sql.TxOptions{})
    89  	if err != nil {
    90  		return nil, err
    91  	}
    92  
    93  	defer func() {
    94  		if err != nil {
    95  			err = errors.Join(err, tx.Rollback())
    96  		}
    97  	}()
    98  
    99  	providerSettingsID, errID := o.getProviderSettingsID(ctx, bannerID)
   100  	if errID != nil {
   101  		return nil, sqlerror.Wrap(errID)
   102  	}
   103  
   104  	if providerSettings.PinAttempts != nil {
   105  		_, err = tx.ExecContext(ctx, sqlquery.UpdatePinAttempts, providerSettings.PinAttempts, providerSettingsID)
   106  		if err != nil {
   107  			return nil, sqlerror.Wrap(err)
   108  		}
   109  	}
   110  
   111  	if providerSettings.PinExpire != nil {
   112  		_, err = tx.ExecContext(ctx, sqlquery.UpdatePinExpire, providerSettings.PinExpire, providerSettingsID)
   113  		if err != nil {
   114  			return nil, sqlerror.Wrap(err)
   115  		}
   116  	}
   117  
   118  	if providerSettings.PinHistory != nil {
   119  		_, err = tx.ExecContext(ctx, sqlquery.UpdatePinHistory, providerSettings.PinHistory, providerSettingsID)
   120  		if err != nil {
   121  			return nil, sqlerror.Wrap(err)
   122  		}
   123  	}
   124  
   125  	if providerSettings.PinLength != nil {
   126  		_, err = tx.ExecContext(ctx, sqlquery.UpdatePinLength, providerSettings.PinLength, providerSettingsID)
   127  		if err != nil {
   128  			return nil, sqlerror.Wrap(err)
   129  		}
   130  	}
   131  
   132  	if providerSettings.BarcodeExpire != nil {
   133  		_, err = tx.ExecContext(ctx, sqlquery.UpdateBarcodeExpire, providerSettings.BarcodeExpire, providerSettingsID)
   134  		if err != nil {
   135  			return nil, sqlerror.Wrap(err)
   136  		}
   137  	}
   138  
   139  	if providerSettings.BarcodePrefix != nil {
   140  		_, err = tx.ExecContext(ctx, sqlquery.UpdateBarcodePrefix, providerSettings.BarcodePrefix, providerSettingsID)
   141  		if err != nil {
   142  			return nil, sqlerror.Wrap(err)
   143  		}
   144  	}
   145  
   146  	if providerSettings.BarcodeLength != nil {
   147  		_, err = tx.ExecContext(ctx, sqlquery.UpdateBarcodeLength, providerSettings.BarcodeLength, providerSettingsID)
   148  		if err != nil {
   149  			return nil, sqlerror.Wrap(err)
   150  		}
   151  	}
   152  
   153  	if providerSettings.BcryptCost != nil {
   154  		_, err = tx.ExecContext(ctx, sqlquery.UpdateBcryptCost, providerSettings.BcryptCost, providerSettingsID)
   155  		if err != nil {
   156  			return nil, sqlerror.Wrap(err)
   157  		}
   158  	}
   159  
   160  	if providerSettings.ProfileExpire != nil {
   161  		_, err = tx.ExecContext(ctx, sqlquery.UpdateProfileExpire, providerSettings.ProfileExpire, providerSettingsID)
   162  		if err != nil {
   163  			return nil, sqlerror.Wrap(err)
   164  		}
   165  	}
   166  
   167  	if err = tx.Commit(); err != nil {
   168  		return nil, err
   169  	}
   170  
   171  	settings, err := o.GetSettings(ctx, bannerID)
   172  
   173  	return settings, err
   174  }
   175  
   176  func (o *iamSettingService) DeleteSettings(ctx context.Context, bannerID string) (*model.Provider, error) {
   177  	rowDeleted, err := o.GetSettings(ctx, bannerID)
   178  	if err != nil {
   179  		return nil, err
   180  	}
   181  
   182  	providerSettingsID, errID := o.getProviderSettingsID(ctx, bannerID)
   183  	if errID != nil {
   184  		return nil, sqlerror.Wrap(errID)
   185  	}
   186  
   187  	_, err = o.SQLDB.ExecContext(ctx, sqlquery.DeleteProviderSettings, providerSettingsID)
   188  	if err != nil {
   189  		return nil, sqlerror.Wrap(err)
   190  	}
   191  
   192  	//delete associated owner after row is deleted
   193  	err = o.deleteProviderOwner(ctx, providerSettingsID)
   194  	if err != nil {
   195  		return nil, sqlerror.Wrap(err)
   196  	}
   197  
   198  	return rowDeleted, nil
   199  }
   200  
   201  func (o *iamSettingService) getProviderSettingsID(ctx context.Context, bannerID string) (string, error) {
   202  	var settingsID string
   203  	row := o.SQLDB.QueryRowContext(ctx, sqlquery.GetProviderOwner, bannerID)
   204  	err := row.Scan(&settingsID)
   205  
   206  	//return settings with provided id
   207  	return settingsID, err
   208  }
   209  
   210  func (o *iamSettingService) deleteProviderOwner(ctx context.Context, providerSettingsID string) error {
   211  	_, err := o.SQLDB.ExecContext(ctx, sqlquery.DeleteProviderOwner, providerSettingsID)
   212  	if err != nil {
   213  		return sqlerror.Wrap(err)
   214  	}
   215  
   216  	return nil
   217  }
   218  
   219  func (o *iamSettingService) createProviderOwner(ctx context.Context, bannerID string, providerSettingsID string, tx *sql.Tx) error {
   220  	if _, err := tx.ExecContext(ctx, sqlquery.InsertProviderOwner, bannerID, providerSettingsID); err != nil {
   221  		return sqlerror.Wrap(err)
   222  	}
   223  
   224  	return nil
   225  }
   226  
   227  func NewIAMSettingsService(sqlDB *sql.DB) *iamSettingService { //nolint
   228  	return &iamSettingService{
   229  		SQLDB: sqlDB,
   230  	}
   231  }
   232  

View as plain text