mirror of
https://codeberg.org/forgejo/forgejo.git
synced 2026-05-16 07:46:35 +00:00
- Resolves #476 - Follow up for: #540 - Ensure that the doer and blocked person cannot follow each other. - Ensure that the block person cannot watch doer's repositories. - Add unblock button to the blocked user list. - Add blocked since information to the blocked user list. - Add extra testing to moderation code. - Blocked user will unwatch doer's owned repository upon blocking. - Add flash messages to let the user know the block/unblock action was successful. - Add "You haven't blocked any users" message. - Add organization blocking a user. Co-authored-by: Gusted <postmaster@gusted.xyz> Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/802 (cherry picked from commit0505a10421) (cherry picked from commit37b4e6ef9b) (cherry picked from commit217475385a) (cherry picked from commitf2c38ce5c2) (cherry picked from commit1edfb68137)
80 lines
2.5 KiB
Go
80 lines
2.5 KiB
Go
// Copyright 2023 The Forgejo Authors. All rights reserved.
|
|
// SPDX-License-Identifier: MIT
|
|
|
|
package user
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
|
|
"code.gitea.io/gitea/models/db"
|
|
"code.gitea.io/gitea/modules/timeutil"
|
|
)
|
|
|
|
// ErrBlockedByUser defines an error stating that the user is not allowed to perform the action because they are blocked.
|
|
var ErrBlockedByUser = errors.New("user is blocked by the poster or repository owner")
|
|
|
|
// BlockedUser represents a blocked user entry.
|
|
type BlockedUser struct {
|
|
ID int64 `xorm:"pk autoincr"`
|
|
// UID of the one who got blocked.
|
|
BlockID int64 `xorm:"index"`
|
|
// UID of the one who did the block action.
|
|
UserID int64 `xorm:"index"`
|
|
|
|
CreatedUnix timeutil.TimeStamp `xorm:"created"`
|
|
}
|
|
|
|
// TableName provides the real table name
|
|
func (*BlockedUser) TableName() string {
|
|
return "forgejo_blocked_user"
|
|
}
|
|
|
|
func init() {
|
|
db.RegisterModel(new(BlockedUser))
|
|
}
|
|
|
|
// IsBlocked returns if userID has blocked blockID.
|
|
func IsBlocked(ctx context.Context, userID, blockID int64) bool {
|
|
has, _ := db.GetEngine(ctx).Exist(&BlockedUser{UserID: userID, BlockID: blockID})
|
|
return has
|
|
}
|
|
|
|
// IsBlockedMultiple returns if one of the userIDs has blocked blockID.
|
|
func IsBlockedMultiple(ctx context.Context, userIDs []int64, blockID int64) bool {
|
|
has, _ := db.GetEngine(ctx).In("user_id", userIDs).Exist(&BlockedUser{BlockID: blockID})
|
|
return has
|
|
}
|
|
|
|
// UnblockUser removes the blocked user entry.
|
|
func UnblockUser(ctx context.Context, userID, blockID int64) error {
|
|
_, err := db.GetEngine(ctx).Delete(&BlockedUser{UserID: userID, BlockID: blockID})
|
|
return err
|
|
}
|
|
|
|
// ListBlockedUsers returns the users that the user has blocked.
|
|
// The created_unix field of the user struct is overridden by the creation_unix
|
|
// field of blockeduser.
|
|
func ListBlockedUsers(ctx context.Context, userID int64) ([]*User, error) {
|
|
users := make([]*User, 0, 8)
|
|
err := db.GetEngine(ctx).
|
|
Select("`forgejo_blocked_user`.created_unix, `user`.*").
|
|
Join("INNER", "forgejo_blocked_user", "`user`.id=`forgejo_blocked_user`.block_id").
|
|
Where("`forgejo_blocked_user`.user_id=?", userID).
|
|
Find(&users)
|
|
|
|
return users, err
|
|
}
|
|
|
|
// ListBlockedByUsersID returns the ids of the users that blocked the user.
|
|
func ListBlockedByUsersID(ctx context.Context, userID int64) ([]int64, error) {
|
|
users := make([]int64, 0, 8)
|
|
err := db.GetEngine(ctx).
|
|
Table("user").
|
|
Select("`user`.id").
|
|
Join("INNER", "forgejo_blocked_user", "`user`.id=`forgejo_blocked_user`.user_id").
|
|
Where("`forgejo_blocked_user`.block_id=?", userID).
|
|
Find(&users)
|
|
|
|
return users, err
|
|
}
|