Browse Source

BridgeController: Added GET /api/bridge/discover/:driver_name

login_bugfix
Gisle Aune 5 years ago
parent
commit
f27c0a3f7f
  1. 12
      controllers/bridge-controller.go
  2. 22
      light/hue/driver.go
  3. 29
      light/service.go

12
controllers/bridge-controller.go

@ -212,6 +212,17 @@ func (c *BridgeController) deleteBridgeLight(w http.ResponseWriter, r *http.Requ
respond.Data(w, bridge)
}
// discoverBridges (`GET /discover/:driver`): Get all bridges
func (c *BridgeController) discoverBridges(w http.ResponseWriter, r *http.Request) {
newBridges, err := c.service.DiscoverBridges(r.Context(), mux.Vars(r)["driver_name"])
if err != nil {
httperr.Respond(w, err)
return
}
respond.Data(w, newBridges)
}
// Mount mounts the controller
func (c *BridgeController) Mount(router *mux.Router, prefix string) {
sub := router.PathPrefix(prefix).Subrouter()
@ -225,6 +236,7 @@ func (c *BridgeController) Mount(router *mux.Router, prefix string) {
sub.HandleFunc("/{bridge_id}", c.deleteBridge).Methods("DELETE")
sub.HandleFunc("/{bridge_id}/light/{light_id}", c.deleteBridgeLight).Methods("DELETE")
sub.HandleFunc("/{bridge_id}/discover", c.postBridgeDiscover).Methods("POST")
sub.HandleFunc("/discover/{driver_name}", c.discoverBridges).Methods("GET")
}
func (c *BridgeController) adminMiddleware() mux.MiddlewareFunc {

22
light/hue/driver.go

@ -147,7 +147,27 @@ func (d *driver) Lights(ctx context.Context, bridge models.Bridge) ([]models.Lig
}
func (d *driver) Bridges(ctx context.Context) ([]models.Bridge, error) {
panic("not implemented")
hueBridges, err := gohue.FindBridges()
if err != nil {
if err.Error() == "no bridges found" { // It's not my fault the library doesn't have good errors. D:<
return []models.Bridge{}, nil
}
return nil, err
}
bridges := make([]models.Bridge, 0, len(hueBridges))
for _, hueBridge := range hueBridges {
bridges = append(bridges, models.Bridge{
ID: -1,
InternalID: hueBridge.Info.Device.SerialNumber,
Driver: "hue",
Name: fmt.Sprintf("New bridge (%s, %s)", hueBridge.Info.Device.FriendlyName, hueBridge.Info.Device.SerialNumber),
Addr: hueBridge.IPAddress,
})
}
return bridges, err
}
func (d *driver) Connect(ctx context.Context, bridge models.Bridge) (models.Bridge, error) {

29
light/service.go

@ -245,6 +245,35 @@ func (s *Service) DiscoverLights(ctx context.Context, bridge models.Bridge) erro
return d.DiscoverLights(ctx, bridge)
}
// DiscoverBridges discovers new lights.
func (s *Service) DiscoverBridges(ctx context.Context, driver string) ([]models.Bridge, error) {
d, ok := drivers[driver]
if !ok {
return nil, ErrUnknownDriver
}
existingBridges, err := s.Bridges(ctx)
if err != nil {
return nil, err
}
newBridges, err := d.Bridges(ctx)
if err != nil {
return nil, err
}
for _, existingBridge := range existingBridges {
for j, newBridge := range newBridges {
if newBridge.InternalID == existingBridge.InternalID {
newBridges = append(newBridges[:j], newBridges[j+1:]...)
break
}
}
}
return newBridges, nil
}
// NewService creates a new light.Service.
func NewService(bridges models.BridgeRepository, lights models.LightRepository) *Service {
return &Service{

Loading…
Cancel
Save