From 82a750164afea90e5588d81e7b0eb635e8656e16 Mon Sep 17 00:00:00 2001 From: yp05327 <576951401@qq.com> Date: Fri, 12 May 2023 07:06:31 +0000 Subject: [PATCH 01/20] remove --- models/migrations/migrations.go | 2 ++ models/migrations/v1_20/v257.go | 22 ++++++++++++++++++++++ models/unittest/consistency.go | 2 -- models/user/user.go | 6 ++---- services/convert/user.go | 2 -- 5 files changed, 26 insertions(+), 8 deletions(-) create mode 100644 models/migrations/v1_20/v257.go diff --git a/models/migrations/migrations.go b/models/migrations/migrations.go index 0e84ae9f0e29a..2e04183508cf5 100644 --- a/models/migrations/migrations.go +++ b/models/migrations/migrations.go @@ -491,6 +491,8 @@ var migrations = []Migration{ NewMigration("Add ArchivedUnix Column", v1_20.AddArchivedUnixToRepository), // v256 -> v257 NewMigration("Add is_internal column to package", v1_20.AddIsInternalColumnToPackage), + // v257 -> v258 + NewMigration("Drop column NumFollowers and NumFollowing on User", v1_20.DropColumnNumFollowersAndNumFollowingOnUser), } // GetCurrentDBVersion returns the current db version diff --git a/models/migrations/v1_20/v257.go b/models/migrations/v1_20/v257.go new file mode 100644 index 0000000000000..0277180a4c472 --- /dev/null +++ b/models/migrations/v1_20/v257.go @@ -0,0 +1,22 @@ +// Copyright 2023 The Gitea Authors. All rights reserved. +// SPDX-License-Identifier: MIT + +package v1_20 //nolint + +import ( + "code.gitea.io/gitea/models/migrations/base" + + "xorm.io/xorm" +) + +func DropColumnNumFollowersAndNumFollowingOnUser(x *xorm.Engine) error { + sess := x.NewSession() + defer sess.Close() + if err := sess.Begin(); err != nil { + return err + } + if err := base.DropTableColumns(sess, "user", "num_followers", "num_following"); err != nil { + return err + } + return sess.Commit() +} diff --git a/models/unittest/consistency.go b/models/unittest/consistency.go index 41798c62536f5..4fb2b8dd68886 100644 --- a/models/unittest/consistency.go +++ b/models/unittest/consistency.go @@ -69,8 +69,6 @@ func init() { AssertCountByCond(t, "star", builder.Eq{"uid": user.int("ID")}, user.int("NumStars")) AssertCountByCond(t, "org_user", builder.Eq{"org_id": user.int("ID")}, user.int("NumMembers")) AssertCountByCond(t, "team", builder.Eq{"org_id": user.int("ID")}, user.int("NumTeams")) - AssertCountByCond(t, "follow", builder.Eq{"user_id": user.int("ID")}, user.int("NumFollowing")) - AssertCountByCond(t, "follow", builder.Eq{"follow_id": user.int("ID")}, user.int("NumFollowers")) if user.int("Type") != modelsUserTypeOrganization { assert.EqualValues(t, 0, user.int("NumMembers"), "Unexpected number of members for user id: %d", user.int("ID")) assert.EqualValues(t, 0, user.int("NumTeams"), "Unexpected number of teams for user id: %d", user.int("ID")) diff --git a/models/user/user.go b/models/user/user.go index 46c4440e5f07e..26903740d6434 100644 --- a/models/user/user.go +++ b/models/user/user.go @@ -125,10 +125,8 @@ type User struct { UseCustomAvatar bool // Counters - NumFollowers int - NumFollowing int `xorm:"NOT NULL DEFAULT 0"` - NumStars int - NumRepos int + NumStars int + NumRepos int // For organization NumTeams int diff --git a/services/convert/user.go b/services/convert/user.go index 79fcba0176f9a..74d0a1276f528 100644 --- a/services/convert/user.go +++ b/services/convert/user.go @@ -59,8 +59,6 @@ func toUser(ctx context.Context, user *user_model.User, signed, authed bool) *ap Website: user.Website, Description: user.Description, // counter's - Followers: user.NumFollowers, - Following: user.NumFollowing, StarredRepos: user.NumStars, } From 14ae35fd2eb975007ab578675b3b68266f0940e5 Mon Sep 17 00:00:00 2001 From: yp05327 <576951401@qq.com> Date: Fri, 12 May 2023 07:23:08 +0000 Subject: [PATCH 02/20] remove --- models/user/follow.go | 16 ---------------- services/user/delete.go | 18 ------------------ 2 files changed, 34 deletions(-) diff --git a/models/user/follow.go b/models/user/follow.go index 7efecc26a781b..b565c01b8e025 100644 --- a/models/user/follow.go +++ b/models/user/follow.go @@ -41,14 +41,6 @@ func FollowUser(userID, followID int64) (err error) { if err = db.Insert(ctx, &Follow{UserID: userID, FollowID: followID}); err != nil { return err } - - if _, err = db.Exec(ctx, "UPDATE `user` SET num_followers = num_followers + 1 WHERE id = ?", followID); err != nil { - return err - } - - if _, err = db.Exec(ctx, "UPDATE `user` SET num_following = num_following + 1 WHERE id = ?", userID); err != nil { - return err - } return committer.Commit() } @@ -67,13 +59,5 @@ func UnfollowUser(userID, followID int64) (err error) { if _, err = db.DeleteByBean(ctx, &Follow{UserID: userID, FollowID: followID}); err != nil { return err } - - if _, err = db.Exec(ctx, "UPDATE `user` SET num_followers = num_followers - 1 WHERE id = ?", followID); err != nil { - return err - } - - if _, err = db.Exec(ctx, "UPDATE `user` SET num_following = num_following - 1 WHERE id = ?", userID); err != nil { - return err - } return committer.Commit() } diff --git a/services/user/delete.go b/services/user/delete.go index 01e3c37b39f34..07a7eddd1ec78 100644 --- a/services/user/delete.go +++ b/services/user/delete.go @@ -52,24 +52,6 @@ func deleteUser(ctx context.Context, u *user_model.User, purge bool) (err error) } // ***** END: Star ***** - // ***** START: Follow ***** - followeeIDs, err := db.FindIDs(ctx, "follow", "follow.follow_id", - builder.Eq{"follow.user_id": u.ID}) - if err != nil { - return fmt.Errorf("get all followees: %w", err) - } else if err = db.DecrByIDs(ctx, followeeIDs, "num_followers", new(user_model.User)); err != nil { - return fmt.Errorf("decrease user num_followers: %w", err) - } - - followerIDs, err := db.FindIDs(ctx, "follow", "follow.user_id", - builder.Eq{"follow.follow_id": u.ID}) - if err != nil { - return fmt.Errorf("get all followers: %w", err) - } else if err = db.DecrByIDs(ctx, followerIDs, "num_following", new(user_model.User)); err != nil { - return fmt.Errorf("decrease user num_following: %w", err) - } - // ***** END: Follow ***** - if err = db.DeleteBeans(ctx, &auth_model.AccessToken{UID: u.ID}, &repo_model.Collaboration{UserID: u.ID}, From 84d290af354fdc72c9449ffa12cebee12409b1d4 Mon Sep 17 00:00:00 2001 From: yp05327 <576951401@qq.com> Date: Mon, 15 May 2023 02:53:11 +0000 Subject: [PATCH 03/20] remove fixtures --- models/fixtures/user.yml | 68 ---------------------------------------- 1 file changed, 68 deletions(-) diff --git a/models/fixtures/user.yml b/models/fixtures/user.yml index eba33a7c36369..3eff5789f32cd 100644 --- a/models/fixtures/user.yml +++ b/models/fixtures/user.yml @@ -26,8 +26,6 @@ avatar: avatar1 avatar_email: user1@example.com use_custom_avatar: false - num_followers: 0 - num_following: 0 num_stars: 0 num_repos: 0 num_teams: 0 @@ -63,8 +61,6 @@ avatar: avatar2 avatar_email: user2@example.com use_custom_avatar: false - num_followers: 2 - num_following: 1 num_stars: 2 num_repos: 13 num_teams: 0 @@ -100,8 +96,6 @@ avatar: avatar3 avatar_email: user3@example.com use_custom_avatar: false - num_followers: 0 - num_following: 0 num_stars: 0 num_repos: 3 num_teams: 5 @@ -137,8 +131,6 @@ avatar: avatar4 avatar_email: user4@example.com use_custom_avatar: false - num_followers: 0 - num_following: 1 num_stars: 0 num_repos: 0 num_teams: 0 @@ -174,8 +166,6 @@ avatar: avatar5 avatar_email: user5@example.com use_custom_avatar: false - num_followers: 0 - num_following: 0 num_stars: 0 num_repos: 1 num_teams: 0 @@ -211,8 +201,6 @@ avatar: avatar6 avatar_email: user6@example.com use_custom_avatar: false - num_followers: 0 - num_following: 0 num_stars: 0 num_repos: 0 num_teams: 2 @@ -248,8 +236,6 @@ avatar: avatar7 avatar_email: user7@example.com use_custom_avatar: false - num_followers: 0 - num_following: 0 num_stars: 0 num_repos: 0 num_teams: 1 @@ -285,8 +271,6 @@ avatar: avatar8 avatar_email: user8@example.com use_custom_avatar: false - num_followers: 1 - num_following: 1 num_stars: 0 num_repos: 0 num_teams: 0 @@ -322,8 +306,6 @@ avatar: avatar9 avatar_email: user9@example.com use_custom_avatar: false - num_followers: 0 - num_following: 0 num_stars: 0 num_repos: 0 num_teams: 0 @@ -359,8 +341,6 @@ avatar: avatar10 avatar_email: user10@example.com use_custom_avatar: false - num_followers: 0 - num_following: 0 num_stars: 0 num_repos: 3 num_teams: 0 @@ -396,8 +376,6 @@ avatar: avatar11 avatar_email: user11@example.com use_custom_avatar: false - num_followers: 0 - num_following: 0 num_stars: 0 num_repos: 1 num_teams: 0 @@ -433,8 +411,6 @@ avatar: avatar12 avatar_email: user12@example.com use_custom_avatar: false - num_followers: 0 - num_following: 0 num_stars: 0 num_repos: 1 num_teams: 0 @@ -470,8 +446,6 @@ avatar: avatar13 avatar_email: user13@example.com use_custom_avatar: false - num_followers: 0 - num_following: 0 num_stars: 0 num_repos: 1 num_teams: 0 @@ -507,8 +481,6 @@ avatar: avatar14 avatar_email: user13@example.com use_custom_avatar: false - num_followers: 0 - num_following: 0 num_stars: 0 num_repos: 3 num_teams: 0 @@ -544,8 +516,6 @@ avatar: avatar15 avatar_email: user15@example.com use_custom_avatar: false - num_followers: 0 - num_following: 0 num_stars: 0 num_repos: 4 num_teams: 0 @@ -581,8 +551,6 @@ avatar: avatar16 avatar_email: user16@example.com use_custom_avatar: false - num_followers: 0 - num_following: 0 num_stars: 0 num_repos: 2 num_teams: 0 @@ -618,8 +586,6 @@ avatar: avatar17 avatar_email: user17@example.com use_custom_avatar: false - num_followers: 0 - num_following: 0 num_stars: 0 num_repos: 2 num_teams: 3 @@ -655,8 +621,6 @@ avatar: avatar18 avatar_email: user18@example.com use_custom_avatar: false - num_followers: 0 - num_following: 0 num_stars: 0 num_repos: 0 num_teams: 0 @@ -692,8 +656,6 @@ avatar: avatar19 avatar_email: user19@example.com use_custom_avatar: false - num_followers: 0 - num_following: 0 num_stars: 0 num_repos: 2 num_teams: 1 @@ -729,8 +691,6 @@ avatar: avatar20 avatar_email: user20@example.com use_custom_avatar: false - num_followers: 0 - num_following: 0 num_stars: 0 num_repos: 4 num_teams: 0 @@ -766,8 +726,6 @@ avatar: avatar21 avatar_email: user21@example.com use_custom_avatar: false - num_followers: 0 - num_following: 0 num_stars: 0 num_repos: 2 num_teams: 0 @@ -803,8 +761,6 @@ avatar: avatar22 avatar_email: limited_org@example.com use_custom_avatar: false - num_followers: 0 - num_following: 0 num_stars: 0 num_repos: 2 num_teams: 1 @@ -840,8 +796,6 @@ avatar: avatar23 avatar_email: privated_org@example.com use_custom_avatar: false - num_followers: 0 - num_following: 0 num_stars: 0 num_repos: 2 num_teams: 2 @@ -877,8 +831,6 @@ avatar: avatar24 avatar_email: user24@example.com use_custom_avatar: false - num_followers: 0 - num_following: 0 num_stars: 0 num_repos: 0 num_teams: 0 @@ -914,8 +866,6 @@ avatar: avatar25 avatar_email: org25@example.com use_custom_avatar: false - num_followers: 0 - num_following: 0 num_stars: 0 num_repos: 0 num_teams: 1 @@ -951,8 +901,6 @@ avatar: avatar26 avatar_email: org26@example.com use_custom_avatar: false - num_followers: 0 - num_following: 0 num_stars: 0 num_repos: 4 num_teams: 1 @@ -988,8 +936,6 @@ avatar: avatar27 avatar_email: user27@example.com use_custom_avatar: false - num_followers: 0 - num_following: 0 num_stars: 0 num_repos: 3 num_teams: 0 @@ -1025,8 +971,6 @@ avatar: avatar28 avatar_email: user28@example.com use_custom_avatar: false - num_followers: 0 - num_following: 0 num_stars: 0 num_repos: 0 num_teams: 0 @@ -1062,8 +1006,6 @@ avatar: avatar29 avatar_email: user29@example.com use_custom_avatar: false - num_followers: 0 - num_following: 0 num_stars: 0 num_repos: 0 num_teams: 0 @@ -1099,8 +1041,6 @@ avatar: avatar29 avatar_email: user30@example.com use_custom_avatar: false - num_followers: 0 - num_following: 0 num_stars: 0 num_repos: 4 num_teams: 0 @@ -1136,8 +1076,6 @@ avatar: avatar31 avatar_email: user31@example.com use_custom_avatar: false - num_followers: 0 - num_following: 1 num_stars: 0 num_repos: 0 num_teams: 0 @@ -1173,8 +1111,6 @@ avatar: avatar32 avatar_email: user30@example.com use_custom_avatar: false - num_followers: 0 - num_following: 0 num_stars: 0 num_repos: 0 num_teams: 0 @@ -1210,8 +1146,6 @@ avatar: avatar33 avatar_email: user33@example.com use_custom_avatar: false - num_followers: 1 - num_following: 0 num_stars: 0 num_repos: 0 num_teams: 0 @@ -1248,8 +1182,6 @@ avatar: avatar34 avatar_email: user34@example.com use_custom_avatar: true - num_followers: 0 - num_following: 0 num_stars: 0 num_repos: 0 num_teams: 0 From 5419531e7898bdba82da425f60eae7a7df5d9403 Mon Sep 17 00:00:00 2001 From: yp05327 <576951401@qq.com> Date: Thu, 18 May 2023 06:29:13 +0000 Subject: [PATCH 04/20] fix --- services/convert/user.go | 36 ++++++++++++++++++++++++++---------- 1 file changed, 26 insertions(+), 10 deletions(-) diff --git a/services/convert/user.go b/services/convert/user.go index 74d0a1276f528..17b07b21323eb 100644 --- a/services/convert/user.go +++ b/services/convert/user.go @@ -6,6 +6,7 @@ package convert import ( "context" + "code.gitea.io/gitea/models/db" "code.gitea.io/gitea/models/perm" user_model "code.gitea.io/gitea/models/user" api "code.gitea.io/gitea/modules/structs" @@ -17,13 +18,7 @@ func ToUser(ctx context.Context, user, doer *user_model.User) *api.User { if user == nil { return nil } - authed := false - signed := false - if doer != nil { - signed = true - authed = doer.ID == user.ID || doer.IsAdmin - } - return toUser(ctx, user, signed, authed) + return toUser(ctx, user, doer, perm.AccessModeNone) } // ToUsers convert list of user_model.User to list of api.User @@ -41,12 +36,13 @@ func ToUserWithAccessMode(ctx context.Context, user *user_model.User, accessMode if user == nil { return nil } - return toUser(ctx, user, accessMode != perm.AccessModeNone, false) + return toUser(ctx, user, nil, accessMode) } // toUser convert user_model.User to api.User -// signed shall only be set if requester is logged in. authed shall only be set if user is site admin or user himself -func toUser(ctx context.Context, user *user_model.User, signed, authed bool) *api.User { +// accessMode is only used if doer is nil +func toUser(ctx context.Context, user, doer *user_model.User, accessMode perm.AccessMode) *api.User { + result := &api.User{ ID: user.ID, UserName: user.Name, @@ -64,6 +60,26 @@ func toUser(ctx context.Context, user *user_model.User, signed, authed bool) *ap result.Visibility = user.Visibility.String() + authed := false + signed := false + if doer != nil { + signed = true + authed = doer.ID == user.ID || doer.IsAdmin + + _, followersCount, err := user_model.GetUserFollowers(ctx, user, doer, db.ListOptions{ListAll: true}) + if err != nil { + return nil + } + result.Followers = int(followersCount) + _, followingCount, err := user_model.GetUserFollowing(ctx, user, doer, db.ListOptions{ListAll: true}) + if err != nil { + return nil + } + result.Following = int(followingCount) + } else if accessMode != perm.AccessModeNone { + signed = true + } + // hide primary email if API caller is anonymous or user keep email private if signed && (!user.KeepEmailPrivate || authed) { result.Email = user.Email From 42e2020b78b03279fe9d0c86f114e5bd265189b4 Mon Sep 17 00:00:00 2001 From: yp05327 <576951401@qq.com> Date: Thu, 18 May 2023 06:34:24 +0000 Subject: [PATCH 05/20] remove empty line --- services/convert/user.go | 1 - 1 file changed, 1 deletion(-) diff --git a/services/convert/user.go b/services/convert/user.go index 17b07b21323eb..f4f907a2484b0 100644 --- a/services/convert/user.go +++ b/services/convert/user.go @@ -42,7 +42,6 @@ func ToUserWithAccessMode(ctx context.Context, user *user_model.User, accessMode // toUser convert user_model.User to api.User // accessMode is only used if doer is nil func toUser(ctx context.Context, user, doer *user_model.User, accessMode perm.AccessMode) *api.User { - result := &api.User{ ID: user.ID, UserName: user.Name, From 69f116c0393b0de96c6c8b211c03aaf963aedaa7 Mon Sep 17 00:00:00 2001 From: yp05327 <576951401@qq.com> Date: Fri, 19 May 2023 08:50:43 +0000 Subject: [PATCH 06/20] fix user_test --- services/convert/user_test.go | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/services/convert/user_test.go b/services/convert/user_test.go index 4b1effc7aa5fc..212d7500113ed 100644 --- a/services/convert/user_test.go +++ b/services/convert/user_test.go @@ -7,6 +7,7 @@ import ( "testing" "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/models/perm" "code.gitea.io/gitea/models/unittest" user_model "code.gitea.io/gitea/models/user" api "code.gitea.io/gitea/modules/structs" @@ -19,22 +20,22 @@ func TestUser_ToUser(t *testing.T) { user1 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 1, IsAdmin: true}) - apiUser := toUser(db.DefaultContext, user1, true, true) + apiUser := toUser(db.DefaultContext, user1, nil, perm.AccessModeRead) assert.True(t, apiUser.IsAdmin) assert.Contains(t, apiUser.AvatarURL, "://") user2 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2, IsAdmin: false}) - apiUser = toUser(db.DefaultContext, user2, true, true) + apiUser = toUser(db.DefaultContext, user2, user1, perm.AccessModeNone) assert.False(t, apiUser.IsAdmin) - apiUser = toUser(db.DefaultContext, user1, false, false) + apiUser = toUser(db.DefaultContext, user1, nil, perm.AccessModeNone) assert.False(t, apiUser.IsAdmin) assert.EqualValues(t, api.VisibleTypePublic.String(), apiUser.Visibility) user31 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 31, IsAdmin: false, Visibility: api.VisibleTypePrivate}) - apiUser = toUser(db.DefaultContext, user31, true, true) + apiUser = toUser(db.DefaultContext, user31, user31, perm.AccessModeNone) assert.False(t, apiUser.IsAdmin) assert.EqualValues(t, api.VisibleTypePrivate.String(), apiUser.Visibility) } From c7af3f300a52dccdeaf467de86a4d3b3eb7751a3 Mon Sep 17 00:00:00 2001 From: yp05327 <576951401@qq.com> Date: Mon, 22 May 2023 02:23:20 +0000 Subject: [PATCH 07/20] only search the first page followers and following --- services/convert/user.go | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/services/convert/user.go b/services/convert/user.go index f4f907a2484b0..24401beb6c353 100644 --- a/services/convert/user.go +++ b/services/convert/user.go @@ -9,6 +9,7 @@ import ( "code.gitea.io/gitea/models/db" "code.gitea.io/gitea/models/perm" user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/modules/setting" api "code.gitea.io/gitea/modules/structs" ) @@ -65,12 +66,18 @@ func toUser(ctx context.Context, user, doer *user_model.User, accessMode perm.Ac signed = true authed = doer.ID == user.ID || doer.IsAdmin - _, followersCount, err := user_model.GetUserFollowers(ctx, user, doer, db.ListOptions{ListAll: true}) + _, followersCount, err := user_model.GetUserFollowers(ctx, user, doer, db.ListOptions{ + Page: 1, + PageSize: setting.API.DefaultPagingNum, + }) if err != nil { return nil } result.Followers = int(followersCount) - _, followingCount, err := user_model.GetUserFollowing(ctx, user, doer, db.ListOptions{ListAll: true}) + _, followingCount, err := user_model.GetUserFollowing(ctx, user, doer, db.ListOptions{ + Page: 1, + PageSize: setting.API.DefaultPagingNum, + }) if err != nil { return nil } From 8fcb0647aac9dc749c0a55c573d57e4d615b8dee Mon Sep 17 00:00:00 2001 From: yp05327 <576951401@qq.com> Date: Mon, 22 May 2023 02:28:09 +0000 Subject: [PATCH 08/20] fix unit test --- services/convert/user_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/convert/user_test.go b/services/convert/user_test.go index 212d7500113ed..d61f3a88d10d3 100644 --- a/services/convert/user_test.go +++ b/services/convert/user_test.go @@ -20,7 +20,7 @@ func TestUser_ToUser(t *testing.T) { user1 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 1, IsAdmin: true}) - apiUser := toUser(db.DefaultContext, user1, nil, perm.AccessModeRead) + apiUser := toUser(db.DefaultContext, user1, user1, perm.AccessModeNone) assert.True(t, apiUser.IsAdmin) assert.Contains(t, apiUser.AvatarURL, "://") From 772638cfd1d2c9694a35c1152f455029f04610d3 Mon Sep 17 00:00:00 2001 From: yp05327 <576951401@qq.com> Date: Mon, 22 May 2023 02:29:40 +0000 Subject: [PATCH 09/20] pre fix conflict --- models/migrations/migrations.go | 2 +- models/migrations/v1_20/{v257.go => v258.go} | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename models/migrations/v1_20/{v257.go => v258.go} (100%) diff --git a/models/migrations/migrations.go b/models/migrations/migrations.go index 2e04183508cf5..0c0df4ad3bdf4 100644 --- a/models/migrations/migrations.go +++ b/models/migrations/migrations.go @@ -491,7 +491,7 @@ var migrations = []Migration{ NewMigration("Add ArchivedUnix Column", v1_20.AddArchivedUnixToRepository), // v256 -> v257 NewMigration("Add is_internal column to package", v1_20.AddIsInternalColumnToPackage), - // v257 -> v258 + // v258 -> v259 NewMigration("Drop column NumFollowers and NumFollowing on User", v1_20.DropColumnNumFollowersAndNumFollowingOnUser), } diff --git a/models/migrations/v1_20/v257.go b/models/migrations/v1_20/v258.go similarity index 100% rename from models/migrations/v1_20/v257.go rename to models/migrations/v1_20/v258.go From 8aa7b818879c2b0a9c3489af96ebd746a24e9063 Mon Sep 17 00:00:00 2001 From: yp05327 <576951401@qq.com> Date: Mon, 22 May 2023 04:15:21 +0000 Subject: [PATCH 10/20] fix lint --- models/migrations/migrations.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/models/migrations/migrations.go b/models/migrations/migrations.go index d05f970e85ea6..a548166b470f0 100644 --- a/models/migrations/migrations.go +++ b/models/migrations/migrations.go @@ -493,7 +493,7 @@ var migrations = []Migration{ NewMigration("Add is_internal column to package", v1_20.AddIsInternalColumnToPackage), // v257 -> v258 NewMigration("Add Actions Artifact table", v1_20.CreateActionArtifactTable), - // v258 -> v259 + // v258 -> v259 NewMigration("Drop column NumFollowers and NumFollowing on User", v1_20.DropColumnNumFollowersAndNumFollowingOnUser), } From b57c9cb0ba3263f4151b1cbd43abf29805d326f3 Mon Sep 17 00:00:00 2001 From: yp05327 <576951401@qq.com> Date: Thu, 25 May 2023 05:04:28 +0000 Subject: [PATCH 11/20] improve --- models/user/user.go | 38 ++++++++++++++++++++++++++++++++++++++ services/convert/user.go | 15 ++++----------- 2 files changed, 42 insertions(+), 11 deletions(-) diff --git a/models/user/user.go b/models/user/user.go index 85935ea454f65..6e91a3533674e 100644 --- a/models/user/user.go +++ b/models/user/user.go @@ -353,6 +353,44 @@ func GetUserFollowing(ctx context.Context, u, viewer *User, listOptions db.ListO return users, count, err } +// GetUserFollowers returns range of user's followers. +func GetUserFollowersCount(ctx context.Context, u, viewer *User, listOptions db.ListOptions) (int64, error) { + sess := db.GetEngine(ctx). + Select("`user`.*"). + Join("LEFT", "follow", "`user`.id=follow.user_id"). + Where("follow.follow_id=?", u.ID). + And("`user`.type=?", UserTypeIndividual). + And(isUserVisibleToViewerCond(viewer)) + + if listOptions.Page != 0 { + sess = db.SetSessionPagination(sess, &listOptions) + count, err := sess.Count() + return count, err + } + + count, err := sess.Count() + return count, err +} + +// GetUserFollowing returns range of user's following. +func GetUserFollowingCount(ctx context.Context, u, viewer *User, listOptions db.ListOptions) (int64, error) { + sess := db.GetEngine(db.DefaultContext). + Select("`user`.*"). + Join("LEFT", "follow", "`user`.id=follow.follow_id"). + Where("follow.user_id=?", u.ID). + And("`user`.type IN (?, ?)", UserTypeIndividual, UserTypeOrganization). + And(isUserVisibleToViewerCond(viewer)) + + if listOptions.Page != 0 { + sess = db.SetSessionPagination(sess, &listOptions) + count, err := sess.Count() + return count, err + } + + count, err := sess.Count() + return count, err +} + // NewGitSig generates and returns the signature of given user. func (u *User) NewGitSig() *git.Signature { return &git.Signature{ diff --git a/services/convert/user.go b/services/convert/user.go index 24401beb6c353..ee6e15d2dbd3c 100644 --- a/services/convert/user.go +++ b/services/convert/user.go @@ -9,7 +9,6 @@ import ( "code.gitea.io/gitea/models/db" "code.gitea.io/gitea/models/perm" user_model "code.gitea.io/gitea/models/user" - "code.gitea.io/gitea/modules/setting" api "code.gitea.io/gitea/modules/structs" ) @@ -66,22 +65,16 @@ func toUser(ctx context.Context, user, doer *user_model.User, accessMode perm.Ac signed = true authed = doer.ID == user.ID || doer.IsAdmin - _, followersCount, err := user_model.GetUserFollowers(ctx, user, doer, db.ListOptions{ - Page: 1, - PageSize: setting.API.DefaultPagingNum, - }) + count, err := user_model.GetUserFollowersCount(ctx, user, doer, db.ListOptions{ListAll: true}) if err != nil { return nil } - result.Followers = int(followersCount) - _, followingCount, err := user_model.GetUserFollowing(ctx, user, doer, db.ListOptions{ - Page: 1, - PageSize: setting.API.DefaultPagingNum, - }) + result.Followers = int(count) + count, err = user_model.GetUserFollowingCount(ctx, user, doer, db.ListOptions{ListAll: true}) if err != nil { return nil } - result.Following = int(followingCount) + result.Following = int(count) } else if accessMode != perm.AccessModeNone { signed = true } From cc750a91199b5ec0b1b9cff5b4bf9a020c72a657 Mon Sep 17 00:00:00 2001 From: yp05327 <576951401@qq.com> Date: Thu, 25 May 2023 05:05:52 +0000 Subject: [PATCH 12/20] fix comment --- models/user/user.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/models/user/user.go b/models/user/user.go index 6e91a3533674e..e526a3f225f75 100644 --- a/models/user/user.go +++ b/models/user/user.go @@ -353,7 +353,7 @@ func GetUserFollowing(ctx context.Context, u, viewer *User, listOptions db.ListO return users, count, err } -// GetUserFollowers returns range of user's followers. +// GetUserFollowersCount returns count of user's followers. func GetUserFollowersCount(ctx context.Context, u, viewer *User, listOptions db.ListOptions) (int64, error) { sess := db.GetEngine(ctx). Select("`user`.*"). @@ -372,7 +372,7 @@ func GetUserFollowersCount(ctx context.Context, u, viewer *User, listOptions db. return count, err } -// GetUserFollowing returns range of user's following. +// GetUserFollowingCount returns count of user's following. func GetUserFollowingCount(ctx context.Context, u, viewer *User, listOptions db.ListOptions) (int64, error) { sess := db.GetEngine(db.DefaultContext). Select("`user`.*"). From 8645c5c857e263fb19e48d78ca870b13c38dfe70 Mon Sep 17 00:00:00 2001 From: yp05327 <576951401@qq.com> Date: Thu, 25 May 2023 07:53:05 +0000 Subject: [PATCH 13/20] improve --- models/user/user.go | 65 +++++++++++++++------------------------- services/convert/user.go | 5 ++-- 2 files changed, 26 insertions(+), 44 deletions(-) diff --git a/models/user/user.go b/models/user/user.go index e526a3f225f75..666b7a0689baf 100644 --- a/models/user/user.go +++ b/models/user/user.go @@ -29,6 +29,7 @@ import ( "code.gitea.io/gitea/modules/validation" "xorm.io/builder" + "xorm.io/xorm" ) // UserType defines the user type @@ -309,14 +310,27 @@ func (u *User) GenerateEmailActivateCode(email string) string { return code } -// GetUserFollowers returns range of user's followers. -func GetUserFollowers(ctx context.Context, u, viewer *User, listOptions db.ListOptions) ([]*User, int64, error) { - sess := db.GetEngine(ctx). +func searchUserFollowers(ctx context.Context, u, viewer *User) *xorm.Session { + return db.GetEngine(ctx). Select("`user`.*"). Join("LEFT", "follow", "`user`.id=follow.user_id"). Where("follow.follow_id=?", u.ID). And("`user`.type=?", UserTypeIndividual). And(isUserVisibleToViewerCond(viewer)) +} + +func searchUserFollowing(ctx context.Context, u, viewer *User) *xorm.Session { + return db.GetEngine(db.DefaultContext). + Select("`user`.*"). + Join("LEFT", "follow", "`user`.id=follow.follow_id"). + Where("follow.user_id=?", u.ID). + And("`user`.type IN (?, ?)", UserTypeIndividual, UserTypeOrganization). + And(isUserVisibleToViewerCond(viewer)) +} + +// GetUserFollowers returns range of user's followers. +func GetUserFollowers(ctx context.Context, u, viewer *User, listOptions db.ListOptions) ([]*User, int64, error) { + sess := searchUserFollowers(ctx, u, viewer) if listOptions.Page != 0 { sess = db.SetSessionPagination(sess, &listOptions) @@ -333,12 +347,7 @@ func GetUserFollowers(ctx context.Context, u, viewer *User, listOptions db.ListO // GetUserFollowing returns range of user's following. func GetUserFollowing(ctx context.Context, u, viewer *User, listOptions db.ListOptions) ([]*User, int64, error) { - sess := db.GetEngine(db.DefaultContext). - Select("`user`.*"). - Join("LEFT", "follow", "`user`.id=follow.follow_id"). - Where("follow.user_id=?", u.ID). - And("`user`.type IN (?, ?)", UserTypeIndividual, UserTypeOrganization). - And(isUserVisibleToViewerCond(viewer)) + sess := searchUserFollowing(ctx, u, viewer) if listOptions.Page != 0 { sess = db.SetSessionPagination(sess, &listOptions) @@ -354,41 +363,15 @@ func GetUserFollowing(ctx context.Context, u, viewer *User, listOptions db.ListO } // GetUserFollowersCount returns count of user's followers. -func GetUserFollowersCount(ctx context.Context, u, viewer *User, listOptions db.ListOptions) (int64, error) { - sess := db.GetEngine(ctx). - Select("`user`.*"). - Join("LEFT", "follow", "`user`.id=follow.user_id"). - Where("follow.follow_id=?", u.ID). - And("`user`.type=?", UserTypeIndividual). - And(isUserVisibleToViewerCond(viewer)) - - if listOptions.Page != 0 { - sess = db.SetSessionPagination(sess, &listOptions) - count, err := sess.Count() - return count, err - } - - count, err := sess.Count() - return count, err +func GetUserFollowersCount(ctx context.Context, u, viewer *User) (int64, error) { + sess := searchUserFollowers(ctx, u, viewer) + return sess.Count() } // GetUserFollowingCount returns count of user's following. -func GetUserFollowingCount(ctx context.Context, u, viewer *User, listOptions db.ListOptions) (int64, error) { - sess := db.GetEngine(db.DefaultContext). - Select("`user`.*"). - Join("LEFT", "follow", "`user`.id=follow.follow_id"). - Where("follow.user_id=?", u.ID). - And("`user`.type IN (?, ?)", UserTypeIndividual, UserTypeOrganization). - And(isUserVisibleToViewerCond(viewer)) - - if listOptions.Page != 0 { - sess = db.SetSessionPagination(sess, &listOptions) - count, err := sess.Count() - return count, err - } - - count, err := sess.Count() - return count, err +func GetUserFollowingCount(ctx context.Context, u, viewer *User) (int64, error) { + sess := searchUserFollowing(ctx, u, viewer) + return sess.Count() } // NewGitSig generates and returns the signature of given user. diff --git a/services/convert/user.go b/services/convert/user.go index ee6e15d2dbd3c..6ba767bfa11d9 100644 --- a/services/convert/user.go +++ b/services/convert/user.go @@ -6,7 +6,6 @@ package convert import ( "context" - "code.gitea.io/gitea/models/db" "code.gitea.io/gitea/models/perm" user_model "code.gitea.io/gitea/models/user" api "code.gitea.io/gitea/modules/structs" @@ -65,12 +64,12 @@ func toUser(ctx context.Context, user, doer *user_model.User, accessMode perm.Ac signed = true authed = doer.ID == user.ID || doer.IsAdmin - count, err := user_model.GetUserFollowersCount(ctx, user, doer, db.ListOptions{ListAll: true}) + count, err := user_model.GetUserFollowersCount(ctx, user, doer) if err != nil { return nil } result.Followers = int(count) - count, err = user_model.GetUserFollowingCount(ctx, user, doer, db.ListOptions{ListAll: true}) + count, err = user_model.GetUserFollowingCount(ctx, user, doer) if err != nil { return nil } From 6dee2ac14a4688ba641334d61178ca5859fbd3a0 Mon Sep 17 00:00:00 2001 From: yp05327 <576951401@qq.com> Date: Mon, 29 May 2023 00:14:05 +0000 Subject: [PATCH 14/20] fix sql --- models/user/user.go | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/models/user/user.go b/models/user/user.go index 666b7a0689baf..cb82bad4fd860 100644 --- a/models/user/user.go +++ b/models/user/user.go @@ -312,7 +312,6 @@ func (u *User) GenerateEmailActivateCode(email string) string { func searchUserFollowers(ctx context.Context, u, viewer *User) *xorm.Session { return db.GetEngine(ctx). - Select("`user`.*"). Join("LEFT", "follow", "`user`.id=follow.user_id"). Where("follow.follow_id=?", u.ID). And("`user`.type=?", UserTypeIndividual). @@ -320,8 +319,7 @@ func searchUserFollowers(ctx context.Context, u, viewer *User) *xorm.Session { } func searchUserFollowing(ctx context.Context, u, viewer *User) *xorm.Session { - return db.GetEngine(db.DefaultContext). - Select("`user`.*"). + return db.GetEngine(ctx). Join("LEFT", "follow", "`user`.id=follow.follow_id"). Where("follow.user_id=?", u.ID). And("`user`.type IN (?, ?)", UserTypeIndividual, UserTypeOrganization). From 5a9b107d669ec616e400b57b78ba7a163a90f566 Mon Sep 17 00:00:00 2001 From: yp05327 <576951401@qq.com> Date: Mon, 29 May 2023 00:19:21 +0000 Subject: [PATCH 15/20] fix conflicts --- models/migrations/migrations.go | 2 ++ models/migrations/v1_20/{v258.go => v259.go} | 0 2 files changed, 2 insertions(+) rename models/migrations/v1_20/{v258.go => v259.go} (100%) diff --git a/models/migrations/migrations.go b/models/migrations/migrations.go index a548166b470f0..c45a289b6738e 100644 --- a/models/migrations/migrations.go +++ b/models/migrations/migrations.go @@ -494,6 +494,8 @@ var migrations = []Migration{ // v257 -> v258 NewMigration("Add Actions Artifact table", v1_20.CreateActionArtifactTable), // v258 -> v259 + NewMigration("Add PinOrder Column", v1_20.AddPinOrderToIssue), + // v259 -> v290 NewMigration("Drop column NumFollowers and NumFollowing on User", v1_20.DropColumnNumFollowersAndNumFollowingOnUser), } diff --git a/models/migrations/v1_20/v258.go b/models/migrations/v1_20/v259.go similarity index 100% rename from models/migrations/v1_20/v258.go rename to models/migrations/v1_20/v259.go From af59f2f6c7a1aa1e90dc9ae307807143f710ff42 Mon Sep 17 00:00:00 2001 From: yp05327 <576951401@qq.com> Date: Tue, 30 May 2023 05:32:37 +0000 Subject: [PATCH 16/20] fix --- models/user/user.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/models/user/user.go b/models/user/user.go index 52bb9471579c9..64ef4ff741615 100644 --- a/models/user/user.go +++ b/models/user/user.go @@ -329,7 +329,7 @@ func searchUserFollowing(ctx context.Context, u, viewer *User) *xorm.Session { // GetUserFollowers returns range of user's followers. func GetUserFollowers(ctx context.Context, u, viewer *User, listOptions db.ListOptions) ([]*User, int64, error) { - sess := searchUserFollowers(ctx, u, viewer) + sess := searchUserFollowers(ctx, u, viewer).Select("`user`.*") if listOptions.Page != 0 { sess = db.SetSessionPagination(sess, &listOptions) @@ -346,7 +346,7 @@ func GetUserFollowers(ctx context.Context, u, viewer *User, listOptions db.ListO // GetUserFollowing returns range of user's following. func GetUserFollowing(ctx context.Context, u, viewer *User, listOptions db.ListOptions) ([]*User, int64, error) { - sess := searchUserFollowing(ctx, u, viewer) + sess := searchUserFollowing(ctx, u, viewer).Select("`user`.*") if listOptions.Page != 0 { sess = db.SetSessionPagination(sess, &listOptions) From 4e6608387e158a27ef7ce4e7374e71392c12ed60 Mon Sep 17 00:00:00 2001 From: yp05327 <576951401@qq.com> Date: Tue, 30 May 2023 06:29:36 +0000 Subject: [PATCH 17/20] fix sql --- models/user/user.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/models/user/user.go b/models/user/user.go index 64ef4ff741615..03a3ba1affdd1 100644 --- a/models/user/user.go +++ b/models/user/user.go @@ -363,13 +363,13 @@ func GetUserFollowing(ctx context.Context, u, viewer *User, listOptions db.ListO // GetUserFollowersCount returns count of user's followers. func GetUserFollowersCount(ctx context.Context, u, viewer *User) (int64, error) { - sess := searchUserFollowers(ctx, u, viewer) + sess := searchUserFollowers(ctx, u, viewer).Table("`user`") return sess.Count() } // GetUserFollowingCount returns count of user's following. func GetUserFollowingCount(ctx context.Context, u, viewer *User) (int64, error) { - sess := searchUserFollowing(ctx, u, viewer) + sess := searchUserFollowing(ctx, u, viewer).Table("`user`") return sess.Count() } From cdf832ddab1bbe27c3c1ad1751d1f2d2393530b3 Mon Sep 17 00:00:00 2001 From: yp05327 <576951401@qq.com> Date: Mon, 5 Jun 2023 08:20:00 +0000 Subject: [PATCH 18/20] fix --- models/migrations/migrations.go | 2 +- models/migrations/v1_20/{v259.go => v260.go} | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename models/migrations/v1_20/{v259.go => v260.go} (100%) diff --git a/models/migrations/migrations.go b/models/migrations/migrations.go index c45a289b6738e..608f0ba9ded2d 100644 --- a/models/migrations/migrations.go +++ b/models/migrations/migrations.go @@ -495,7 +495,7 @@ var migrations = []Migration{ NewMigration("Add Actions Artifact table", v1_20.CreateActionArtifactTable), // v258 -> v259 NewMigration("Add PinOrder Column", v1_20.AddPinOrderToIssue), - // v259 -> v290 + // v259 -> v260 NewMigration("Drop column NumFollowers and NumFollowing on User", v1_20.DropColumnNumFollowersAndNumFollowingOnUser), } diff --git a/models/migrations/v1_20/v259.go b/models/migrations/v1_20/v260.go similarity index 100% rename from models/migrations/v1_20/v259.go rename to models/migrations/v1_20/v260.go From 094be5df6c14bd9bd42d10df58c58a3b171dbb63 Mon Sep 17 00:00:00 2001 From: yp05327 <576951401@qq.com> Date: Mon, 5 Jun 2023 08:25:07 +0000 Subject: [PATCH 19/20] fix --- models/migrations/migrations.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/models/migrations/migrations.go b/models/migrations/migrations.go index 8562c9995eb43..bdbfec43d7444 100644 --- a/models/migrations/migrations.go +++ b/models/migrations/migrations.go @@ -496,8 +496,8 @@ var migrations = []Migration{ // v258 -> v259 NewMigration("Add PinOrder Column", v1_20.AddPinOrderToIssue), // v259 -> v260 - NewMigration("Convert scoped access tokens", v1_20.ConvertScopedAccessTokens), - // v260 -> v261 + NewMigration("Convert scoped access tokens", v1_20.ConvertScopedAccessTokens), + // v260 -> v261 NewMigration("Drop column NumFollowers and NumFollowing on User", v1_20.DropColumnNumFollowersAndNumFollowingOnUser), } From f0206ffcd3931d43daafd63097ce2d0514c170c3 Mon Sep 17 00:00:00 2001 From: yp05327 <576951401@qq.com> Date: Wed, 14 Jun 2023 08:53:44 +0000 Subject: [PATCH 20/20] fix conflict --- models/migrations/migrations.go | 4 ++-- models/migrations/{v1_20/v260.go => v1_21/v261.go} | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) rename models/migrations/{v1_20/v260.go => v1_21/v261.go} (95%) diff --git a/models/migrations/migrations.go b/models/migrations/migrations.go index 3dd98721cc6b2..0fddc7d2be951 100644 --- a/models/migrations/migrations.go +++ b/models/migrations/migrations.go @@ -503,8 +503,8 @@ var migrations = []Migration{ // v260 -> v261 NewMigration("Drop custom_labels column of action_runner table", v1_21.DropCustomLabelsColumnOfActionRunner), - // v261 -> v262 - NewMigration("Drop column NumFollowers and NumFollowing on User", v1_20.DropColumnNumFollowersAndNumFollowingOnUser), + // v261 -> v262 + NewMigration("Drop column NumFollowers and NumFollowing on User", v1_21.DropColumnNumFollowersAndNumFollowingOnUser), } // GetCurrentDBVersion returns the current db version diff --git a/models/migrations/v1_20/v260.go b/models/migrations/v1_21/v261.go similarity index 95% rename from models/migrations/v1_20/v260.go rename to models/migrations/v1_21/v261.go index 0277180a4c472..ee855baeec3ad 100644 --- a/models/migrations/v1_20/v260.go +++ b/models/migrations/v1_21/v261.go @@ -1,7 +1,7 @@ // Copyright 2023 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_20 //nolint +package v1_21 //nolint import ( "code.gitea.io/gitea/models/migrations/base"