113 lines
2.1 KiB
Go
113 lines
2.1 KiB
Go
|
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
|
||
|
}
|