public async Task RegisterByManagerInvite()
        {
            using (var db = new CMSContext())
            {
                var user = await db.Users.SingleOrDefaultAsync(u => u.Email == Dto.Email);

                // User already exists
                if (user != null)
                {
                    throw new Exception("User with this email already exists!");
                }

                var invite = await db.CompanyManagementInvites.SingleOrDefaultAsync(i => i.CompanyId == Dto.CompanyId && i.Email == Dto.Email.Trim());

                // Invite doesn't exist
                if (invite != null)
                {
                    throw new Exception("Invite for this company does not exist for this email!");
                }

                byte[] passwordHash, passwordSalt;
                PasswordService.CreatePasswordHash(Dto.Password, out passwordHash, out passwordSalt);

                user = new Domain.Entities.User()
                {
                    Id           = Guid.NewGuid(),
                    Email        = Dto.Email,
                    PasswordHash = passwordHash,
                    PasswordSalt = passwordSalt,
                    UserType     = UserType.Management,

                    FullName         = Dto.FirstName + " " + Dto.LastName,
                    FirstName        = Dto.FirstName,
                    LastName         = Dto.LastName,
                    ShortName        = (Dto.FirstName.ToCharArray().First().ToString() + Dto.LastName.ToCharArray().First().ToString()).ToUpper(),
                    DefaultCompanyId = invite.CompanyId,
                };

                var companyManagement = new Domain.Entities.CompanyManagement()
                {
                    Id        = Guid.NewGuid(),
                    CompanyId = invite.CompanyId,
                    UserId    = user.Id,
                    IsAdmin   = invite.IsInviteForAdmin,
                    CreatedOn = DateTime.UtcNow,
                    CreatedBy = user.Id
                };

                db.Users.Add(user);
                db.CompanyManagements.Add(companyManagement);

                await db.SaveChangesAsync();
            }
        }
        public async Task Register()
        {
            using (var db = new CMSContext())
            {
                var user = await db.Users.SingleOrDefaultAsync(u => u.Email == Dto.Email);

                // User already exists
                if (user != null)
                {
                    throw new Exception("User with this email already exists!");
                }

                byte[] passwordHash, passwordSalt;
                PasswordService.CreatePasswordHash(Dto.Password, out passwordHash, out passwordSalt);

                user = new Domain.Entities.User()
                {
                    Id           = Guid.NewGuid(),
                    Email        = Dto.Email,
                    PasswordHash = passwordHash,
                    PasswordSalt = passwordSalt,
                    UserType     = Dto.IsCandidateLogin ? UserType.Candidate : UserType.Management,

                    FullName  = Dto.FirstName + " " + Dto.LastName,
                    FirstName = Dto.FirstName,
                    LastName  = Dto.LastName,
                    ShortName = (Dto.FirstName.ToCharArray().First().ToString() + Dto.LastName.ToCharArray().First().ToString()).ToUpper(),
                    // TODO: Add Default company when getting invite for company Manager
                };

                if (!Dto.IsCandidateLogin)
                {
                    var company = new Domain.Entities.Company()
                    {
                        Id        = Guid.NewGuid(),
                        Name      = Dto.CompanyName,
                        CreatedOn = DateTime.UtcNow,
                        CreatedBy = user.Id
                    };

                    var companyManagement = new Domain.Entities.CompanyManagement()
                    {
                        Id        = Guid.NewGuid(),
                        CompanyId = company.Id,
                        UserId    = user.Id,
                        IsAdmin   = true,
                        CreatedOn = DateTime.UtcNow,
                        CreatedBy = user.Id
                    };

                    user.DefaultCompanyId = company.Id;

                    db.Users.Add(user);
                    db.Companies.Add(company);
                    db.CompanyManagements.Add(companyManagement);
                }
                else
                {
                    db.Users.Add(user);
                }

                await db.SaveChangesAsync();
            }
        }