Commit afc6d569 authored by Yann Garcia's avatar Yann Garcia
Browse files

Review meep-sss subscription endpoints

parent 66e1ce2d
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -791,7 +791,7 @@ paths:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/SensorStatusSubscription'
                  $ref: '#/components/schemas/SensorDataSubscription'
                x-content-type: application/json
        "400":
          description: "Bad Request: used to indicate that incorrect parameters were\
@@ -1577,5 +1577,5 @@ components:
    status_data_subscriptionId_body:
      type: object
      properties:
        SensorStatusSubscription:
        SensorDataSubscription:
          $ref: '#/components/schemas/SensorDataSubscription'
+33 −0
Original line number Diff line number Diff line
@@ -71,6 +71,18 @@ type SensorData struct {
	DataTimestamp     *TimeStamp
}

type SensorDiscoveryEventSubscription struct {
	SubscriptionType string
	SensorInfoList   []string
	GeographicalArea []AreaInfo
}

type AreaInfo struct {
	Shape  string
	Points []Point
	Radius int32
}

type TimeStamp struct {
	Seconds     int32
	NanoSeconds int32
@@ -418,6 +430,27 @@ func GetSensorData(sensorIdentifier string) (data SensorData, err error) {
	return data, nil
}

func ProcessSensorDiscoveryEventSubscription(sensorDiscoveryEventSubscription SensorDiscoveryEventSubscription) (err error) {
	log.Info("sbi.processSensorDiscoveryEventSubscription: ", sensorDiscoveryEventSubscription)

	if sbi.sssMgr == nil {
		err = errors.New("No IoT platform registered")
		return err
	}

	sub := tm.SensorDiscoveryEventSubscription{
		SubscriptionType: sensorDiscoveryEventSubscription.SubscriptionType,
		SensorInfoList:   sensorDiscoveryEventSubscription.SensorInfoList,
	}
	// TODO FSCOM Add GeographicalArea field & create a convert function
	err = sbi.sssMgr.ProcessSensorDiscoveryEventSubscription(sub)
	if err != nil {
		return err
	}

	return nil
}

func convertSensorDiscoveryInfoListFromSssMgr(s []tm.SensorDiscoveryInfo) (sensors []SensorDiscoveryInfo) {
	sensors = make([]SensorDiscoveryInfo, len(s))
	for i, val := range s {
+104 −64
Original line number Diff line number Diff line
@@ -885,17 +885,94 @@ func subscriptionsPOST(subType string, w http.ResponseWriter, r *http.Request) {
	w.Header().Set("Content-Type", "application/json; charset=UTF-8")

	var subscriptionCommon SubscriptionCommon
	var bodyBytes []byte
	var err error
	switch subType {
	case SENS_DISCOVERY:
		var sub SensorDiscoverySubscriptionIdBody
		// Read JSON input stream provided in the Request, and stores it in the bodyBytes as bytes
		bodyBytes, err = ioutil.ReadAll(r.Body)
		if err != nil {
			log.Error(err.Error())
			errHandlerProblemDetails(w, err.Error(), http.StatusInternalServerError)
			return
		}
		log.Info("subscriptionsPost: bodyBytes: ", string(bodyBytes))
		// Unmarshal function to converts a JSON-formatted string into a SubscriptionCommon struct and store it in extractSubType
		err = json.Unmarshal(bodyBytes, &sub)
		if err != nil {
			log.Error(err.Error())
			errHandlerProblemDetails(w, err.Error(), http.StatusInternalServerError)
			return
		}
		log.Info("subscriptionsPost: sub: ", sub)
		subscriptionType := ""
		if sub.SensorDiscoveryEventSubscription.SubscriptionType != nil {
			subscriptionType = string(*sub.SensorDiscoveryEventSubscription.SubscriptionType)
		}
		subscriptionCommon = SubscriptionCommon{
			SubscriptionType:        subscriptionType,
			CallbackReference:       sub.SensorDiscoveryEventSubscription.CallbackReference,
			WebsockNotifConfig:      sub.SensorDiscoveryEventSubscription.WebsockNotifConfig,
			RequestTestNotification: sub.SensorDiscoveryEventSubscription.RequestTestNotification,
		}
	case SENS_STATUS:
		var sub SensorStatusSubscriptionIdBody
		// Read JSON input stream provided in the Request, and stores it in the bodyBytes as bytes
		bodyBytes, err = ioutil.ReadAll(r.Body)
		if err != nil {
			log.Error(err.Error())
			errHandlerProblemDetails(w, err.Error(), http.StatusInternalServerError)
			return
		}
		log.Info("subscriptionsPost: bodyBytes: ", string(bodyBytes))
		// Unmarshal function to converts a JSON-formatted string into a SubscriptionCommon struct and store it in extractSubType
		err = json.Unmarshal(bodyBytes, &sub)
		if err != nil {
			log.Error(err.Error())
			errHandlerProblemDetails(w, err.Error(), http.StatusInternalServerError)
			return
		}
		log.Info("subscriptionsPost: sub: ", sub)
		subscriptionType := ""
		if sub.SensorStatusSubscription.SubscriptionType != nil {
			subscriptionType = string(*sub.SensorStatusSubscription.SubscriptionType)
		}
		subscriptionCommon = SubscriptionCommon{
			SubscriptionType:        subscriptionType,
			CallbackReference:       sub.SensorStatusSubscription.CallbackReference,
			WebsockNotifConfig:      sub.SensorStatusSubscription.WebsockNotifConfig,
			RequestTestNotification: sub.SensorStatusSubscription.RequestTestNotification,
		}
	case SENS_DATA:
		var sub SensorDataSubscriptionIdBody
		// Read JSON input stream provided in the Request, and stores it in the bodyBytes as bytes
	bodyBytes, _ := ioutil.ReadAll(r.Body)
		bodyBytes, err = ioutil.ReadAll(r.Body)
		if err != nil {
			log.Error(err.Error())
			errHandlerProblemDetails(w, err.Error(), http.StatusInternalServerError)
			return
		}
		log.Info("subscriptionsPost: bodyBytes: ", string(bodyBytes))
		// Unmarshal function to converts a JSON-formatted string into a SubscriptionCommon struct and store it in extractSubType
	err := json.Unmarshal(bodyBytes, &subscriptionCommon)
		err = json.Unmarshal(bodyBytes, &sub)
		if err != nil {
			log.Error(err.Error())
			errHandlerProblemDetails(w, err.Error(), http.StatusInternalServerError)
			return
		}
	log.Info("subscriptionsPost: subscriptionCommon: ", subscriptionCommon)
		log.Info("subscriptionsPost: sub: ", sub)
		subscriptionType := ""
		if sub.SensorDataSubscription.SubscriptionType != nil {
			subscriptionType = string(*sub.SensorDataSubscription.SubscriptionType)
		}
		subscriptionCommon = SubscriptionCommon{
			SubscriptionType:        subscriptionType,
			CallbackReference:       sub.SensorDataSubscription.CallbackReference,
			WebsockNotifConfig:      sub.SensorDataSubscription.WebsockNotifConfig,
			RequestTestNotification: sub.SensorDataSubscription.RequestTestNotification,
		}
	}

	// Validating mandatory parameters provided in the request body
	if subscriptionCommon.SubscriptionType == "" {
@@ -1058,12 +1135,6 @@ func subscriptionsByIdGET(subType string, w http.ResponseWriter, r *http.Request
	subsIdStr := vars["subscriptionId"]
	log.Info("subsIdStr: ", subsIdStr)

	q := u.Query()
	sensorIdentifier := q.Get("sensorIdentifier")
	log.Debug("subscriptionsByIdGET: sensorIdentifier: ", sensorIdentifier)
	sensorIdentifiers := strings.Split(sensorIdentifier, ",")
	log.Debug("subscriptionsByIdGET: sensorIdentifiers: ", sensorIdentifiers)

	// Find subscription entry in Redis DB
	keyName := baseKey + "subscriptions:" + subsIdStr
	log.Info("subscriptionsByIdGET: keyName: ", keyName)
@@ -1217,24 +1288,10 @@ func processSensorDiscoveryEventSubscription(bodyBytes []byte, link *Subscriptio

	// FIXME FSCOM Check filter values

	if sensorDiscoveryEventSubscription.WebsockNotifConfig == nil && sensorDiscoveryEventSubscription.CallbackReference == "" {
		err = errors.New("Mandatory CallbackReference parameter should be present")
		log.Error(err.Error())
		return "", err
	}
	if sensorDiscoveryEventSubscription.CallbackReference == "" {
		err = errors.New("CallbackReference parameter should be present")
		log.Error(err.Error())
		return "", err
	}
	if sensorDiscoveryEventSubscription.WebsockNotifConfig != nil {
		err = errors.New("WebsockNotifConfig not supported")
		log.Error(err.Error())
		return "", err
	}

	registerSensorDiscoveryEventSubscription(subsIdStr, nil, sensorDiscoveryEventSubscription)

	sensorDiscoveryEventSubscription.SubscriptionType = new(SubscriptionType)
	*sensorDiscoveryEventSubscription.SubscriptionType = SENSOR_DISCOVERY_EVENT_SUBSCRIPTION
	sensorDiscoveryEventSubscription.Links = link

	// Store subscription key in redis
@@ -1313,6 +1370,17 @@ func registerSensorDiscoveryEventSubscription(subId string, currentSensorDiscove
			intList = append(intList, subsId)
			subscriptionExpiryMap[int(sensorDiscoveryEventSubscription.ExpiryDeadline.Seconds)] = intList
		}
		sub := sbi.SensorDiscoveryEventSubscription{
			SubscriptionType: string(SENSOR_DISCOVERY_EVENT_SUBSCRIPTION),
			SensorInfoList:   sensorDiscoveryEventSubscription.SensorInfoList,
		}
		// TODO FSCOM Add GeographicalArea field & create a convert function
		err := sbi.ProcessSensorDiscoveryEventSubscription(sub)
		if err != nil {
			log.Error("Failed to register sensorDiscoveryEventSubscription: ", err)
			errHandlerProblemDetails(nil, err.Error(), http.StatusInternalServerError)
			return
		}
	}
	log.Info("registerSensorDiscoveryEventSubscription: After subscriptionExpiryMap: ", subscriptionExpiryMap)
	log.Info("New registration: ", subsId, " type: ", SENS_DISCOVERY)
@@ -1366,24 +1434,10 @@ func processSensorStatusSubscription(bodyBytes []byte, link *SubscriptionLinks,

	// FIXME FSCOM Check filter values

	if sensorStatusSubscription.WebsockNotifConfig == nil && sensorStatusSubscription.CallbackReference == "" {
		err = errors.New("Mandatory CallbackReference parameter should be present")
		log.Error(err.Error())
		return "", err
	}
	if sensorStatusSubscription.WebsockNotifConfig != nil {
		err = errors.New("WebsockNotifConfig not supported")
		log.Error(err.Error())
		return "", err
	}
	if sensorStatusSubscription.CallbackReference == "" {
		err = errors.New("CallbackReference parameter should be present")
		log.Error(err.Error())
		return "", err
	}

	registerSensorStatusSubscription(subsIdStr, nil, sensorStatusSubscription)

	sensorStatusSubscription.SubscriptionType = new(SubscriptionType)
	*sensorStatusSubscription.SubscriptionType = SENSOR_STATUS_SUBSCRIPTION
	sensorStatusSubscription.Links = link

	// Store subscription key in redis
@@ -1516,24 +1570,10 @@ func processSensorDataSubscription(bodyBytes []byte, link *SubscriptionLinks, su

	// FIXME FSCOM Check filter values

	if sensorDataSubscription.WebsockNotifConfig == nil && sensorDataSubscription.CallbackReference == "" {
		err = errors.New("Mandatory CallbackReference parameter should be present")
		log.Error(err.Error())
		return "", err
	}
	if sensorDataSubscription.WebsockNotifConfig != nil {
		err = errors.New("WebsockNotifConfig not supported")
		log.Error(err.Error())
		return "", err
	}
	if sensorDataSubscription.CallbackReference == "" {
		err = errors.New("CallbackReference parameter should be present")
		log.Error(err.Error())
		return "", err
	}

	registerSensorDataSubscription(subsIdStr, nil, sensorDataSubscription)

	sensorDataSubscription.SubscriptionType = new(SubscriptionType)
	*sensorDataSubscription.SubscriptionType = SENSOR_DATA_SUBSCRIPTION
	sensorDataSubscription.Links = link

	// Store subscription key in redis
+1 −1
Original line number Diff line number Diff line
@@ -10,5 +10,5 @@
package server

type SensorDataSubscriptionIdBody struct {
	SensorStatusSubscription *SensorDataSubscription `json:"SensorStatusSubscription,omitempty"`
	SensorDataSubscription *SensorDataSubscription `json:"SensorStatusSubscription,omitempty"`
}
+2 −2
Original line number Diff line number Diff line
@@ -791,7 +791,7 @@ paths:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/SensorStatusSubscription'
                  $ref: '#/components/schemas/SensorDataSubscription'
                x-content-type: application/json
        "400":
          description: "Bad Request: used to indicate that incorrect parameters were\
@@ -1577,5 +1577,5 @@ components:
    status_data_subscriptionId_body:
      type: object
      properties:
        SensorStatusSubscription:
        SensorDataSubscription:
          $ref: '#/components/schemas/SensorDataSubscription'
Loading