Example #1
0
        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));
        }
Example #2
0
        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));
            }
        }