package models import ( "encoding/json" "io/ioutil" "os" "time" "github.com/google/uuid" "github.com/jmoiron/jsonq" "github.com/sirupsen/logrus" ) const ( nodesFilename = "nodes.json" edgesFilename = "edges.json" ) // Node defines the data we gather through the parsing. type Node struct { ID uuid.UUID Flag string `json:"flag"` } // Edge defines a relation between two nodes. type Edge struct { ID uuid.UUID NodeOneID uuid.UUID `json:"NodeOneID"` // NodeTwoID uuid.UUID `json:NodeTwoID` to implement Timestamp time.Time `json:"Timestamp"` Data jsonq.JsonQuery `json:"Data"` } // SaveData is the main function used to save data. You need to pass a specific // flag to it and the data recieved. It just saves data, it doesn't filter or // look for it in the stream. func SaveData(flag string, data jsonq.JsonQuery) { err := fileExists(nodesFilename) if err != nil { logrus.Error(err) } err = fileExists(edgesFilename) if err != nil { logrus.Error(err) } nodeFile, err := ioutil.ReadFile(nodesFilename) if err != nil { logrus.Error(err) } edgeFile, err := ioutil.ReadFile(edgesFilename) if err != nil { logrus.Error(err) } nodeDatas := []Node{} edgeDatas := []Edge{} json.Unmarshal(nodeFile, &nodeDatas) json.Unmarshal(edgeFile, &edgeDatas) node := &Node{ ID: uuid.New(), Flag: flag, } edge := &Edge{ ID: uuid.New(), NodeOneID: node.ID, Timestamp: time.Now(), Data: data, } nodeDatas = append(nodeDatas, *node) edgeDatas = append(edgeDatas, *edge) nodeBytes, err := json.Marshal(nodeDatas) if err != nil { logrus.Error(err) } edgeBytes, err := json.Marshal(edgeDatas) if err != nil { logrus.Error(err) } err = ioutil.WriteFile(nodesFilename, nodeBytes, 0644) if err != nil { logrus.Error(err) } err = ioutil.WriteFile(edgesFilename, edgeBytes, 0644) if err != nil { logrus.Error(err) } } // Helpers func fileExists(filename string) error { _, err := os.Stat(filename) if os.IsNotExist(err) { _, err := os.Create(filename) if err != nil { return err } } return nil }