public void Send(BillCacheMessage message)
 {
     this.Info(() => "Attempting to send BillCacheMessage: {0} to queue.".FormatWith(message.BillingType));
     var bus = new TransactionBus(_bus);
     bus.SendDynamic(new BillCacheMessage { BillingType = message.BillingType, Command = message.Command });
     this.Info(() => "Successfully sent BillCacheMessage: {0} to queue.".FormatWith(message.BillingType));
 }
 public void Send(BillingMessage message)
 {
     this.Info(() => "Attempting to send BillingMessage: {0} to queue.".FormatWith(message.RunType));
     var bus = new TransactionBus(_bus);
     bus.SendDynamic(new BillingMessage() { RunType = message.RunType, Schedule = message.Schedule });
     this.Info(() => "Successfully sent BillingMessage: {0} to queue.".FormatWith(message.RunType));
 }
 public void Send(TransactionRequestCleanupMessage message)
 {
     this.Info(() => "Attempting to send TransactionRequestCleanupMessage: {0} to queue.".FormatWith(message));
     var bus = new TransactionBus(_bus);
     bus.SendDynamic(new TransactionRequestCleanupMessage());
     this.Info(() => "Successfully sent TransactionRequestCleanupMessage: {0} to queue.".FormatWith(message));
 } 
        public void it_should_publish_a_transaction()
        {
            var bus = new TransactionBus(_bus);

            // Customer
            transaction = new InvoiceTransactionCreated(new Guid("2FD581A3-47EC-42A6-8EE7-ECC03FADD14E"));

            bus.SendDynamic(transaction);

            _bus.ShouldNotBeNull();
        }
        public override void Observe()
        {
            var bus = new TransactionBus(_bus);

            var billRun = new BillingMessage()
            {
                RunType = "Final",
                Schedule = null
            };

            bus.SendDynamic(billRun);
        }
        public void it_should_publish_a_schedule_transaction()
        {
            var bus = new TransactionBus(_bus);

            cleanup = new TransactionRequestCleanupMessage
            {
                RequestId = new Guid()
            };

            bus.SendDynamic(cleanup);

            _bus.ShouldNotBeNull();
        }
        public void it_should_publish_a_cancelled_vin12_transaction()
        {
            var bus = new TransactionBus(_bus);

            transaction = new TransactionRequestMessage
            {
                RequestId = new Guid("8E250190-EE28-40D6-92B8-042B67B98F7C"),
                UserState = ApiCommitRequestUserState.Cancelled
            };

            bus.SendDynamic(transaction);

            _bus.ShouldNotBeNull();
        }
        public override void Observe()
        {
            var bus = new TransactionBus(_bus);

            var packageId = new Guid("E2E91BEA-B301-4CAD-A58A-425BC613C22C");

            var client = new PackageMessage()
            {
                Id = packageId,
                PackageId = packageId,
                PackageName = "PackageTest 1",
            };

            bus.SendDynamic(client);
        }
        public override void Observe()
        {
            var bus = new TransactionBus(_bus);

            //Register Exchanges and Queues for multiple message types
            var messageTypes = new ArrayList
            {
                new InvoiceTransactionCreated(), 
                new EntityMessage()
            };

            IEnumerable<Object> listedMessageTypes = messageTypes.ToArray();

            bus.RegisterQueuesExchanges(listedMessageTypes);
            //END - Register
        }
        public override void Observe()
        {
            var bus = new TransactionBus(_bus);

            var customer = new CustomerMessage()
            {
                Id = Guid.NewGuid(),
                Created = DateTime.UtcNow,
                CreatedBy = "UNITTEST",
                AccountNumber = "UNITTEST0001",
                BillingType = "Response",
                CustomerId = new Guid("662872BB-38DF-4436-87A8-E4D45B6DD70B"),
                CustomerName = "Customer 1"
            };

            bus.SendDynamic(customer);
        }
        public override void Observe()
        {
            var bus = new TransactionBus(_bus);

            var client = new ClientMessage()
            {
                Id = Guid.NewGuid(),
                Created = DateTime.UtcNow,
                AccountNumber = "UNITTESTCL001",
                BillingType = "Response",
                CreatedBy = "UNITTEST",
                ClientId = new Guid("45547DDC-6AB7-4C45-BF50-9F6066AB3EEF"),
                ClientName = "Client 1"
            };

            bus.SendDynamic(client);
        }
        public override void Observe()
        {
            var bus = new TransactionBus(_bus);

            var userTransactions = new List<ContractUserTransactions>();
            var products = new List<ContractProductDetail>();
            products.Add(new ContractProductDetail { PackageName = "Test Package", TransactionCount = 12 });

            userTransactions.Add(new ContractUserTransactions
            {
                User = "******",
                Products = products
            });

            var statementList = new List<ContractStatement>();

            statementList.Add(new ContractStatement
             {
                 Customer = "Test Customer",
                 Client = "",
                 ContractName = "Test Contract",
                 UserTransactions = userTransactions
             });

            var data = new ReportDto
            {
                Template = new ReportTemplate { ShortId = "VkTYTvzp" },
                Data = new ReportData
                {
                    ContractStatements = statementList
                }
            };


            var report = new ReportMessage()
            {
                Id = Guid.NewGuid(),
                ReportBody = JsonConvert.SerializeObject(data),
                ReportType = "pdf"
            };

            bus.SendDynamic(report);
        }
        public override void Observe()
        {
            var bus = new TransactionBus(_bus);

            var packagesList = new List<ReportPackage>();
            packagesList.Add(new ReportPackage
            {
                ItemCode = "1000/200/002",
                ItemDescription = "PackageName",
                QuantityUnit = 1,
                Price = 16314.67,
                Vat = 2284
            });

            var data = new ReportDto
            {
                Template = new ReportTemplate { ShortId = "VJGAd9OM" },
                Data = new ReportData
                {
                    Customer = new ReportCustomer
                    {
                        Name = "Customer 1",
                        TaxRegistration = 4190195679,
                        Packages = packagesList
                    }
                }
            };


            var report = new ReportMessage()
            {
                Id = Guid.NewGuid(),
                ReportBody = JsonConvert.SerializeObject(data),
                ReportType = "pdf"
            };

            bus.SendDynamic(report);
        }
        public AdminBillingModule(IRepository<AuditLog> auditLogs, IRepository<Transaction> transactions, IAdvancedBus eBus)
        {
            this.RequiresAnyClaim(new[] { RoleType.Admin.ToString(), RoleType.ProductManager.ToString(), RoleType.Support.ToString() });

            var advancedBus = new TransactionBus(eBus);

            Get["/Admin/Billing"] = _ => Negotiate.WithView("Index");
            Get["/Admin/AuditLog"] = _ =>
            {
                return Negotiate
                    .WithView("AuditLog")
                    .WithMediaRangeModel(MediaRange.FromString("application/json"), new { data = auditLogs });
            };

            Post["/Admin/Replay/BillingTransactions"] = _ =>
            {
                try
                {
                    foreach (var transaction in transactions)
                    {
                        var message = new InvoiceTransactionCreated(transaction.Id);
                        advancedBus.SendDynamic(message);
                    }
                }
                catch (Exception ex)
                {
                    throw new LightstoneAutoException(ex.Message);
                }

                return Response.AsJson(new { data = "Success" });
            };

            Post["/Admin/Cache/Flush/{cycle}"] = param =>
            {
                string billingCycle = param.cycle;

                try
                {
                    switch (billingCycle)
                    {
                        case "preBilling":
                            advancedBus.SendDynamic(new BillCacheMessage { BillingType = typeof(PreBilling), Command = BillingCacheCommand.Flush });
                            break;

                        case "stageBilling":
                            advancedBus.SendDynamic(new BillCacheMessage { BillingType = typeof(StageBilling), Command = BillingCacheCommand.Flush });
                            break;

                        case "finalBilling":
                            advancedBus.SendDynamic(new BillCacheMessage { BillingType = typeof(FinalBilling), Command = BillingCacheCommand.Flush });
                            break;
                    }
                }
                catch (Exception ex)
                {
                    throw new LightstoneAutoException(ex.Message);
                }

                return Response.AsJson(new { data = "Success" });
            };

            Post["/Admin/Cache/Reload/{cycle}"] = param =>
            {
                string billingCycle = param.cycle;

                try
                {
                    switch (billingCycle)
                    {
                        case "preBilling":
                            advancedBus.SendDynamic(new BillCacheMessage { BillingType = typeof(PreBilling), Command = BillingCacheCommand.Reload });
                            break;

                        case "stageBilling":
                            advancedBus.SendDynamic(new BillCacheMessage { BillingType = typeof(StageBilling), Command = BillingCacheCommand.Reload });
                            break;

                        case "finalBilling":
                            advancedBus.SendDynamic(new BillCacheMessage { BillingType = typeof(FinalBilling), Command = BillingCacheCommand.Reload });
                            break;
                    }
                }
                catch (Exception ex)
                {
                    throw new LightstoneAutoException(ex.Message);
                }

                return Response.AsJson(new { data = "Success" });
            };
        }
        public PackageModule(IPublishStorableCommands publisher,
            IRepository<Domain.Entities.Packages.Read.Package> readRepo,
            INEventStoreRepository<Package> writeRepo, IRepository<State> stateRepo, IEntryPoint entryPoint, IAdvancedBus eBus,
            IUserManagementApiClient userManagementApi, IBillingApiClient billingApiClient, IPublishIntegrationMessages integration)
        {

            Get[PackageBuilderApi.PackageRoutes.RequestIndex.ApiRoute] = _ =>
            {
                return _.showAll
                    ? Response.AsJson(
                        from p1 in readRepo
                        where p1.Version == (from p2 in readRepo where p2.PackageId == p1.PackageId && !p2.IsDeleted select p2.Version).Max()
                        select p1)
                    : Response.AsJson(readRepo.Where(x => !x.IsDeleted));
            };

            Get[PackageBuilderApi.PackageRoutes.RequestLookup.ApiRoute] = parameters =>
            {
                var filter = ((string)Context.Request.Query["q_word[]"].Value + "").Replace(",", " ");
                var pageIndex = 0;
                var pageSize = 0;
                int.TryParse(Context.Request.Query["page_num"].Value, out pageIndex);
                int.TryParse(Context.Request.Query["per_page"].Value, out pageSize);

                var industries = ((string)parameters.industryIds.Value + "").Split(',').Select(x => !string.IsNullOrEmpty(x) ? new Guid(x) : new Guid());

                var publishedPackages = from p1 in readRepo
                    where p1.Version == (from p2 in readRepo where p2.PackageId == p1.PackageId select p2.Version).Max()
                          && p1.State.Name == StateName.Published &&
                          p1.Industries.Any(ind => industries.Contains(ind.Id))
                          && (p1.Name + "").Trim().ToLower().StartsWith(filter)
                    select p1;

                var packages = new PagedList<Domain.Entities.Packages.Read.Package>(publishedPackages, pageIndex - 1, pageSize, x => !x.IsDeleted);

                return Response.AsJson(
                        new
                        {
                            result = packages,
                            cnt_whole = packages.RecordsFiltered
                        });
            };

            Get[PackageBuilderApi.PackageRoutes.RequestUpdate.ApiRoute] = parameters => Response.AsJson(
                new
                {
                    Response = new[] { Mapper.Map<IPackage, PackageDto>(writeRepo.GetById(parameters.id)) }
                });


            Post[PackageBuilderApi.PackageRoutes.Execute.ApiRoute] = parameters =>
            {
                var apiRequest = this.Bind<ApiRequestDto>();
                this.Info(() => StringExtensions.FormatWith("Package Execute Initialized for {0}, TimeStamp: {1}", apiRequest.RequestId, DateTime.UtcNow));

                this.Info(() => StringExtensions.FormatWith("Package Read Initialized, TimeStamp: {0}", DateTime.UtcNow));
                var package = writeRepo.GetById(apiRequest.PackageId, true);
                this.Info(() => StringExtensions.FormatWith("Package Read Completed, TimeStamp: {0}", DateTime.UtcNow));

                if (package == null)
                {
                    this.Error(() => StringExtensions.FormatWith("Package not found:", apiRequest.PackageId));
                    throw new LightstoneAutoException("Package could not be found");
                }

                this.Info(() => StringExtensions.FormatWith("PackageBuilder Auth to UserManagement Initialized for {0}, TimeStamp: {1}", apiRequest.RequestId, DateTime.UtcNow));
                var token = Context.Request.Headers.Authorization.Split(' ')[1];
                var accountNumber = userManagementApi.Get(token, "/CustomerClient/{id}", new[] { new KeyValuePair<string, string>("id", apiRequest.CustomerClientId.ToString()) }, null);

                this.Info(() => StringExtensions.FormatWith("PackageBuilder Auth to UserManagement Completed for {0}, TimeStamp: {1}", apiRequest.RequestId, DateTime.UtcNow));

                var responses = ((Package)package).Execute(entryPoint, apiRequest.UserId, Context.CurrentUser.UserName,
                    Context.CurrentUser.UserName, apiRequest.RequestId, accountNumber, apiRequest.ContractId, apiRequest.ContractVersion,
                    apiRequest.DeviceType, apiRequest.FromIpAddress, "", apiRequest.SystemType, apiRequest.RequestFields, (double)package.CostOfSale, (double)package.RecommendedSalePrice, apiRequest.HasConsent);

                // Filter responses for cleaner api payload
                this.Info(() => StringExtensions.FormatWith("Package Response Filter Cleanup Initialized for {0}, TimeStamp: {1}", apiRequest.RequestId, DateTime.UtcNow));
                var filteredResponse = new List<IProvideResponseDataProvider>
                {
                    new ResponseMeta(apiRequest.RequestId, responses.ResponseState())
                };

                filteredResponse.AddRange(Mapper.Map<IEnumerable<IDataProvider>, IEnumerable<IProvideResponseDataProvider>>(responses));
                this.Info(() => StringExtensions.FormatWith("Package Response Filter Cleanup Completed for {0}, TimeStamp: {1}", apiRequest.RequestId, DateTime.UtcNow));

                integration.SendToBus(new PackageResponseMessage(package.Id, apiRequest.UserId, apiRequest.ContractId, accountNumber,
                    filteredResponse.Any() ? filteredResponse.AsJsonString() : string.Empty, apiRequest.RequestId, Context != null ? Context.CurrentUser.UserName : "******"));

                this.Info(() => StringExtensions.FormatWith("Package Execute Completed for {0}, TimeStamp: {1}", apiRequest.RequestId, DateTime.UtcNow));

                return filteredResponse;
            };

            Post[PackageBuilderApi.PackageRoutes.CommitRequest.ApiRoute] = _ =>
            {
                var apiRequest = this.Bind<ApiCommitRequestDto>();

                var token = Context.Request.Headers.Authorization.Split(' ')[1];
                var request = billingApiClient.Get(token, "/Transactions/Request/{requestId}", new[]
                {
                    new KeyValuePair<string, string>("requestId", apiRequest.RequestId.ToString())
                }
                ,null);

                if (request.Contains("error")) return request;

                // RabbitMQ
                new TransactionBus(eBus).SendDynamic(Mapper.Map(apiRequest, new TransactionRequestMessage()));

                this.Info(() => StringExtensions.FormatWith("Updated TransactionRequest UserState: {0}", apiRequest.UserState));
                if (apiRequest.UserState == ApiCommitRequestUserState.Cancelled) return Response.AsJson(new { Success = "Request successfully cancelled by user" });
                if (apiRequest.UserState == ApiCommitRequestUserState.VehicleNotProvided) return Response.AsJson(new { Success = "Request successfully marked as VehicleNotProvided by user" });

                this.Info(() => StringExtensions.FormatWith("Package ExecuteWithCarId Initialized for {0}, TimeStamp: {1}", apiRequest.RequestId, DateTime.UtcNow));

                this.Info(() => StringExtensions.FormatWith("Package Read Initialized, TimeStamp: {0}", DateTime.UtcNow));
                var package = writeRepo.GetById(apiRequest.PackageId, true);
                this.Info(() => StringExtensions.FormatWith("Package Read Completed, TimeStamp: {0}", DateTime.UtcNow));

                if (package == null)
                {
                    this.Error(() => StringExtensions.FormatWith("Package not found:", apiRequest.PackageId));
                    throw new LightstoneAutoException("Package could not be found");
                }

                this.Info(() => StringExtensions.FormatWith("PackageBuilder Auth to UserManagement Initialized for {0}, TimeStamp: {1}", apiRequest.RequestId, DateTime.UtcNow));

                var accountNumber = userManagementApi.Get(token, "/CustomerClient/{id}", new[] { new KeyValuePair<string, string>("id", apiRequest.CustomerClientId.ToString()) }, null);

                this.Info(() => StringExtensions.FormatWith("PackageBuilder Auth to UserManagement Completed for {0}, TimeStamp: {1}", apiRequest.RequestId, DateTime.UtcNow));

                var responses = ((Package)package).ExecuteWithCarId(entryPoint, apiRequest.UserId, Context.CurrentUser.UserName,
                    Context.CurrentUser.UserName, apiRequest.RequestId, accountNumber, apiRequest.ContractId, apiRequest.ContractVersion,
                    apiRequest.DeviceType, apiRequest.FromIpAddress, "", apiRequest.SystemType, apiRequest.RequestFields, (double)package.CostOfSale, (double)package.RecommendedSalePrice, apiRequest.HasConsent);

                // Filter responses for cleaner api payload
                this.Info(() => StringExtensions.FormatWith("Package Response Filter Cleanup Initialized for {0}, TimeStamp: {1}", apiRequest.RequestId, DateTime.UtcNow));
                var filteredResponse = new List<IProvideResponseDataProvider>
                {
                    new ResponseMeta(apiRequest.RequestId, responses.ResponseState())
                };

                filteredResponse.AddRange(Mapper.Map<IEnumerable<IDataProvider>, IEnumerable<IProvideResponseDataProvider>>(responses));
                this.Info(() => StringExtensions.FormatWith("Package Response Filter Cleanup Completed for {0}, TimeStamp: {1}", apiRequest.RequestId, DateTime.UtcNow));

                integration.SendToBus(new PackageResponseMessage(package.Id, apiRequest.UserId, apiRequest.ContractId, accountNumber,
                    filteredResponse.Any() ? filteredResponse.AsJsonString() : string.Empty, apiRequest.RequestId, Context != null ? Context.CurrentUser.UserName : "******"));

                this.Info(() => StringExtensions.FormatWith("Package ExecuteWithCarId Completed for {0}, TimeStamp: {1}", apiRequest.RequestId, DateTime.UtcNow));

                return filteredResponse;
            };

            Post[PackageBuilderApi.PackageRoutes.ProcessCreate.ApiRoute] = parameters =>
            {
                var dto = this.Bind<PackageDto>();
                dto.Id = dto.Id == new Guid() ? Guid.NewGuid() : dto.Id; // Required for acceptance tests where we specify the Id

                var dProviders = Mapper.Map<IEnumerable<DataProviderDto>, IEnumerable<DataProviderOverride>>(dto.DataProviders);

                publisher.Publish(new CreatePackage(dto.Id, dto.Name, dto.Description, dto.CostOfSale,
                    dto.RecommendedSalePrice, dto.Notes, dto.PackageEventType, Mapper.Map<PackageDto, IEnumerable<Industry>>(dto), dto.State, dto.Owner, DateTime.UtcNow, null,
                    dProviders));

                ////RabbitMQ
                var metaEntity = Mapper.Map(dto, new PackageMessage());
                var advancedBus = new TransactionBus(eBus);
                advancedBus.SendDynamic(metaEntity);

                return Response.AsJson(new { msg = "Success" });
            };

            Put[PackageBuilderApi.PackageRoutes.ProcessUpdate.ApiRoute] = parameters =>
            {
                var dto = this.Bind<PackageDto>();
                var dProviders =
                    Mapper.Map<IEnumerable<DataProviderDto>, IEnumerable<DataProviderOverride>>(dto.DataProviders);

                publisher.Publish(new UpdatePackage(parameters.id, dto.Name, dto.Description, dto.CostOfSale,
                    dto.RecommendedSalePrice, dto.Notes, dto.PackageEventType, Mapper.Map<PackageDto, IEnumerable<Industry>>(dto), dto.State, dto.Version, dto.Owner,
                    dto.CreatedDate, DateTime.UtcNow, dProviders));

                ////RabbitMQ
                var metaEntity = Mapper.Map(dto, new PackageMessage());
                var advancedBus = new TransactionBus(eBus);
                advancedBus.SendDynamic(metaEntity);

                return Response.AsJson(new { msg = "Success, " + parameters.id + " edited" });
            };

            Put["/Packages/Clone/{id}/{cloneName}"] = parameters =>
            {
                var packageToClone = Mapper.Map<IPackage, PackageDto>(writeRepo.GetById(parameters.id));
                var dataProvidersToClone =
                    Mapper.Map<IEnumerable<DataProviderDto>, IEnumerable<DataProviderOverride>>(
                        packageToClone.DataProviders);
                var stateResolve = stateRepo.Where(x => x.Alias == "Draft")
                    .Select(y => new State(y.Id, y.Name, y.Alias));

                publisher.Publish(new CreatePackage(Guid.NewGuid(),
                    parameters.cloneName,
                    packageToClone.Description,
                    packageToClone.CostOfSale,
                    packageToClone.RecommendedSalePrice,
                    packageToClone.Notes,
                    packageToClone.PackageEventType,
                    packageToClone.Industries,
                    stateResolve.FirstOrDefault(),
                    packageToClone.Owner, DateTime.UtcNow, null,
                    dataProvidersToClone));

                return
                    Response.AsJson(
                        new
                        {
                            msg =
                                "Success, Package with ID: " + parameters.id + " has been cloned to package '" +
                                parameters.cloneName + "'"
                        });
            };

            Delete[PackageBuilderApi.PackageRoutes.ProcessDelete.ApiRoute] = parameters =>
            {
                this.RequiresAnyClaim(new[] { RoleType.Admin.ToString(), RoleType.ProductManager.ToString(), RoleType.Support.ToString() });

                publisher.Publish(new DeletePackage(new Guid(parameters.id)));

                return Response.AsJson(new { msg = "Success, " + parameters.id + " deleted" });
            };
        }
 public override void Observe()
 {
     advancedBus = new TransactionBus(_bus);
 }
Exemplo n.º 17
0
        public UserModule(IBus bus, IAdvancedBus eBus, IUserRepository userRepository)
        {
            if (_defaultJsonMaxLength == 0)
                _defaultJsonMaxLength = JsonSettings.MaxJsonLength;

            //Hackeroonie - Required, due to complex model structures (Nancy default restriction length [102400])
            JsonSettings.MaxJsonLength = Int32.MaxValue;

            Get["/Users/All"] = _ => Response.AsJson(Mapper.Map<IEnumerable<User>, IEnumerable<UserDto>>(userRepository));

            Get["/Users"] = _ =>
            {
                var search = Context.Request.Query["search"];
                var offset = Context.Request.Query["offset"];
                var limit = Context.Request.Query["limit"];

                if (offset == null) offset = 0;
                if (limit == null) limit = 10;

                var model = this.Bind<DataTablesViewModel>();
                var dto = Mapper.Map<IEnumerable<User>, IEnumerable<UserDto>>(userRepository.Where(x => x.IsActive != false));//.Search(Context.Request.Query["search[value]"].Value, model.Start, model.Length));

                return Negotiate
                    .WithView("Index")
                    .WithMediaRangeModel(MediaRange.FromString("application/json"), new { data = dto.ToList() });
            };

            Get["/UserLookup/{filter}"] = _ =>
            {
                var filter = (string)_.filter;
                var dto = Mapper.Map<IEnumerable<User>, IEnumerable<UserDto>>(userRepository.Where(x => x.IsActive == true && (x.Individual.Name.StartsWith(filter) || x.Individual.Surname.StartsWith(filter))));
                return Negotiate
                    .WithView("Index")
                    .WithMediaRangeModel(MediaRange.FromString("application/json"), new { dto });
            };

            Get["/UserCustomers/{userId:guid}"] = _ =>
            {
                var userId = (Guid)_.userId;
                var customers = userRepository.Where(x => x.Id == userId && x.IsActive == true).SelectMany(x => x.CustomerUsers.Select(cu => cu.Customer));

                return Negotiate
                    .WithView("Index")
                    .WithMediaRangeModel(MediaRange.FromString("application/json"), Mapper.Map<IEnumerable<Customer>, IEnumerable<CustomerDto>>(customers));
            };

            Get["/Userlist"] = parameters =>
            {
                var filter = "";
                if (Context.Request.Query["q_word[]"].HasValue)
                    filter = (string)Context.Request.Query["q_word[]"].Value.ToString();
                var pageIndex = 0;
                var pageSize = 0;
                int.TryParse(Context.Request.Query["page_num"].Value, out pageIndex);
                int.TryParse(Context.Request.Query["per_page"].Value, out pageSize);

                Expression<Func<User, bool>> predicate = x => x.IsActive == true && x.UserType == UserType.Internal && (x.Individual.Name.StartsWith(filter) || x.Individual.Surname.StartsWith(filter));
                var users = new PagedList<User>(userRepository, pageIndex != 0 ? pageIndex - 1 : pageIndex, pageSize == 0 ? 10 : pageSize, predicate);

                return Negotiate
                    .WithView("Index")
                    .WithMediaRangeModel(MediaRange.FromString("application/json"), new { result = Mapper.Map<IEnumerable<User>, IEnumerable<UserDto>>(users), cnt_whole = users.RecordsFiltered });
            };

            Get["/Users/Add"] = _ => View["Save", new UserDto()];

            Get["/Users/{id:guid}"] = parameters =>
            {
                var guid = (Guid)parameters.id;
                var dto = Mapper.Map<User, UserDto>(userRepository.Get(guid));

                return View["Save", dto];
            };

            Get["/Users/Details/{id:guid}"] = parameters =>
            {
                var guid = (Guid)parameters.id;
                var dto = Mapper.Map<User, UserDto>(userRepository.Get(guid));

                return Response.AsJson(dto);
            };

            Post["/Users"] = _ =>
            {
                var dto = this.BindAndValidate<UserDto>();
                dto.CreatedBy = Context.CurrentUser.UserName;
                dto.IsActive = true;

                if (dto.TrialExpiration == null) dto.TrialExpiration = DateTime.UtcNow.Date;

                if (ModelValidationResult.IsValid)
                {
                    //var clientUsersDto = this.Bind<List<ClientUserDto>>();
                    //dto.ClientUsers = clientUsersDto;

                    var entity = Mapper.Map(dto, userRepository.Get(dto.Id) ?? new User());
                    entity.HashPassword(dto.Password);

                    bus.Publish(new CreateUpdateEntity(entity, "Create"));

                    ////RabbitMQ
                    var metaEntity = Mapper.Map(entity, new UserMessage());
                    var advancedBus = new TransactionBus(eBus);
                    advancedBus.SendDynamic(metaEntity);

                    return View["Index"];
                }

                return View["Save", dto];
            };

            Put["/Users/{id}"] = parameters =>
            {
                var dto = this.BindAndValidate<UserDto>();
                dto.ModifiedBy = Context.CurrentUser.UserName;

                if (dto.ResetPassword != null)
                {
                    dto.Password = dto.ResetPassword;
                }

                if (dto.TrialExpiration == null) dto.TrialExpiration = DateTime.UtcNow.Date;

                if (ModelValidationResult.IsValid)
                {
                    //var clientUsersDto = this.Bind<List<ClientUserDto>>();
                    //dto.ClientUsers = clientUsersDto;
                    var entity = Mapper.Map(dto, userRepository.Get(dto.Id));
                    if (dto.ResetPassword != null) entity.HashPassword(dto.Password);

                    bus.Publish(new CreateUpdateEntity(entity, "Update"));

                    ////RabbitMQ
                    var metaEntity = Mapper.Map(entity, new UserMessage());
                    var advancedBus = new TransactionBus(eBus);
                    advancedBus.SendDynamic(metaEntity);

                    return View["Index"];
                }

                return View["Save", dto];
            };

            Put["/Users/Lock/{id}"] = parameters =>
            {
                var dto = this.Bind<CustomerDto>();

                var entity = userRepository.Get(dto.Id);
                entity.Modified = DateTime.UtcNow;
                entity.ModifiedBy = Context.CurrentUser.UserName;
                entity.Lock(true);

                bus.Publish(new CreateUpdateEntity(entity, "Update"));

                return Response.AsJson("User has been locked");
            };

            Put["/Users/UnLock/{id}"] = parameters =>
            {
                var dto = this.Bind<CustomerDto>();

                var entity = userRepository.Get(dto.Id);
                entity.Modified = DateTime.UtcNow;
                entity.ModifiedBy = Context.CurrentUser.UserName;
                entity.Lock(false);

                bus.Publish(new CreateUpdateEntity(entity, "Update"));

                return Response.AsJson("User has been un-locked");
            };

            Delete["/Users/{id}"] = _ =>
            {
                this.RequiresAnyClaim(new[] { RoleType.Admin.ToString(), RoleType.ProductManager.ToString(), RoleType.Support.ToString() });

                var dto = this.Bind<UserDto>();
                var entity = userRepository.Get(dto.Id);

                bus.Publish(new SoftDeleteEntity(entity));

                return Response.AsJson("User has been soft deleted");
            };
        }