Skip to content

Commit

Permalink
Merge pull request #171 from OktopUSP/dev
Browse files Browse the repository at this point in the history
Dev
  • Loading branch information
leandrofars committed Dec 1, 2023
2 parents 5b803f4 + 76b0371 commit ef3e861
Show file tree
Hide file tree
Showing 4 changed files with 104 additions and 14 deletions.
1 change: 1 addition & 0 deletions backend/services/controller/internal/api/api.go
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@ func StartApi(a Api) {
iot := r.PathPrefix("/api/device").Subrouter()
//TODO: create query for devices
iot.HandleFunc("", a.retrieveDevices).Methods("GET")
iot.HandleFunc("/{id}", a.retrieveDevices).Methods("GET")
iot.HandleFunc("/{sn}/get", a.deviceGetMsg).Methods("PUT")
iot.HandleFunc("/{sn}/add", a.deviceCreateMsg).Methods("PUT")
iot.HandleFunc("/{sn}/del", a.deviceDeleteMsg).Methods("PUT")
Expand Down
84 changes: 82 additions & 2 deletions backend/services/controller/internal/api/device.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,10 @@ package api

import (
"encoding/json"
"go.mongodb.org/mongo-driver/bson"
"log"
"net/http"
"strconv"

"github.com/gorilla/mux"
"github.com/leandrofars/oktopus/internal/db"
Expand Down Expand Up @@ -31,12 +33,90 @@ func (a *Api) deviceGetSupportedParametersMsg(w http.ResponseWriter, r *http.Req
}

func (a *Api) retrieveDevices(w http.ResponseWriter, r *http.Request) {
devices, err := a.Db.RetrieveDevices()
const PAGE_SIZE_LIMIT = 50
const PAGE_SIZE_DEFAULT = 20

// Get specific device
id := mux.Vars(r)["id"]
if id != "" {
device, err := a.Db.RetrieveDevice(id)
if err != nil {
log.Println(err)
w.WriteHeader(http.StatusInternalServerError)
return
}
err = json.NewEncoder(w).Encode(device)
if err != nil {
log.Println(err)
}
return
}

// Get devices with pagination
page_n := r.URL.Query().Get("page_number")
page_s := r.URL.Query().Get("page_size")
var err error

var page_number int64
if page_n == "" {
page_number = 1
} else {
page_number, err = strconv.ParseInt(page_n, 10, 64)
if err != nil {
w.WriteHeader(http.StatusBadRequest)
json.NewEncoder(w).Encode("Page number must be an integer")
return
}
}

var page_size int64
if page_s != "" {
page_size, err = strconv.ParseInt(page_s, 10, 64)

if err != nil {
w.WriteHeader(http.StatusBadRequest)
json.NewEncoder(w).Encode("Page size must be an integer")
return
}

if page_size > PAGE_SIZE_LIMIT {
w.WriteHeader(http.StatusBadRequest)
json.NewEncoder(w).Encode("Page size must not exceed " + strconv.Itoa(PAGE_SIZE_LIMIT))
return
}

} else {
page_size = PAGE_SIZE_DEFAULT
}

total, err := a.Db.RetrieveDevicesCount(bson.M{})
if err != nil {
w.WriteHeader(http.StatusInternalServerError)
json.NewEncoder(w).Encode("Unable to get devices count from database")
}

skip := page_number * (page_size - 1)
if total < page_size {
skip = 0
}

//TODO: Create filters
//TODO: Create sorting

filter := bson.A{
//bson.M{"$match": filter},
//bson.M{"$sort": sort},
bson.M{"$skip": skip},
bson.M{"$limit": page_size},
}

devices, err := a.Db.RetrieveDevices(filter)
if err != nil {
log.Println(err)
w.WriteHeader(http.StatusInternalServerError)
json.NewEncoder(w).Encode("Unable to aggregate database devices info")
return
}

err = json.NewEncoder(w).Encode(devices)
if err != nil {
log.Println(err)
Expand Down
31 changes: 20 additions & 11 deletions backend/services/controller/internal/db/device.go
Original file line number Diff line number Diff line change
Expand Up @@ -42,20 +42,24 @@ func (d *Database) CreateDevice(device Device) error {
log.Printf("Device %s already existed, and got replaced for new info", device.SN)
return err
}
func (d *Database) RetrieveDevices(filter bson.A) ([]Device, error) {
cursor, err := d.devices.Aggregate(d.ctx, filter)

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

for cursor.Next(d.ctx) {
var device Device

err := cursor.Decode(&device)
if err != nil {
log.Println("Error to decode device info fields")
continue
}

results = append(results, device)
}
return results, nil

return results, err
}

func (d *Database) RetrieveDevice(sn string) (Device, error) {
Expand All @@ -68,6 +72,11 @@ func (d *Database) RetrieveDevice(sn string) (Device, error) {
return result, err
}

func (d *Database) RetrieveDevicesCount(filter bson.M) (int64, error) {
count, err := d.devices.CountDocuments(d.ctx, filter)
return count, err
}

func (d *Database) DeleteDevice() {

}
Expand Down
2 changes: 1 addition & 1 deletion devops/docker-compose.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ services:
ipv4_address: 172.16.235.5

frontend:
image: 'node:14.20'
image: 'node:16.20.2'
container_name: frontend
tty: true
stdin_open: true
Expand Down

0 comments on commit ef3e861

Please sign in to comment.