feat(db): get mapping dynamically from file

Assisted-by: Junie:claude-sonnet-4.6
Signed-off-by: Klagarge <remi@heredero.ch>
This commit is contained in:
2026-05-21 12:40:39 +02:00
parent 679f6fece2
commit c34ec94a6b
2 changed files with 42 additions and 7 deletions

View File

@@ -92,13 +92,9 @@ func influxConnection() *influx.InfluxGateway {
// @BasePath /api/v1
// @securityDefinitions.basic BasicAuth
func main() {
// Load mapping configuration
// Load mapping configuration (reloaded dynamically on each access)
mappingPath := getEnv("MAPPING_CONFIG_PATH", "mapping.json")
mapping, err := LoadMapping(mappingPath)
if err != nil {
log.Printf("[Main] Warning: could not load mapping file: %v. Using defaults.", err)
mapping = EmptyMapping()
}
mapping := NewDynamicMapping(mappingPath)
mqttGateway := mqttConnection()
defer mqttGateway.Disconnect()
@@ -112,7 +108,7 @@ func main() {
provenceMeasurement := point.CreateMeasurement[ProvenceData](measurementName)
// The incoming MQTT topic structure is: <gateway_id>/<node_id>/update
topicStructur := []string{"gateway", "node"}
err = mqtt.SubscribeTyped(mqttGateway, "+/+/update", provenceMeasurement, topicStructur, func(dp point.DataPoint[ProvenceData]) {
err := mqtt.SubscribeTyped(mqttGateway, "+/+/update", provenceMeasurement, topicStructur, func(dp point.DataPoint[ProvenceData]) {
var gatewayID, nodeID string
for _, tag := range dp.Tags() {
switch tag.Subject {

View File

@@ -23,6 +23,45 @@ type MappingConfig struct {
nodeToRoom map[string]string
}
// DynamicMapping reloads the mapping file on every access so that changes
// to the JSON file take effect without restarting the programme.
type DynamicMapping struct {
path string
}
// NewDynamicMapping creates a DynamicMapping that reads from the given path.
func NewDynamicMapping(path string) *DynamicMapping {
return &DynamicMapping{path: path}
}
func (d *DynamicMapping) load() *MappingConfig {
cfg, err := LoadMapping(d.path)
if err != nil {
return EmptyMapping()
}
return cfg
}
func (d *DynamicMapping) GetCampus(gatewayID string) (string, bool) {
return d.load().GetCampus(gatewayID)
}
func (d *DynamicMapping) GetRoom(nodeID string) (string, bool) {
return d.load().GetRoom(nodeID)
}
func (d *DynamicMapping) NodesForRoom(room string) []string {
return d.load().NodesForRoom(room)
}
func (d *DynamicMapping) AllNodes() []string {
return d.load().AllNodes()
}
func (d *DynamicMapping) Rooms() []string {
return d.load().Rooms()
}
// EmptyMapping returns a MappingConfig with no entries.
// GetCampus and GetRoom will return their "unknown_*" fallback values.
func EmptyMapping() *MappingConfig {