-
-
Notifications
You must be signed in to change notification settings - Fork 17
/
deleteLinkedAccount.go
82 lines (73 loc) · 2.15 KB
/
deleteLinkedAccount.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
package service
import (
"context"
"fmt"
"net/http"
"sync"
"github.com/plgd-dev/cloud/cloud2cloud-connector/store"
"github.com/plgd-dev/kit/log"
"github.com/gorilla/mux"
)
func cancelLinkedAccountSubscription(ctx context.Context, cloud store.LinkedCloud, linkedAccount *LinkedAccountData) {
var wg sync.WaitGroup
if linkedAccount.isSubscribed {
wg.Add(1)
go func() {
defer wg.Done()
err := cancelDevicesSubscription(ctx, linkedAccount.linkedAccount, cloud, linkedAccount.subscription.ID)
if err != nil {
log.Error(err)
}
}()
}
linkedAccount.devices.Range(func(_, deviceI interface{}) bool {
device := deviceI.(*DeviceData)
if device.isSubscribed {
wg.Add(1)
go func() {
defer wg.Done()
err := cancelDeviceSubscription(ctx, linkedAccount.linkedAccount, cloud, device.subscription.DeviceID, device.subscription.ID)
if err != nil {
log.Error(err)
}
}()
}
device.resources.Range(func(_, resourceI interface{}) bool {
resource := resourceI.(*ResourceData)
if resource.isSubscribed {
wg.Add(1)
go func() {
defer wg.Done()
err := cancelResourceSubscription(ctx, linkedAccount.linkedAccount, cloud, resource.subscription.DeviceID, resource.subscription.Href, resource.subscription.ID)
if err != nil {
log.Error(err)
}
}()
}
return true
})
return true
})
wg.Wait()
}
func (rh *RequestHandler) deleteLinkedAccount(w http.ResponseWriter, r *http.Request) (int, error) {
vars := mux.Vars(r)
cloudID := vars[cloudIDKey]
accountID := vars[accountIDKey]
linkedAccount, err := rh.store.PullOutLinkedAccount(r.Context(), cloudID, accountID)
if err != nil {
return http.StatusBadRequest, fmt.Errorf("cannot load linked account: %w", err)
}
cloud, ok := rh.store.LoadCloud(cloudID)
if !ok {
return http.StatusOK, nil
}
cancelLinkedAccountSubscription(r.Context(), cloud, linkedAccount)
return http.StatusOK, nil
}
func (rh *RequestHandler) DeleteLinkedAccount(w http.ResponseWriter, r *http.Request) {
statusCode, err := rh.deleteLinkedAccount(w, r)
if err != nil {
logAndWriteErrorResponse(fmt.Errorf("cannot delete linked accounts: %w", err), statusCode, w)
}
}