Skip to content

Commit 2ee1315

Browse files
committed
Move UserRedirect into models/user/
1 parent 224058c commit 2ee1315

File tree

12 files changed

+130
-127
lines changed

12 files changed

+130
-127
lines changed

models/error.go

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -123,21 +123,6 @@ func (err ErrUserNotExist) Error() string {
123123
return fmt.Sprintf("user does not exist [uid: %d, name: %s, keyid: %d]", err.UID, err.Name, err.KeyID)
124124
}
125125

126-
// ErrUserRedirectNotExist represents a "UserRedirectNotExist" kind of error.
127-
type ErrUserRedirectNotExist struct {
128-
Name string
129-
}
130-
131-
// IsErrUserRedirectNotExist check if an error is an ErrUserRedirectNotExist.
132-
func IsErrUserRedirectNotExist(err error) bool {
133-
_, ok := err.(ErrUserRedirectNotExist)
134-
return ok
135-
}
136-
137-
func (err ErrUserRedirectNotExist) Error() string {
138-
return fmt.Sprintf("user redirect does not exist [name: %s]", err.Name)
139-
}
140-
141126
// ErrUserProhibitLogin represents a "ErrUserProhibitLogin" kind of error.
142127
type ErrUserProhibitLogin struct {
143128
UID int64

models/org.go

Lines changed: 12 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import (
1111

1212
"code.gitea.io/gitea/models/db"
1313
"code.gitea.io/gitea/models/unit"
14+
user_model "code.gitea.io/gitea/models/user"
1415
"code.gitea.io/gitea/modules/log"
1516
"code.gitea.io/gitea/modules/setting"
1617
"code.gitea.io/gitea/modules/storage"
@@ -163,25 +164,25 @@ func CreateOrganization(org, owner *User) (err error) {
163164
org.NumMembers = 1
164165
org.Type = UserTypeOrganization
165166

166-
sess := db.NewSession(db.DefaultContext)
167-
defer sess.Close()
168-
if err = sess.Begin(); err != nil {
167+
ctx, committer, err := db.TxContext()
168+
if err != nil {
169169
return err
170170
}
171+
defer committer.Close()
171172

172-
if err = deleteUserRedirect(sess, org.Name); err != nil {
173+
if err = user_model.DeleteUserRedirect(ctx, org.Name); err != nil {
173174
return err
174175
}
175176

176-
if _, err = sess.Insert(org); err != nil {
177+
if err = db.Insert(ctx, org); err != nil {
177178
return fmt.Errorf("insert organization: %v", err)
178179
}
179-
if err = org.generateRandomAvatar(sess); err != nil {
180+
if err = org.generateRandomAvatar(db.GetEngine(ctx)); err != nil {
180181
return fmt.Errorf("generate random avatar: %v", err)
181182
}
182183

183184
// Add initial creator to organization and owner team.
184-
if _, err = sess.Insert(&OrgUser{
185+
if err = db.Insert(ctx, &OrgUser{
185186
UID: owner.ID,
186187
OrgID: org.ID,
187188
}); err != nil {
@@ -198,7 +199,7 @@ func CreateOrganization(org, owner *User) (err error) {
198199
IncludesAllRepositories: true,
199200
CanCreateOrgRepo: true,
200201
}
201-
if _, err = sess.Insert(t); err != nil {
202+
if err = db.Insert(ctx, t); err != nil {
202203
return fmt.Errorf("insert owner team: %v", err)
203204
}
204205

@@ -212,22 +213,19 @@ func CreateOrganization(org, owner *User) (err error) {
212213
})
213214
}
214215

215-
if _, err = sess.Insert(&units); err != nil {
216-
if err := sess.Rollback(); err != nil {
217-
log.Error("CreateOrganization: sess.Rollback: %v", err)
218-
}
216+
if err = db.Insert(ctx, &units); err != nil {
219217
return err
220218
}
221219

222-
if _, err = sess.Insert(&TeamUser{
220+
if err = db.Insert(ctx, &TeamUser{
223221
UID: owner.ID,
224222
OrgID: org.ID,
225223
TeamID: t.ID,
226224
}); err != nil {
227225
return fmt.Errorf("insert team-user relation: %v", err)
228226
}
229227

230-
return sess.Commit()
228+
return committer.Commit()
231229
}
232230

233231
// GetOrgByName returns organization by given name.

models/user.go

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -930,7 +930,7 @@ func CreateUser(u *User, overwriteDefault ...*CreateUserOverwriteOptions) (err e
930930

931931
// save changes to database
932932

933-
if err = deleteUserRedirect(sess, u.Name); err != nil {
933+
if err = user_model.DeleteUserRedirect(ctx, u.Name); err != nil {
934934
return err
935935
}
936936

@@ -1024,11 +1024,12 @@ func ChangeUserName(u *User, newUserName string) (err error) {
10241024
return err
10251025
}
10261026

1027-
sess := db.NewSession(db.DefaultContext)
1028-
defer sess.Close()
1029-
if err = sess.Begin(); err != nil {
1027+
ctx, committer, err := db.TxContext()
1028+
if err != nil {
10301029
return err
10311030
}
1031+
defer committer.Close()
1032+
sess := db.GetEngine(ctx)
10321033

10331034
isExist, err := isUserExist(sess, 0, newUserName)
10341035
if err != nil {
@@ -1046,11 +1047,11 @@ func ChangeUserName(u *User, newUserName string) (err error) {
10461047
return fmt.Errorf("Rename user directory: %v", err)
10471048
}
10481049

1049-
if err = newUserRedirect(sess, u.ID, oldUserName, newUserName); err != nil {
1050+
if err = user_model.NewUserRedirect(ctx, u.ID, oldUserName, newUserName); err != nil {
10501051
return err
10511052
}
10521053

1053-
if err = sess.Commit(); err != nil {
1054+
if err = committer.Commit(); err != nil {
10541055
if err2 := util.Rename(UserPath(newUserName), UserPath(oldUserName)); err2 != nil && !os.IsNotExist(err2) {
10551056
log.Critical("Unable to rollback directory change during failed username change from: %s to: %s. DB Error: %v. Filesystem Error: %v", oldUserName, newUserName, err, err2)
10561057
return fmt.Errorf("failed to rollback directory change during failed username change from: %s to: %s. DB Error: %w. Filesystem Error: %v", oldUserName, newUserName, err, err2)

models/user_redirect.go renamed to models/user/redirect.go

Lines changed: 27 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,33 @@
22
// Use of this source code is governed by a MIT-style
33
// license that can be found in the LICENSE file.
44

5-
package models
5+
package user
66

77
import (
8+
"context"
9+
"fmt"
810
"strings"
911

1012
"code.gitea.io/gitea/models/db"
1113
)
1214

15+
// ErrUserRedirectNotExist represents a "UserRedirectNotExist" kind of error.
16+
type ErrUserRedirectNotExist struct {
17+
Name string
18+
}
19+
20+
// IsErrUserRedirectNotExist check if an error is an ErrUserRedirectNotExist.
21+
func IsErrUserRedirectNotExist(err error) bool {
22+
_, ok := err.(ErrUserRedirectNotExist)
23+
return ok
24+
}
25+
26+
func (err ErrUserRedirectNotExist) Error() string {
27+
return fmt.Sprintf("user redirect does not exist [name: %s]", err.Name)
28+
}
29+
1330
// UserRedirect represents that a user name should be redirected to another
14-
type UserRedirect struct {
31+
type UserRedirect struct { // nolint
1532
ID int64 `xorm:"pk autoincr"`
1633
LowerName string `xorm:"UNIQUE(s) INDEX NOT NULL"`
1734
RedirectUserID int64 // userID to redirect to
@@ -33,28 +50,25 @@ func LookupUserRedirect(userName string) (int64, error) {
3350
return redirect.RedirectUserID, nil
3451
}
3552

36-
// newUserRedirect create a new user redirect
37-
func newUserRedirect(e db.Engine, ID int64, oldUserName, newUserName string) error {
53+
// NewUserRedirect create a new user redirect
54+
func NewUserRedirect(ctx context.Context, ID int64, oldUserName, newUserName string) error {
3855
oldUserName = strings.ToLower(oldUserName)
3956
newUserName = strings.ToLower(newUserName)
4057

41-
if err := deleteUserRedirect(e, newUserName); err != nil {
58+
if err := DeleteUserRedirect(ctx, newUserName); err != nil {
4259
return err
4360
}
4461

45-
if _, err := e.Insert(&UserRedirect{
62+
return db.Insert(ctx, &UserRedirect{
4663
LowerName: oldUserName,
4764
RedirectUserID: ID,
48-
}); err != nil {
49-
return err
50-
}
51-
return nil
65+
})
5266
}
5367

54-
// deleteUserRedirect delete any redirect from the specified user name to
68+
// DeleteUserRedirect delete any redirect from the specified user name to
5569
// anything else
56-
func deleteUserRedirect(e db.Engine, userName string) error {
70+
func DeleteUserRedirect(ctx context.Context, userName string) error {
5771
userName = strings.ToLower(userName)
58-
_, err := e.Delete(&UserRedirect{LowerName: userName})
72+
_, err := db.GetEngine(ctx).Delete(&UserRedirect{LowerName: userName})
5973
return err
6074
}

models/user/redirect_test.go

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
// Copyright 2020 The Gitea Authors. All rights reserved.
2+
// Use of this source code is governed by a MIT-style
3+
// license that can be found in the LICENSE file.
4+
5+
package user
6+
7+
import (
8+
"testing"
9+
10+
"code.gitea.io/gitea/models/db"
11+
"github.com/stretchr/testify/assert"
12+
)
13+
14+
func TestLookupUserRedirect(t *testing.T) {
15+
assert.NoError(t, db.PrepareTestDatabase())
16+
17+
userID, err := LookupUserRedirect("olduser1")
18+
assert.NoError(t, err)
19+
assert.EqualValues(t, 1, userID)
20+
21+
_, err = LookupUserRedirect("doesnotexist")
22+
assert.True(t, IsErrUserRedirectNotExist(err))
23+
}

models/user_redirect_test.go

Lines changed: 0 additions & 70 deletions
This file was deleted.

models/user_test.go

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -512,3 +512,50 @@ func TestUpdateUser(t *testing.T) {
512512
user.Email = "no [email protected]"
513513
assert.Error(t, UpdateUser(user))
514514
}
515+
516+
func TestNewUserRedirect(t *testing.T) {
517+
// redirect to a completely new name
518+
assert.NoError(t, db.PrepareTestDatabase())
519+
520+
user := db.AssertExistsAndLoadBean(t, &User{ID: 1}).(*User)
521+
assert.NoError(t, user_model.NewUserRedirect(db.DefaultContext, user.ID, user.Name, "newusername"))
522+
523+
db.AssertExistsAndLoadBean(t, &user_model.UserRedirect{
524+
LowerName: user.LowerName,
525+
RedirectUserID: user.ID,
526+
})
527+
db.AssertExistsAndLoadBean(t, &user_model.UserRedirect{
528+
LowerName: "olduser1",
529+
RedirectUserID: user.ID,
530+
})
531+
}
532+
533+
func TestNewUserRedirect2(t *testing.T) {
534+
// redirect to previously used name
535+
assert.NoError(t, db.PrepareTestDatabase())
536+
537+
user := db.AssertExistsAndLoadBean(t, &User{ID: 1}).(*User)
538+
assert.NoError(t, user_model.NewUserRedirect(db.DefaultContext, user.ID, user.Name, "olduser1"))
539+
540+
db.AssertExistsAndLoadBean(t, &user_model.UserRedirect{
541+
LowerName: user.LowerName,
542+
RedirectUserID: user.ID,
543+
})
544+
db.AssertNotExistsBean(t, &user_model.UserRedirect{
545+
LowerName: "olduser1",
546+
RedirectUserID: user.ID,
547+
})
548+
}
549+
550+
func TestNewUserRedirect3(t *testing.T) {
551+
// redirect for a previously-unredirected user
552+
assert.NoError(t, db.PrepareTestDatabase())
553+
554+
user := db.AssertExistsAndLoadBean(t, &User{ID: 2}).(*User)
555+
assert.NoError(t, user_model.NewUserRedirect(db.DefaultContext, user.ID, user.Name, "newusername"))
556+
557+
db.AssertExistsAndLoadBean(t, &user_model.UserRedirect{
558+
LowerName: user.LowerName,
559+
RedirectUserID: user.ID,
560+
})
561+
}

modules/context/org.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import (
99
"strings"
1010

1111
"code.gitea.io/gitea/models"
12+
user_model "code.gitea.io/gitea/models/user"
1213
)
1314

1415
// Organization contains organization context
@@ -51,10 +52,10 @@ func HandleOrgAssignment(ctx *Context, args ...bool) {
5152
ctx.Org.Organization, err = models.GetUserByName(orgName)
5253
if err != nil {
5354
if models.IsErrUserNotExist(err) {
54-
redirectUserID, err := models.LookupUserRedirect(orgName)
55+
redirectUserID, err := user_model.LookupUserRedirect(orgName)
5556
if err == nil {
5657
RedirectToUser(ctx, orgName, redirectUserID)
57-
} else if models.IsErrUserRedirectNotExist(err) {
58+
} else if user_model.IsErrUserRedirectNotExist(err) {
5859
ctx.NotFound("GetUserByName", err)
5960
} else {
6061
ctx.ServerError("LookupUserRedirect", err)

0 commit comments

Comments
 (0)