From 7c40982a00e9b874fd852ef9f9aa8aff98fd424b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Leandro=20Ant=C3=B4nio=20Farias=20Machado?= Date: Thu, 20 Apr 2023 11:37:20 -0300 Subject: [PATCH] feat: save devices at database --- backend/services/controller/go.mod | 1 + backend/services/controller/go.sum | 2 ++ .../services/controller/internal/db/device.go | 35 +++++++++++++++++-- .../services/controller/internal/mqtt/mqtt.go | 4 +-- 4 files changed, 37 insertions(+), 5 deletions(-) diff --git a/backend/services/controller/go.mod b/backend/services/controller/go.mod index e8d211b..8457d1a 100755 --- a/backend/services/controller/go.mod +++ b/backend/services/controller/go.mod @@ -10,6 +10,7 @@ require ( require ( github.com/golang/snappy v0.0.1 // indirect + github.com/gorilla/mux v1.8.0 // indirect github.com/klauspost/compress v1.13.6 // indirect github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe // indirect github.com/pkg/errors v0.9.1 // indirect diff --git a/backend/services/controller/go.sum b/backend/services/controller/go.sum index fc404e7..19993ba 100644 --- a/backend/services/controller/go.sum +++ b/backend/services/controller/go.sum @@ -9,6 +9,8 @@ github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEW github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= +github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/klauspost/compress v1.13.6 h1:P76CopJELS0TiO2mebmnzgWaajssP/EszplttgQxcgc= github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= diff --git a/backend/services/controller/internal/db/device.go b/backend/services/controller/internal/db/device.go index 6883b2c..e152afc 100644 --- a/backend/services/controller/internal/db/device.go +++ b/backend/services/controller/internal/db/device.go @@ -1,6 +1,14 @@ package db +import ( + "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/mongo" + "go.mongodb.org/mongo-driver/mongo/options" + "log" +) + type Device struct { + SN string Model string Customer string Vendor string @@ -8,12 +16,33 @@ type Device struct { } func (d *Database) CreateDevice(device Device) error { - _, err := d.devices.InsertOne(d.ctx, device, nil) + var result bson.M + opts := options.FindOneAndReplace().SetUpsert(true) + err := d.devices.FindOneAndReplace(d.ctx, bson.D{{"sn", device.SN}}, device, opts).Decode(&result) + if err != nil { + if err == mongo.ErrNoDocuments { + log.Printf("New device %s added to database", device.SN) + return nil + } + log.Fatal(err) + } + log.Printf("Device %s already existed, and got replaced for new info", device.SN) return err } -func (d *Database) RetrieveDevice() { - +func (d *Database) RetrieveDevices() ([]Device, error) { + var results []Device + //TODO: filter devices by user ownership + cursor, err := d.devices.Find(d.ctx, bson.D{}, nil) + if err != nil { + log.Println(err) + return nil, err + } + if err = cursor.All(d.ctx, &results); err != nil { + log.Println(err) + return nil, err + } + return results, nil } func (d *Database) DeleteDevice() { diff --git a/backend/services/controller/internal/mqtt/mqtt.go b/backend/services/controller/internal/mqtt/mqtt.go index a30b206..662d886 100644 --- a/backend/services/controller/internal/mqtt/mqtt.go +++ b/backend/services/controller/internal/mqtt/mqtt.go @@ -238,6 +238,7 @@ func (m *Mqtt) handleNewDevice(deviceMac string) { "Device.DeviceInfo.Manufacturer", "Device.DeviceInfo.ModelName", "Device.DeviceInfo.SoftwareVersion", + "Device.DeviceInfo.SerialNumber", }, MaxDepth: 1, }, @@ -285,11 +286,10 @@ func (m *Mqtt) handleDevicesResponse(p []byte) { device.Vendor = msg.ReqPathResults[0].ResolvedPathResults[0].ResultParams["Manufacturer"] device.Model = msg.ReqPathResults[1].ResolvedPathResults[0].ResultParams["ModelName"] device.Version = msg.ReqPathResults[2].ResolvedPathResults[0].ResultParams["SoftwareVersion"] + device.SN = msg.ReqPathResults[3].ResolvedPathResults[0].ResultParams["SerialNumber"] err = m.DB.CreateDevice(device) if err != nil { log.Fatal(err) } - - log.Printf("New device saved at database") }