public TopicSubscriptionsModule(ISubscriptionService subcriptionService) { _subscriptionService = subcriptionService; //Subscribe to topic Post("Subscriptions/{accountId}/Subscribe/{topicId}", async(args, ct) => { var accountId = args.accountId; var topicId = args.topicId; var sessionCookie = Request.Headers.Cookie.FirstOrDefault(c => c.Name == _sessionTokenCookieName); var sessionToken = sessionCookie == null ? null : sessionCookie.Value; ActionResult <Subscription> result = await _subscriptionService.CreateSubscription(accountId, topicId, sessionToken); if (result.statusCode != (System.Net.HttpStatusCode)HttpStatusCode.Created) { return(result.statusCode); } var subscription = result.resposeObject; var confirmationToken = subscription.ConfirmationToken; var subId = subscription.Id; var links = new List <HyperMedia> { new HyperMedia { Href = this.Request.Url, Rel = "self" }, new HyperMedia { Href = $"{this.Request.Url.SiteBase}/Subscriptions/{accountId}/Confirm/{confirmationToken}", Rel = "confirm" }, new HyperMedia { Href = $"{this.Request.Url.SiteBase}/Subscriptions/{accountId}/Subscription/{subId}", Rel = "delete" } }; var response = Response.AsJson(new { ConfirmationToken = confirmationToken, links = links }); if (!string.IsNullOrWhiteSpace(result.sessionToken)) { await response.WithCookie(_sessionTokenCookieName, result.sessionToken); } return(response); }); //Confirm topic subscription Put("Subscriptions/{accountId}/Confirm/{confirmationToken}", async(args, ct) => { var confirmationToken = args.confirmationToken; var accountId = args.accountId; var sessionCookie = Request.Headers.Cookie.FirstOrDefault(c => c.Name == _sessionTokenCookieName); var sessionToken = sessionCookie == null ? null : sessionCookie.Value; ActionResult <Subscription> result = await _subscriptionService.ConfirmSubscription(confirmationToken, accountId, sessionToken); if (result.statusCode != (System.Net.HttpStatusCode)HttpStatusCode.OK) { //If status is Precondition failed then there is a concurrency violation. if (result.statusCode == (System.Net.HttpStatusCode)HttpStatusCode.PreconditionFailed) { return("There is an update conflit on this subscription. Please refresh the status of the subscription and try again"); } return(result.statusCode); } var subscription = result.resposeObject; var subId = subscription.Id; var links = new List <HyperMedia> { new HyperMedia { Href = this.Request.Url, Rel = "self" }, new HyperMedia { Href = $"{this.Request.Url.SiteBase}/Subscriptions/{accountId}/Subscription/{subId}", Rel = "delete" } }; var response = Response.AsJson(links); if (!string.IsNullOrWhiteSpace(result.sessionToken)) { await response.WithCookie(_sessionTokenCookieName, result.sessionToken); } return(Response.AsJson(links)); }); //Delete topic Delete("Subscriptions/{accountId}/Subscription/{subscriptionId}", async args => { var accountId = args.accountId; var subId = args.subscriptionId; var result = await _subscriptionService.DeleteSubscription(subId, accountId); return(result); }); }