90 lines
2.4 KiB
Go
90 lines
2.4 KiB
Go
package main
|
|
|
|
import (
|
|
"errors"
|
|
_ "gateway-softweng/docs"
|
|
"time"
|
|
|
|
_ "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]interface{} "response or status:ok"
|
|
// @Failure 500 {object} gin.H
|
|
// @Router /raclette [post]
|
|
func (gh *Gateway) publishCommand(c *gin.Context) (string, 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
|
|
}
|
|
|
|
// Set the pending request fields to track this request
|
|
gh.pendingUser = user
|
|
gh.pendingRoom = room
|
|
gh.pendingDevice = device
|
|
|
|
// Publish the command to the MQTT broker
|
|
cmdTopic := user + "/" + room + "/" + device + "/cmd/" + json.Command
|
|
token := gh.mqtt.Publish(cmdTopic, 1, false, "")
|
|
if token.Wait() && token.Error() != nil {
|
|
// Clear pending request fields
|
|
gh.pendingUser = ""
|
|
gh.pendingRoom = ""
|
|
gh.pendingDevice = ""
|
|
return "", token.Error()
|
|
}
|
|
|
|
// Wait for response with a 1-second timeout
|
|
select {
|
|
case response := <-gh.pendingChan:
|
|
// Clear pending request fields
|
|
gh.pendingUser = ""
|
|
gh.pendingRoom = ""
|
|
gh.pendingDevice = ""
|
|
return response, nil
|
|
case <-time.After(1 * time.Second):
|
|
// Timeout occurred, clear pending request fields
|
|
gh.pendingUser = ""
|
|
gh.pendingRoom = ""
|
|
gh.pendingDevice = ""
|
|
return "", nil
|
|
}
|
|
}
|