diff --git a/backend/internal/bootstrap/bootstrap.go b/backend/internal/bootstrap/bootstrap.go index 7fb4a8a9..cba2250b 100644 --- a/backend/internal/bootstrap/bootstrap.go +++ b/backend/internal/bootstrap/bootstrap.go @@ -27,7 +27,10 @@ func Bootstrap(ctx context.Context) error { } // Connect to the database - db := NewDatabase() + db, err := NewDatabase() + if err != nil { + return fmt.Errorf("failed to initialize database: %w", err) + } // Create all services svc, err := initServices(ctx, db, httpClient) diff --git a/backend/internal/bootstrap/db_bootstrap.go b/backend/internal/bootstrap/db_bootstrap.go index a3d08cfc..14e6bbe1 100644 --- a/backend/internal/bootstrap/db_bootstrap.go +++ b/backend/internal/bootstrap/db_bootstrap.go @@ -3,7 +3,6 @@ package bootstrap import ( "errors" "fmt" - "log" "log/slog" "net/url" "strings" @@ -25,14 +24,14 @@ import ( "github.com/pocket-id/pocket-id/backend/resources" ) -func NewDatabase() (db *gorm.DB) { - db, err := connectDatabase() +func NewDatabase() (db *gorm.DB, err error) { + db, err = connectDatabase() if err != nil { - log.Fatalf("failed to connect to database: %v", err) + return nil, fmt.Errorf("failed to connect to database: %w", err) } sqlDb, err := db.DB() if err != nil { - log.Fatalf("failed to get sql.DB: %v", err) + return nil, fmt.Errorf("failed to get sql.DB: %w", err) } // Choose the correct driver for the database provider @@ -44,18 +43,18 @@ func NewDatabase() (db *gorm.DB) { driver, err = postgresMigrate.WithInstance(sqlDb, &postgresMigrate.Config{}) default: // Should never happen at this point - log.Fatalf("unsupported database provider: %s", common.EnvConfig.DbProvider) + return nil, fmt.Errorf("unsupported database provider: %s", common.EnvConfig.DbProvider) } if err != nil { - log.Fatalf("failed to create migration driver: %v", err) + return nil, fmt.Errorf("failed to create migration driver: %w", err) } // Run migrations if err := migrateDatabase(driver); err != nil { - log.Fatalf("failed to run migrations: %v", err) + return nil, fmt.Errorf("failed to run migrations: %w", err) } - return db + return db, nil } func migrateDatabase(driver database.Driver) error { diff --git a/backend/internal/bootstrap/e2etest_router_bootstrap.go b/backend/internal/bootstrap/e2etest_router_bootstrap.go index e16bdc9f..434ba223 100644 --- a/backend/internal/bootstrap/e2etest_router_bootstrap.go +++ b/backend/internal/bootstrap/e2etest_router_bootstrap.go @@ -3,7 +3,8 @@ package bootstrap import ( - "log" + "log/slog" + "os" "github.com/gin-gonic/gin" "gorm.io/gorm" @@ -18,7 +19,8 @@ func init() { func(apiGroup *gin.RouterGroup, db *gorm.DB, svc *services) { testService, err := service.NewTestService(db, svc.appConfigService, svc.jwtService, svc.ldapService) if err != nil { - log.Fatalf("failed to initialize test service: %v", err) + slog.Error("Failed to initialize test service", slog.Any("error", err)) + os.Exit(1) return } diff --git a/backend/internal/bootstrap/services_bootstrap.go b/backend/internal/bootstrap/services_bootstrap.go index 8502b9bf..a379124f 100644 --- a/backend/internal/bootstrap/services_bootstrap.go +++ b/backend/internal/bootstrap/services_bootstrap.go @@ -29,7 +29,10 @@ type services struct { func initServices(ctx context.Context, db *gorm.DB, httpClient *http.Client) (svc *services, err error) { svc = &services{} - svc.appConfigService = service.NewAppConfigService(ctx, db) + svc.appConfigService, err = service.NewAppConfigService(ctx, db) + if err != nil { + return nil, fmt.Errorf("failed to create app config service: %w", err) + } svc.emailService, err = service.NewEmailService(db, svc.appConfigService) if err != nil { @@ -54,7 +57,11 @@ func initServices(ctx context.Context, db *gorm.DB, httpClient *http.Client) (sv svc.userGroupService = service.NewUserGroupService(db, svc.appConfigService) svc.ldapService = service.NewLdapService(db, httpClient, svc.appConfigService, svc.userService, svc.userGroupService) svc.apiKeyService = service.NewApiKeyService(db, svc.emailService) - svc.webauthnService = service.NewWebAuthnService(db, svc.jwtService, svc.auditLogService, svc.appConfigService) + + svc.webauthnService, err = service.NewWebAuthnService(db, svc.jwtService, svc.auditLogService, svc.appConfigService) + if err != nil { + return nil, fmt.Errorf("failed to create WebAuthn service: %w", err) + } return svc, nil } diff --git a/backend/internal/cmds/key_rotate.go b/backend/internal/cmds/key_rotate.go index 5e29f7d3..1a219b7d 100644 --- a/backend/internal/cmds/key_rotate.go +++ b/backend/internal/cmds/key_rotate.go @@ -30,7 +30,10 @@ func init() { Use: "key-rotate", Short: "Generates a new token signing key and replaces the current one", RunE: func(cmd *cobra.Command, args []string) error { - db := bootstrap.NewDatabase() + db, err := bootstrap.NewDatabase() + if err != nil { + return err + } return keyRotate(cmd.Context(), flags, db, &common.EnvConfig) }, @@ -80,7 +83,10 @@ func keyRotate(ctx context.Context, flags keyRotateFlags, db *gorm.DB, envConfig } // Init the services we need - appConfigService := service.NewAppConfigService(ctx, db) + appConfigService, err := service.NewAppConfigService(ctx, db) + if err != nil { + return fmt.Errorf("failed to create app config service: %w", err) + } // Get the key provider keyProvider, err := jwkutils.GetKeyProvider(db, envConfig, appConfigService.GetDbConfig().InstanceID.Value) diff --git a/backend/internal/cmds/key_rotate_test.go b/backend/internal/cmds/key_rotate_test.go index cd020a34..e7ecd47f 100644 --- a/backend/internal/cmds/key_rotate_test.go +++ b/backend/internal/cmds/key_rotate_test.go @@ -97,7 +97,8 @@ func testKeyRotateWithFileStorage(t *testing.T, flags keyRotateFlags, wantErr bo db := testingutils.NewDatabaseForTest(t) // Initialize app config service and create instance - appConfigService := service.NewAppConfigService(t.Context(), db) + appConfigService, err := service.NewAppConfigService(t.Context(), db) + require.NoError(t, err) instanceID := appConfigService.GetDbConfig().InstanceID.Value // Check if key exists before rotation @@ -147,7 +148,8 @@ func testKeyRotateWithDatabaseStorage(t *testing.T, flags keyRotateFlags, wantEr db := testingutils.NewDatabaseForTest(t) // Initialize app config service and create instance - appConfigService := service.NewAppConfigService(t.Context(), db) + appConfigService, err := service.NewAppConfigService(t.Context(), db) + require.NoError(t, err) instanceID := appConfigService.GetDbConfig().InstanceID.Value // Get key provider diff --git a/backend/internal/cmds/one_time_access_token.go b/backend/internal/cmds/one_time_access_token.go index 65b94e87..6b9804a5 100644 --- a/backend/internal/cmds/one_time_access_token.go +++ b/backend/internal/cmds/one_time_access_token.go @@ -24,11 +24,14 @@ var oneTimeAccessTokenCmd = &cobra.Command{ userArg := args[0] // Connect to the database - db := bootstrap.NewDatabase() + db, err := bootstrap.NewDatabase() + if err != nil { + return err + } // Create the access token var oneTimeAccessToken *model.OneTimeAccessToken - err := db.Transaction(func(tx *gorm.DB) error { + err = db.Transaction(func(tx *gorm.DB) error { // Load the user to retrieve the user ID var user model.User queryCtx, queryCancel := context.WithTimeout(cmd.Context(), 10*time.Second) diff --git a/backend/internal/common/env_config.go b/backend/internal/common/env_config.go index 1ec0eb3d..17528865 100644 --- a/backend/internal/common/env_config.go +++ b/backend/internal/common/env_config.go @@ -3,8 +3,9 @@ package common import ( "errors" "fmt" - "log" + "log/slog" "net/url" + "os" "github.com/caarlos0/env/v11" _ "github.com/joho/godotenv/autoload" @@ -57,7 +58,8 @@ var EnvConfig = defaultConfig() func init() { err := parseEnvConfig() if err != nil { - log.Fatalf("Configuration error: %v", err) + slog.Error("Configuration error", slog.Any("error", err)) + os.Exit(1) } } diff --git a/backend/internal/controller/e2etest_controller.go b/backend/internal/controller/e2etest_controller.go index 4e5e791c..54d74e2c 100644 --- a/backend/internal/controller/e2etest_controller.go +++ b/backend/internal/controller/e2etest_controller.go @@ -40,7 +40,7 @@ func (tc *TestController) resetAndSeedHandler(c *gin.Context) { return } - if err := tc.TestService.ResetApplicationImages(); err != nil { + if err := tc.TestService.ResetApplicationImages(c.Request.Context()); err != nil { _ = c.Error(err) return } diff --git a/backend/internal/controller/well_known_controller.go b/backend/internal/controller/well_known_controller.go index e8f01746..4d5a2cf2 100644 --- a/backend/internal/controller/well_known_controller.go +++ b/backend/internal/controller/well_known_controller.go @@ -3,8 +3,9 @@ package controller import ( "encoding/json" "fmt" - "log" + "log/slog" "net/http" + "os" "github.com/gin-gonic/gin" @@ -23,7 +24,9 @@ func NewWellKnownController(group *gin.RouterGroup, jwtService *service.JwtServi var err error wkc.oidcConfig, err = wkc.computeOIDCConfiguration() if err != nil { - log.Fatalf("Failed to pre-compute OpenID Connect configuration document: %v", err) + slog.Error("Failed to pre-compute OpenID Connect configuration document", slog.Any("error", err)) + os.Exit(1) + return } group.GET("/.well-known/jwks.json", wkc.jwksHandler) diff --git a/backend/internal/dto/validations.go b/backend/internal/dto/validations.go index 1313c9b9..b98ac27d 100644 --- a/backend/internal/dto/validations.go +++ b/backend/internal/dto/validations.go @@ -1,7 +1,8 @@ package dto import ( - "log" + "log/slog" + "os" "regexp" "github.com/gin-gonic/gin/binding" @@ -18,9 +19,11 @@ var validateUsername validator.Func = func(fl validator.FieldLevel) bool { } func init() { - if v, ok := binding.Validator.Engine().(*validator.Validate); ok { - if err := v.RegisterValidation("username", validateUsername); err != nil { - log.Fatalf("Failed to register custom validation: %v", err) - } + v, _ := binding.Validator.Engine().(*validator.Validate) + err := v.RegisterValidation("username", validateUsername) + if err != nil { + slog.Error("Failed to register custom validation", slog.Any("error", err)) + os.Exit(1) + return } } diff --git a/backend/internal/service/app_config_service.go b/backend/internal/service/app_config_service.go index 7df3c9bc..81422e44 100644 --- a/backend/internal/service/app_config_service.go +++ b/backend/internal/service/app_config_service.go @@ -4,7 +4,6 @@ import ( "context" "errors" "fmt" - "log" "mime/multipart" "os" "reflect" @@ -28,22 +27,22 @@ type AppConfigService struct { db *gorm.DB } -func NewAppConfigService(ctx context.Context, db *gorm.DB) *AppConfigService { +func NewAppConfigService(ctx context.Context, db *gorm.DB) (*AppConfigService, error) { service := &AppConfigService{ db: db, } err := service.LoadDbConfig(ctx) if err != nil { - log.Fatalf("Failed to initialize app config service: %v", err) + return nil, fmt.Errorf("failed to initialize app config service: %w", err) } err = service.initInstanceID(ctx) if err != nil { - log.Fatalf("Failed to initialize instance ID: %v", err) + return nil, fmt.Errorf("failed to initialize instance ID: %w", err) } - return service + return service, nil } // GetDbConfig returns the application configuration. diff --git a/backend/internal/service/audit_log_service.go b/backend/internal/service/audit_log_service.go index 3f31d5ca..fb5ceec7 100644 --- a/backend/internal/service/audit_log_service.go +++ b/backend/internal/service/audit_log_service.go @@ -22,7 +22,12 @@ type AuditLogService struct { } func NewAuditLogService(db *gorm.DB, appConfigService *AppConfigService, emailService *EmailService, geoliteService *GeoLiteService) *AuditLogService { - return &AuditLogService{db: db, appConfigService: appConfigService, emailService: emailService, geoliteService: geoliteService} + return &AuditLogService{ + db: db, + appConfigService: appConfigService, + emailService: emailService, + geoliteService: geoliteService, + } } // Create creates a new audit log entry in the database diff --git a/backend/internal/service/e2etest_service.go b/backend/internal/service/e2etest_service.go index b7632e3a..9043a954 100644 --- a/backend/internal/service/e2etest_service.go +++ b/backend/internal/service/e2etest_service.go @@ -10,7 +10,7 @@ import ( "crypto/x509" "encoding/base64" "fmt" - "log" + "log/slog" "os" "path/filepath" "time" @@ -402,9 +402,9 @@ func (s *TestService) ResetDatabase() error { return err } -func (s *TestService) ResetApplicationImages() error { +func (s *TestService) ResetApplicationImages(ctx context.Context) error { if err := os.RemoveAll(common.EnvConfig.UploadPath); err != nil { - log.Printf("Error removing directory: %v", err) + slog.ErrorContext(ctx, "Error removing directory", slog.Any("error", err)) return err } diff --git a/backend/internal/service/geolite_service.go b/backend/internal/service/geolite_service.go index fdc87c0a..3ce847e4 100644 --- a/backend/internal/service/geolite_service.go +++ b/backend/internal/service/geolite_service.go @@ -57,7 +57,8 @@ func NewGeoLiteService(httpClient *http.Client) *GeoLiteService { } // Initialize IPv6 local ranges - if err := service.initializeIPv6LocalRanges(); err != nil { + err := service.initializeIPv6LocalRanges() + if err != nil { slog.Warn("Failed to initialize IPv6 local ranges", slog.Any("error", err)) } diff --git a/backend/internal/service/ldap_service.go b/backend/internal/service/ldap_service.go index 52ff9ffd..9567503c 100644 --- a/backend/internal/service/ldap_service.go +++ b/backend/internal/service/ldap_service.go @@ -8,7 +8,6 @@ import ( "errors" "fmt" "io" - "log" "log/slog" "net/http" "net/url" @@ -169,13 +168,13 @@ func (s *LdapService) SyncGroups(ctx context.Context, tx *gorm.DB, client *ldap. userResult, err := client.Search(userSearchReq) if err != nil || len(userResult.Entries) == 0 { - log.Printf("Could not resolve group member DN '%s': %v", member, err) + slog.WarnContext(ctx, "Could not resolve group member DN", slog.String("member", member), slog.Any("error", err)) continue } username = userResult.Entries[0].GetAttributeValue(dbConfig.LdapAttributeUserUsername.Value) if username == "" { - log.Printf("Could not extract username from group member DN '%s'", member) + slog.WarnContext(ctx, "Could not extract username from group member DN", slog.String("member", member)) continue } } diff --git a/backend/internal/service/oidc_service.go b/backend/internal/service/oidc_service.go index fadfc68a..209837c0 100644 --- a/backend/internal/service/oidc_service.go +++ b/backend/internal/service/oidc_service.go @@ -8,7 +8,6 @@ import ( "encoding/json" "errors" "fmt" - "log" "log/slog" "mime/multipart" "net/http" @@ -1180,9 +1179,13 @@ func (s *OidcService) VerifyDeviceCode(ctx context.Context, userCode string, use }() var deviceAuth model.OidcDeviceCode - if err := tx.WithContext(ctx).Preload("Client.AllowedUserGroups").First(&deviceAuth, "user_code = ?", userCode).Error; err != nil { - log.Printf("Error finding device code with user_code %s: %v", userCode, err) - return err + err := tx. + WithContext(ctx). + Preload("Client.AllowedUserGroups"). + First(&deviceAuth, "user_code = ?", userCode). + Error + if err != nil { + return fmt.Errorf("error finding device code: %w", err) } if time.Now().After(deviceAuth.ExpiresAt.ToTime()) { @@ -1191,17 +1194,26 @@ func (s *OidcService) VerifyDeviceCode(ctx context.Context, userCode string, use // Check if the user group is allowed to authorize the client var user model.User - if err := tx.WithContext(ctx).Preload("UserGroups").First(&user, "id = ?", userID).Error; err != nil { - return err + err = tx. + WithContext(ctx). + Preload("UserGroups"). + First(&user, "id = ?", userID). + Error + if err != nil { + return fmt.Errorf("error finding user groups: %w", err) } if !s.IsUserGroupAllowedToAuthorize(user, deviceAuth.Client) { return &common.OidcAccessDeniedError{} } - if err := tx.WithContext(ctx).Preload("Client").First(&deviceAuth, "user_code = ?", userCode).Error; err != nil { - log.Printf("Error finding device code with user_code %s: %v", userCode, err) - return err + err = tx. + WithContext(ctx). + Preload("Client"). + First(&deviceAuth, "user_code = ?", userCode). + Error + if err != nil { + return fmt.Errorf("error finding device code: %w", err) } if time.Now().After(deviceAuth.ExpiresAt.ToTime()) { @@ -1211,16 +1223,12 @@ func (s *OidcService) VerifyDeviceCode(ctx context.Context, userCode string, use deviceAuth.UserID = &userID deviceAuth.IsAuthorized = true - if err := tx.WithContext(ctx).Save(&deviceAuth).Error; err != nil { - log.Printf("Error saving device auth: %v", err) - return err - } - - // Verify the update was successful - var verifiedAuth model.OidcDeviceCode - if err := tx.WithContext(ctx).First(&verifiedAuth, "device_code = ?", deviceAuth.DeviceCode).Error; err != nil { - log.Printf("Error verifying update: %v", err) - return err + err = tx. + WithContext(ctx). + Save(&deviceAuth). + Error + if err != nil { + return fmt.Errorf("error saving device auth: %w", err) } // Create user authorization if needed @@ -1229,15 +1237,16 @@ func (s *OidcService) VerifyDeviceCode(ctx context.Context, userCode string, use return err } + auditLogData := model.AuditLogData{"clientName": deviceAuth.Client.Name} if !hasAuthorizedClient { - err := s.createAuthorizedClientInternal(ctx, userID, deviceAuth.ClientID, deviceAuth.Scope, tx) + err = s.createAuthorizedClientInternal(ctx, userID, deviceAuth.ClientID, deviceAuth.Scope, tx) if err != nil { return err } - s.auditLogService.Create(ctx, model.AuditLogEventNewDeviceCodeAuthorization, ipAddress, userAgent, userID, model.AuditLogData{"clientName": deviceAuth.Client.Name}, tx) + s.auditLogService.Create(ctx, model.AuditLogEventNewDeviceCodeAuthorization, ipAddress, userAgent, userID, auditLogData, tx) } else { - s.auditLogService.Create(ctx, model.AuditLogEventDeviceCodeAuthorization, ipAddress, userAgent, userID, model.AuditLogData{"clientName": deviceAuth.Client.Name}, tx) + s.auditLogService.Create(ctx, model.AuditLogEventDeviceCodeAuthorization, ipAddress, userAgent, userID, auditLogData, tx) } return tx.Commit().Error @@ -1428,7 +1437,7 @@ func (s *OidcService) verifyClientCredentialsInternal(ctx context.Context, tx *g case isClientAssertion: err = s.verifyClientAssertionFromFederatedIdentities(ctx, client, input) if err != nil { - log.Printf("Invalid assertion for client '%s': %v", client.ID, err) + slog.WarnContext(ctx, "Invalid assertion for client", slog.String("client", client.ID), slog.Any("error", err)) return nil, &common.OidcClientAssertionInvalidError{} } return client, nil diff --git a/backend/internal/service/user_service.go b/backend/internal/service/user_service.go index 30527fd8..1ed1795c 100644 --- a/backend/internal/service/user_service.go +++ b/backend/internal/service/user_service.go @@ -6,7 +6,6 @@ import ( "errors" "fmt" "io" - "log" "log/slog" "net/url" "os" @@ -35,7 +34,13 @@ type UserService struct { } func NewUserService(db *gorm.DB, jwtService *JwtService, auditLogService *AuditLogService, emailService *EmailService, appConfigService *AppConfigService) *UserService { - return &UserService{db: db, jwtService: jwtService, auditLogService: auditLogService, emailService: emailService, appConfigService: appConfigService} + return &UserService{ + db: db, + jwtService: jwtService, + auditLogService: auditLogService, + emailService: emailService, + appConfigService: appConfigService, + } } func (s *UserService) ListUsers(ctx context.Context, searchTerm string, sortedPaginationRequest utils.SortedPaginationRequest) ([]model.User, utils.PaginationResponse, error) { @@ -47,7 +52,8 @@ func (s *UserService) ListUsers(ctx context.Context, searchTerm string, sortedPa if searchTerm != "" { searchPattern := "%" + searchTerm + "%" - query = query.Where("email LIKE ? OR first_name LIKE ? OR last_name LIKE ? OR username LIKE ?", + query = query.Where( + "email LIKE ? OR first_name LIKE ? OR last_name LIKE ? OR username LIKE ?", searchPattern, searchPattern, searchPattern, searchPattern) } @@ -120,13 +126,14 @@ func (s *UserService) GetProfilePicture(ctx context.Context, userID string) (io. defaultPictureBytes := defaultPicture.Bytes() go func() { // Ensure the directory exists - err = os.MkdirAll(defaultProfilePicturesDir, os.ModePerm) - if err != nil { - log.Printf("Failed to create directory for default profile picture: %v", err) + errInternal := os.MkdirAll(defaultProfilePicturesDir, os.ModePerm) + if errInternal != nil { + slog.Error("Failed to create directory for default profile picture", slog.Any("error", errInternal)) return } - if err := utils.SaveFileStream(bytes.NewReader(defaultPictureBytes), defaultPicturePath); err != nil { - log.Printf("Failed to cache default profile picture for initials %s: %v", user.Initials(), err) + errInternal = utils.SaveFileStream(bytes.NewReader(defaultPictureBytes), defaultPicturePath) + if errInternal != nil { + slog.Error("Failed to cache default profile picture for initials", slog.String("initials", user.Initials()), slog.Any("error", errInternal)) } }() diff --git a/backend/internal/service/webauthn_service.go b/backend/internal/service/webauthn_service.go index a12e5278..e6f26e71 100644 --- a/backend/internal/service/webauthn_service.go +++ b/backend/internal/service/webauthn_service.go @@ -25,8 +25,8 @@ type WebAuthnService struct { appConfigService *AppConfigService } -func NewWebAuthnService(db *gorm.DB, jwtService *JwtService, auditLogService *AuditLogService, appConfigService *AppConfigService) *WebAuthnService { - webauthnConfig := &webauthn.Config{ +func NewWebAuthnService(db *gorm.DB, jwtService *JwtService, auditLogService *AuditLogService, appConfigService *AppConfigService) (*WebAuthnService, error) { + wa, err := webauthn.New(&webauthn.Config{ RPDisplayName: appConfigService.GetDbConfig().AppName.Value, RPID: utils.GetHostnameFromURL(common.EnvConfig.AppURL), RPOrigins: []string{common.EnvConfig.AppURL}, @@ -45,15 +45,18 @@ func NewWebAuthnService(db *gorm.DB, jwtService *JwtService, auditLogService *Au TimeoutUVD: time.Second * 60, }, }, + }) + if err != nil { + return nil, fmt.Errorf("failed to init webauthn object: %w", err) } - wa, _ := webauthn.New(webauthnConfig) + return &WebAuthnService{ db: db, webAuthn: wa, jwtService: jwtService, auditLogService: auditLogService, appConfigService: appConfigService, - } + }, nil } func (s *WebAuthnService) BeginRegistration(ctx context.Context, userID string) (*model.PublicKeyCredentialCreationOptions, error) { diff --git a/backend/internal/utils/aaguid_util.go b/backend/internal/utils/aaguid_util.go index e2611a70..2c25bf24 100644 --- a/backend/internal/utils/aaguid_util.go +++ b/backend/internal/utils/aaguid_util.go @@ -4,7 +4,7 @@ import ( "encoding/hex" "encoding/json" "fmt" - "log" + "log/slog" "sync" "github.com/pocket-id/pocket-id/backend/resources" @@ -57,12 +57,13 @@ func loadAAGUIDsFromFile() { // Read from embedded file system data, err := resources.FS.ReadFile("aaguids.json") if err != nil { - log.Printf("Error reading embedded AAGUID file: %v", err) + slog.Error("Error reading embedded AAGUID file", slog.Any("error", err)) return } - if err := json.Unmarshal(data, &aaguidMap); err != nil { - log.Printf("Error unmarshalling AAGUID data: %v", err) + err = json.Unmarshal(data, &aaguidMap) + if err != nil { + slog.Error("Error unmarshalling AAGUID data", slog.Any("error", err)) return } } diff --git a/backend/internal/utils/image/profile_picture.go b/backend/internal/utils/image/profile_picture.go index 0bbba5ea..63e531f6 100644 --- a/backend/internal/utils/image/profile_picture.go +++ b/backend/internal/utils/image/profile_picture.go @@ -29,9 +29,9 @@ func CreateProfilePicture(file io.Reader) (io.Reader, error) { pr, pw := io.Pipe() go func() { - err = imaging.Encode(pw, img, imaging.PNG) - if err != nil { - _ = pw.CloseWithError(fmt.Errorf("failed to encode image: %w", err)) + innerErr := imaging.Encode(pw, img, imaging.PNG) + if innerErr != nil { + _ = pw.CloseWithError(fmt.Errorf("failed to encode image: %w", innerErr)) return } pw.Close() diff --git a/backend/internal/utils/signals/signal.go b/backend/internal/utils/signals/signal.go index fe2e7251..8699216b 100644 --- a/backend/internal/utils/signals/signal.go +++ b/backend/internal/utils/signals/signal.go @@ -2,7 +2,7 @@ package signals import ( "context" - "log" + "log/slog" "os" "os/signal" "syscall" @@ -28,11 +28,11 @@ func SignalContext(parentCtx context.Context) context.Context { signal.Notify(sigCh, os.Interrupt, syscall.SIGTERM) go func() { <-sigCh - log.Println("Received interrupt signal. Shutting down…") + slog.Info("Received interrupt signal. Shutting down…") cancel() <-sigCh - log.Println("Received a second interrupt signal. Forcing an immediate shutdown.") + slog.Warn("Received a second interrupt signal. Forcing an immediate shutdown.") os.Exit(1) }()