Newer
Older
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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
/*
* Copyright (c) 2019
* InterDigital Communications, Inc.
* All rights reserved.
*
* The information provided herein is the proprietary and confidential
* information of InterDigital Communications, Inc.
*/
package server
import (
"context"
"encoding/json"
"errors"
"fmt"
"net/http"
"net/url"
"strconv"
"strings"
"time"
log "github.com/InterDigitalInc/AdvantEDGE/go-apps/meep-loc-serv/log"
db "github.com/InterDigitalInc/AdvantEDGE/go-apps/meep-loc-serv/redis"
sbi "github.com/InterDigitalInc/AdvantEDGE/go-apps/meep-loc-serv/sbi"
subs "github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-loc-serv-notification-client"
"github.com/KromDaniel/rejonson"
"github.com/go-redis/redis"
"github.com/gorilla/mux"
)
const basepathURL = "http://meep-loc-serv/etsi-013/location/v1/"
const moduleLocServ string = "loc-serv"
const typeZone = "zone"
const typeAccessPoint = "accessPoint"
const typeUser = "user"
const typeZonalSubscription = "zonalsubs"
const typeUserSubscription = "usersubs"
const typeZoneStatusSubscription = "zonestatus"
const locServChannel string = moduleLocServ
var nextZonalSubscriptionIdAvailable int
var nextUserSubscriptionIdAvailable int
//var nextZoneStatusSubscriptionIdAvailable = 1
var zonalSubscriptionEnteringMap = map[string]string{}
var zonalSubscriptionLeavingMap = map[string]string{}
var zonalSubscriptionTransferringMap = map[string]string{}
var zonalSubscriptionMap = map[string]string{}
var userSubscriptionEnteringMap = map[string]string{}
var userSubscriptionLeavingMap = map[string]string{}
var userSubscriptionTransferringMap = map[string]string{}
var userSubscriptionMap = map[string]string{}
var pubsub *redis.PubSub
var LOC_SERV_DB = 5
var dbClient *rejonson.Client
// Init - Location Service initialization
func Init() (err error) {
// Connect to Redis DB
dbClient, err = db.RedisDBConnect(LOC_SERV_DB)
if err != nil {
log.Error("Failed connection to Active DB for server. Error: ", err)
return err
}
log.Info("Connected to Active location service DB")
// Subscribe to Pub-Sub events for MEEP Controller
// NOTE: Current implementation is RedisDB Pub-Sub
pubsub, err = db.Subscribe(dbClient, locServChannel)
if err != nil {
log.Error("Failed to subscribe to Pub/Sub events. Error: ", err)
return err
}
userTrackingReInit()
zonalTrafficReInit()
_ = sbi.Init(updateUserInfo, updateZoneInfo, updateAccessPointInfo)
return nil
}
// Run - MEEP Location Service execution
func Run() {
// Listen for subscribed events. Provide event handler method.
_ = db.Listen(pubsub, eventHandler)
}
func eventHandler(channel string, payload string) {
// Handle Message according to Rx Channel
switch channel {
// MEEP Ctrl Engine active scenario update Channel
case locServChannel:
log.Debug("Event received on location service channel in server : ", payload)
go checkNotificationRegistrations(payload)
default:
log.Warn("Unsupported channel")
}
}
func createClient(notifyPath string) (*subs.APIClient, error) {
// Create & store client for App REST API
subsAppClientCfg := subs.NewConfiguration()
subsAppClientCfg.BasePath = notifyPath
subsAppClient := subs.NewAPIClient(subsAppClientCfg)
if subsAppClient == nil {
log.Error("Failed to create Subscription App REST API client: ", subsAppClientCfg.BasePath)
err := errors.New("Failed to create Subscription App REST API client")
return nil, err
}
return subsAppClient, nil
}
func deregisterZonal(subsId string) {
zoneId := zonalSubscriptionMap[subsId]
zonalSubscriptionMap[subsId] = ""
zonalSubscriptionEnteringMap[zoneId] = ""
zonalSubscriptionLeavingMap[zoneId] = ""
zonalSubscriptionTransferringMap[zoneId] = ""
}
func registerZonal(zoneId string, event []UserEventType, subsId string) {
if event != nil {
for i := 0; i < len(event); i++ {
switch event[i] {
case ENTERING:
zonalSubscriptionEnteringMap[zoneId] = subsId
case LEAVING:
zonalSubscriptionLeavingMap[zoneId] = subsId
case TRANSFERRING:
zonalSubscriptionTransferringMap[zoneId] = subsId
default:
}
}
} else {
zonalSubscriptionEnteringMap[zoneId] = subsId
zonalSubscriptionLeavingMap[zoneId] = subsId
zonalSubscriptionTransferringMap[zoneId] = subsId
}
zonalSubscriptionMap[subsId] = zoneId
}
func deregisterUser(subsId string) {
userAddress := userSubscriptionMap[subsId]
userSubscriptionMap[subsId] = ""
userSubscriptionEnteringMap[userAddress] = ""
userSubscriptionLeavingMap[userAddress] = ""
userSubscriptionTransferringMap[userAddress] = ""
}
func registerUser(userAddress string, event []UserEventType, subsId string) {
if event != nil {
for i := 0; i < len(event); i++ {
switch event[i] {
case ENTERING:
userSubscriptionEnteringMap[userAddress] = subsId
case LEAVING:
userSubscriptionLeavingMap[userAddress] = subsId
case TRANSFERRING:
userSubscriptionTransferringMap[userAddress] = subsId
default:
}
}
} else {
userSubscriptionEnteringMap[userAddress] = subsId
userSubscriptionLeavingMap[userAddress] = subsId
userSubscriptionTransferringMap[userAddress] = subsId
}
userSubscriptionMap[subsId] = userAddress
}
func checkNotificationRegistrations(payload string) {
values := strings.Split(payload, ":")
if len(values) == 5 {
//value is split in 5 newZoneId:oldZoneId:newAccessPointId:oldAccessPointId:userAddress
checkNotificationRegisteredUsers(values[0], values[1], values[2], values[3], values[4])
checkNotificationRegisteredZones(values[0], values[1], values[2], values[3], values[4])
}
}
func checkNotificationRegisteredUsers(oldZoneId string, newZoneId string, oldApId string, newApId string, userId string) {
//user is the same so we just need to get it once
subsId := userSubscriptionEnteringMap[userId]
if subsId == "" {
subsId = userSubscriptionLeavingMap[userId]
}
if subsId == "" {
subsId = userSubscriptionTransferringMap[userId]
}
Loading
Loading full blame…