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  */