Commit 64e5d0af authored by Ikram Haq's avatar Ikram Haq
Browse files

Implement logic to handle ReportingCtrl and expirydeadline attribute in UserAreaSubscription

parent 27f23e00
Loading
Loading
Loading
Loading
+43 −8
Original line number Diff line number Diff line
@@ -152,6 +152,9 @@ type AreaCircleCheck struct {
	AddrInArea             map[string]bool
	NbNotificationsSent    int32
	NotificationCheckReady bool
	Reporting_amount       int32
	Reporting_interval     int32
	TimeStamp              int64
	Subscription           *UserAreaSubscription
}

@@ -1351,6 +1354,7 @@ func checkNotificationAreaCircle(addressToCheck string) {
	//only check if there is at least one subscription
	mutex.Lock()
	defer mutex.Unlock()
	currentTime := time.Now().Unix()
	//check all that applies
	for subsId, areaCircleCheck := range areaCircleSubscriptionMap {
		if areaCircleCheck != nil && areaCircleCheck.Subscription != nil {
@@ -1360,6 +1364,16 @@ func checkNotificationAreaCircle(addressToCheck string) {
			// 	}

			//loop through every reference address
			if areaCircleCheck.Subscription.ExpiryDeadline != nil && time.Now().Unix() > int64(areaCircleSubscriptionMap[subsId].TimeStamp) {
				subsIdStr := strconv.Itoa(subsId)
				log.Info("Expiry deadline passed for subscription: ")
				// Optionally, you can remove the subscription from the map or perform other cleanup actions
				err := rc.JSONDelEntry(baseKey+typeAreaCircleSubscription+":"+subsIdStr, ".")
				if err != nil {
					log.Error(err.Error())
				}
				continue
			}
			for _, addr := range areaCircleCheck.Subscription.AddressList {
				if addr != addressToCheck {
					continue
@@ -1429,7 +1443,25 @@ func checkNotificationAreaCircle(addressToCheck string) {
				var inlineCircleSubscriptionNotification InlineUserAreaNotification
				inlineCircleSubscriptionNotification.UserAreaNotification = &areaCircleNotif
				areaCircleCheck.NbNotificationsSent++
				if areaCircleCheck.Subscription.ReportingCtrl != nil {
					// If NextTts has passed, send notification

					if currentTime >= int64(areaCircleCheck.NextTts) {
						// Update NextTts for the next notification
						areaCircleCheck.NextTts = int32(currentTime + int64(areaCircleCheck.Reporting_interval))
						// Check if reporting amount is reached
						if areaCircleCheck.Reporting_amount <= 0 {
							// If reporting amount is zero, no more notifications should be sent
							continue
						}
						// Decrement reporting amount
						areaCircleCheck.Reporting_amount--
						sendSubscriptionNotification5(areaCircleCheck.Subscription.CallbackReference, inlineCircleSubscriptionNotification)
					}
				} else {
					// If no reporting control parameters, send notification without conditions
					sendSubscriptionNotification5(areaCircleCheck.Subscription.CallbackReference, inlineCircleSubscriptionNotification)
				}
				log.Info("Area Circle Notification" + "(" + subsIdStr + ") For " + addr + " when " + " area")
				// areaCircleSubscriptionMap[subsId].NextTts = areaCircleCheck.Subscription.Frequency
				// areaCircleSubscriptionMap[subsId].NotificationCheckReady = false
@@ -1721,19 +1753,22 @@ func registerAreaCircle(areaSub *UserAreaSubscription, subsIdStr string) {
	if err != nil {
		log.Error(err)
	}

	var expiryTime int64
	if areaSub != nil && areaSub.ExpiryDeadline != nil {
		expiryTime = time.Now().Unix() + int64(areaSub.ExpiryDeadline.Seconds)
	}
	mutex.Lock()
	defer mutex.Unlock()
	var areaCircleCheck AreaCircleCheck
	areaCircleCheck.Subscription = areaSub
	areaCircleCheck.NbNotificationsSent = 0
	areaCircleCheck.AddrInArea = map[string]bool{}
	//checkImmediate ignored, will be hit on next check anyway
	//if areaCircleSub.CheckImmediate {
	areaCircleCheck.NextTts = 0 //next time periodic trigger hits, will be forced to trigger
	//} else {
	//		areaCircleCheck.NextTts = areaCircleSub.Frequency
	//	}
	if areaSub != nil && areaSub.ReportingCtrl != nil {
		areaCircleCheck.Reporting_amount = areaSub.ReportingCtrl.MaximumCount
		areaCircleCheck.Reporting_interval = areaSub.ReportingCtrl.MinimumInterval
	}
	areaCircleCheck.TimeStamp = expiryTime
	areaCircleCheck.NextTts = 0
	areaCircleSubscriptionMap[subsId] = &areaCircleCheck
}