package main import ( "errors" _ "gateway-softweng/docs" _ "github.com/eclipse/paho.mqtt.golang" "github.com/gin-gonic/gin" ) // Command represents the structure of the command to be published // @Description Command structure for publishing type Command struct { Command string `json:"command" example:"measure" binding:"required"` } // @Summary Publish command // @Description Publish a command to a specific device in a room // @Tags commands // @Accept json // @Produce json // @Security BasicAuth // @Param user query string true "User name" example(remi) // @Param room query string true "Room name" example(Bedroom) // @Param device query string true "Device name" example(DoorSensor) // @Param command body main.Command true "Command to publish" // @Success 200 {object} map[string]string "status:ok" // @Failure 500 {object} gin.H // @Router /raclette [post] func (gh *Gateway) publishCommand(c *gin.Context) error { // Get the user from the authenticated context //userid := c.MustGet(gin.AuthUserKey).(string) // Get user, room and device from the query parameters user, ret := c.GetQuery("user") if !ret { return errors.New("no user found") } room, ret := c.GetQuery("room") if !ret { return errors.New(`no room found`) } device, ret := c.GetQuery("device") if !ret { return errors.New(`no device found`) } // Define the JSON structure for the command var json Command // Bind the JSON payload to the structure err := c.Bind(&json) if err != nil { return err } // Publish the command to the MQTT broker topic := user + "/" + room + "/" + device + "/cmd/" + json.Command token := gh.mqtt.Publish(topic, 1, false, "") if token.Wait() && token.Error() != nil { return token.Error() } return nil }