Skip to content

Commit 95d3266

Browse files
authored
Move user follow and openid into models/user/ (#17613)
* Move UserRedirect into models/user/ * Fix lint & test * Fix lint * Fix lint * remove nolint comment * Fix lint * Move user follow and openid into models/user * Ignore the lint * Ignore the lint * Fix test * ignore stutters lint on UserOpenID
1 parent adda276 commit 95d3266

File tree

17 files changed

+155
-143
lines changed

17 files changed

+155
-143
lines changed

.golangci.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,3 +111,6 @@ issues:
111111
linters:
112112
- staticcheck
113113
text: "svc.IsAnInteractiveSession is deprecated: Use IsWindowsService instead."
114+
- path: models/user/openid.go
115+
linters:
116+
- golint

integrations/delete_user_test.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,13 @@ import (
1111

1212
"code.gitea.io/gitea/models"
1313
"code.gitea.io/gitea/models/unittest"
14+
user_model "code.gitea.io/gitea/models/user"
1415
)
1516

1617
func assertUserDeleted(t *testing.T, userID int64) {
1718
unittest.AssertNotExistsBean(t, &models.User{ID: userID})
18-
unittest.AssertNotExistsBean(t, &models.Follow{UserID: userID})
19-
unittest.AssertNotExistsBean(t, &models.Follow{FollowID: userID})
19+
unittest.AssertNotExistsBean(t, &user_model.Follow{UserID: userID})
20+
unittest.AssertNotExistsBean(t, &user_model.Follow{FollowID: userID})
2021
unittest.AssertNotExistsBean(t, &models.Repository{OwnerID: userID})
2122
unittest.AssertNotExistsBean(t, &models.Access{UserID: userID})
2223
unittest.AssertNotExistsBean(t, &models.OrgUser{UID: userID})

models/error.go

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -155,21 +155,6 @@ func (err ErrUserInactive) Error() string {
155155
return fmt.Sprintf("user is inactive [uid: %d, name: %s]", err.UID, err.Name)
156156
}
157157

158-
// ErrOpenIDAlreadyUsed represents a "OpenIDAlreadyUsed" kind of error.
159-
type ErrOpenIDAlreadyUsed struct {
160-
OpenID string
161-
}
162-
163-
// IsErrOpenIDAlreadyUsed checks if an error is a ErrOpenIDAlreadyUsed.
164-
func IsErrOpenIDAlreadyUsed(err error) bool {
165-
_, ok := err.(ErrOpenIDAlreadyUsed)
166-
return ok
167-
}
168-
169-
func (err ErrOpenIDAlreadyUsed) Error() string {
170-
return fmt.Sprintf("OpenID already in use [oid: %s]", err.OpenID)
171-
}
172-
173158
// ErrUserOwnRepos represents a "UserOwnRepos" kind of error.
174159
type ErrUserOwnRepos struct {
175160
UID int64

models/statistic.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ package models
77
import (
88
"code.gitea.io/gitea/models/db"
99
"code.gitea.io/gitea/models/login"
10+
user_model "code.gitea.io/gitea/models/user"
1011
"code.gitea.io/gitea/models/webhook"
1112
"code.gitea.io/gitea/modules/setting"
1213
)
@@ -92,7 +93,7 @@ func GetStatistic() (stats Statistic) {
9293

9394
stats.Counter.Comment, _ = e.Count(new(Comment))
9495
stats.Counter.Oauth = 0
95-
stats.Counter.Follow, _ = e.Count(new(Follow))
96+
stats.Counter.Follow, _ = e.Count(new(user_model.Follow))
9697
stats.Counter.Mirror, _ = e.Count(new(Mirror))
9798
stats.Counter.Release, _ = e.Count(new(Release))
9899
stats.Counter.LoginSource = login.CountSources()

models/user.go

Lines changed: 32 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import (
2525
"code.gitea.io/gitea/models/login"
2626
"code.gitea.io/gitea/models/unit"
2727
user_model "code.gitea.io/gitea/models/user"
28+
"code.gitea.io/gitea/modules/auth/openid"
2829
"code.gitea.io/gitea/modules/base"
2930
"code.gitea.io/gitea/modules/git"
3031
"code.gitea.io/gitea/modules/log"
@@ -359,7 +360,7 @@ func (u *User) GetFollowers(listOptions db.ListOptions) ([]*User, error) {
359360

360361
// IsFollowing returns true if user is following followID.
361362
func (u *User) IsFollowing(followID int64) bool {
362-
return IsFollowing(u.ID, followID)
363+
return user_model.IsFollowing(u.ID, followID)
363364
}
364365

365366
// GetFollowing returns range of user's following.
@@ -469,7 +470,7 @@ func (u *User) isVisibleToUser(e db.Engine, viewer *User) bool {
469470
}
470471

471472
// If they follow - they see each over
472-
follower := IsFollowing(u.ID, viewer.ID)
473+
follower := user_model.IsFollowing(u.ID, viewer.ID)
473474
if follower {
474475
return true
475476
}
@@ -1212,12 +1213,12 @@ func deleteUser(e db.Engine, u *User) error {
12121213
&Access{UserID: u.ID},
12131214
&Watch{UserID: u.ID},
12141215
&Star{UID: u.ID},
1215-
&Follow{UserID: u.ID},
1216-
&Follow{FollowID: u.ID},
1216+
&user_model.Follow{UserID: u.ID},
1217+
&user_model.Follow{FollowID: u.ID},
12171218
&Action{UserID: u.ID},
12181219
&IssueUser{UID: u.ID},
12191220
&user_model.EmailAddress{UID: u.ID},
1220-
&UserOpenID{UID: u.ID},
1221+
&user_model.UserOpenID{UID: u.ID},
12211222
&Reaction{UserID: u.ID},
12221223
&TeamUser{UID: u.ID},
12231224
&Collaboration{UserID: u.ID},
@@ -1798,3 +1799,29 @@ func IterateUser(f func(user *User) error) error {
17981799
}
17991800
}
18001801
}
1802+
1803+
// GetUserByOpenID returns the user object by given OpenID if exists.
1804+
func GetUserByOpenID(uri string) (*User, error) {
1805+
if len(uri) == 0 {
1806+
return nil, ErrUserNotExist{0, uri, 0}
1807+
}
1808+
1809+
uri, err := openid.Normalize(uri)
1810+
if err != nil {
1811+
return nil, err
1812+
}
1813+
1814+
log.Trace("Normalized OpenID URI: " + uri)
1815+
1816+
// Otherwise, check in openid table
1817+
oid := &user_model.UserOpenID{}
1818+
has, err := db.GetEngine(db.DefaultContext).Where("uri=?", uri).Get(oid)
1819+
if err != nil {
1820+
return nil, err
1821+
}
1822+
if has {
1823+
return GetUserByID(oid.UID)
1824+
}
1825+
1826+
return nil, ErrUserNotExist{0, uri, 0}
1827+
}

models/user_follow.go renamed to models/user/follow.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
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 (
88
"code.gitea.io/gitea/models/db"

models/user/follow_test.go

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
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/unittest"
11+
12+
"github.com/stretchr/testify/assert"
13+
)
14+
15+
func TestIsFollowing(t *testing.T) {
16+
assert.NoError(t, unittest.PrepareTestDatabase())
17+
assert.True(t, IsFollowing(4, 2))
18+
assert.False(t, IsFollowing(2, 4))
19+
assert.False(t, IsFollowing(5, unittest.NonexistentID))
20+
assert.False(t, IsFollowing(unittest.NonexistentID, 5))
21+
assert.False(t, IsFollowing(unittest.NonexistentID, unittest.NonexistentID))
22+
}

models/user/main_test.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,5 +15,7 @@ func TestMain(m *testing.M) {
1515
unittest.MainTest(m, filepath.Join("..", ".."),
1616
"email_address.yml",
1717
"user_redirect.yml",
18+
"follow.yml",
19+
"user_open_id.yml",
1820
)
1921
}

models/user_openid.go renamed to models/user/openid.go

Lines changed: 19 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -2,21 +2,21 @@
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 (
88
"errors"
9+
"fmt"
910

1011
"code.gitea.io/gitea/models/db"
11-
"code.gitea.io/gitea/modules/auth/openid"
12-
"code.gitea.io/gitea/modules/log"
1312
)
1413

1514
// ErrOpenIDNotExist openid is not known
1615
var ErrOpenIDNotExist = errors.New("OpenID is unknown")
1716

1817
// UserOpenID is the list of all OpenID identities of a user.
19-
type UserOpenID struct {
18+
// Since this is a middle table, name it OpenID is not suitable, so we ignore the lint here
19+
type UserOpenID struct { //revive:disable-line:exported
2020
ID int64 `xorm:"pk autoincr"`
2121
UID int64 `xorm:"INDEX NOT NULL"`
2222
URI string `xorm:"UNIQUE NOT NULL"`
@@ -49,6 +49,21 @@ func isOpenIDUsed(e db.Engine, uri string) (bool, error) {
4949
return e.Get(&UserOpenID{URI: uri})
5050
}
5151

52+
// ErrOpenIDAlreadyUsed represents a "OpenIDAlreadyUsed" kind of error.
53+
type ErrOpenIDAlreadyUsed struct {
54+
OpenID string
55+
}
56+
57+
// IsErrOpenIDAlreadyUsed checks if an error is a ErrOpenIDAlreadyUsed.
58+
func IsErrOpenIDAlreadyUsed(err error) bool {
59+
_, ok := err.(ErrOpenIDAlreadyUsed)
60+
return ok
61+
}
62+
63+
func (err ErrOpenIDAlreadyUsed) Error() string {
64+
return fmt.Sprintf("OpenID already in use [oid: %s]", err.OpenID)
65+
}
66+
5267
// NOTE: make sure openid.URI is normalized already
5368
func addUserOpenID(e db.Engine, openid *UserOpenID) error {
5469
used, err := isOpenIDUsed(e, openid.URI)
@@ -95,29 +110,3 @@ func ToggleUserOpenIDVisibility(id int64) (err error) {
95110
_, err = db.GetEngine(db.DefaultContext).Exec("update `user_open_id` set `show` = not `show` where `id` = ?", id)
96111
return err
97112
}
98-
99-
// GetUserByOpenID returns the user object by given OpenID if exists.
100-
func GetUserByOpenID(uri string) (*User, error) {
101-
if len(uri) == 0 {
102-
return nil, ErrUserNotExist{0, uri, 0}
103-
}
104-
105-
uri, err := openid.Normalize(uri)
106-
if err != nil {
107-
return nil, err
108-
}
109-
110-
log.Trace("Normalized OpenID URI: " + uri)
111-
112-
// Otherwise, check in openid table
113-
oid := &UserOpenID{}
114-
has, err := db.GetEngine(db.DefaultContext).Where("uri=?", uri).Get(oid)
115-
if err != nil {
116-
return nil, err
117-
}
118-
if has {
119-
return GetUserByID(oid.UID)
120-
}
121-
122-
return nil, ErrUserNotExist{0, uri, 0}
123-
}

models/user_openid_test.go renamed to models/user/openid_test.go

Lines changed: 1 addition & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
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 (
88
"testing"
@@ -30,25 +30,6 @@ func TestGetUserOpenIDs(t *testing.T) {
3030
}
3131
}
3232

33-
func TestGetUserByOpenID(t *testing.T) {
34-
assert.NoError(t, unittest.PrepareTestDatabase())
35-
36-
_, err := GetUserByOpenID("https://unknown")
37-
if assert.Error(t, err) {
38-
assert.True(t, IsErrUserNotExist(err))
39-
}
40-
41-
user, err := GetUserByOpenID("https://user1.domain1.tld")
42-
if assert.NoError(t, err) {
43-
assert.Equal(t, int64(1), user.ID)
44-
}
45-
46-
user, err = GetUserByOpenID("https://domain1.tld/user2/")
47-
if assert.NoError(t, err) {
48-
assert.Equal(t, int64(2), user.ID)
49-
}
50-
}
51-
5233
func TestToggleUserOpenIDVisibility(t *testing.T) {
5334
assert.NoError(t, unittest.PrepareTestDatabase())
5435
oids, err := GetUserOpenIDs(int64(2))

models/user_follow_test.go

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

models/user_test.go

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -560,3 +560,51 @@ func TestNewUserRedirect3(t *testing.T) {
560560
RedirectUserID: user.ID,
561561
})
562562
}
563+
564+
func TestFollowUser(t *testing.T) {
565+
assert.NoError(t, unittest.PrepareTestDatabase())
566+
567+
testSuccess := func(followerID, followedID int64) {
568+
assert.NoError(t, user_model.FollowUser(followerID, followedID))
569+
unittest.AssertExistsAndLoadBean(t, &user_model.Follow{UserID: followerID, FollowID: followedID})
570+
}
571+
testSuccess(4, 2)
572+
testSuccess(5, 2)
573+
574+
assert.NoError(t, user_model.FollowUser(2, 2))
575+
576+
unittest.CheckConsistencyFor(t, &User{})
577+
}
578+
579+
func TestUnfollowUser(t *testing.T) {
580+
assert.NoError(t, unittest.PrepareTestDatabase())
581+
582+
testSuccess := func(followerID, followedID int64) {
583+
assert.NoError(t, user_model.UnfollowUser(followerID, followedID))
584+
unittest.AssertNotExistsBean(t, &user_model.Follow{UserID: followerID, FollowID: followedID})
585+
}
586+
testSuccess(4, 2)
587+
testSuccess(5, 2)
588+
testSuccess(2, 2)
589+
590+
unittest.CheckConsistencyFor(t, &User{})
591+
}
592+
593+
func TestGetUserByOpenID(t *testing.T) {
594+
assert.NoError(t, unittest.PrepareTestDatabase())
595+
596+
_, err := GetUserByOpenID("https://unknown")
597+
if assert.Error(t, err) {
598+
assert.True(t, IsErrUserNotExist(err))
599+
}
600+
601+
user, err := GetUserByOpenID("https://user1.domain1.tld")
602+
if assert.NoError(t, err) {
603+
assert.Equal(t, int64(1), user.ID)
604+
}
605+
606+
user, err = GetUserByOpenID("https://domain1.tld/user2/")
607+
if assert.NoError(t, err) {
608+
assert.Equal(t, int64(2), user.ID)
609+
}
610+
}

0 commit comments

Comments
 (0)