package wechat import ( "context" "wechat-api/ent" "wechat-api/ent/agent" "wechat-api/ent/contact" "wechat-api/ent/label" "wechat-api/ent/labelrelationship" "wechat-api/ent/wx" ) type WxSafeChange struct { Ctx context.Context Tx *ent.Tx WxId string OrganizationId uint64 } func (w *WxSafeChange) KeepAllSafe() error { err := w.BlockListSafe() if err != nil { return err } err = w.AgentSafe() if err != nil { return err } err = w.LabelSafe() if err != nil { return err } return nil } func (w *WxSafeChange) BlockListSafe() error { wxinfo, err := w.Tx.Wx.Query(). Where( wx.Wxid(w.WxId), ). Only(w.Ctx) if err != nil { if ent.IsNotFound(err) { return nil } return err } bl := []string{} if wxinfo == nil { return nil } for _, l := range wxinfo.BlockList { if l != "" && l != "ALL" { bl = append(bl, l) } } for _, l := range wxinfo.GroupBlockList { if l != "" && l != "ALL" { bl = append(bl, l) } } for _, l := range wxinfo.AllowList { if l != "" && l != "ALL" { bl = append(bl, l) } } for _, l := range wxinfo.GroupAllowList { if l != "" && l != "ALL" { bl = append(bl, l) } } contactList, err := w.Tx.Contact.Query(). Where( contact.WxWxidNEQ(w.WxId), contact.WxidIn(bl...), ).All(w.Ctx) if err != nil && !ent.IsNotFound(err) { return err } if contactList != nil { _, err = w.Tx.Wx.UpdateOneID(wxinfo.ID). SetBlockList([]string{}). SetGroupBlockList([]string{}). SetAllowList([]string{"ALL"}). SetGroupAllowList([]string{"ALL"}). Save(w.Ctx) if err != nil { return err } } return nil } func (w *WxSafeChange) AgentSafe() error { wxinfo, err := w.Tx.Wx.Query(). Where( wx.Wxid(w.WxId), wx.HasAgentWith( agent.DeletedAtIsNil(), agent.OrganizationIDNEQ(w.OrganizationId), ), ). WithAgent(). Only(w.Ctx) if err != nil { if ent.IsNotFound(err) { return nil } return err } if wxinfo != nil && wxinfo.Edges.Agent != nil { _, err = w.Tx.Wx.UpdateOneID(wxinfo.ID). SetAgentID(0). Save(w.Ctx) if err != nil { return err } } return nil } func (w *WxSafeChange) LabelSafe() error { // 获取现有联系人的所有标签名称 contactLabelNames, err := w.Tx.Label.Query(). Where( label.DeletedAtIsNil(), label.HasLabelRelationshipsWith( labelrelationship.DeletedAtIsNil(), labelrelationship.HasContactsWith( contact.WxWxidEQ(w.WxId), ), ), ). Select(label.FieldName). Strings(w.Ctx) if err != nil { if ent.IsNotFound(err) { return nil } return err } newLabelNames, err := w.Tx.Label.Query(). Where( label.DeletedAtIsNil(), label.OrganizationIDEQ(w.OrganizationId), label.NameNotIn(contactLabelNames...), ). Select(label.FieldName). Strings(w.Ctx) if err != nil && !ent.IsNotFound(err) { return err } if newLabelNames == nil && len(newLabelNames) > 0 { // 创建新标签 for _, labelName := range newLabelNames { _, err = w.Tx.Label.Create(). SetName(labelName). SetOrganizationID(w.OrganizationId). Save(w.Ctx) if err != nil { return err } } } // 建立新的标签 id 映射关系 orgLabels, err := w.Tx.Label.Query(). Where( label.DeletedAtIsNil(), label.OrganizationIDEQ(w.OrganizationId), label.NameIn(contactLabelNames...), ). Select(label.FieldID, label.FieldName). All(w.Ctx) if err != nil { return err } labelSet := make(map[string]uint64) for _, l := range orgLabels { labelSet[l.Name] = l.ID } // 建立新的标签关系 labelRelationships, err := w.Tx.LabelRelationship.Query(). Where( labelrelationship.DeletedAtIsNil(), labelrelationship.HasContactsWith( contact.WxWxidEQ(w.WxId), ), ).WithLabels().WithContacts().All(w.Ctx) if err != nil { return err } for _, relationship := range labelRelationships { _, err = w.Tx.LabelRelationship.Create(). SetLabelID(labelSet[relationship.Edges.Labels.Name]). SetContactID(relationship.Edges.Contacts.ID). Save(w.Ctx) if err != nil { return err } } // 删除旧的标签关系 _, err = w.Tx.LabelRelationship.Delete(). Where( labelrelationship.DeletedAtIsNil(), labelrelationship.HasLabelsWith( label.OrganizationIDNEQ(w.OrganizationId)), labelrelationship.HasContactsWith( contact.WxWxidEQ(w.WxId), ), ).Exec(w.Ctx) if err != nil { return err } return nil }