{"record":{"id":"e03d933663dd4b17","repo":"AdguardTeam/AdGuardHome","slug":"userid-w","errorCode":null,"errorMessage":"userid: %w","messagePattern":"userid: %w","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"internal/aghuser/db.go","lineNumber":132,"sourceCode":"func (db *DefaultDB) ByUUID(ctx context.Context, id UserID) (u *User, err error) {\n\tdb.mu.Lock()\n\tdefer db.mu.Unlock()\n\n\tu, ok := db.userIDToUser[id]\n\tif !ok {\n\t\treturn nil, nil\n\t}\n\n\treturn u, nil\n}\n\n// Create implements the [DB] interface for *DefaultDB.\nfunc (db *DefaultDB) Create(ctx context.Context, u *User) (err error) {\n\tdb.mu.Lock()\n\tdefer db.mu.Unlock()\n\n\tif u.ID == (UserID{}) {\n\t\treturn fmt.Errorf(\"userid: %w\", errors.ErrEmptyValue)\n\t}\n\n\t_, ok := db.userIDToUser[u.ID]\n\tif ok {\n\t\treturn fmt.Errorf(\"userid: %w\", errors.ErrDuplicated)\n\t}\n\n\t_, ok = db.loginToUserID[u.Login]\n\tif ok {\n\t\treturn fmt.Errorf(\"login: %w\", errors.ErrDuplicated)\n\t}\n\n\tdb.userIDToUser[u.ID] = u\n\tdb.loginToUserID[u.Login] = u.ID\n\n\treturn nil\n}\n","sourceCodeStart":114,"sourceCodeEnd":150,"githubUrl":"https://github.com/AdguardTeam/AdGuardHome/blob/b41aefbe51c8dde65e2c50f093996afa0502edf9/internal/aghuser/db.go#L114-L150","documentation":"Create rejected a user record because its UserID is the zero value; the wrapped sentinel is errors.ErrEmptyValue. The in-memory user database requires every created user to have a non-empty identifier.","triggerScenarios":"Calling DefaultDB.Create with a User whose ID field was never set (u.ID == UserID{}), typically when the caller expects the DB to autogenerate IDs — it does not.","commonSituations":"Building users from parsed config or requests without generating an ID first; refactors that dropped the ID assignment; test fixtures forgetting to set an ID.","solutions":["Generate an ID before calling Create, e.g. u.ID = aghuser.NewUserID()","If importing users, map each source user to a fresh UserID","Add a lint/test that asserts u.ID != UserID{} before persistence"],"exampleFix":"// before\nerr := db.Create(ctx, &aghuser.User{Login: \"alice\"})\n// after\nu := &aghuser.User{Login: \"alice\"}\nu.ID = aghuser.NewUserID()\nerr := db.Create(ctx, u)","handlingStrategy":"validation","validationCode":"if u.ID == (aghuser.UserID{}) {\n    u.ID = aghuser.NewUserID()\n}","typeGuard":"func hasUserID(u *aghuser.User) bool { return u.ID != aghuser.UserID{} }","tryCatchPattern":"if err := db.Create(ctx, u); err != nil {\n    if errors.Is(err, errors.ErrEmptyValue) { u.ID = aghuser.NewUserID(); err = db.Create(ctx, u) }\n}","preventionTips":["Centralize user construction in one factory that always assigns an ID","Assert non-zero ID in tests before persistence"],"tags":["user","validation","database","in-memory-db"],"backgroundTag":"missing-required-field","analyzedSha":"b41aefbe51c8dde65e2c50f093996afa0502edf9","analyzedAt":"2026-08-27T04:57:55.097Z","schemaVersion":2},"datasetVersion":"2026-08-27T08:17:20.692Z"}