public async Task <HttpResponseMessage> NewRedirects(MessageRedirectRequest request) { if (string.IsNullOrWhiteSpace(request.fromphysicaladdress) || string.IsNullOrWhiteSpace(request.tophysicaladdress)) { return(Request.CreateResponse(HttpStatusCode.BadRequest)); } var messageRedirect = new MessageRedirect { FromPhysicalAddress = request.fromphysicaladdress, ToPhysicalAddress = request.tophysicaladdress, LastModifiedTicks = DateTime.UtcNow.Ticks }; using (var session = documentStore.OpenAsyncSession()) { var collection = await MessageRedirectsCollection.GetOrCreate(session).ConfigureAwait(false); var existing = collection[messageRedirect.MessageRedirectId]; if (existing != null) { return(existing.ToPhysicalAddress == messageRedirect.ToPhysicalAddress ? Negotiator.FromModel(Request, messageRedirect, HttpStatusCode.Created) : Negotiator.FromModel(Request, existing, HttpStatusCode.Conflict).WithReasonPhrase("Duplicate")); } var dependents = collection.Redirects.Where(r => r.ToPhysicalAddress == request.fromphysicaladdress).ToList(); if (dependents.Any()) { return(Negotiator.FromModel(Request, dependents, HttpStatusCode.Conflict).WithReasonPhrase("Dependents")); } collection.Redirects.Add(messageRedirect); await collection.Save(session).ConfigureAwait(false); } await domainEvents.Raise(new MessageRedirectCreated { MessageRedirectId = messageRedirect.MessageRedirectId, FromPhysicalAddress = messageRedirect.FromPhysicalAddress, ToPhysicalAddress = messageRedirect.ToPhysicalAddress }).ConfigureAwait(false); if (request.retryexisting) { await messageSession.SendLocal(new RetryPendingMessages { QueueAddress = messageRedirect.FromPhysicalAddress, PeriodFrom = DateTime.MinValue, PeriodTo = DateTime.UtcNow }).ConfigureAwait(false); } return(Request.CreateResponse(HttpStatusCode.Created)); }
public async Task <HttpResponseMessage> UpdateRedirect(Guid messageRedirectId, MessageRedirectRequest request) { if (string.IsNullOrWhiteSpace(request.tophysicaladdress)) { return(Request.CreateResponse(HttpStatusCode.BadRequest)); } using (var session = documentStore.OpenAsyncSession()) { var redirects = await MessageRedirectsCollection.GetOrCreate(session).ConfigureAwait(false); var messageRedirect = redirects[messageRedirectId]; if (messageRedirect == null) { return(Request.CreateResponse(HttpStatusCode.NotFound)); } var toMessageRedirectId = DeterministicGuid.MakeId(request.tophysicaladdress); if (redirects[toMessageRedirectId] != null) { return(Request.CreateResponse(HttpStatusCode.Conflict)); } var messageRedirectChanged = new MessageRedirectChanged { MessageRedirectId = messageRedirectId, PreviousToPhysicalAddress = messageRedirect.ToPhysicalAddress, FromPhysicalAddress = messageRedirect.FromPhysicalAddress, ToPhysicalAddress = messageRedirect.ToPhysicalAddress = request.tophysicaladdress }; messageRedirect.LastModifiedTicks = DateTime.UtcNow.Ticks; await redirects.Save(session).ConfigureAwait(false); await domainEvents.Raise(messageRedirectChanged) .ConfigureAwait(false); return(Request.CreateResponse(HttpStatusCode.NoContent)); } }