diff --git a/internal/drivers/hue2/bridge.go b/internal/drivers/hue2/bridge.go index 16e5dad..86a3ee7 100644 --- a/internal/drivers/hue2/bridge.go +++ b/internal/drivers/hue2/bridge.go @@ -624,9 +624,13 @@ func (b *Bridge) Forget(ctx context.Context, device models.Device) error { b.mu.Lock() resource := b.resources[device.InternalID] b.mu.Unlock() - if resource == nil || resource.LegacyID == "" { + + if resource == nil { return errors.New("resource not found") } - return b.client.legacyDelete(ctx, resource.LegacyID, nil) + return b.client.DeleteResource(ctx, ResourceLink{ + ID: device.InternalID, + Kind: "device", + }) } diff --git a/internal/drivers/hue2/client.go b/internal/drivers/hue2/client.go index 48a55b9..04fee80 100644 --- a/internal/drivers/hue2/client.go +++ b/internal/drivers/hue2/client.go @@ -92,6 +92,10 @@ func (c *Client) UpdateResource(ctx context.Context, link ResourceLink, update R return c.put(ctx, link.Path(), update, nil) } +func (c *Client) DeleteResource(ctx context.Context, link ResourceLink) error { + return c.delete(ctx, link.Path(), nil) +} + func (c *Client) LegacyDiscover(ctx context.Context, kind string) error { return c.legacyPost(ctx, kind, nil, nil) } @@ -268,6 +272,36 @@ func (c *Client) post(ctx context.Context, path string, body interface{}, target return json.NewDecoder(res.Body).Decode(&target) } +func (c *Client) delete(ctx context.Context, path string, target interface{}) error { + select { + case <-ctx.Done(): + return ctx.Err() + case <-c.ch: + defer func() { + c.ch <- struct{}{} + }() + } + + req, err := http.NewRequest("PUT", fmt.Sprintf("https://%s/%s", c.host, path), nil) + if err != nil { + return err + } + + req.Header.Set("hue-application-key", c.token) + + res, err := httpClient.Do(req.WithContext(ctx)) + if err != nil { + return err + } + defer res.Body.Close() + + if target == nil { + return nil + } + + return json.NewDecoder(res.Body).Decode(&target) +} + func (c *Client) legacyPost(ctx context.Context, resource string, body interface{}, target interface{}) error { select { case <-ctx.Done():