Ejemplo n.º 1
0
 private Result ValidateRequest(Models.Requests.ManagerWithServiceSupplier managerRequest)
 => ValidationHelper.Validate(managerRequest, new ManagerWithServiceSupplierValidator());
Ejemplo n.º 2
0
        public Task <Result <Models.Responses.ManagerContext> > RegisterWithServiceSupplier(Models.Requests.ManagerWithServiceSupplier managerRequest, string email)
        {
            return(CheckIdentityHashNotEmpty()
                   .Ensure(DoesManagerNotExist, "Manager has already been registered")
                   .Bind(() => ValidateRequest(managerRequest))
                   .Bind(AddManager)
                   .Bind(AddServiceSupplierAndRelation)
                   .Map(Build));


            async Task <bool> DoesManagerNotExist() => !await _managerContext.DoesManagerExist();


            async Task <Result <Manager> > AddManager()
            {
                return(await Create()
                       .Bind(Add));


                Result <Manager> Create()
                {
                    var utcNowDate = _dateTimeProvider.UtcNow();

                    return(new Manager
                    {
                        IdentityHash = _managerContext.GetHash(),
                        Email = email,
                        FirstName = managerRequest.Manager.FirstName,
                        LastName = managerRequest.Manager.LastName,
                        Title = managerRequest.Manager.Title,
                        Position = managerRequest.Manager.Position,
                        Phone = managerRequest.Manager.Phone,
                        Fax = managerRequest.Manager.Fax,
                        Created = utcNowDate,
                        Updated = utcNowDate,
                        IsActive = true
                    });
                }

                async Task <Result <Manager> > Add(Manager manager)
                {
                    var entry = _dbContext.Managers.Add(manager);
                    await _dbContext.SaveChangesAsync();

                    _dbContext.DetachEntry(entry.Entity);

                    return(entry.Entity);
                }
            }

            async Task <Result <ManagerContext> > AddServiceSupplierAndRelation(Manager manager)
            {
                return(await CreateServiceSupplier()
                       .Bind(AddServiceSupplier)
                       .Bind(serviceSupplier => CreateRelation(serviceSupplier))
                       .Bind(AddRelation));


                Result <ServiceSupplier> CreateServiceSupplier()
                {
                    var utcNowDate = _dateTimeProvider.UtcNow();

                    return(new ServiceSupplier
                    {
                        Name = managerRequest.ServiceSupplier.Name,
                        Address = managerRequest.ServiceSupplier.Address,
                        PostalCode = managerRequest.ServiceSupplier.PostalCode,
                        Phone = managerRequest.ServiceSupplier.Phone,
                        Website = managerRequest.ServiceSupplier.Website,
                        Created = utcNowDate,
                        Modified = utcNowDate
                    });
                }

                async Task <Result <ServiceSupplier> > AddServiceSupplier(ServiceSupplier serviceSupplier)
                {
                    var entry = _dbContext.ServiceSuppliers.Add(serviceSupplier);
                    await _dbContext.SaveChangesAsync();

                    _dbContext.DetachEntry(entry.Entity);

                    return(entry.Entity);
                }

                Result <ManagerServiceSupplierRelation> CreateRelation(ServiceSupplier serviceSupplier)
                => new ManagerServiceSupplierRelation
                {
                    ManagerId          = manager.Id,
                    ManagerPermissions = ManagerPermissions.All,
                    ServiceSupplierId  = serviceSupplier.Id,
                    IsMaster           = true,
                    IsActive           = true
                };


                async Task <Result <ManagerContext> > AddRelation(ManagerServiceSupplierRelation managerRelation)
                {
                    var entry = _dbContext.ManagerServiceSupplierRelations.Add(managerRelation);
                    await _dbContext.SaveChangesAsync();

                    _dbContext.DetachEntry(entry.Entity);

                    return(CollectManagerContext(manager, entry.Entity));
                }
            }
        }