家庭组 权益修改
Build docker and publish / build (20.15.1) (push) Successful in 8m16s

This commit is contained in:
2026-03-04 22:02:42 -08:00
parent 3594097d47
commit 4349a7ea2f
28 changed files with 960 additions and 96 deletions
@@ -118,6 +118,7 @@ func (h *familyBindingHelper) joinFamily(ownerUserId, memberUserId int64, source
result := &familyJoinResult{
OwnerUserId: ownerUserId,
}
removedSubscribes := make([]user.Subscribe, 0)
err := h.svcCtx.DB.WithContext(h.ctx).Transaction(func(tx *gorm.DB) error {
ownerFamily, err := h.getOrCreateOwnerFamily(tx, ownerUserId)
@@ -166,20 +167,24 @@ func (h *familyBindingHelper) joinFamily(ownerUserId, memberUserId int64, source
if err = tx.Create(&memberRecord).Error; err != nil {
return errors.Wrapf(xerr.NewErrCode(xerr.DatabaseInsertError), "create family member failed")
}
return nil
} else {
if memberRecord.FamilyId != ownerFamily.Id {
memberRecord.FamilyId = ownerFamily.Id
}
memberRecord.Status = user.FamilyMemberActive
memberRecord.Role = user.FamilyRoleMember
memberRecord.JoinSource = source
memberRecord.JoinedAt = now
memberRecord.LeftAt = nil
memberRecord.DeletedAt = gorm.DeletedAt{}
if err = tx.Unscoped().Save(&memberRecord).Error; err != nil {
return errors.Wrapf(xerr.NewErrCode(xerr.DatabaseUpdateError), "update family member failed")
}
}
if memberRecord.FamilyId != ownerFamily.Id {
memberRecord.FamilyId = ownerFamily.Id
}
memberRecord.Status = user.FamilyMemberActive
memberRecord.Role = user.FamilyRoleMember
memberRecord.JoinSource = source
memberRecord.JoinedAt = now
memberRecord.LeftAt = nil
memberRecord.DeletedAt = gorm.DeletedAt{}
if err = tx.Unscoped().Save(&memberRecord).Error; err != nil {
return errors.Wrapf(xerr.NewErrCode(xerr.DatabaseUpdateError), "update family member failed")
removedSubscribes, err = clearMemberSubscribes(tx, memberUserId)
if err != nil {
return err
}
return nil
})
@@ -187,9 +192,63 @@ func (h *familyBindingHelper) joinFamily(ownerUserId, memberUserId int64, source
if err != nil {
return nil, err
}
if err = h.clearRemovedMemberSubscribeCache(removedSubscribes); err != nil {
return nil, err
}
return result, nil
}
func clearMemberSubscribes(tx *gorm.DB, memberUserId int64) ([]user.Subscribe, error) {
var subscribes []user.Subscribe
if err := tx.Model(&user.Subscribe{}).
Where("user_id = ?", memberUserId).
Find(&subscribes).Error; err != nil {
return nil, errors.Wrapf(xerr.NewErrCode(xerr.DatabaseQueryError), "query member subscribe list failed")
}
if len(subscribes) == 0 {
return nil, nil
}
if err := tx.Where("user_id = ?", memberUserId).Delete(&user.Subscribe{}).Error; err != nil {
return nil, errors.Wrapf(xerr.NewErrCode(xerr.DatabaseUpdateError), "delete member subscribe list failed")
}
return subscribes, nil
}
func (h *familyBindingHelper) clearRemovedMemberSubscribeCache(removedSubscribes []user.Subscribe) error {
if len(removedSubscribes) == 0 {
return nil
}
subscribeModels, subscribeIDSet := buildRemovedSubscribeCacheMeta(removedSubscribes)
if err := h.svcCtx.UserModel.ClearSubscribeCache(h.ctx, subscribeModels...); err != nil {
return errors.Wrapf(xerr.NewErrCode(xerr.ERROR), "clear member subscribe cache failed")
}
for subscribeID := range subscribeIDSet {
if err := h.svcCtx.SubscribeModel.ClearCache(h.ctx, subscribeID); err != nil {
return errors.Wrapf(xerr.NewErrCode(xerr.ERROR), "clear subscribe cache failed")
}
}
if err := h.svcCtx.NodeModel.ClearServerAllCache(h.ctx); err != nil {
return errors.Wrapf(xerr.NewErrCode(xerr.ERROR), "clear node cache failed")
}
return nil
}
func buildRemovedSubscribeCacheMeta(removedSubscribes []user.Subscribe) ([]*user.Subscribe, map[int64]struct{}) {
subscribeModels := make([]*user.Subscribe, 0, len(removedSubscribes))
subscribeIDSet := make(map[int64]struct{}, len(removedSubscribes))
for i := range removedSubscribes {
subscribeModels = append(subscribeModels, &removedSubscribes[i])
if removedSubscribes[i].SubscribeId > 0 {
subscribeIDSet[removedSubscribes[i].SubscribeId] = struct{}{}
}
}
return subscribeModels, subscribeIDSet
}
func (h *familyBindingHelper) getOrCreateOwnerFamily(tx *gorm.DB, ownerUserId int64) (*user.UserFamily, error) {
var ownerFamily user.UserFamily
err := tx.Unscoped().Clauses(clause.Locking{Strength: "UPDATE"}).