public async Task <IActionResult> UpdateDependent([FromBody] Api.DependentUpdate dependent)
        {
            if (dependent.UserId == ApplicationUser.SuperAdminId)
            {
                return(new JsonResult(new { Error = "Cannot edit super admin." })
                {
                    StatusCode = (int)HttpStatusCode.Forbidden
                });
            }

            ApplicationUser user = await userManager.GetUserAsync(User);

            if (dependent.UserId == user.Id)
            {
                return(new JsonResult(new { Error = "Cannot edit self." })
                {
                    StatusCode = (int)HttpStatusCode.Forbidden
                });
            }

            if (dependent.UserId == null)
            {
                return(new JsonResult(new { Error = "UserId must be set." })
                {
                    StatusCode = (int)HttpStatusCode.BadRequest
                });
            }

            List <string> errors = new List <string>();

            if (dependent.Id == null)
            {
                if (dependent.NameFirst == null)
                {
                    errors.Add("NameFirst must be set");
                }
                if (dependent.NameLast == null)
                {
                    errors.Add("NameLast must be set");
                }
            }

            if (dependent.NameFirst != null && dependent.NameFirst.Length <= 0)
            {
                errors.Add("NameFirst length must be greater than 0");
            }
            if (dependent.NameLast != null && dependent.NameLast.Length <= 0)
            {
                errors.Add("NameLast length must be greater than 0");
            }
            if (dependent.BenefitsCost != null && dependent.BenefitsCost < 0)
            {
                errors.Add("BenefitsCost value must not be negative");
            }
            if (dependent.Modifier != null && dependent.Modifier < 0)
            {
                errors.Add("Modifer value must not be negative");
            }

            if (errors.Count > 0)
            {
                return(new JsonResult(new { Error = "Request contains errors.", Errors = errors })
                {
                    StatusCode = (int)HttpStatusCode.BadRequest
                });
            }

            ApplicationUser appUser = await userManager.Users.Include(x => x.Employee)
                                      .Include(x => x.Employee.BenefitsEmployee)
                                      .Include(x => x.Employee.BenefitsDependents)
                                      .SingleOrDefaultAsync(x => x.Id == dependent.UserId);

            List <BenefitsDependent> dependents = appUser.Employee.BenefitsDependents;

            if (dependent.Id == null)
            {
                // Create new dependent
                var target = new BenefitsDependent()
                {
                    Id        = Guid.NewGuid().ToString(),
                    NameFirst = dependent.NameFirst,
                    NameLast  = dependent.NameLast,
                };

                if (dependent.BenefitsCost != null)
                {
                    target.BenefitsCost = (decimal)dependent.BenefitsCost;
                }
                if (dependent.Modifier != null)
                {
                    target.Modifier = (decimal)dependent.Modifier;
                }
                else if (dependent.NameFirst[0] == 'A')
                {
                    target.Modifier = 0.9m;
                }

                dependents.Add(target);
            }
            else
            {
                // Update existing dependent
                BenefitsDependent target = dependents.Find(x => x.Id == dependent.Id);

                if (target == null)
                {
                    return(new JsonResult(new { Error = "Dependent not found." })
                    {
                        StatusCode = (int)HttpStatusCode.NotFound
                    });
                }

                if (dependent.NameFirst != null)
                {
                    target.NameFirst = dependent.NameFirst;
                }
                if (dependent.NameLast != null)
                {
                    target.NameLast = dependent.NameLast;
                }
                if (dependent.BenefitsCost != null)
                {
                    target.BenefitsCost = (decimal)dependent.BenefitsCost;
                }
                if (dependent.Modifier != null)
                {
                    target.Modifier = (decimal)dependent.Modifier;
                }
            }

            await userManager.UpdateAsync(appUser);

            return(Ok(new Api.Employee(appUser)));
        }
예제 #2
0
        public async Task PopulateSeedData()
        {
            List <string> roles = new List <string>
            {
                "ViewSelf",
                "ViewOther",
                "AddEdit",
                "Remove",
                "PermissionsView",
                "PermissionsEdit",
            };
            List <string> noRoles = new List <string>();

            RoleManager <IdentityRole> roleManager = context.GetService <RoleManager <IdentityRole> >();

            // Add missing roles by Id
            foreach (var role in roles.Where(x => !context.Roles.Any(y => y.Name == x)))
            {
                await roleManager.CreateAsync(new IdentityRole(role));
            }

            // TODO: Move seed data somewhere more appropriate
            var users = new[]
            {
                new {
                    AppUser = Employee.FromSeed(
                        id: ApplicationUser.SuperAdminId,
                        email: "*****@*****.**",
                        password: "******",
                        nameFirst: "Super",
                        nameLast: "Admin",
                        salaryBase: 0,
                        benefitsCost: 0
                        ),
                    Roles = roles,
                },
                new {
                    AppUser = Employee.FromSeed(
                        email: "*****@*****.**",
                        password: "******",
                        nameFirst: "Seed",
                        nameLast: "User01"
                        ),
                    Roles = noRoles
                },
                new {
                    AppUser = Employee.FromSeed(
                        email: "*****@*****.**",
                        password: "******",
                        nameFirst: "Seed",
                        nameLast: "User02"
                        ),
                    Roles = new List <string>()
                    {
                        "ViewSelf",
                    },
                },
                new {
                    AppUser = Employee.FromSeed(
                        email: "*****@*****.**",
                        password: "******",
                        nameFirst: "Seed",
                        nameLast: "User03"
                        ),
                    Roles = new List <string>()
                    {
                        "ViewSelf",
                        "ViewOther",
                    },
                },
                new {
                    AppUser = Employee.FromSeed(
                        email: "*****@*****.**",
                        password: "******",
                        nameFirst: "Seed",
                        nameLast: "User04"
                        ),
                    Roles = new List <string>()
                    {
                        "ViewSelf",
                        "ViewOther",
                        "AddEdit",
                    },
                },
                new {
                    AppUser = Employee.FromSeed(
                        email: "*****@*****.**",
                        password: "******",
                        nameFirst: "Seed",
                        nameLast: "User05",
                        salaryBase: 100000,
                        dependents: new List <BenefitsDependent>()
                    {
                        BenefitsDependent.FromSeed(
                            nameFirst: "Anthony",
                            nameLast: "User05"
                            ),
                    }
                        ),
                    Roles = new List <string>()
                    {
                        "ViewSelf",
                    },
                },
            };

            UserManager <ApplicationUser>    userManager = context.GetService <UserManager <ApplicationUser> >();
            PasswordHasher <ApplicationUser> hasher      = new PasswordHasher <ApplicationUser>();

            // TODO: Split seed data into "always" and "dev only"
            // Add missing users by Id
            foreach (var user in users.Where(x => !context.Users.Any(y => x.AppUser.Email == y.UserName || x.AppUser.Id == y.Id)))
            {
                // With password validation
                //var results = await userManager.CreateAsync(user.AppUser, user.AppUser.Password);

                // Without password validation
                //user.AppUser.PasswordHash = hasher.HashPassword(null, user.AppUser.password);

                // TODO: Do something with `results`
                var results = await userManager.CreateAsync(user.AppUser);

                await userManager.AddToRolesAsync(user.AppUser, user.Roles);
            }

            await context.SaveChangesAsync();
        }