This commit is contained in:
+59
-3
@@ -3,11 +3,14 @@ package api
|
||||
import (
|
||||
"context"
|
||||
"git.aiterp.net/lucifer/new-server/app/config"
|
||||
"git.aiterp.net/lucifer/new-server/app/services/scene"
|
||||
"git.aiterp.net/lucifer/new-server/models"
|
||||
"github.com/gin-gonic/gin"
|
||||
"golang.org/x/sync/errgroup"
|
||||
"log"
|
||||
"strconv"
|
||||
"strings"
|
||||
"time"
|
||||
)
|
||||
|
||||
func fetchDevices(ctx context.Context, fetchStr string) ([]models.Device, error) {
|
||||
@@ -71,12 +74,15 @@ func Devices(r gin.IRoutes) {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
_ = scene.GlobalManager().UpdateDevice(ctxOf(c), &devices[i], nil)
|
||||
|
||||
set[devices[i].ID] = true
|
||||
changed = append(changed, devices[i])
|
||||
}
|
||||
}
|
||||
|
||||
config.PublishChannel <- changed
|
||||
|
||||
config.PublishChannel <- scene.GlobalManager().FilterUnassigned(changed)
|
||||
|
||||
go func() {
|
||||
for _, device := range changed {
|
||||
@@ -139,9 +145,11 @@ func Devices(r gin.IRoutes) {
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
_ = scene.GlobalManager().UpdateDevice(ctxOf(c), &devices[i], nil)
|
||||
}
|
||||
|
||||
config.PublishChannel <- devices
|
||||
config.PublishChannel <- scene.GlobalManager().FilterUnassigned(devices)
|
||||
|
||||
go func() {
|
||||
for _, device := range devices {
|
||||
@@ -212,4 +220,52 @@ func Devices(r gin.IRoutes) {
|
||||
|
||||
return devices, nil
|
||||
}))
|
||||
}
|
||||
|
||||
r.PUT("/:fetch/scene", handler(func(c *gin.Context) (interface{}, error) {
|
||||
var body models.DeviceSceneAssignment
|
||||
err := parseBody(c, &body)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
devices, err := fetchDevices(ctxOf(c), c.Param("fetch"))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if len(devices) == 0 {
|
||||
return []models.Device{}, nil
|
||||
}
|
||||
|
||||
assignedScene, err := config.SceneRepository().Find(ctxOf(c), body.SceneID)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if body.DurationMS < 0 {
|
||||
body.DurationMS = 0
|
||||
}
|
||||
body.StartTime = time.Now()
|
||||
|
||||
for i := range devices {
|
||||
devices[i].SceneAssignments = []models.DeviceSceneAssignment{body}
|
||||
|
||||
err := scene.GlobalManager().UpdateDevice(ctxOf(c), &devices[i], assignedScene)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
|
||||
eg := errgroup.Group{}
|
||||
for i := range devices {
|
||||
eg.Go(func() error {
|
||||
return config.DeviceRepository().Save(ctxOf(c), &devices[i], 0)
|
||||
})
|
||||
}
|
||||
|
||||
err = eg.Wait()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return devices, nil
|
||||
}))
|
||||
}
|
||||
@@ -0,0 +1,37 @@
|
||||
package api
|
||||
|
||||
import (
|
||||
"git.aiterp.net/lucifer/new-server/app/config"
|
||||
"git.aiterp.net/lucifer/new-server/models"
|
||||
"github.com/gin-gonic/gin"
|
||||
)
|
||||
|
||||
func Scenes(r gin.IRoutes) {
|
||||
r.GET("", handler(func(c *gin.Context) (interface{}, error) {
|
||||
return config.SceneRepository().FetchAll(ctxOf(c))
|
||||
}))
|
||||
|
||||
r.GET("/:id", handler(func(c *gin.Context) (interface{}, error) {
|
||||
return config.SceneRepository().Find(ctxOf(c), intParam(c, "id"))
|
||||
}))
|
||||
|
||||
r.POST("", handler(func(c *gin.Context) (interface{}, error) {
|
||||
var body models.Scene
|
||||
err := parseBody(c, &body)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
err = body.Validate()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
err = config.SceneRepository().Save(ctxOf(c), &body)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return body, nil
|
||||
}))
|
||||
}
|
||||
Reference in New Issue
Block a user