public async Task <ActionResult <EfManager> > PostManager([FromBody] Manager managerDto)
        {
            if (managerDto == null)
            {
                return(BadRequest("Data is missing"));
            }
            var manager = new EfManager();

            manager.Email = managerDto.Email.ToLowerInvariant();
            var emailExist = await _context.Accounts.Where(u => u.Email == manager.Email)
                             .FirstOrDefaultAsync().ConfigureAwait(false);

            if (emailExist != null)
            {
                ModelState.AddModelError("Email", "Email already in use");
                return(BadRequest(ModelState));
            }
            manager.FirstName = managerDto.FirstName;
            manager.LastName  = managerDto.LastName;
            var account = new EfAccount()
            {
                Email     = manager.Email,
                IsManager = true
            };

            account.PwHash  = HashPassword(managerDto.Password, _appSettings.BcryptWorkfactor);
            manager.Account = account;
            _context.Accounts.Add(account);
            _context.Managers.Add(manager);
            await _context.SaveChangesAsync();

            return(Created(manager.EfManagerId.ToString(), manager));
        }
        public IActionResult PutManager(long id, EfManager manager)
        {
            if (manager == null)
            {
                return(BadRequest($"Input parameter {typeof(EfManager)} {nameof(manager)} was null."));
            }
            if (id != manager.EfManagerId)
            {
                return(BadRequest("Id Mismatch"));
            }

            // Check if new email
            var old = _managerRepository.GetBy(selector: source => source,
                                               predicate: m => m.EfManagerId == id).FirstOrDefault();

            if (old == null)
            {
                return(BadRequest($"Manager not found with id {id}"));
            }

            // Update account
            var account = _accountRepository.GetBy(
                selector: source => source,
                predicate: a => a.EfAccountId == manager.EfAccountId,
                disableTracking: false).FirstOrDefault();

            if (account == null)
            {
                return(BadRequest("Account of manager not found."));
            }

            account.Email = manager.Email;
            old.Email     = manager.Email;
            old.FirstName = manager.FirstName;
            old.LastName  = manager.LastName;

            _accountRepository.Update(account);
            _managerRepository.Update(old);

            return(Ok());
        }
        public async Task <IActionResult> PutManager(long id, EfManager manager)
        {
            if (id != manager.EfManagerId)
            {
                return(BadRequest());
            }

            // Check if new email
            var old = await _context.Managers.FindAsync(manager.EfManagerId);

            if (old.Email != manager.Email)
            {
                // Update account
                var account = await _context.Accounts.FindAsync(manager.EfAccountId);

                account.Email = manager.Email;
            }

            _context.Entry(manager).State = EntityState.Modified;

            try
            {
                await _context.SaveChangesAsync();
            }
            catch (DbUpdateConcurrencyException)
            {
                if (!ManagerExists(id))
                {
                    return(NotFound());
                }
                else
                {
                    throw;
                }
            }

            return(NoContent());
        }