feat: add friend add and curfew controls

This commit is contained in:
richjohnrambo
2026-09-18 10:55:33 +08:00
parent 348cbcaf96
commit 7c8b4d9b7c
12 changed files with 270 additions and 1 deletions
+49
View File
@@ -360,6 +360,7 @@ func (s *sSysImUser) listModel(ctx context.Context, db gdb.DB) *gdb.Model {
"up.public_account",
"up.gender",
"up.region",
"COALESCE(up.friend_add_enabled, 1) friend_add_enabled",
"us.auth_version",
"us.password_updated_at",
)
@@ -589,6 +590,54 @@ func (s *sSysImUser) AdjustGroup(ctx context.Context, in *sysin.ImUserAdjustGrou
return nil
}
func (s *sSysImUser) FriendAdd(ctx context.Context, in *sysin.ImUserFriendAddInp) error {
if err := in.Filter(ctx); err != nil {
return err
}
scope, err := resolveImAdminScope(ctx, in.TenantId)
if err != nil {
return err
}
db, _, err := imtenant.DB(ctx, scope.TenantId)
if err != nil {
return err
}
now := gtime.Now()
result, err := db.Model("im_user_profiles").Safe().Ctx(ctx).
Where("user_id", in.UserId).
Data(g.Map{
"friend_add_enabled": in.Enabled,
"friend_add_disabled_reason": in.Reason,
"friend_add_policy_version": gdb.Raw("friend_add_policy_version+1"),
"updated_at": now,
}).Update()
if err != nil {
return gerror.Wrap(err, "设置用户加好友开关失败")
}
affected, _ := result.RowsAffected()
if affected == 0 {
profileID, idErr := imtenant.NextSnowflakeID(ctx)
if idErr != nil {
return gerror.Wrap(idErr, "生成用户资料ID失败")
}
_, err = db.Model("im_user_profiles").Safe().Ctx(ctx).Data(g.Map{
"id": profileID,
"user_id": in.UserId,
"public_account": fmt.Sprintf("usr%d", in.UserId),
"friend_add_enabled": in.Enabled,
"friend_add_disabled_reason": in.Reason,
"friend_add_policy_version": 1,
"created_at": now,
"updated_at": now,
}).Insert()
if err != nil {
return gerror.Wrap(err, "补全用户资料并设置加好友开关失败")
}
}
_ = writeImAdminAudit(ctx, scope.TenantId, "im_user_friend_add_update", "user", in.UserId, "success", g.Map{"enabled": in.Enabled, "reason": in.Reason})
return nil
}
func (s *sSysImUser) IPWhitelist(ctx context.Context, in *sysin.ImUserIPWhitelistInp) (*sysin.ImUserIPWhitelistModel, error) {
if err := in.Filter(ctx); err != nil {
return nil, err