weatherSourceBase as composition to mqtt-source and rest-api

This commit is contained in:
Joel Schmid 2021-11-26 13:46:57 +01:00
parent f623f76c1a
commit 261cfb96c4
7 changed files with 33 additions and 53 deletions

View file

@ -32,10 +32,10 @@ type UserClaims struct {
}
type weatherRestApi struct {
weathersource.WeatherSourceBase
connection string
config config.RestConfig
weaterStorage storage.WeatherStorage
weatherSource weathersource.WeatherSourceBase
sensorRegistry storage.SensorRegistry
}
@ -157,7 +157,7 @@ func (api *weatherRestApi) addWeatherDataHandler(w http.ResponseWriter, r *http.
return
}
api.addNewWeatherData(*weatherData)
api.NewWeatherData(weatherData)
w.Header().Add("content-type", "application/json")
w.WriteHeader(http.StatusCreated)
@ -336,12 +336,3 @@ func (api *weatherRestApi) parseToken(header http.Header) (*UserClaims, error) {
)
return claims, err
}
//AddNewWeatherDataCallback adds a new callbackMethod for incoming weather data
func (api *weatherRestApi) AddNewWeatherDataCallback(callback weathersource.NewWeatherDataCallbackFunc) {
api.weatherSource.AddNewWeatherDataCallback(callback)
}
func (api *weatherRestApi) addNewWeatherData(weatherData storage.WeatherData) {
api.weatherSource.NewWeatherData(weatherData)
}

13
main.go
View file

@ -35,23 +35,24 @@ func main() {
log.Fatal(err)
}
defer weatherSource.Close()
weatherSource.AddNewWeatherDataCallback(handleNewWeatherData)
weatherSource.OnNewWeatherData(handleNewWeatherData)
//setup a API -> REST
weatherAPI = api.NewRestAPI(":10000", weatherStorage, sensorRegistry, config.RestConfiguration)
defer weatherAPI.Close()
weatherAPI.AddNewWeatherDataCallback(handleNewWeatherData)
weatherAPI.OnNewWeatherData(handleNewWeatherData)
log.Print("Application is running")
err = weatherAPI.Start()
if err != nil {
log.Fatal(err)
}
log.Print("Application is running")
}
func handleNewWeatherData(wd storage.WeatherData) {
_, err := sensorRegistry.GetSensor(wd.SensorId)
if config.AllowUnregisteredSensors || err == nil {
func handleNewWeatherData(wd *storage.WeatherData) {
if config.AllowUnregisteredSensors {
weatherStorage.Save(wd)
} else if exist, err := sensorRegistry.ExistSensor(wd.SensorId); err == nil && exist {
weatherStorage.Save(wd)
}
}

View file

@ -31,7 +31,7 @@ func NewInfluxStorage(cfg config.InfluxConfig) (*influxStorage, error) {
}
//Save WeatherData to InfluxDB
func (storage *influxStorage) Save(data WeatherData) error {
func (storage *influxStorage) Save(data *WeatherData) error {
tags := map[string]string{
"sensorId": data.SensorId.String()}

View file

@ -2,7 +2,7 @@ package storage
//WeatherStorage interface for different storage-implementations of weather data
type WeatherStorage interface {
Save(WeatherData) error
Save(*WeatherData) error
GetData(*WeatherQuery) ([]*WeatherData, error)
Close() error
}

View file

@ -20,9 +20,9 @@ var regexTopic *regexp.Regexp = regexp.MustCompile(mqttTopicRegexPattern)
var channelBufferSize = 10
type mqttWeatherSource struct {
WeatherSourceBase
config config.MqttConfig
mqttClient mqtt.Client
weatherSource WeatherSourceBase
activeSensorMeasurements map[uuid.UUID](chan map[storage.SensorValueType]float64)
sensorMutex sync.RWMutex
}
@ -127,14 +127,5 @@ func (source *mqttWeatherSource) publishSensorMeasurement(sensorId uuid.UUID, ch
}
}
source.newWeatherData(*weatherData)
}
//AddNewWeatherDataCallback adds a new callbackMethod for incoming weather data
func (source *mqttWeatherSource) AddNewWeatherDataCallback(callback NewWeatherDataCallbackFunc) {
source.weatherSource.AddNewWeatherDataCallback(callback)
}
func (source *mqttWeatherSource) newWeatherData(datapoint storage.WeatherData) {
source.weatherSource.NewWeatherData(datapoint)
source.NewWeatherData(weatherData)
}

View file

@ -1,20 +0,0 @@
package weathersource
import "weather-data/storage"
//WeatherSourceBase is the lowlevel-implementation of the WeatherSource interface, intended to used by highlevel-implementations
type WeatherSourceBase struct {
newWeatherDataCallbackFuncs []NewWeatherDataCallbackFunc
}
//AddNewWeatherDataCallback adds a new callbackMethod for incoming weather data
func (source *WeatherSourceBase) AddNewWeatherDataCallback(callback NewWeatherDataCallbackFunc) {
source.newWeatherDataCallbackFuncs = append(source.newWeatherDataCallbackFuncs, callback)
}
//NewWeatherData executes all newWeatherDataCallbackFuncs for this datapoint
func (source *WeatherSourceBase) NewWeatherData(datapoint storage.WeatherData) {
for _, callback := range source.newWeatherDataCallbackFuncs {
callback(datapoint)
}
}

View file

@ -2,11 +2,28 @@ package weathersource
import "weather-data/storage"
//NewWeatherDataCallbackFunc Function-Signature for new weather data callback function
type NewWeatherDataCallbackFunc func(storage.WeatherData)
//NewWeatherDataFunc Function-Signature for new weather data
type NewWeatherDataFunc func(*storage.WeatherData)
//WeatherSource is the interface for different weather-source implementations
type WeatherSource interface {
AddNewWeatherDataCallback(NewWeatherDataCallbackFunc)
OnNewWeatherData(callback NewWeatherDataFunc)
Close()
}
//WeatherSourceBase is the lowlevel-implementation of the WeatherSource interface, intended to used by highlevel-implementations
type WeatherSourceBase struct {
onNewWeatherDataFunctions []NewWeatherDataFunc
}
//OnNewWeatherData add a function executed on NewWeatherData called
func (source *WeatherSourceBase) OnNewWeatherData(callback NewWeatherDataFunc) {
source.onNewWeatherDataFunctions = append(source.onNewWeatherDataFunctions, callback)
}
//NewWeatherData executes all NewWeatherDataFunc for the weatherData
func (source *WeatherSourceBase) NewWeatherData(weatherData *storage.WeatherData) {
for _, function := range source.onNewWeatherDataFunctions {
function(weatherData)
}
}