Skip to content

Commit edbcc49

Browse files
committed
refactor(pkg,api,cli): remove UserData struct
1 parent c9e7e8c commit edbcc49

File tree

4 files changed

+21
-41
lines changed

4 files changed

+21
-41
lines changed

api/services/auth.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -310,7 +310,7 @@ func (s *service) AuthLocalUser(ctx context.Context, req *requests.AuthLocalUser
310310
User: user.Username,
311311
Name: user.Name,
312312
Email: user.Email,
313-
RecoveryEmail: user.RecoveryEmail,
313+
RecoveryEmail: user.Preferences.RecoveryEmail,
314314
MFA: user.MFA.Enabled,
315315
Tenant: tenantID,
316316
Role: role,
@@ -394,7 +394,7 @@ func (s *service) CreateUserToken(ctx context.Context, req *requests.CreateUserT
394394
User: user.Username,
395395
Name: user.Name,
396396
Email: user.Email,
397-
RecoveryEmail: user.RecoveryEmail,
397+
RecoveryEmail: user.Preferences.RecoveryEmail,
398398
MFA: user.MFA.Enabled,
399399
Tenant: tenantID,
400400
Role: role,

api/services/setup.go

Lines changed: 5 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -31,17 +31,6 @@ func (s *service) Setup(ctx context.Context, req requests.Setup) error {
3131
return NewErrSetupForbidden(err)
3232
}
3333

34-
data := models.UserData{
35-
Name: req.Name,
36-
Email: req.Email,
37-
Username: req.Username,
38-
RecoveryEmail: "",
39-
}
40-
41-
if ok, err := s.validator.Struct(data); !ok || err != nil {
42-
return NewErrUserInvalid(nil, err)
43-
}
44-
4534
pwdDigest, err := hash.Do(req.Password)
4635
if err != nil {
4736
return NewErrUserPasswordInvalid(err)
@@ -53,14 +42,17 @@ func (s *service) Setup(ctx context.Context, req requests.Setup) error {
5342

5443
user := &models.User{
5544
Origin: models.UserOriginLocal,
56-
UserData: data,
45+
Name: req.Name,
46+
Email: req.Email,
47+
Username: req.Username,
5748
PasswordDigest: pwdDigest,
5849
// NOTE: user's created from the setup screen doesn't need to be confirmed.
5950
Status: models.UserStatusConfirmed,
6051
CreatedAt: clock.Now(),
6152
MaxNamespaces: -1,
6253
Preferences: models.UserPreferences{
63-
AuthMethods: []models.UserAuthMethod{models.UserAuthMethodLocal},
54+
AuthMethods: []models.UserAuthMethod{models.UserAuthMethodLocal},
55+
RecoveryEmail: "",
6456
},
6557
}
6658

cli/services/users.go

Lines changed: 4 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -13,19 +13,7 @@ import (
1313
// UserCreate adds a new user based on the provided user's data. This method validates data and
1414
// checks for conflicts.
1515
func (s *service) UserCreate(ctx context.Context, input *inputs.UserCreate) (*models.User, error) {
16-
// TODO: convert username and email to lower case.
17-
userData := models.UserData{
18-
Name: input.Username,
19-
Email: input.Email,
20-
Username: input.Username,
21-
}
22-
23-
// TODO: validate this at cmd layer
24-
if ok, err := s.validator.Struct(userData); !ok || err != nil {
25-
return nil, ErrUserDataInvalid
26-
}
27-
28-
if conflicts, has, _ := s.store.UserConflicts(ctx, &models.UserConflicts{Email: userData.Email, Username: userData.Username}); has {
16+
if conflicts, has, _ := s.store.UserConflicts(ctx, &models.UserConflicts{Email: input.Email, Username: input.Username}); has {
2917
containsEmail := slices.Contains(conflicts, "email")
3018
containsUsername := slices.Contains(conflicts, "username")
3119

@@ -48,7 +36,9 @@ func (s *service) UserCreate(ctx context.Context, input *inputs.UserCreate) (*mo
4836

4937
user := &models.User{
5038
Origin: models.UserOriginLocal,
51-
UserData: userData,
39+
Name: input.Username,
40+
Email: input.Email,
41+
Username: input.Username,
5242
PasswordDigest: pwdDigest,
5343
Status: models.UserStatusConfirmed,
5444
CreatedAt: clock.Now(),

pkg/models/user.go

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,10 @@ type User struct {
7070
CreatedAt time.Time `json:"created_at" bson:"created_at"`
7171
LastLogin time.Time `json:"last_login" bson:"last_login"`
7272
EmailMarketing bool `json:"email_marketing" bson:"email_marketing"`
73-
UserData `bson:",inline"`
73+
74+
Name string `json:"name" validate:"required,name"`
75+
Username string `json:"username" bson:"username" validate:"required,username"`
76+
Email string `json:"email" bson:"email" validate:"required,email"`
7477

7578
// PasswordDigest stores the hashed password.
7679
PasswordDigest string `json:"-"`
@@ -83,17 +86,6 @@ type User struct {
8386
Preferences UserPreferences `json:"preferences" bson:"preferences"`
8487
}
8588

86-
type UserData struct {
87-
Name string `json:"name" validate:"required,name"`
88-
Username string `json:"username" bson:"username" validate:"required,username"`
89-
Email string `json:"email" bson:"email" validate:"required,email"`
90-
// RecoveryEmail is a custom, non-unique email address that a user can use to recover their account
91-
// when they lose access to all other methods. It must never be equal to [UserData.Email].
92-
//
93-
// NOTE: Recovery email is available as a cloud-only feature and must be ignored in community.
94-
RecoveryEmail string `json:"recovery_email" bson:"recovery_email" validate:"omitempty,email"`
95-
}
96-
9789
// UserMFA represents the attributes related to MFA for a user.
9890
type UserMFA struct {
9991
// Enabled reports whether MFA is enabled for the user.
@@ -110,6 +102,12 @@ type UserPreferences struct {
110102

111103
// AuthMethods indicates the authentication methods that the user can use to authenticate.
112104
AuthMethods []UserAuthMethod `json:"auth_methods" bson:"auth_methods"`
105+
106+
// RecoveryEmail is a custom, non-unique email address that a user can use to recover their account
107+
// when they lose access to all other methods. It must never be equal to [UserData.Email].
108+
//
109+
// NOTE: Recovery email is available as a cloud-only feature and must be ignored in community.
110+
RecoveryEmail string `json:"recovery_email" bson:"recovery_email" validate:"omitempty,email"`
113111
}
114112

115113
// UserAuthIdentifier is an username or email used to authenticate.

0 commit comments

Comments
 (0)