Working on better styling, added graceful shutdown
This commit is contained in:
parent
39f79a8f51
commit
699e8aa959
|
|
@ -36,6 +36,7 @@
|
||||||
color: var(--modal-fg-color);
|
color: var(--modal-fg-color);
|
||||||
margin-top: 5vh;
|
margin-top: 5vh;
|
||||||
box-shadow: var(--box-shadow);
|
box-shadow: var(--box-shadow);
|
||||||
|
border: 1px solid var(--box-border-color);
|
||||||
border-radius: var(--border-radius);
|
border-radius: var(--border-radius);
|
||||||
width: 20rem;
|
width: 20rem;
|
||||||
max-height: 90%;
|
max-height: 90%;
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,9 @@
|
||||||
|
.section-title {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
|
||||||
|
h2 {
|
||||||
|
flex: 1;
|
||||||
|
font-weight: normal;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -1,16 +1,7 @@
|
||||||
.alerts-page .content {
|
.alerts-page .content {
|
||||||
max-width: 50rem;
|
width: 50rem;
|
||||||
padding: 1rem;
|
padding: 1rem;
|
||||||
|
margin: 0 auto;
|
||||||
.section-title {
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
|
|
||||||
h2 {
|
|
||||||
flex: 1;
|
|
||||||
font-weight: normal;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.contact-points {
|
.contact-points {
|
||||||
margin-bottom: 2rem;
|
margin-bottom: 2rem;
|
||||||
|
|
|
||||||
|
|
@ -10,7 +10,8 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
section.content {
|
section.content {
|
||||||
max-width: 50rem;
|
width: 50rem;
|
||||||
|
margin: 0 auto;
|
||||||
padding: 1rem;
|
padding: 1rem;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -46,6 +46,7 @@ a {
|
||||||
@import 'components/user-layout';
|
@import 'components/user-layout';
|
||||||
@import 'components/box';
|
@import 'components/box';
|
||||||
@import 'components/data-table';
|
@import 'components/data-table';
|
||||||
|
@import 'components/section-title';
|
||||||
|
|
||||||
@import 'pages/login-page';
|
@import 'pages/login-page';
|
||||||
@import 'pages/sensors-page';
|
@import 'pages/sensors-page';
|
||||||
|
|
|
||||||
|
|
@ -75,7 +75,7 @@
|
||||||
--button-bg-color: #0b3c9f;
|
--button-bg-color: #0b3c9f;
|
||||||
--button-fg-color: #eee;
|
--button-fg-color: #eee;
|
||||||
--button-cancel-fg-color: #ccc;
|
--button-cancel-fg-color: #ccc;
|
||||||
--modal-overlay-bg-color: rgba(0, 0, 0, 0.3);
|
--modal-overlay-bg-color: rgba(0, 0, 0, 0.5);
|
||||||
--confirm-overlay-bg-color: rgba(0, 0, 0, 0.5);
|
--confirm-overlay-bg-color: rgba(0, 0, 0, 0.5);
|
||||||
--input-border-color: #333;
|
--input-border-color: #333;
|
||||||
--input-focus-border-color: #666;
|
--input-focus-border-color: #666;
|
||||||
|
|
|
||||||
|
|
@ -27,17 +27,14 @@ export const SensorsPage = () => {
|
||||||
})
|
})
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<UserLayout
|
<UserLayout className="sensors-page">
|
||||||
header={
|
<div className="section-title">
|
||||||
<div className="sensors-head">
|
<h2>Sensors</h2>
|
||||||
<div>Sensors</div>
|
|
||||||
<button onClick={() => setShowNew(true)}>
|
<button onClick={() => setShowNew(true)}>
|
||||||
<PlusIcon /> Add sensor
|
<PlusIcon /> Add sensor
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
}
|
|
||||||
className="sensors-page"
|
|
||||||
>
|
|
||||||
<div className="box-shadow">
|
<div className="box-shadow">
|
||||||
<DataTable
|
<DataTable
|
||||||
data={sensors.data ?? []}
|
data={sensors.data ?? []}
|
||||||
|
|
|
||||||
|
|
@ -4,8 +4,12 @@ import (
|
||||||
"basic-sensor-receiver/app"
|
"basic-sensor-receiver/app"
|
||||||
"basic-sensor-receiver/middleware"
|
"basic-sensor-receiver/middleware"
|
||||||
"basic-sensor-receiver/routes"
|
"basic-sensor-receiver/routes"
|
||||||
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
"log"
|
"log"
|
||||||
|
"net/http"
|
||||||
|
"os/signal"
|
||||||
|
"syscall"
|
||||||
|
|
||||||
"github.com/gin-gonic/gin"
|
"github.com/gin-gonic/gin"
|
||||||
"github.com/joho/godotenv"
|
"github.com/joho/godotenv"
|
||||||
|
|
@ -80,10 +84,35 @@ func main() {
|
||||||
// Starts alerts handling goroutine
|
// Starts alerts handling goroutine
|
||||||
server.StartAlerts()
|
server.StartAlerts()
|
||||||
|
|
||||||
|
// Graceful shutdown using SIGTERM or SIGINT
|
||||||
|
ctx, stop := signal.NotifyContext(context.Background(), syscall.SIGINT, syscall.SIGTERM)
|
||||||
|
defer stop()
|
||||||
|
|
||||||
|
// Prepare http server
|
||||||
address := fmt.Sprintf("%s:%d", server.Config.Ip, server.Config.Port)
|
address := fmt.Sprintf("%s:%d", server.Config.Ip, server.Config.Port)
|
||||||
|
srv := &http.Server{
|
||||||
|
Addr: address,
|
||||||
|
Handler: router,
|
||||||
|
}
|
||||||
|
|
||||||
log.Println("Starting server on", address)
|
// Run the server in a goroutine so that it doesn't block and we can stop it later
|
||||||
|
go func() {
|
||||||
|
log.Println("Running server on", address)
|
||||||
|
|
||||||
// Run the server
|
if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed {
|
||||||
router.Run(address)
|
log.Fatalf("Listen: %s\n", err)
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
|
// Wait for shutdown signal
|
||||||
|
<-ctx.Done()
|
||||||
|
|
||||||
|
// Shutdown the server
|
||||||
|
log.Println("Shutting down server...")
|
||||||
|
|
||||||
|
if err := srv.Shutdown(context.TODO()); err != nil {
|
||||||
|
log.Fatalf("Server shutdown failed: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
log.Println("Server stopped")
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue