From e207bd0f0a42a9d3e570f5642f0ae00cd4ba5f16 Mon Sep 17 00:00:00 2001 From: leandrofars Date: Sun, 24 Dec 2023 11:19:32 -0300 Subject: [PATCH 1/4] feat: script to run agent --- agent/run.sh | 1 + 1 file changed, 1 insertion(+) create mode 100644 agent/run.sh diff --git a/agent/run.sh b/agent/run.sh new file mode 100644 index 0000000..996e4a4 --- /dev/null +++ b/agent/run.sh @@ -0,0 +1 @@ +obuspa -p -v 4 -r ./oktopus-mqtt-obuspa.txt -i lo \ No newline at end of file From 3fa8315d622e895392be98345589e775e543b87e Mon Sep 17 00:00:00 2001 From: leandrofars Date: Sun, 24 Dec 2023 11:19:53 -0300 Subject: [PATCH 2/4] fix(controller): list device by id --- backend/services/controller/internal/api/device.go | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/backend/services/controller/internal/api/device.go b/backend/services/controller/internal/api/device.go index af4e798..8c0675b 100644 --- a/backend/services/controller/internal/api/device.go +++ b/backend/services/controller/internal/api/device.go @@ -2,11 +2,12 @@ package api import ( "encoding/json" - "go.mongodb.org/mongo-driver/bson" "log" "net/http" "strconv" + "go.mongodb.org/mongo-driver/bson" + "github.com/gorilla/mux" "github.com/leandrofars/oktopus/internal/db" usp_msg "github.com/leandrofars/oktopus/internal/usp_message" @@ -37,11 +38,15 @@ func (a *Api) retrieveDevices(w http.ResponseWriter, r *http.Request) { const PAGE_SIZE_DEFAULT = 20 // Get specific device - id := mux.Vars(r)["id"] + id := r.URL.Query().Get("id") if id != "" { device, err := a.Db.RetrieveDevice(id) if err != nil { - log.Println(err) + if err == mongo.ErrNoDocuments { + json.NewEncoder(w).Encode("Device id: " + id + " not found") + return + } + json.NewEncoder(w).Encode(err) w.WriteHeader(http.StatusInternalServerError) return } From 318720d9fa7389414068aea11ec1be29ec859c11 Mon Sep 17 00:00:00 2001 From: leandrofars Date: Sun, 24 Dec 2023 13:21:21 -0300 Subject: [PATCH 3/4] feat(controller): add details for devices list --- backend/services/controller/internal/api/device.go | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/backend/services/controller/internal/api/device.go b/backend/services/controller/internal/api/device.go index 8c0675b..d533217 100644 --- a/backend/services/controller/internal/api/device.go +++ b/backend/services/controller/internal/api/device.go @@ -98,6 +98,7 @@ func (a *Api) retrieveDevices(w http.ResponseWriter, r *http.Request) { if err != nil { w.WriteHeader(http.StatusInternalServerError) json.NewEncoder(w).Encode("Unable to get devices count from database") + return } skip := page_number * (page_size - 1) @@ -122,12 +123,15 @@ func (a *Api) retrieveDevices(w http.ResponseWriter, r *http.Request) { return } - err = json.NewEncoder(w).Encode(devices) + err = json.NewEncoder(w).Encode(map[string]interface{}{ + "pages": total / page_size, + "page": page_number, + "size": page_size, + "devices": devices, + }) if err != nil { log.Println(err) } - - return } func (a *Api) deviceCreateMsg(w http.ResponseWriter, r *http.Request) { From 763fe6efa2e7bd399edeb17dc080d04aa07870cf Mon Sep 17 00:00:00 2001 From: leandrofars Date: Wed, 27 Dec 2023 21:48:50 -0300 Subject: [PATCH 4/4] feat(frontend): get device per id + init pagination --- frontend/src/pages/devices.js | 134 ++++++++++++++++++++++++++++++++-- 1 file changed, 129 insertions(+), 5 deletions(-) diff --git a/frontend/src/pages/devices.js b/frontend/src/pages/devices.js index 5defbb1..2f9b2bf 100644 --- a/frontend/src/pages/devices.js +++ b/frontend/src/pages/devices.js @@ -1,6 +1,17 @@ import React, { useState, useEffect } from 'react'; import Head from 'next/head'; -import { Box, Container, Unstable_Grid2 as Grid } from '@mui/material'; +import { + Box, + Container, + Unstable_Grid2 as Grid, + Card, + OutlinedInput, + InputAdornment, + SvgIcon, + Stack, + Pagination +} from '@mui/material'; +import MagnifyingGlassIcon from '@heroicons/react/24/solid/MagnifyingGlassIcon'; import { Layout as DashboardLayout } from 'src/layouts/dashboard/layout'; import { OverviewLatestOrders } from 'src/sections/overview/overview-latest-orders'; import { useAuth } from 'src/hooks/use-auth'; @@ -10,6 +21,10 @@ const Page = () => { const router = useRouter() const auth = useAuth(); const [devices, setDevices] = useState([]); + const [deviceFound, setDeviceFound] = useState(false) + const [pages, setPages] = useState(0); + const [page, setPage] = useState(null); + useEffect(() => { @@ -36,13 +51,70 @@ const Page = () => { return response.json() }) .then(json => { - return setDevices(json) + setPages(json.pages + 1) + setPage(json.page) + setDevices(json.devices) + return setDeviceFound(true) }) .catch(error => { return console.error('Error:', error) }); }, [auth.user]); + const handleChangePage = (e) => { + console.log("new page: ", e.target.value) + //TODO: Handle page change + } + + const fetchDevicePerId = async (id) => { + + var myHeaders = new Headers(); + myHeaders.append("Content-Type", "application/json"); + myHeaders.append("Authorization", auth.user.token); + + var requestOptions = { + method: 'GET', + headers: myHeaders, + redirect: 'follow' + } + + if (id == ""){ + fetch(process.env.NEXT_PUBLIC_REST_ENPOINT+'/device', requestOptions) + .then(response => { + if (response.status === 401) + router.push("/auth/login") + return response.json() + }) + .then(json => { + setPages(json.pages + 1) + setPage(json.page) + setDevices(json.devices) + return setDeviceFound(true) + }) + .catch(error => { + return console.error('Error:', error) + }); + } + + let response = await fetch(process.env.NEXT_PUBLIC_REST_ENPOINT+'/device?id='+id, requestOptions) + if (response.status === 401) + router.push("/auth/login") + let json = await response.json() + if (json.device != undefined){ + setDevices({"devices":[ + json.device + ]}) + setPages(1) + setPage(1) + }else{ + setDeviceFound(false) + setDevices([]) + setPages(1) + setPage(1) + } + + } + return ( <> @@ -50,6 +122,7 @@ const Page = () => { Oktopus | TR-369 + { }} > - + + + { + if (e.key === 'Enter') { + console.log("Fetch devices per id: ", e.target.value) + fetchDevicePerId(e.target.value) + } + }} + startAdornment={( + + + + + + )} + sx={{ maxWidth: 500 }} + /> + + {deviceFound ? + : + +

Device Not Found

+
+ } + + {pages ? : null} + {/* //TODO: show loading */} + +