Commit 45a08883 authored by Ikram Haq's avatar Ikram Haq
Browse files

Implement logic to GET the Event and Periodic based subscriptions w.r.t to standard

parent 227cecf2
Loading
Loading
Loading
Loading
+68 −32
Original line number Diff line number Diff line
@@ -2815,11 +2815,10 @@ func userSubListGET(w http.ResponseWriter, r *http.Request) {
	subscriptionType := queryParams.Get("subscription_type")
	address := queryParams.Get("address")

	var response InlineNotificationSubscriptionList
	var userSubList NotificationSubscriptionList
	userSubList.ResourceURL = &LinkType{}
	userSubList.ResourceURL.Href = hostUrl.String() + basePath + "subscriptions/users"
	response.NotificationSubscriptionList = &userSubList
	var response []InlineNotificationSubscriptionList

	// Create a slice to hold subscriptions
	var subscriptions []Subscription

	var err error
	switch subscriptionType {
@@ -2829,17 +2828,17 @@ func userSubListGET(w http.ResponseWriter, r *http.Request) {
		if address != "" {
			keyName += ":" + address
		}
		err = rc.ForEachJSONEntry(keyName, populateUserSubList, &userSubList)
		err = rc.ForEachJSONEntry(keyName, populateUserSubList, &subscriptions)
	case "event":
		keyName := baseKey + typeUserSubscription + "*"
		// If address parameter is provided, filter subscriptions by address
		if address != "" {
			keyName += ":" + address
		}
		err = rc.ForEachJSONEntry(keyName, populateUserSubList1, &userSubList)
		err = rc.ForEachJSONEntry(keyName, populateUserSubList1, &subscriptions)
	default:
		// If no subscription_type is provided, return both responses
		var userSubListPeriodic NotificationSubscriptionList
		var userSubListPeriodic []Subscription
		keyNamePeriodic := baseKey + typePeriodicSubscription + "*"
		// If address parameter is provided, filter subscriptions by address
		errPeriodic := rc.ForEachJSONEntry(keyNamePeriodic, populateUserSubList, &userSubListPeriodic)
@@ -2849,7 +2848,7 @@ func userSubListGET(w http.ResponseWriter, r *http.Request) {
			return
		}

		var userSubListEvent NotificationSubscriptionList
		var userSubListEvent []Subscription
		keyNameEvent := baseKey + typeUserSubscription + "*"
		// If address parameter is provided, filter subscriptions by address

@@ -2860,9 +2859,8 @@ func userSubListGET(w http.ResponseWriter, r *http.Request) {
			return
		}

		// Merge both lists
		userSubList.UserLocationPeriodicSubscription = append(userSubList.UserLocationPeriodicSubscription, userSubListPeriodic.UserLocationPeriodicSubscription...)
		userSubList.UserLocationEventSubscription = append(userSubList.UserLocationEventSubscription, userSubListEvent.UserLocationEventSubscription...)
		subscriptions = append(subscriptions, userSubListPeriodic...)
		subscriptions = append(subscriptions, userSubListEvent...)

		// No error since we're combining the lists
		err = nil
@@ -2874,6 +2872,17 @@ func userSubListGET(w http.ResponseWriter, r *http.Request) {
		return
	}

	// Constructing the response
	response = append(response, InlineNotificationSubscriptionList{
		NotificationSubscriptionList: &NotificationSubscriptionList{
			Subscription: subscriptions,
			ResourceURL: &LinkType{
				Href: hostUrl.String() + basePath + "subscriptions/users",
			},
		},
	})

	// Marshaling the response
	jsonResponse, err := json.Marshal(response)
	if err != nil {
		log.Error(err.Error())
@@ -2881,8 +2890,9 @@ func userSubListGET(w http.ResponseWriter, r *http.Request) {
		return
	}

	// Writing the response
	w.WriteHeader(http.StatusOK)
	fmt.Fprint(w, string(jsonResponse))
	w.Write(jsonResponse)
}

func periodicSubGet(w http.ResponseWriter, r *http.Request) {
@@ -3407,7 +3417,12 @@ func handleUserLocationEventSubscription(w http.ResponseWriter, requestBody []ma
			subsIdStr := strconv.Itoa(newSubsId)

			registerUser1(userSubBody.Address, userSubBody.LocationEventCriteria, subsIdStr)
			userSubBody.ResourceURL = hostUrl.String() + basePath + "subscriptions/users/" + subsIdStr
			userSubBody.Links = &Links{
				Self: &LinkType{
					Href: hostUrl.String() + basePath + "subscriptions/users/" + subsIdStr,
				},
			}
			userSubBody.SubscriptionType = "userLocationEventSubscription"
			_ = rc.JSONSetEntry(baseKey+typeUserSubscription+":"+subsIdStr, ".", convertUserSubscriptionToJson1(&userSubBody))

			// Prepare response
@@ -3467,7 +3482,12 @@ func handleUserLocationPeriodicSubscription(w http.ResponseWriter, requestBody [
			nextPeriodicSubscriptionIdAvailable += 2
			subsIdStr := strconv.Itoa(newSubsId)

			periodicSub.ResourceURL = hostUrl.String() + basePath + "subscriptions/users/" + subsIdStr
			periodicSub.Links = &Links{
				Self: &LinkType{
					Href: hostUrl.String() + basePath + "subscriptions/users/" + subsIdStr,
				},
			}
			periodicSub.SubscriptionType = "userLocationPeriodicSubscription"
			_ = rc.JSONSetEntry(baseKey+typePeriodicSubscription+":"+subsIdStr, ".", convertPeriodicSubscriptionToJson1(&periodicSub))
			registerPeriodic1(&periodicSub, subsIdStr)

@@ -3814,7 +3834,12 @@ func handleUserLocationEventSubscriptionPut(w http.ResponseWriter, requestBody [
				return
			}

			userSubBody.ResourceURL = hostUrl.String() + basePath + "subscriptions/users/" + subsIdStr
			userSubBody.Links = &Links{
				Self: &LinkType{
					Href: hostUrl.String() + basePath + "subscriptions/users/" + subsIdStr,
				},
			}
			userSubBody.SubscriptionType = "userLocationEventSubscription"

			subsId, err := strconv.Atoi(subsIdStr)
			if err != nil {
@@ -3887,7 +3912,12 @@ func handleUserLocationPeriodicSubscriptionPut(w http.ResponseWriter, requestBod
				return
			}

			periodicSub.ResourceURL = hostUrl.String() + basePath + "subscriptions/users/" + subsIdStr
			periodicSub.Links = &Links{
				Self: &LinkType{
					Href: hostUrl.String() + basePath + "subscriptions/users/" + subsIdStr,
				},
			}
			periodicSub.SubscriptionType = "userLocationPeriodicSubscription"

			subsId, err := strconv.Atoi(subsIdStr)
			if err != nil {
@@ -4010,7 +4040,7 @@ func userTrackingSubPut(w http.ResponseWriter, r *http.Request) {

func populateUserSubList1(key string, jsonInfo string, userData interface{}) error {

	userList := userData.(*NotificationSubscriptionList)
	userList := userData.(*[]Subscription)
	var userInfo UserLocationEventSubscription

	// Format response
@@ -4018,13 +4048,21 @@ func populateUserSubList1(key string, jsonInfo string, userData interface{}) err
	if err != nil {
		return err
	}
	userList.UserLocationEventSubscription = append(userList.UserLocationEventSubscription, userInfo)
	href := ""
	if userInfo.Links != nil && userInfo.Links.Self != nil {
		href = userInfo.Links.Self.Href
	}
	sub := Subscription{
		Href:             href,
		SubscriptionType: userInfo.SubscriptionType,
	}
	*userList = append(*userList, sub)
	return nil
}

func populateUserSubList(key string, jsonInfo string, userData interface{}) error {

	userList := userData.(*NotificationSubscriptionList)
	subscriptions := userData.(*[]Subscription)
	var userInfo UserLocationPeriodicSubscription

	// Format response
@@ -4032,19 +4070,17 @@ func populateUserSubList(key string, jsonInfo string, userData interface{}) erro
	if err != nil {
		return err
	}
	userList.UserLocationPeriodicSubscription = append(userList.UserLocationPeriodicSubscription, userInfo)
	href := ""
	if userInfo.Links != nil && userInfo.Links.Self != nil {
		href = userInfo.Links.Self.Href
	}
	// Create a Subscription instance
	sub := Subscription{
		Href:             href,
		SubscriptionType: userInfo.SubscriptionType,
	}
	*subscriptions = append(*subscriptions, sub)
	return nil

	// userList := userData.(*NotificationSubscriptionList)
	// var userInfo UserLocationEventSubscription

	// // Format response
	// err := json.Unmarshal([]byte(jsonInfo), &userInfo)
	// if err != nil {
	// 	return err
	// }
	// userList.UserLocationEventSubscription = append(userList.UserLocationEventSubscription, userInfo)
	// return nil
}

func populateUserTrackingList(key string, jsonInfo string, userData interface{}) error {
+3 −0
Original line number Diff line number Diff line
@@ -11,6 +11,9 @@ package server

// A type containing data for notifications, when the area is defined as a circle.
type UserLocationEventSubscription struct {
	SubscriptionType string `json:"subscriptionType"`

	Links *Links `json:"_links,omitempty"`
	// Address of user (e.g. ‘sip’ URI, ‘tel’ URI, ‘acr’ URI) to monitor.
	Address string `json:"address,omitempty"`
	// URI exposed by the client on which to receive notifications via HTTP. See note 1.
+1 −0
Original line number Diff line number Diff line
@@ -10,6 +10,7 @@
package server

type UserLocationPeriodicSubscription struct {
	Links *Links `json:"_links,omitempty"`
	// Address of user (e.g. ‘sip’ URI, ‘tel’ URI, ‘acr’ URI) to monitor.
	Address []string `json:"address"`
	// URI exposed by the client on which to receive notifications via HTTP. See note 1.