}
type ProviderManager struct {
- onboardedProviders map[string]provapi.APIProviderEnrolmentDetails
- lock sync.Mutex
+ registeredProviders map[string]provapi.APIProviderEnrolmentDetails
+ lock sync.Mutex
}
func NewProviderManager() *ProviderManager {
return &ProviderManager{
- onboardedProviders: make(map[string]provapi.APIProviderEnrolmentDetails),
+ registeredProviders: make(map[string]provapi.APIProviderEnrolmentDetails),
}
}
func (pm *ProviderManager) IsFunctionRegistered(functionId string) bool {
registered := false
out:
- for _, provider := range pm.onboardedProviders {
+ for _, provider := range pm.registeredProviders {
for _, registeredFunc := range *provider.ApiProvFuncs {
if *registeredFunc.ApiProvFuncId == functionId {
registered = true
}
func (pm *ProviderManager) GetAefsForPublisher(apfId string) []string {
- for _, provider := range pm.onboardedProviders {
+ for _, provider := range pm.registeredProviders {
for _, registeredFunc := range *provider.ApiProvFuncs {
if *registeredFunc.ApiProvFuncId == apfId && registeredFunc.ApiProvFuncRole == provapi.ApiProviderFuncRoleAPF {
return getExposedFuncs(provider.ApiProvFuncs)
return sendCoreError(ctx, http.StatusBadRequest, "Provider missing required ApiProvDomInfo")
}
- pm.lock.Lock()
- defer pm.lock.Unlock()
-
- newProvider.ApiProvDomId = pm.getDomainId(newProvider.ApiProvDomInfo)
-
- pm.registerFunctions(newProvider.ApiProvFuncs)
- pm.onboardedProviders[*newProvider.ApiProvDomId] = newProvider
+ pm.prepareNewProvider(&newProvider)
uri := ctx.Request().Host + ctx.Request().URL.String()
ctx.Response().Header().Set(echo.HeaderLocation, ctx.Scheme()+`://`+path.Join(uri, *newProvider.ApiProvDomId))
return nil
}
-func (pm *ProviderManager) DeleteRegistrationsRegistrationId(ctx echo.Context, registrationId string) error {
+func (pm *ProviderManager) prepareNewProvider(newProvider *provapi.APIProviderEnrolmentDetails) {
pm.lock.Lock()
defer pm.lock.Unlock()
- log.Debug(pm.onboardedProviders)
- if _, ok := pm.onboardedProviders[registrationId]; ok {
- log.Debug("Deleting provider", registrationId)
- delete(pm.onboardedProviders, registrationId)
+ newProvider.ApiProvDomId = pm.getDomainId(newProvider.ApiProvDomInfo)
+
+ pm.registerFunctions(newProvider.ApiProvFuncs)
+ pm.registeredProviders[*newProvider.ApiProvDomId] = *newProvider
+}
+
+func (pm *ProviderManager) DeleteRegistrationsRegistrationId(ctx echo.Context, registrationId string) error {
+
+ log.Debug(pm.registeredProviders)
+ if _, ok := pm.registeredProviders[registrationId]; ok {
+ pm.deleteProvider(registrationId)
}
return ctx.NoContent(http.StatusNoContent)
}
-func (pm *ProviderManager) PutRegistrationsRegistrationId(ctx echo.Context, registrationId string) error {
+func (pm *ProviderManager) deleteProvider(registrationId string) {
+ log.Debug("Deleting provider", registrationId)
pm.lock.Lock()
defer pm.lock.Unlock()
+ delete(pm.registeredProviders, registrationId)
+}
- registeredProvider, shouldReturn, returnValue := pm.checkIfProviderIsRegistered(registrationId, ctx)
- if shouldReturn {
- return returnValue
- }
-
- updatedProvider, shouldReturn1, returnValue1 := getProviderFromRequest(ctx)
- if shouldReturn1 {
- return returnValue1
+func (pm *ProviderManager) PutRegistrationsRegistrationId(ctx echo.Context, registrationId string) error {
+ errMsg := "Unable to update provider due to %s."
+ registeredProvider, err := pm.checkIfProviderIsRegistered(registrationId, ctx)
+ if err != nil {
+ return sendCoreError(ctx, http.StatusBadRequest, fmt.Sprintf(errMsg, err))
}
- if updatedProvider.ApiProvDomInfo != nil {
- registeredProvider.ApiProvDomInfo = updatedProvider.ApiProvDomInfo
+ updatedProvider, err := getProviderFromRequest(ctx)
+ if err != nil {
+ return sendCoreError(ctx, http.StatusBadRequest, fmt.Sprintf(errMsg, err))
}
- shouldReturn, returnValue = pm.updateFunctions(updatedProvider, registeredProvider, ctx)
- if shouldReturn {
- return returnValue
+ err = pm.updateProvider(updatedProvider, registeredProvider)
+ if err != nil {
+ return sendCoreError(ctx, http.StatusBadRequest, fmt.Sprintf(errMsg, err))
}
- err := ctx.JSON(http.StatusOK, pm.onboardedProviders[registrationId])
+ err = ctx.JSON(http.StatusOK, *registeredProvider)
if err != nil {
// Something really bad happened, tell Echo that our handler failed
return err
return nil
}
-func (pm *ProviderManager) checkIfProviderIsRegistered(registrationId string, ctx echo.Context) (provapi.APIProviderEnrolmentDetails, bool, error) {
- registeredProvider, ok := pm.onboardedProviders[registrationId]
+func (pm *ProviderManager) checkIfProviderIsRegistered(registrationId string, ctx echo.Context) (*provapi.APIProviderEnrolmentDetails, error) {
+ registeredProvider, ok := pm.registeredProviders[registrationId]
if !ok {
- return provapi.APIProviderEnrolmentDetails{}, true, sendCoreError(ctx, http.StatusBadRequest, "Provider must be onboarded before updating it")
+ return nil, fmt.Errorf("provider not onboarded")
}
- return registeredProvider, false, nil
+ return ®isteredProvider, nil
}
-func getProviderFromRequest(ctx echo.Context) (provapi.APIProviderEnrolmentDetails, bool, error) {
+func getProviderFromRequest(ctx echo.Context) (provapi.APIProviderEnrolmentDetails, error) {
var updatedProvider provapi.APIProviderEnrolmentDetails
err := ctx.Bind(&updatedProvider)
if err != nil {
- return provapi.APIProviderEnrolmentDetails{}, true, sendCoreError(ctx, http.StatusBadRequest, "Invalid format for provider")
+ return provapi.APIProviderEnrolmentDetails{}, fmt.Errorf("invalid format for provider")
}
- return updatedProvider, false, nil
+ return updatedProvider, nil
}
-func (pm *ProviderManager) updateFunctions(updatedProvider provapi.APIProviderEnrolmentDetails, registeredProvider provapi.APIProviderEnrolmentDetails, ctx echo.Context) (bool, error) {
- for _, function := range *updatedProvider.ApiProvFuncs {
- if function.ApiProvFuncId == nil {
- pm.addFunction(function, registeredProvider)
- } else {
- shouldReturn, returnValue := pm.updateFunction(function, registeredProvider, ctx)
- if shouldReturn {
- return true, returnValue
- }
- }
+func (pm *ProviderManager) updateProvider(updatedProvider provapi.APIProviderEnrolmentDetails, registeredProvider *provapi.APIProviderEnrolmentDetails) error {
+ pm.lock.Lock()
+ defer pm.lock.Unlock()
+
+ updateDomainInfo(&updatedProvider, registeredProvider)
+
+ funcsAfterUpdate, err := updateFuncs(updatedProvider.ApiProvFuncs, registeredProvider.ApiProvFuncs)
+ if err == nil {
+ registeredProvider.ApiProvFuncs = funcsAfterUpdate
+
+ pm.registeredProviders[*registeredProvider.ApiProvDomId] = *registeredProvider
+ return nil
}
- return false, nil
+ return err
}
-func (pm *ProviderManager) addFunction(function provapi.APIProviderFunctionDetails, registeredProvider provapi.APIProviderEnrolmentDetails) {
- function.ApiProvFuncId = pm.getFuncId(function.ApiProvFuncRole, function.ApiProvFuncInfo)
- registeredFuncs := *registeredProvider.ApiProvFuncs
- newFuncs := append(registeredFuncs, function)
- registeredProvider.ApiProvFuncs = &newFuncs
- pm.onboardedProviders[*registeredProvider.ApiProvDomId] = registeredProvider
+func updateDomainInfo(updatedProvider, registeredProvider *provapi.APIProviderEnrolmentDetails) {
+ if updatedProvider.ApiProvDomInfo != nil {
+ registeredProvider.ApiProvDomInfo = updatedProvider.ApiProvDomInfo
+ }
}
-func (*ProviderManager) updateFunction(function provapi.APIProviderFunctionDetails, registeredProvider provapi.APIProviderEnrolmentDetails, ctx echo.Context) (bool, error) {
- pos, registeredFunction, err := getApiFunc(*function.ApiProvFuncId, registeredProvider.ApiProvFuncs)
- if err != nil {
- return true, sendCoreError(ctx, http.StatusBadRequest, "Unable to update provider due to: "+err.Error())
- }
- if function.ApiProvFuncInfo != nil {
- registeredFunction.ApiProvFuncInfo = function.ApiProvFuncInfo
- (*registeredProvider.ApiProvFuncs)[pos] = registeredFunction
+func updateFuncs(updatedFuncs, registeredFuncs *[]provapi.APIProviderFunctionDetails) (*[]provapi.APIProviderFunctionDetails, error) {
+ addedFuncs := []provapi.APIProviderFunctionDetails{}
+ changedFuncs := []provapi.APIProviderFunctionDetails{}
+ for _, function := range *updatedFuncs {
+ if function.ApiProvFuncId == nil {
+ function.ApiProvFuncId = getFuncId(function.ApiProvFuncRole, function.ApiProvFuncInfo)
+ addedFuncs = append(addedFuncs, function)
+ } else {
+ registeredFunction, ok := getApiFunc(*function.ApiProvFuncId, registeredFuncs)
+ if !ok {
+ return nil, fmt.Errorf("function with ID %s is not registered for the provider", *function.ApiProvFuncId)
+ }
+ if function.ApiProvFuncInfo != nil {
+ registeredFunction.ApiProvFuncInfo = function.ApiProvFuncInfo
+ }
+ changedFuncs = append(changedFuncs, function)
+ }
}
- return false, nil
+ modifiedFuncs := append(changedFuncs, addedFuncs...)
+ return &modifiedFuncs, nil
}
-func getApiFunc(funcId string, apiFunctions *[]provapi.APIProviderFunctionDetails) (int, provapi.APIProviderFunctionDetails, error) {
- for pos, function := range *apiFunctions {
+func getApiFunc(funcId string, apiFunctions *[]provapi.APIProviderFunctionDetails) (provapi.APIProviderFunctionDetails, bool) {
+ for _, function := range *apiFunctions {
if *function.ApiProvFuncId == funcId {
- return pos, function, nil
+ return function, true
}
}
- return 0, provapi.APIProviderFunctionDetails{}, fmt.Errorf("function with ID %s is not registered for the provider", funcId)
+ return provapi.APIProviderFunctionDetails{}, false
}
func (pm *ProviderManager) ModifyIndApiProviderEnrolment(ctx echo.Context, registrationId string) error {
return
}
for i, provFunc := range *provFuncs {
- (*provFuncs)[i].ApiProvFuncId = pm.getFuncId(provFunc.ApiProvFuncRole, provFunc.ApiProvFuncInfo)
+ (*provFuncs)[i].ApiProvFuncId = getFuncId(provFunc.ApiProvFuncRole, provFunc.ApiProvFuncInfo)
}
}
return &idAsString
}
-func (pm *ProviderManager) getFuncId(role provapi.ApiProviderFuncRole, funcInfo *string) *string {
+func getFuncId(role provapi.ApiProviderFuncRole, funcInfo *string) *string {
var idPrefix string
switch role {
case provapi.ApiProviderFuncRoleAPF: