loading up the forgejo repo on tangled to test page performance
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

at forgejo 95 lines 2.5 kB view raw
1// Copyright 2023 The Forgejo Authors. All rights reserved. 2// SPDX-License-Identifier: MIT 3package user 4 5import ( 6 "context" 7 8 model "forgejo.org/models" 9 "forgejo.org/models/db" 10 repo_model "forgejo.org/models/repo" 11 user_model "forgejo.org/models/user" 12 13 "xorm.io/builder" 14) 15 16// BlockUser adds a blocked user entry for userID to block blockID. 17// TODO: Figure out if instance admins should be immune to blocking. 18// TODO: Add more mechanism like removing blocked user as collaborator on 19// repositories where the user is an owner. 20func BlockUser(ctx context.Context, userID, blockID int64) error { 21 if userID == blockID || user_model.IsBlocked(ctx, userID, blockID) { 22 return nil 23 } 24 25 ctx, committer, err := db.TxContext(ctx) 26 if err != nil { 27 return err 28 } 29 defer committer.Close() 30 31 // Add the blocked user entry. 32 _, err = db.GetEngine(ctx).Insert(&user_model.BlockedUser{UserID: userID, BlockID: blockID}) 33 if err != nil { 34 return err 35 } 36 37 // Unfollow the user from the block's perspective. 38 err = user_model.UnfollowUser(ctx, blockID, userID) 39 if err != nil { 40 return err 41 } 42 43 // Unfollow the user from the doer's perspective. 44 err = user_model.UnfollowUser(ctx, userID, blockID) 45 if err != nil { 46 return err 47 } 48 49 // Blocked user unwatch all repository owned by the doer. 50 repoIDs, err := repo_model.GetWatchedRepoIDsOwnedBy(ctx, blockID, userID) 51 if err != nil { 52 return err 53 } 54 55 err = repo_model.UnwatchRepos(ctx, blockID, repoIDs) 56 if err != nil { 57 return err 58 } 59 60 // Remove blocked user as collaborator from repositories the user owns as an 61 // individual. 62 collabsID, err := repo_model.GetCollaboratorWithUser(ctx, userID, blockID) 63 if err != nil { 64 return err 65 } 66 67 _, err = db.GetEngine(ctx).In("id", collabsID).Delete(&repo_model.Collaboration{}) 68 if err != nil { 69 return err 70 } 71 72 // Remove pending repository transfers, and set the status on those repository 73 // back to ready. 74 pendingTransfersIDs, err := model.GetPendingTransferIDs(ctx, userID, blockID) 75 if err != nil { 76 return err 77 } 78 79 // Use a subquery instead of a JOIN, because not every database supports JOIN 80 // on a UPDATE query. 81 _, err = db.GetEngine(ctx).Table("repository"). 82 In("id", builder.Select("repo_id").From("repo_transfer").Where(builder.In("id", pendingTransfersIDs))). 83 Cols("status"). 84 Update(&repo_model.Repository{Status: repo_model.RepositoryReady}) 85 if err != nil { 86 return err 87 } 88 89 _, err = db.GetEngine(ctx).In("id", pendingTransfersIDs).Delete(&model.RepoTransfer{}) 90 if err != nil { 91 return err 92 } 93 94 return committer.Commit() 95}