From c9e0073b6362dffc93b79f340289853ba28aa9d6 Mon Sep 17 00:00:00 2001 From: Elias Schneider Date: Thu, 27 Mar 2025 16:48:36 +0100 Subject: [PATCH] refactor: fix code smells --- .../controller/app_config_controller.go | 26 ++--- .../controller/audit_log_controller.go | 6 +- .../controller/custom_claim_controller.go | 14 +-- .../internal/controller/oidc_controller.go | 70 ++++++------ .../internal/controller/test_controller.go | 8 +- .../internal/controller/user_controller.go | 74 ++++++------- .../controller/user_group_controller.go | 32 +++--- .../controller/webauthn_controller.go | 30 ++--- .../controller/well_known_controller.go | 2 +- backend/internal/dto/dto_mapper.go | 104 ++++++++---------- backend/internal/middleware/api_key_auth.go | 2 +- .../internal/middleware/auth_middleware.go | 2 +- .../internal/middleware/file_size_limit.go | 2 +- backend/internal/middleware/jwt_auth.go | 2 +- backend/internal/middleware/rate_limit.go | 2 +- backend/internal/model/audit_log.go | 6 +- backend/internal/model/oidc.go | 2 +- backend/internal/model/webauthn.go | 2 +- backend/internal/service/oidc_service.go | 5 +- 19 files changed, 191 insertions(+), 200 deletions(-) diff --git a/backend/internal/controller/app_config_controller.go b/backend/internal/controller/app_config_controller.go index 23b6ae14..3994177f 100644 --- a/backend/internal/controller/app_config_controller.go +++ b/backend/internal/controller/app_config_controller.go @@ -62,13 +62,13 @@ type AppConfigController struct { func (acc *AppConfigController) listAppConfigHandler(c *gin.Context) { configuration, err := acc.appConfigService.ListAppConfig(false) if err != nil { - c.Error(err) + _ = c.Error(err) return } var configVariablesDto []dto.PublicAppConfigVariableDto if err := dto.MapStructList(configuration, &configVariablesDto); err != nil { - c.Error(err) + _ = c.Error(err) return } @@ -87,13 +87,13 @@ func (acc *AppConfigController) listAppConfigHandler(c *gin.Context) { func (acc *AppConfigController) listAllAppConfigHandler(c *gin.Context) { configuration, err := acc.appConfigService.ListAppConfig(true) if err != nil { - c.Error(err) + _ = c.Error(err) return } var configVariablesDto []dto.AppConfigVariableDto if err := dto.MapStructList(configuration, &configVariablesDto); err != nil { - c.Error(err) + _ = c.Error(err) return } @@ -113,19 +113,19 @@ func (acc *AppConfigController) listAllAppConfigHandler(c *gin.Context) { func (acc *AppConfigController) updateAppConfigHandler(c *gin.Context) { var input dto.AppConfigUpdateDto if err := c.ShouldBindJSON(&input); err != nil { - c.Error(err) + _ = c.Error(err) return } savedConfigVariables, err := acc.appConfigService.UpdateAppConfig(input) if err != nil { - c.Error(err) + _ = c.Error(err) return } var configVariablesDto []dto.AppConfigVariableDto if err := dto.MapStructList(savedConfigVariables, &configVariablesDto); err != nil { - c.Error(err) + _ = c.Error(err) return } @@ -224,13 +224,13 @@ func (acc *AppConfigController) updateLogoHandler(c *gin.Context) { func (acc *AppConfigController) updateFaviconHandler(c *gin.Context) { file, err := c.FormFile("file") if err != nil { - c.Error(err) + _ = c.Error(err) return } fileType := utils.GetFileExtension(file.Filename) if fileType != "ico" { - c.Error(&common.WrongFileTypeError{ExpectedFileType: ".ico"}) + _ = c.Error(&common.WrongFileTypeError{ExpectedFileType: ".ico"}) return } acc.updateImage(c, "favicon", "ico") @@ -263,13 +263,13 @@ func (acc *AppConfigController) getImage(c *gin.Context, name string, imageType func (acc *AppConfigController) updateImage(c *gin.Context, imageName string, oldImageType string) { file, err := c.FormFile("file") if err != nil { - c.Error(err) + _ = c.Error(err) return } err = acc.appConfigService.UpdateImage(file, imageName, oldImageType) if err != nil { - c.Error(err) + _ = c.Error(err) return } @@ -286,7 +286,7 @@ func (acc *AppConfigController) updateImage(c *gin.Context, imageName string, ol func (acc *AppConfigController) syncLdapHandler(c *gin.Context) { err := acc.ldapService.SyncAll() if err != nil { - c.Error(err) + _ = c.Error(err) return } @@ -305,7 +305,7 @@ func (acc *AppConfigController) testEmailHandler(c *gin.Context) { err := acc.emailService.SendTestEmail(userID) if err != nil { - c.Error(err) + _ = c.Error(err) return } diff --git a/backend/internal/controller/audit_log_controller.go b/backend/internal/controller/audit_log_controller.go index 89f147a4..6f3d2da0 100644 --- a/backend/internal/controller/audit_log_controller.go +++ b/backend/internal/controller/audit_log_controller.go @@ -40,7 +40,7 @@ type AuditLogController struct { func (alc *AuditLogController) listAuditLogsForUserHandler(c *gin.Context) { var sortedPaginationRequest utils.SortedPaginationRequest if err := c.ShouldBindQuery(&sortedPaginationRequest); err != nil { - c.Error(err) + _ = c.Error(err) return } @@ -49,7 +49,7 @@ func (alc *AuditLogController) listAuditLogsForUserHandler(c *gin.Context) { // Fetch audit logs for the user logs, pagination, err := alc.auditLogService.ListAuditLogsForUser(userID, sortedPaginationRequest) if err != nil { - c.Error(err) + _ = c.Error(err) return } @@ -57,7 +57,7 @@ func (alc *AuditLogController) listAuditLogsForUserHandler(c *gin.Context) { var logsDtos []dto.AuditLogDto err = dto.MapStructList(logs, &logsDtos) if err != nil { - c.Error(err) + _ = c.Error(err) return } diff --git a/backend/internal/controller/custom_claim_controller.go b/backend/internal/controller/custom_claim_controller.go index 762e3464..40168c3a 100644 --- a/backend/internal/controller/custom_claim_controller.go +++ b/backend/internal/controller/custom_claim_controller.go @@ -43,7 +43,7 @@ type CustomClaimController struct { func (ccc *CustomClaimController) getSuggestionsHandler(c *gin.Context) { claims, err := ccc.customClaimService.GetSuggestions() if err != nil { - c.Error(err) + _ = c.Error(err) return } @@ -64,20 +64,20 @@ func (ccc *CustomClaimController) UpdateCustomClaimsForUserHandler(c *gin.Contex var input []dto.CustomClaimCreateDto if err := c.ShouldBindJSON(&input); err != nil { - c.Error(err) + _ = c.Error(err) return } userId := c.Param("userId") claims, err := ccc.customClaimService.UpdateCustomClaimsForUser(userId, input) if err != nil { - c.Error(err) + _ = c.Error(err) return } var customClaimsDto []dto.CustomClaimDto if err := dto.MapStructList(claims, &customClaimsDto); err != nil { - c.Error(err) + _ = c.Error(err) return } @@ -99,20 +99,20 @@ func (ccc *CustomClaimController) UpdateCustomClaimsForUserGroupHandler(c *gin.C var input []dto.CustomClaimCreateDto if err := c.ShouldBindJSON(&input); err != nil { - c.Error(err) + _ = c.Error(err) return } userGroupId := c.Param("userGroupId") claims, err := ccc.customClaimService.UpdateCustomClaimsForUserGroup(userGroupId, input) if err != nil { - c.Error(err) + _ = c.Error(err) return } var customClaimsDto []dto.CustomClaimDto if err := dto.MapStructList(claims, &customClaimsDto); err != nil { - c.Error(err) + _ = c.Error(err) return } diff --git a/backend/internal/controller/oidc_controller.go b/backend/internal/controller/oidc_controller.go index 607aade4..4e2040cc 100644 --- a/backend/internal/controller/oidc_controller.go +++ b/backend/internal/controller/oidc_controller.go @@ -65,13 +65,13 @@ type OidcController struct { func (oc *OidcController) authorizeHandler(c *gin.Context) { var input dto.AuthorizeOidcClientRequestDto if err := c.ShouldBindJSON(&input); err != nil { - c.Error(err) + _ = c.Error(err) return } code, callbackURL, err := oc.oidcService.Authorize(input, c.GetString("userID"), c.ClientIP(), c.Request.UserAgent()) if err != nil { - c.Error(err) + _ = c.Error(err) return } @@ -96,13 +96,13 @@ func (oc *OidcController) authorizeHandler(c *gin.Context) { func (oc *OidcController) authorizationConfirmationRequiredHandler(c *gin.Context) { var input dto.AuthorizationRequiredDto if err := c.ShouldBindJSON(&input); err != nil { - c.Error(err) + _ = c.Error(err) return } hasAuthorizedClient, err := oc.oidcService.HasAuthorizedClient(input.ClientID, c.GetString("userID"), input.Scope) if err != nil { - c.Error(err) + _ = c.Error(err) return } @@ -128,19 +128,19 @@ func (oc *OidcController) createTokensHandler(c *gin.Context) { var input dto.OidcCreateTokensDto if err := c.ShouldBind(&input); err != nil { - c.Error(err) + _ = c.Error(err) return } // Validate that code is provided for authorization_code grant type if input.GrantType == "authorization_code" && input.Code == "" { - c.Error(&common.OidcMissingAuthorizationCodeError{}) + _ = c.Error(&common.OidcMissingAuthorizationCodeError{}) return } // Validate that refresh_token is provided for refresh_token grant type if input.GrantType == "refresh_token" && input.RefreshToken == "" { - c.Error(&common.OidcMissingRefreshTokenError{}) + _ = c.Error(&common.OidcMissingRefreshTokenError{}) return } @@ -162,7 +162,7 @@ func (oc *OidcController) createTokensHandler(c *gin.Context) { ) if err != nil { - c.Error(err) + _ = c.Error(err) return } @@ -197,7 +197,7 @@ func (oc *OidcController) createTokensHandler(c *gin.Context) { func (oc *OidcController) userInfoHandler(c *gin.Context) { authHeaderSplit := strings.Split(c.GetHeader("Authorization"), " ") if len(authHeaderSplit) != 2 { - c.Error(&common.MissingAccessToken{}) + _ = c.Error(&common.MissingAccessToken{}) return } @@ -205,14 +205,14 @@ func (oc *OidcController) userInfoHandler(c *gin.Context) { jwtClaims, err := oc.jwtService.VerifyOauthAccessToken(token) if err != nil { - c.Error(err) + _ = c.Error(err) return } userID := jwtClaims.Subject clientId := jwtClaims.Audience[0] claims, err := oc.oidcService.GetUserClaimsForClient(userID, clientId) if err != nil { - c.Error(err) + _ = c.Error(err) return } @@ -249,13 +249,13 @@ func (oc *OidcController) EndSessionHandler(c *gin.Context) { // Bind query parameters to the struct if c.Request.Method == http.MethodGet { if err := c.ShouldBindQuery(&input); err != nil { - c.Error(err) + _ = c.Error(err) return } } else if c.Request.Method == http.MethodPost { // Bind form parameters to the struct if err := c.ShouldBind(&input); err != nil { - c.Error(err) + _ = c.Error(err) return } } @@ -308,7 +308,7 @@ func (oc *OidcController) getClientMetaDataHandler(c *gin.Context) { clientId := c.Param("id") client, err := oc.oidcService.GetClient(clientId) if err != nil { - c.Error(err) + _ = c.Error(err) return } @@ -319,7 +319,7 @@ func (oc *OidcController) getClientMetaDataHandler(c *gin.Context) { return } - c.Error(err) + _ = c.Error(err) } // getClientHandler godoc @@ -335,7 +335,7 @@ func (oc *OidcController) getClientHandler(c *gin.Context) { clientId := c.Param("id") client, err := oc.oidcService.GetClient(clientId) if err != nil { - c.Error(err) + _ = c.Error(err) return } @@ -346,7 +346,7 @@ func (oc *OidcController) getClientHandler(c *gin.Context) { return } - c.Error(err) + _ = c.Error(err) } // listClientsHandler godoc @@ -365,19 +365,19 @@ func (oc *OidcController) listClientsHandler(c *gin.Context) { searchTerm := c.Query("search") var sortedPaginationRequest utils.SortedPaginationRequest if err := c.ShouldBindQuery(&sortedPaginationRequest); err != nil { - c.Error(err) + _ = c.Error(err) return } clients, pagination, err := oc.oidcService.ListClients(searchTerm, sortedPaginationRequest) if err != nil { - c.Error(err) + _ = c.Error(err) return } var clientsDto []dto.OidcClientDto if err := dto.MapStructList(clients, &clientsDto); err != nil { - c.Error(err) + _ = c.Error(err) return } @@ -400,19 +400,19 @@ func (oc *OidcController) listClientsHandler(c *gin.Context) { func (oc *OidcController) createClientHandler(c *gin.Context) { var input dto.OidcClientCreateDto if err := c.ShouldBindJSON(&input); err != nil { - c.Error(err) + _ = c.Error(err) return } client, err := oc.oidcService.CreateClient(input, c.GetString("userID")) if err != nil { - c.Error(err) + _ = c.Error(err) return } var clientDto dto.OidcClientWithAllowedUserGroupsDto if err := dto.MapStruct(client, &clientDto); err != nil { - c.Error(err) + _ = c.Error(err) return } @@ -430,7 +430,7 @@ func (oc *OidcController) createClientHandler(c *gin.Context) { func (oc *OidcController) deleteClientHandler(c *gin.Context) { err := oc.oidcService.DeleteClient(c.Param("id")) if err != nil { - c.Error(err) + _ = c.Error(err) return } @@ -451,19 +451,19 @@ func (oc *OidcController) deleteClientHandler(c *gin.Context) { func (oc *OidcController) updateClientHandler(c *gin.Context) { var input dto.OidcClientCreateDto if err := c.ShouldBindJSON(&input); err != nil { - c.Error(err) + _ = c.Error(err) return } client, err := oc.oidcService.UpdateClient(c.Param("id"), input) if err != nil { - c.Error(err) + _ = c.Error(err) return } var clientDto dto.OidcClientWithAllowedUserGroupsDto if err := dto.MapStruct(client, &clientDto); err != nil { - c.Error(err) + _ = c.Error(err) return } @@ -482,7 +482,7 @@ func (oc *OidcController) updateClientHandler(c *gin.Context) { func (oc *OidcController) createClientSecretHandler(c *gin.Context) { secret, err := oc.oidcService.CreateClientSecret(c.Param("id")) if err != nil { - c.Error(err) + _ = c.Error(err) return } @@ -502,7 +502,7 @@ func (oc *OidcController) createClientSecretHandler(c *gin.Context) { func (oc *OidcController) getClientLogoHandler(c *gin.Context) { imagePath, mimeType, err := oc.oidcService.GetClientLogo(c.Param("id")) if err != nil { - c.Error(err) + _ = c.Error(err) return } @@ -523,13 +523,13 @@ func (oc *OidcController) getClientLogoHandler(c *gin.Context) { func (oc *OidcController) updateClientLogoHandler(c *gin.Context) { file, err := c.FormFile("file") if err != nil { - c.Error(err) + _ = c.Error(err) return } err = oc.oidcService.UpdateClientLogo(c.Param("id"), file) if err != nil { - c.Error(err) + _ = c.Error(err) return } @@ -547,7 +547,7 @@ func (oc *OidcController) updateClientLogoHandler(c *gin.Context) { func (oc *OidcController) deleteClientLogoHandler(c *gin.Context) { err := oc.oidcService.DeleteClientLogo(c.Param("id")) if err != nil { - c.Error(err) + _ = c.Error(err) return } @@ -568,19 +568,19 @@ func (oc *OidcController) deleteClientLogoHandler(c *gin.Context) { func (oc *OidcController) updateAllowedUserGroupsHandler(c *gin.Context) { var input dto.OidcUpdateAllowedUserGroupsDto if err := c.ShouldBindJSON(&input); err != nil { - c.Error(err) + _ = c.Error(err) return } oidcClient, err := oc.oidcService.UpdateAllowedUserGroups(c.Param("id"), input) if err != nil { - c.Error(err) + _ = c.Error(err) return } var oidcClientDto dto.OidcClientDto if err := dto.MapStruct(oidcClient, &oidcClientDto); err != nil { - c.Error(err) + _ = c.Error(err) return } diff --git a/backend/internal/controller/test_controller.go b/backend/internal/controller/test_controller.go index f1c6ad3c..262c4d31 100644 --- a/backend/internal/controller/test_controller.go +++ b/backend/internal/controller/test_controller.go @@ -19,22 +19,22 @@ type TestController struct { func (tc *TestController) resetAndSeedHandler(c *gin.Context) { if err := tc.TestService.ResetDatabase(); err != nil { - c.Error(err) + _ = c.Error(err) return } if err := tc.TestService.ResetApplicationImages(); err != nil { - c.Error(err) + _ = c.Error(err) return } if err := tc.TestService.SeedDatabase(); err != nil { - c.Error(err) + _ = c.Error(err) return } if err := tc.TestService.ResetAppConfig(); err != nil { - c.Error(err) + _ = c.Error(err) return } diff --git a/backend/internal/controller/user_controller.go b/backend/internal/controller/user_controller.go index 4df986b4..b3f4303d 100644 --- a/backend/internal/controller/user_controller.go +++ b/backend/internal/controller/user_controller.go @@ -68,13 +68,13 @@ func (uc *UserController) getUserGroupsHandler(c *gin.Context) { userID := c.Param("id") groups, err := uc.userService.GetUserGroups(userID) if err != nil { - c.Error(err) + _ = c.Error(err) return } var groupsDto []dto.UserGroupDtoWithUsers if err := dto.MapStructList(groups, &groupsDto); err != nil { - c.Error(err) + _ = c.Error(err) return } @@ -96,19 +96,19 @@ func (uc *UserController) listUsersHandler(c *gin.Context) { searchTerm := c.Query("search") var sortedPaginationRequest utils.SortedPaginationRequest if err := c.ShouldBindQuery(&sortedPaginationRequest); err != nil { - c.Error(err) + _ = c.Error(err) return } users, pagination, err := uc.userService.ListUsers(searchTerm, sortedPaginationRequest) if err != nil { - c.Error(err) + _ = c.Error(err) return } var usersDto []dto.UserDto if err := dto.MapStructList(users, &usersDto); err != nil { - c.Error(err) + _ = c.Error(err) return } @@ -128,13 +128,13 @@ func (uc *UserController) listUsersHandler(c *gin.Context) { func (uc *UserController) getUserHandler(c *gin.Context) { user, err := uc.userService.GetUser(c.Param("id")) if err != nil { - c.Error(err) + _ = c.Error(err) return } var userDto dto.UserDto if err := dto.MapStruct(user, &userDto); err != nil { - c.Error(err) + _ = c.Error(err) return } @@ -150,13 +150,13 @@ func (uc *UserController) getUserHandler(c *gin.Context) { func (uc *UserController) getCurrentUserHandler(c *gin.Context) { user, err := uc.userService.GetUser(c.GetString("userID")) if err != nil { - c.Error(err) + _ = c.Error(err) return } var userDto dto.UserDto if err := dto.MapStruct(user, &userDto); err != nil { - c.Error(err) + _ = c.Error(err) return } @@ -172,7 +172,7 @@ func (uc *UserController) getCurrentUserHandler(c *gin.Context) { // @Router /api/users/{id} [delete] func (uc *UserController) deleteUserHandler(c *gin.Context) { if err := uc.userService.DeleteUser(c.Param("id")); err != nil { - c.Error(err) + _ = c.Error(err) return } @@ -189,19 +189,19 @@ func (uc *UserController) deleteUserHandler(c *gin.Context) { func (uc *UserController) createUserHandler(c *gin.Context) { var input dto.UserCreateDto if err := c.ShouldBindJSON(&input); err != nil { - c.Error(err) + _ = c.Error(err) return } user, err := uc.userService.CreateUser(input) if err != nil { - c.Error(err) + _ = c.Error(err) return } var userDto dto.UserDto if err := dto.MapStruct(user, &userDto); err != nil { - c.Error(err) + _ = c.Error(err) return } @@ -229,7 +229,7 @@ func (uc *UserController) updateUserHandler(c *gin.Context) { // @Router /api/users/me [put] func (uc *UserController) updateCurrentUserHandler(c *gin.Context) { if uc.appConfigService.DbConfig.AllowOwnAccountEdit.Value != "true" { - c.Error(&common.AccountEditNotAllowedError{}) + _ = c.Error(&common.AccountEditNotAllowedError{}) return } uc.updateUser(c, true) @@ -248,7 +248,7 @@ func (uc *UserController) getUserProfilePictureHandler(c *gin.Context) { picture, size, err := uc.userService.GetProfilePicture(userID) if err != nil { - c.Error(err) + _ = c.Error(err) return } @@ -271,18 +271,18 @@ func (uc *UserController) updateUserProfilePictureHandler(c *gin.Context) { userID := c.Param("id") fileHeader, err := c.FormFile("file") if err != nil { - c.Error(err) + _ = c.Error(err) return } file, err := fileHeader.Open() if err != nil { - c.Error(err) + _ = c.Error(err) return } defer file.Close() if err := uc.userService.UpdateProfilePicture(userID, file); err != nil { - c.Error(err) + _ = c.Error(err) return } @@ -302,18 +302,18 @@ func (uc *UserController) updateCurrentUserProfilePictureHandler(c *gin.Context) userID := c.GetString("userID") fileHeader, err := c.FormFile("file") if err != nil { - c.Error(err) + _ = c.Error(err) return } file, err := fileHeader.Open() if err != nil { - c.Error(err) + _ = c.Error(err) return } defer file.Close() if err := uc.userService.UpdateProfilePicture(userID, file); err != nil { - c.Error(err) + _ = c.Error(err) return } @@ -323,7 +323,7 @@ func (uc *UserController) updateCurrentUserProfilePictureHandler(c *gin.Context) func (uc *UserController) createOneTimeAccessTokenHandler(c *gin.Context, own bool) { var input dto.OneTimeAccessTokenCreateDto if err := c.ShouldBindJSON(&input); err != nil { - c.Error(err) + _ = c.Error(err) return } @@ -332,7 +332,7 @@ func (uc *UserController) createOneTimeAccessTokenHandler(c *gin.Context, own bo } token, err := uc.userService.CreateOneTimeAccessToken(input.UserID, input.ExpiresAt) if err != nil { - c.Error(err) + _ = c.Error(err) return } @@ -358,13 +358,13 @@ func (uc *UserController) createAdminOneTimeAccessTokenHandler(c *gin.Context) { func (uc *UserController) requestOneTimeAccessEmailHandler(c *gin.Context) { var input dto.OneTimeAccessEmailDto if err := c.ShouldBindJSON(&input); err != nil { - c.Error(err) + _ = c.Error(err) return } err := uc.userService.RequestOneTimeAccessEmail(input.Email, input.RedirectPath) if err != nil { - c.Error(err) + _ = c.Error(err) return } @@ -381,13 +381,13 @@ func (uc *UserController) requestOneTimeAccessEmailHandler(c *gin.Context) { func (uc *UserController) exchangeOneTimeAccessTokenHandler(c *gin.Context) { user, token, err := uc.userService.ExchangeOneTimeAccessToken(c.Param("token"), c.ClientIP(), c.Request.UserAgent()) if err != nil { - c.Error(err) + _ = c.Error(err) return } var userDto dto.UserDto if err := dto.MapStruct(user, &userDto); err != nil { - c.Error(err) + _ = c.Error(err) return } @@ -407,13 +407,13 @@ func (uc *UserController) exchangeOneTimeAccessTokenHandler(c *gin.Context) { func (uc *UserController) getSetupAccessTokenHandler(c *gin.Context) { user, token, err := uc.userService.SetupInitialAdmin() if err != nil { - c.Error(err) + _ = c.Error(err) return } var userDto dto.UserDto if err := dto.MapStruct(user, &userDto); err != nil { - c.Error(err) + _ = c.Error(err) return } @@ -435,19 +435,19 @@ func (uc *UserController) getSetupAccessTokenHandler(c *gin.Context) { func (uc *UserController) updateUserGroups(c *gin.Context) { var input dto.UserUpdateUserGroupDto if err := c.ShouldBindJSON(&input); err != nil { - c.Error(err) + _ = c.Error(err) return } user, err := uc.userService.UpdateUserGroups(c.Param("id"), input.UserGroupIds) if err != nil { - c.Error(err) + _ = c.Error(err) return } var userDto dto.UserDto if err := dto.MapStruct(user, &userDto); err != nil { - c.Error(err) + _ = c.Error(err) return } @@ -458,7 +458,7 @@ func (uc *UserController) updateUserGroups(c *gin.Context) { func (uc *UserController) updateUser(c *gin.Context, updateOwnUser bool) { var input dto.UserCreateDto if err := c.ShouldBindJSON(&input); err != nil { - c.Error(err) + _ = c.Error(err) return } @@ -471,13 +471,13 @@ func (uc *UserController) updateUser(c *gin.Context, updateOwnUser bool) { user, err := uc.userService.UpdateUser(userID, input, updateOwnUser, false) if err != nil { - c.Error(err) + _ = c.Error(err) return } var userDto dto.UserDto if err := dto.MapStruct(user, &userDto); err != nil { - c.Error(err) + _ = c.Error(err) return } @@ -496,7 +496,7 @@ func (uc *UserController) resetUserProfilePictureHandler(c *gin.Context) { userID := c.Param("id") if err := uc.userService.ResetProfilePicture(userID); err != nil { - c.Error(err) + _ = c.Error(err) return } @@ -514,7 +514,7 @@ func (uc *UserController) resetCurrentUserProfilePictureHandler(c *gin.Context) userID := c.GetString("userID") if err := uc.userService.ResetProfilePicture(userID); err != nil { - c.Error(err) + _ = c.Error(err) return } diff --git a/backend/internal/controller/user_group_controller.go b/backend/internal/controller/user_group_controller.go index da8bd34c..04865990 100644 --- a/backend/internal/controller/user_group_controller.go +++ b/backend/internal/controller/user_group_controller.go @@ -50,13 +50,13 @@ func (ugc *UserGroupController) list(c *gin.Context) { searchTerm := c.Query("search") var sortedPaginationRequest utils.SortedPaginationRequest if err := c.ShouldBindQuery(&sortedPaginationRequest); err != nil { - c.Error(err) + _ = c.Error(err) return } groups, pagination, err := ugc.UserGroupService.List(searchTerm, sortedPaginationRequest) if err != nil { - c.Error(err) + _ = c.Error(err) return } @@ -65,12 +65,12 @@ func (ugc *UserGroupController) list(c *gin.Context) { for i, group := range groups { var groupDto dto.UserGroupDtoWithUserCount if err := dto.MapStruct(group, &groupDto); err != nil { - c.Error(err) + _ = c.Error(err) return } groupDto.UserCount, err = ugc.UserGroupService.GetUserCountOfGroup(group.ID) if err != nil { - c.Error(err) + _ = c.Error(err) return } groupsDto[i] = groupDto @@ -95,13 +95,13 @@ func (ugc *UserGroupController) list(c *gin.Context) { func (ugc *UserGroupController) get(c *gin.Context) { group, err := ugc.UserGroupService.Get(c.Param("id")) if err != nil { - c.Error(err) + _ = c.Error(err) return } var groupDto dto.UserGroupDtoWithUsers if err := dto.MapStruct(group, &groupDto); err != nil { - c.Error(err) + _ = c.Error(err) return } @@ -121,19 +121,19 @@ func (ugc *UserGroupController) get(c *gin.Context) { func (ugc *UserGroupController) create(c *gin.Context) { var input dto.UserGroupCreateDto if err := c.ShouldBindJSON(&input); err != nil { - c.Error(err) + _ = c.Error(err) return } group, err := ugc.UserGroupService.Create(input) if err != nil { - c.Error(err) + _ = c.Error(err) return } var groupDto dto.UserGroupDtoWithUsers if err := dto.MapStruct(group, &groupDto); err != nil { - c.Error(err) + _ = c.Error(err) return } @@ -154,19 +154,19 @@ func (ugc *UserGroupController) create(c *gin.Context) { func (ugc *UserGroupController) update(c *gin.Context) { var input dto.UserGroupCreateDto if err := c.ShouldBindJSON(&input); err != nil { - c.Error(err) + _ = c.Error(err) return } group, err := ugc.UserGroupService.Update(c.Param("id"), input, false) if err != nil { - c.Error(err) + _ = c.Error(err) return } var groupDto dto.UserGroupDtoWithUsers if err := dto.MapStruct(group, &groupDto); err != nil { - c.Error(err) + _ = c.Error(err) return } @@ -185,7 +185,7 @@ func (ugc *UserGroupController) update(c *gin.Context) { // @Router /api/user-groups/{id} [delete] func (ugc *UserGroupController) delete(c *gin.Context) { if err := ugc.UserGroupService.Delete(c.Param("id")); err != nil { - c.Error(err) + _ = c.Error(err) return } @@ -206,19 +206,19 @@ func (ugc *UserGroupController) delete(c *gin.Context) { func (ugc *UserGroupController) updateUsers(c *gin.Context) { var input dto.UserGroupUpdateUsersDto if err := c.ShouldBindJSON(&input); err != nil { - c.Error(err) + _ = c.Error(err) return } group, err := ugc.UserGroupService.UpdateUsers(c.Param("id"), input.UserIDs) if err != nil { - c.Error(err) + _ = c.Error(err) return } var groupDto dto.UserGroupDtoWithUsers if err := dto.MapStruct(group, &groupDto); err != nil { - c.Error(err) + _ = c.Error(err) return } diff --git a/backend/internal/controller/webauthn_controller.go b/backend/internal/controller/webauthn_controller.go index ce7c49ea..e39dd695 100644 --- a/backend/internal/controller/webauthn_controller.go +++ b/backend/internal/controller/webauthn_controller.go @@ -40,7 +40,7 @@ func (wc *WebauthnController) beginRegistrationHandler(c *gin.Context) { userID := c.GetString("userID") options, err := wc.webAuthnService.BeginRegistration(userID) if err != nil { - c.Error(err) + _ = c.Error(err) return } @@ -51,20 +51,20 @@ func (wc *WebauthnController) beginRegistrationHandler(c *gin.Context) { func (wc *WebauthnController) verifyRegistrationHandler(c *gin.Context) { sessionID, err := c.Cookie(cookie.SessionIdCookieName) if err != nil { - c.Error(&common.MissingSessionIdError{}) + _ = c.Error(&common.MissingSessionIdError{}) return } userID := c.GetString("userID") credential, err := wc.webAuthnService.VerifyRegistration(sessionID, userID, c.Request) if err != nil { - c.Error(err) + _ = c.Error(err) return } var credentialDto dto.WebauthnCredentialDto if err := dto.MapStruct(credential, &credentialDto); err != nil { - c.Error(err) + _ = c.Error(err) return } @@ -74,7 +74,7 @@ func (wc *WebauthnController) verifyRegistrationHandler(c *gin.Context) { func (wc *WebauthnController) beginLoginHandler(c *gin.Context) { options, err := wc.webAuthnService.BeginLogin() if err != nil { - c.Error(err) + _ = c.Error(err) return } @@ -85,25 +85,25 @@ func (wc *WebauthnController) beginLoginHandler(c *gin.Context) { func (wc *WebauthnController) verifyLoginHandler(c *gin.Context) { sessionID, err := c.Cookie(cookie.SessionIdCookieName) if err != nil { - c.Error(&common.MissingSessionIdError{}) + _ = c.Error(&common.MissingSessionIdError{}) return } credentialAssertionData, err := protocol.ParseCredentialRequestResponseBody(c.Request.Body) if err != nil { - c.Error(err) + _ = c.Error(err) return } user, token, err := wc.webAuthnService.VerifyLogin(sessionID, credentialAssertionData, c.ClientIP(), c.Request.UserAgent()) if err != nil { - c.Error(err) + _ = c.Error(err) return } var userDto dto.UserDto if err := dto.MapStruct(user, &userDto); err != nil { - c.Error(err) + _ = c.Error(err) return } @@ -118,13 +118,13 @@ func (wc *WebauthnController) listCredentialsHandler(c *gin.Context) { userID := c.GetString("userID") credentials, err := wc.webAuthnService.ListCredentials(userID) if err != nil { - c.Error(err) + _ = c.Error(err) return } var credentialDtos []dto.WebauthnCredentialDto if err := dto.MapStructList(credentials, &credentialDtos); err != nil { - c.Error(err) + _ = c.Error(err) return } @@ -137,7 +137,7 @@ func (wc *WebauthnController) deleteCredentialHandler(c *gin.Context) { err := wc.webAuthnService.DeleteCredential(userID, credentialID) if err != nil { - c.Error(err) + _ = c.Error(err) return } @@ -150,19 +150,19 @@ func (wc *WebauthnController) updateCredentialHandler(c *gin.Context) { var input dto.WebauthnCredentialUpdateDto if err := c.ShouldBindJSON(&input); err != nil { - c.Error(err) + _ = c.Error(err) return } credential, err := wc.webAuthnService.UpdateCredential(userID, credentialID, input.Name) if err != nil { - c.Error(err) + _ = c.Error(err) return } var credentialDto dto.WebauthnCredentialDto if err := dto.MapStruct(credential, &credentialDto); err != nil { - c.Error(err) + _ = c.Error(err) return } diff --git a/backend/internal/controller/well_known_controller.go b/backend/internal/controller/well_known_controller.go index 3019e3eb..dc9d368b 100644 --- a/backend/internal/controller/well_known_controller.go +++ b/backend/internal/controller/well_known_controller.go @@ -32,7 +32,7 @@ type WellKnownController struct { func (wkc *WellKnownController) jwksHandler(c *gin.Context) { jwks, err := wkc.jwtService.GetPublicJWKSAsJSON() if err != nil { - c.Error(err) + _ = c.Error(err) return } diff --git a/backend/internal/dto/dto_mapper.go b/backend/internal/dto/dto_mapper.go index d1b48578..ba00ca6f 100644 --- a/backend/internal/dto/dto_mapper.go +++ b/backend/internal/dto/dto_mapper.go @@ -40,13 +40,11 @@ func MapStruct[S any, D any](source S, destination *D) error { } func mapStructInternal(sourceVal reflect.Value, destVal reflect.Value) error { - // Loop through the fields of the destination struct for i := 0; i < destVal.NumField(); i++ { destField := destVal.Field(i) destFieldType := destVal.Type().Field(i) if destFieldType.Anonymous { - // Recursively handle embedded structs if err := mapStructInternal(sourceVal, destField); err != nil { return err } @@ -55,63 +53,57 @@ func mapStructInternal(sourceVal reflect.Value, destVal reflect.Value) error { sourceField := sourceVal.FieldByName(destFieldType.Name) - // If the source field is valid and can be assigned to the destination field if sourceField.IsValid() && destField.CanSet() { - // Handle direct assignment for simple types - if sourceField.Type() == destField.Type() { - destField.Set(sourceField) - - } else if sourceField.Kind() == reflect.Slice && destField.Kind() == reflect.Slice { - // Handle slices - if sourceField.Type().Elem() == destField.Type().Elem() { - // Direct assignment for slices of primitive types or non-struct elements - newSlice := reflect.MakeSlice(destField.Type(), sourceField.Len(), sourceField.Cap()) - - for j := 0; j < sourceField.Len(); j++ { - newSlice.Index(j).Set(sourceField.Index(j)) - } - - destField.Set(newSlice) - - } else if sourceField.Type().Elem().Kind() == reflect.Struct && destField.Type().Elem().Kind() == reflect.Struct { - // Recursively map slices of structs - newSlice := reflect.MakeSlice(destField.Type(), sourceField.Len(), sourceField.Cap()) - - for j := 0; j < sourceField.Len(); j++ { - // Get the element from both source and destination slice - sourceElem := sourceField.Index(j) - destElem := reflect.New(destField.Type().Elem()).Elem() - - // Recursively map the struct elements - if err := mapStructInternal(sourceElem, destElem); err != nil { - return err - } - - // Set the mapped element in the new slice - newSlice.Index(j).Set(destElem) - } - - destField.Set(newSlice) - } - } else if sourceField.Kind() == reflect.Struct && destField.Kind() == reflect.Struct { - // Recursively map nested structs - if err := mapStructInternal(sourceField, destField); err != nil { - return err - } - } else { - // Type switch for specific type conversions - switch sourceField.Interface().(type) { - case datatype.DateTime: - // Convert datatype.DateTime to time.Time - if sourceField.Type() == reflect.TypeOf(datatype.DateTime{}) && destField.Type() == reflect.TypeOf(time.Time{}) { - dateValue := sourceField.Interface().(datatype.DateTime) - destField.Set(reflect.ValueOf(dateValue.ToTime())) - } - } + if err := mapField(sourceField, destField); err != nil { + return err } - } } - + return nil +} + +func mapField(sourceField reflect.Value, destField reflect.Value) error { + if sourceField.Type() == destField.Type() { + destField.Set(sourceField) + } else if sourceField.Kind() == reflect.Slice && destField.Kind() == reflect.Slice { + return mapSlice(sourceField, destField) + } else if sourceField.Kind() == reflect.Struct && destField.Kind() == reflect.Struct { + return mapStructInternal(sourceField, destField) + } else { + return mapSpecialTypes(sourceField, destField) + } + return nil +} + +func mapSlice(sourceField reflect.Value, destField reflect.Value) error { + if sourceField.Type().Elem() == destField.Type().Elem() { + newSlice := reflect.MakeSlice(destField.Type(), sourceField.Len(), sourceField.Cap()) + for j := 0; j < sourceField.Len(); j++ { + newSlice.Index(j).Set(sourceField.Index(j)) + } + destField.Set(newSlice) + } else if sourceField.Type().Elem().Kind() == reflect.Struct && destField.Type().Elem().Kind() == reflect.Struct { + newSlice := reflect.MakeSlice(destField.Type(), sourceField.Len(), sourceField.Cap()) + for j := 0; j < sourceField.Len(); j++ { + sourceElem := sourceField.Index(j) + destElem := reflect.New(destField.Type().Elem()).Elem() + if err := mapStructInternal(sourceElem, destElem); err != nil { + return err + } + newSlice.Index(j).Set(destElem) + } + destField.Set(newSlice) + } + return nil +} + +func mapSpecialTypes(sourceField reflect.Value, destField reflect.Value) error { + switch sourceField.Interface().(type) { + case datatype.DateTime: + if sourceField.Type() == reflect.TypeOf(datatype.DateTime{}) && destField.Type() == reflect.TypeOf(time.Time{}) { + dateValue := sourceField.Interface().(datatype.DateTime) + destField.Set(reflect.ValueOf(dateValue.ToTime())) + } + } return nil } diff --git a/backend/internal/middleware/api_key_auth.go b/backend/internal/middleware/api_key_auth.go index 79b32ee7..4464c5f3 100644 --- a/backend/internal/middleware/api_key_auth.go +++ b/backend/internal/middleware/api_key_auth.go @@ -23,7 +23,7 @@ func (m *ApiKeyAuthMiddleware) Add(adminRequired bool) gin.HandlerFunc { userID, isAdmin, err := m.Verify(c, adminRequired) if err != nil { c.Abort() - c.Error(err) + _ = c.Error(err) return } diff --git a/backend/internal/middleware/auth_middleware.go b/backend/internal/middleware/auth_middleware.go index 29b8ea8f..7b0ac61b 100644 --- a/backend/internal/middleware/auth_middleware.go +++ b/backend/internal/middleware/auth_middleware.go @@ -84,6 +84,6 @@ func (m *AuthMiddleware) Add() gin.HandlerFunc { // Both JWT and API key auth failed c.Abort() - c.Error(err) + _ = c.Error(err) } } diff --git a/backend/internal/middleware/file_size_limit.go b/backend/internal/middleware/file_size_limit.go index d393ab44..c5581ac1 100644 --- a/backend/internal/middleware/file_size_limit.go +++ b/backend/internal/middleware/file_size_limit.go @@ -19,7 +19,7 @@ func (m *FileSizeLimitMiddleware) Add(maxSize int64) gin.HandlerFunc { c.Request.Body = http.MaxBytesReader(c.Writer, c.Request.Body, maxSize) if err := c.Request.ParseMultipartForm(maxSize); err != nil { err = &common.FileTooLargeError{MaxSize: formatFileSize(maxSize)} - c.Error(err) + _ = c.Error(err) c.Abort() return } diff --git a/backend/internal/middleware/jwt_auth.go b/backend/internal/middleware/jwt_auth.go index 572f14c1..b67cd1eb 100644 --- a/backend/internal/middleware/jwt_auth.go +++ b/backend/internal/middleware/jwt_auth.go @@ -23,7 +23,7 @@ func (m *JwtAuthMiddleware) Add(adminRequired bool) gin.HandlerFunc { userID, isAdmin, err := m.Verify(c, adminRequired) if err != nil { c.Abort() - c.Error(err) + _ = c.Error(err) return } diff --git a/backend/internal/middleware/rate_limit.go b/backend/internal/middleware/rate_limit.go index 53fac976..2d9386d1 100644 --- a/backend/internal/middleware/rate_limit.go +++ b/backend/internal/middleware/rate_limit.go @@ -36,7 +36,7 @@ func (m *RateLimitMiddleware) Add(limit rate.Limit, burst int) gin.HandlerFunc { limiter := getLimiter(ip, limit, burst, &mu, clients) if !limiter.Allow() { - c.Error(&common.TooManyRequestsError{}) + _ = c.Error(&common.TooManyRequestsError{}) c.Abort() return } diff --git a/backend/internal/model/audit_log.go b/backend/internal/model/audit_log.go index bef022be..d255a0a8 100644 --- a/backend/internal/model/audit_log.go +++ b/backend/internal/model/audit_log.go @@ -18,9 +18,9 @@ type AuditLog struct { Data AuditLogData } -type AuditLogData map[string]string +type AuditLogData map[string]string //nolint:recvcheck -type AuditLogEvent string +type AuditLogEvent string //nolint:recvcheck const ( AuditLogEventSignIn AuditLogEvent = "SIGN_IN" @@ -48,6 +48,6 @@ func (d *AuditLogData) Scan(value interface{}) error { } } -func (d AuditLogData) Value() (driver.Value, error) { +func (d *AuditLogData) Value() (driver.Value, error) { return json.Marshal(d) } diff --git a/backend/internal/model/oidc.go b/backend/internal/model/oidc.go index d2d950b3..7a138b1a 100644 --- a/backend/internal/model/oidc.go +++ b/backend/internal/model/oidc.go @@ -71,7 +71,7 @@ func (c *OidcClient) AfterFind(_ *gorm.DB) (err error) { return nil } -type UrlList []string +type UrlList []string //nolint:recvcheck func (cu *UrlList) Scan(value interface{}) error { if v, ok := value.([]byte); ok { diff --git a/backend/internal/model/webauthn.go b/backend/internal/model/webauthn.go index 47b171a2..1991e40d 100644 --- a/backend/internal/model/webauthn.go +++ b/backend/internal/model/webauthn.go @@ -45,7 +45,7 @@ type PublicKeyCredentialRequestOptions struct { Timeout time.Duration } -type AuthenticatorTransportList []protocol.AuthenticatorTransport +type AuthenticatorTransportList []protocol.AuthenticatorTransport //nolint:recvcheck // Scan and Value methods for GORM to handle the custom type func (atl *AuthenticatorTransportList) Scan(value interface{}) error { diff --git a/backend/internal/service/oidc_service.go b/backend/internal/service/oidc_service.go index 112f0e57..5587d8d5 100644 --- a/backend/internal/service/oidc_service.go +++ b/backend/internal/service/oidc_service.go @@ -492,9 +492,8 @@ func (s *OidcService) GetUserClaimsForClient(userID string, clientID string) (ma for _, customClaim := range customClaims { // The value of the custom claim can be a JSON object or a string var jsonValue interface{} - //nolint:errcheck // Ignore error for JSON unmarshalling - json.Unmarshal([]byte(customClaim.Value), &jsonValue) - if jsonValue != nil { + err := json.Unmarshal([]byte(customClaim.Value), &jsonValue) + if err == nil { // It's JSON so we store it as an object claims[customClaim.Key] = jsonValue } else {