Refactor SSOSettings to use types (#78675)

* refactor SSOSettings to use types

* test struct

* refactor SSOSettings struct to use types

* fix database tests

* fix populateSSOSettings() to accept an SSOSettings param

* fix all tests from the database layer

* handle errors for converting to/from SSOSettings

* add json tag on OAuthInfo fields

* use continue instead of if/else

* add the source field to SSOSettingsDTO conversion

* remove omitempty from json tags in OAuthInfo struct
This commit is contained in:
Mihai Doarna
2023-11-29 18:02:04 +02:00
committed by GitHub
parent 931c8e99b9
commit 2e2b1cd9e4
20 changed files with 445 additions and 383 deletions
+28 -5
View File
@@ -61,7 +61,18 @@ func (api *Api) listAllProvidersSettings(c *contextmodel.ReqContext) response.Re
return response.Error(500, "Failed to get providers", err)
}
return response.JSON(http.StatusOK, providers)
dtos := make([]*models.SSOSettingsDTO, 0)
for _, provider := range providers {
dto, err := provider.ToSSOSettingsDTO()
if err != nil {
api.Log.Warn("Failed to convert SSO Settings for provider " + provider.Provider)
continue
}
dtos = append(dtos, dto)
}
return response.JSON(http.StatusOK, dtos)
}
func (api *Api) getProviderSettings(c *contextmodel.ReqContext) response.Response {
@@ -75,7 +86,12 @@ func (api *Api) getProviderSettings(c *contextmodel.ReqContext) response.Respons
return response.Error(http.StatusNotFound, "The provider was not found", err)
}
return response.JSON(http.StatusOK, settings)
dto, err := settings.ToSSOSettingsDTO()
if err != nil {
return response.Error(http.StatusInternalServerError, "The provider is invalid", err)
}
return response.JSON(http.StatusOK, dto)
}
func (api *Api) updateProviderSettings(c *contextmodel.ReqContext) response.Response {
@@ -84,12 +100,19 @@ func (api *Api) updateProviderSettings(c *contextmodel.ReqContext) response.Resp
return response.Error(http.StatusBadRequest, "Missing key", nil)
}
var newSettings models.SSOSetting
if err := web.Bind(c.Req, &newSettings); err != nil {
var settingsDTO models.SSOSettingsDTO
if err := web.Bind(c.Req, &settingsDTO); err != nil {
return response.Error(http.StatusBadRequest, "Failed to parse request body", err)
}
err := api.SSOSettingsService.Upsert(c.Req.Context(), key, newSettings.Settings)
settings, err := settingsDTO.ToSSOSettings()
if err != nil {
return response.Error(http.StatusBadRequest, "Invalid request body", err)
}
settings.Provider = key
err = api.SSOSettingsService.Upsert(c.Req.Context(), *settings)
// TODO: first check whether the error is referring to validation errors
// other error