github.com/simpleiot/simpleiot@v0.18.3/store/notification.go (about) 1 package store 2 3 // TODO this code is currently not used and needs to be moved to a client 4 5 /* 6 func (st *Store) handleNotification(msg *nats.Msg) { 7 chunks := strings.Split(msg.Subject, ".") 8 if len(chunks) < 2 { 9 log.Println("Error in message subject:", msg.Subject) 10 return 11 } 12 13 nodeID := chunks[1] 14 15 not, err := data.PbDecodeNotification(msg.Data) 16 17 if err != nil { 18 log.Println("Error decoding Pb notification:", err) 19 return 20 } 21 22 userNodes := []data.NodeEdge{} 23 24 var findUsers func(id string) 25 26 findUsers = func(id string) { 27 nodes, err := st.db.getNodes(nil, "all", id, data.NodeTypeUser, false) 28 if err != nil { 29 log.Println("Error find user nodes:", err) 30 return 31 } 32 33 for _, n := range nodes { 34 userNodes = append(userNodes, n) 35 } 36 37 38 // now process upstream nodes 39 upIDs := st.db.edgeUp(id, false) 40 if err != nil { 41 log.Println("Error getting upstream nodes:", err) 42 return 43 } 44 45 for _, id := range upIDs { 46 findUsers(id.Up) 47 } 48 } 49 50 node, err := st.db.node(nodeID) 51 52 if err != nil { 53 log.Println("Error getting node:", nodeID) 54 return 55 } 56 57 if node.Type == data.NodeTypeUser { 58 // if we notify a user node, we only want to message this node, and not walk up the tree 59 nodeEdge := node.ToNodeEdge(data.Edge{Up: not.Parent}) 60 userNodes = append(userNodes, nodeEdge) 61 } else { 62 findUsers(nodeID) 63 } 64 65 for _, userNode := range userNodes { 66 user, err := data.NodeToUser(userNode.ToNode()) 67 68 if err != nil { 69 log.Println("Error converting node to user:", err) 70 continue 71 } 72 73 if user.Email != "" || user.Phone != "" { 74 msg := data.Message{ 75 ID: uuid.New().String(), 76 UserID: user.ID, 77 ParentID: userNode.Parent, 78 NotificationID: nodeID, 79 Email: user.Email, 80 Phone: user.Phone, 81 Subject: not.Subject, 82 Message: not.Message, 83 } 84 85 data, err := msg.ToPb() 86 87 if err != nil { 88 log.Println("Error serializing msg to protobuf:", err) 89 continue 90 } 91 92 err = st.nc.Publish("node."+user.ID+".msg", data) 93 94 if err != nil { 95 log.Println("Error publishing message:", err) 96 continue 97 } 98 } 99 } 100 } 101 102 func (st *Store) handleMessage(natsMsg *nats.Msg) { 103 chunks := strings.Split(natsMsg.Subject, ".") 104 if len(chunks) < 2 { 105 log.Println("Error in message subject:", natsMsg.Subject) 106 return 107 } 108 109 nodeID := chunks[1] 110 111 message, err := data.PbDecodeMessage(natsMsg.Data) 112 113 if err != nil { 114 log.Println("Error decoding Pb message:", err) 115 return 116 } 117 118 svcNodes := []data.NodeEdge{} 119 120 var findSvcNodes func(string) 121 122 level := 0 123 124 findSvcNodes = func(id string) { 125 nodes, err := st.db.getNodes(nil, "all", id, data.NodeTypeMsgService, false) 126 if err != nil { 127 log.Println("Error getting svc descendents:", err) 128 return 129 } 130 131 svcNodes = append(svcNodes, nodes...) 132 133 // now process upstream nodes 134 // if we are at the first level, only process the msg user parent, instead 135 // of all user parents. This eliminates duplicate messages when a user is a 136 // member of multiple groups which may have different notification services. 137 138 var upIDs []*data.Edge 139 140 // FIXME this needs to be moved to client 141 142 if level == 0 { 143 upIDs = []*data.Edge{&data.Edge{Up: message.ParentID}} 144 } else { 145 upIDs = st.db.edgeUp(id, false) 146 if err != nil { 147 log.Println("Error getting upstream nodes:", err) 148 return 149 } 150 } 151 152 level++ 153 154 for _, id := range upIDs { 155 findSvcNodes(id.Up) 156 } 157 } 158 159 findSvcNodes(nodeID) 160 161 svcNodes = data.RemoveDuplicateNodesID(svcNodes) 162 163 for _, svcNode := range svcNodes { 164 svc, err := data.NodeToMsgService(svcNode.ToNode()) 165 if err != nil { 166 log.Println("Error converting node to msg service:", err) 167 continue 168 } 169 170 if svc.Service == data.PointValueTwilio && 171 message.Phone != "" { 172 twilio := msg.NewTwilio(svc.SID, svc.AuthToken, svc.From) 173 174 err := twilio.SendSMS(message.Phone, message.Message) 175 176 if err != nil { 177 log.Printf("Error sending SMS to: %v: %v\n", 178 message.Phone, err) 179 } 180 } 181 } 182 } 183 */