123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228 |
- 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
- }
|