add: integrated caching, Dockerfile; removed influx

With this update I deleted influx for now, also the caching is now fully
implemented. Also an new Dockerfile got build for testing the envir. in
containers
This commit is contained in:
Oliver Wallisch 2026-02-23 20:32:52 +01:00
parent a1beb7dbad
commit 9b71665192
11 changed files with 111 additions and 15 deletions

View file

@ -28,6 +28,14 @@ func main() {
}
defer db.Close()
// influx, err := database.NewInfluxDB()
// if err != nil {
// slog.Error("Failed to establish connection", "error:", err)
// os.Exit(1)
// return
// }
// defer influx.Close()
dbadapter := database.NewDatabaseAdapter(db)
sensorService := domain.NewSensorService(dbadapter)

View file

@ -1,19 +1,23 @@
package domain
import (
"context"
"fmt"
"log/slog"
"esp32/backend/internal/core"
"esp32/backend/internal/models"
)
type sensorService struct {
repo core.SensorRepository
repo core.SensorRepository
cache core.CacheRepository
}
func NewSensorService(r core.SensorRepository) core.SensorService {
func NewSensorService(r core.SensorRepository, c core.CacheRepository) core.SensorService {
return &sensorService{
repo: r,
repo: r,
cache: c,
}
}
@ -31,6 +35,10 @@ func (s *sensorService) ProcessIncomingMetric(payload models.SensorPayload, topi
Pressure: payload.Pressure,
Topic: topic,
}
err = s.cache.SaveLatestMetrics(context.Background(), sensorData.DeviceID, sensorData)
if err != nil {
slog.Info("failed to save data in cache", "error", err)
}
return s.repo.SaveSensorData(sensorData)
}

View file

@ -0,0 +1,12 @@
package core
import (
"context"
"esp32/backend/internal/models"
)
type CacheRepository interface {
SaveLatestMetrics(ctx context.Context, deviceID string, data models.SensorData) error
GetLatestMetrics(ctx context.Context, deviceID string) (models.SensorData, error)
}

View file

@ -0,0 +1,16 @@
package database
import (
"os"
influxdb2 "github.com/influxdata/influxdb-client-go/v2"
)
func NewInfluxDB() influxdb2.Client {
token := os.Getenv("INFLUXDB_TOKEN")
url := "http://localhost:8086"
client := influxdb2.NewClient(url, token)
return client
}

View file

@ -1,19 +1,18 @@
package database
import (
"context"
"github.com/redis/go-redis/v9"
)
var (
Rdb *redis.Client
Ctx = context.Background()
)
type RedisAdapter struct {
rdb *redis.Client
}
func InitRedis(addr string) error {
Rdb = redis.NewClient(&redis.Options{
func NewRedisAdapter(addr string) *RedisAdapter {
client := redis.NewClient(&redis.Options{
Addr: addr,
})
return Rdb.Ping(Ctx).Err()
return &RedisAdapter{
rdb: client,
}
}

View file

@ -43,6 +43,9 @@ func (da *DatabaseAdapter) GetCustomerIDByDeviceID(deviceID string) (int, error)
return customerID, err
}
// Customer ID kann weg!
// device version muss dazu
// Teste 2 esp32 gleiches topic daten filtern
func (da *DatabaseAdapter) SaveSensorData(data models.SensorData) error {
query := `
INSERT INTO sensor_data (device_id, customer_id, temperature, humidity, pressure, topic)

View file

@ -32,7 +32,5 @@ func (a *MQTTAdapter) RecieveMessage(c mqtt.Client, msg mqtt.Message) {
} else {
fmt.Printf("Erfolgreich verarbeitet: %s\n", payload.DeviceID)
}
msg.Ack()
}

View file

@ -65,4 +65,3 @@ func (a *MQTTAdapter) Disconnect(quiesce uint) {
fmt.Println("MQTT Verbindung erfolgreich geschlossen")
}
}

View file

@ -31,6 +31,37 @@ services:
image: redis:7-alpine
ports:
- "6379:6379"
influxdb2:
image: influxdb:2
ports:
- 8086:8086
environment:
DOCKER_INFLUXDB_INIT_MODE: setup
DOCKER_INFLUXDB_INIT_USERNAME_FILE: /run/secrets/influxdb2-admin-username
DOCKER_INFLUXDB_INIT_PASSWORD_FILE: /run/secrets/influxdb2-admin-password
DOCKER_INFLUXDB_INIT_ADMIN_TOKEN_FILE: /run/secrets/influxdb2-admin-token
DOCKER_INFLUXDB_INIT_ORG: docs
DOCKER_INFLUXDB_INIT_BUCKET: home
secrets:
- influxdb2-admin-username
- influxdb2-admin-password
- influxdb2-admin-token
volumes:
- type: volume
source: influxdb2-data
target: /var/lib/influxdb2
- type: volume
source: influxdb2-config
target: /etc/influxdb2
secrets:
influxdb2-admin-username:
file: ~/.env.influxdb2-admin-username
influxdb2-admin-password:
file: ~/.env.influxdb2-admin-password
influxdb2-admin-token:
file: ~/.env.influxdb2-admin-token
volumes:
postgres_data:
influxdb2-data:
influxdb2-config:

5
go.mod
View file

@ -10,12 +10,17 @@ require (
)
require (
github.com/apapsch/go-jsonmerge/v2 v2.0.0 // indirect
github.com/cespare/xxhash/v2 v2.3.0 // indirect
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect
github.com/google/uuid v1.3.1 // indirect
github.com/gorilla/websocket v1.5.3 // indirect
github.com/influxdata/influxdb-client-go/v2 v2.14.0 // indirect
github.com/influxdata/line-protocol v0.0.0-20200327222509-2487e7298839 // indirect
github.com/labstack/gommon v0.4.2 // indirect
github.com/mattn/go-colorable v0.1.14 // indirect
github.com/mattn/go-isatty v0.0.20 // indirect
github.com/oapi-codegen/runtime v1.0.0 // indirect
github.com/redis/go-redis/v9 v9.17.3 // indirect
github.com/valyala/bytebufferpool v1.0.0 // indirect
github.com/valyala/fasttemplate v1.2.2 // indirect

17
go.sum
View file

@ -1,15 +1,27 @@
github.com/RaveNoX/go-jsoncommentstrip v1.0.0/go.mod h1:78ihd09MekBnJnxpICcwzCMzGrKSKYe4AqU6PDYYpjk=
github.com/apapsch/go-jsonmerge/v2 v2.0.0 h1:axGnT1gRIfimI7gJifB699GoE/oq+F2MU7Dml6nw9rQ=
github.com/apapsch/go-jsonmerge/v2 v2.0.0/go.mod h1:lvDnEdqiQrp0O42VQGgmlKpxL1AP2+08jFMw88y4klk=
github.com/bmatcuk/doublestar v1.1.1/go.mod h1:UD6OnuiIn0yFxxA2le/rnRU1G4RaI4UvFv1sNto9p6w=
github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=
github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=
github.com/eclipse/paho.mqtt.golang v1.5.1 h1:/VSOv3oDLlpqR2Epjn1Q7b2bSTplJIeV2ISgCl2W7nE=
github.com/eclipse/paho.mqtt.golang v1.5.1/go.mod h1:1/yJCneuyOoCOzKSsOTUc0AJfpsItBGWvYpBLimhArU=
github.com/google/uuid v1.3.1 h1:KjJaJ9iWZ3jOFZIf1Lqf4laDRCasjl0BCmnEGxkdLb4=
github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg=
github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
github.com/influxdata/influxdb-client-go/v2 v2.14.0 h1:AjbBfJuq+QoaXNcrova8smSjwJdUHnwvfjMF71M1iI4=
github.com/influxdata/influxdb-client-go/v2 v2.14.0/go.mod h1:Ahpm3QXKMJslpXl3IftVLVezreAUtBOTZssDrjZEFHI=
github.com/influxdata/line-protocol v0.0.0-20200327222509-2487e7298839 h1:W9WBk7wlPfJLvMCdtV4zPulc4uCPrlywQOmbFOhgQNU=
github.com/influxdata/line-protocol v0.0.0-20200327222509-2487e7298839/go.mod h1:xaLFMmpvUxqXtVkUJfg9QmT88cDaCJ3ZKgdZ78oO8Qo=
github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=
github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=
github.com/juju/gnuflag v0.0.0-20171113085948-2ce1bb71843d/go.mod h1:2PavIy+JPciBPrBUjwbNvtwB6RQlve+hkpll6QSNmOE=
github.com/labstack/echo/v4 v4.13.4 h1:oTZZW+T3s9gAu5L8vmzihV7/lkXGZuITzTQkTEhcXEA=
github.com/labstack/echo/v4 v4.13.4/go.mod h1:g63b33BZ5vZzcIUF8AtRH40DrTlXnx4UMC8rBdndmjQ=
github.com/labstack/gommon v0.4.2 h1:F8qTUNXgG1+6WQmqoUWnz8WiEU60mXVVw0P4ht1WRA0=
@ -20,10 +32,15 @@ github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHP
github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8=
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
github.com/oapi-codegen/runtime v1.0.0 h1:P4rqFX5fMFWqRzY9M/3YF9+aPSPPB06IzP2P7oOxrWo=
github.com/oapi-codegen/runtime v1.0.0/go.mod h1:LmCUMQuPB4M/nLXilQXhHw+BLZdDb18B34OO356yJ/A=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/redis/go-redis/v9 v9.17.3 h1:fN29NdNrE17KttK5Ndf20buqfDZwGNgoUr9qjl1DQx4=
github.com/redis/go-redis/v9 v9.17.3/go.mod h1:u410H11HMLoB+TP67dz8rL9s6QW2j76l0//kSOd3370=
github.com/spkg/bom v0.0.0-20160624110644-59b7046e48ad/go.mod h1:qLr4V1qq6nMqFKkMo8ZTx3f+BZEkzsRUY10Xsm2mwU0=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=
github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw=