This commit is contained in:
@@ -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"}).
|
||||
|
||||
Reference in New Issue
Block a user