package controllers import ( "errors" "gelvin/app/models" "github.com/gin-gonic/gin" "gorm.io/gorm" "net/http" "strconv" ) func (c Controller) GetSensors(ctx *gin.Context) { var sensors []models.Sensor result := c.app.Db().Find(&sensors) if result.Error != nil { ctx.IndentedJSON(http.StatusNotFound, c.app.NewError("sensor not found", result.Error.Error())) } else { ctx.IndentedJSON(http.StatusOK, sensors) } } func (c Controller) GetSensor(ctx *gin.Context) { var sensor models.Sensor id, err := strconv.ParseUint(ctx.Param("id"), 10, 32) if err != nil { ctx.IndentedJSON(http.StatusBadRequest, c.app.NewError("invalid input", err.Error())) return } result := c.app.Db().First(&sensor, id) if result.Error != nil { ctx.IndentedJSON(http.StatusNotFound, c.app.NewError("sensor not found", result.Error.Error())) } else { ctx.IndentedJSON(http.StatusOK, sensor) } } func (c Controller) AddSensor(ctx *gin.Context) { var sensor models.Sensor var err = ctx.BindJSON(&sensor) if err == nil && !sensor.IsValid() { err = errors.New("invalid sensor") } var result uint httpCode := http.StatusCreated if err == nil { var txSensor models.Sensor tx := c.app.Db().Where(&models.Sensor{Name: sensor.Name}).First(&txSensor) if tx.Error == nil { result, err = c.model.UpdateSensor(sensor, txSensor, tx) httpCode = http.StatusOK } else { result, err = c.model.AddSensor(sensor) } } if err != nil { ctx.IndentedJSON(http.StatusBadRequest, c.app.NewError("invalid input", err.Error())) } else { id := struct { Id uint `json:"id"` }{result} ctx.IndentedJSON(httpCode, id) } } func (c Controller) GetMeasurements(ctx *gin.Context) { var measurements []models.Measurement //result := c.app.Db().Find(&measurements) // MAX(created_at) converts time.Time to string, `as created_at` or datetime() is not sufficient result := c.app.Db().Select("MAX(created_at)", "id", "created_at", "deleted_at", "sensor_id", "value").Group("sensor_id").Find(&measurements) if result.Error != nil { ctx.IndentedJSON(http.StatusOK, struct{}{}) } else { ctx.IndentedJSON(http.StatusOK, measurements) } //result := c.app.Db().Select("id sensor_id MAX(created_at) value").Group("sensor_id").Find(&measurements) } func (c Controller) GetMeasurement(ctx *gin.Context) { var measurements []models.Measurement id, err := strconv.ParseUint(ctx.Param("id"), 10, 32) if err != nil { ctx.IndentedJSON(http.StatusBadRequest, c.app.NewError("invalid input", err.Error())) return } result := c.app.Db().Where(&models.Measurement{SensorID: uint(id)}).Find(&measurements) if result.Error != nil { ctx.IndentedJSON(http.StatusOK, struct{}{}) } else { ctx.IndentedJSON(http.StatusOK, measurements) } } func (c Controller) AddMeasurement(ctx *gin.Context) { var measurement models.Measurement err := ctx.BindJSON(&measurement) if err != nil { ctx.IndentedJSON(http.StatusBadRequest, c.app.NewError("invalid input", err.Error())) return } c.addMeasurement(ctx, measurement) } func (c Controller) AddMeasurementID(ctx *gin.Context) { var measurement models.Measurement id, err := strconv.ParseUint(ctx.Param("id"), 10, 32) if err != nil { ctx.IndentedJSON(http.StatusBadRequest, c.app.NewError("invalid input", err.Error())) return } err = ctx.BindJSON(&measurement) if err != nil { ctx.IndentedJSON(http.StatusBadRequest, c.app.NewError("invalid input", err.Error())) return } measurement.SensorID = uint(id) c.addMeasurement(ctx, measurement) } func (c Controller) addMeasurement(ctx *gin.Context, measurement models.Measurement) { result, err := c.model.AddMeasurement(measurement) if err != nil { if err == gorm.ErrRecordNotFound { ctx.IndentedJSON(http.StatusNotFound, c.app.NewError("sensor not found", err.Error())) } else { ctx.IndentedJSON(http.StatusBadRequest, c.app.NewError("invalid input", err.Error())) } } else { id := struct { Id uint `json:"id"` }{result} ctx.IndentedJSON(http.StatusOK, id) } }