public ViewModels.Site Save(ViewModels.RegisterSite site)
        {
            try
            {
                if (!ValidateSite(site))
                {
                    base.ValidationFailed();
                    return(null);
                }

                base.ValidationPassed();

                DataModels.Site dbSite = new DataModels.Site();
                dbSite.HoursPerDay      = site.HoursPerDay;
                dbSite.IncludeWeekends  = site.IncludeWeekends;
                dbSite.Name             = site.Name;
                dbSite.UniqueSiteId     = site.UniqueSiteId;
                dbSite.PublicIdentifier = Guid.NewGuid();
                this.context.Site.Add(dbSite);
                this.context.SaveChanges();
                ViewModels.Site viewSite = new ViewModels.Site();
                viewSite.UniqueSiteId    = dbSite.UniqueSiteId;
                viewSite.HoursPerDay     = dbSite.HoursPerDay;
                viewSite.ID              = dbSite.PublicIdentifier;
                viewSite.IncludeWeekends = dbSite.IncludeWeekends;
                viewSite.Name            = dbSite.Name;
                return(viewSite);
            }
            catch (Exception e)
            {
                base.SetError(e.Message);
                return(null);
            }
        }
        public ViewModels.Site GetSite(Guid id)
        {
            try
            {
                DataModels.Site site = this.context.Site.Where(f => f.PublicIdentifier == id).FirstOrDefault();
                if (site == null)
                {
                    base.ValidationFailed();
                    return(null);
                }

                base.ValidationPassed();
                ViewModels.Site viewSite = new ViewModels.Site();
                viewSite.HoursPerDay     = site.HoursPerDay;
                viewSite.IncludeWeekends = site.IncludeWeekends;
                viewSite.Name            = site.Name;
                viewSite.ID = site.PublicIdentifier;
                return(viewSite);
            }
            catch (Exception e)
            {
                base.SetError(e.Message);
                return(null);
            }
        }
        public ViewModels.User Save(ViewModels.RegisterUser user)
        {
            try
            {
                if (!ValidateUser(user))
                {
                    base.ValidationFailed();
                    return(null);
                }

                base.ValidationPassed();
                DataModels.User dbUser = new DataModels.User();
                dbUser.CreatedDate      = DateTime.Now;
                dbUser.EmailAddress     = user.EmailAddress;
                dbUser.FirstName        = user.FirstName;
                dbUser.LastName         = user.LastName;
                dbUser.PasswordHash     = hashGenerator.CalculateHash(user.Password);
                dbUser.PublicIdentifier = Guid.NewGuid();
                DataModels.Site site = null;
                if (this.configuration["SingleSiteMode"].ToLower() == "true")
                {
                    site        = this.context.Site.FirstOrDefault();
                    dbUser.Site = site;
                }
                if (this.context.User.Count() == 0)
                {
                    //Congrats you are the site admin!
                    dbUser.Role = this.context.Role.Where(x => x.ID == 1).FirstOrDefault();
                }
                else
                {
                    //Lowly team member
                    dbUser.Role = this.context.Role.Where(x => x.ID == 4).FirstOrDefault();
                }
                this.context.User.Add(dbUser);
                this.context.SaveChanges();
                ViewModels.User viewUser = new ViewModels.User();
                viewUser.FirstName    = dbUser.FirstName;
                viewUser.LastName     = dbUser.LastName;
                viewUser.EmailAddress = dbUser.EmailAddress;
                viewUser.UserSite     = site.PublicIdentifier;
                viewUser.userId       = dbUser.PublicIdentifier;
                return(viewUser);
            }
            catch (Exception e)
            {
                base.SetError(e.Message);
                return(null);
            }
        }
        private bool ValidateUser(ViewModels.RegisterUser user)
        {
            if (String.IsNullOrEmpty(user.FirstName) || user.FirstName.Length > 50)
            {
                return(false);
            }

            if (String.IsNullOrEmpty(user.LastName) || user.LastName.Length > 50)
            {
                return(false);
            }

            if (String.IsNullOrEmpty(user.EmailAddress) || user.EmailAddress.Length > 50)
            {
                return(false);
            }


            DataModels.Site site = null;
            if (this.configuration["SingleSiteMode"].ToLower() == "true")
            {
                site = this.context.Site.FirstOrDefault();
                if (site == null)
                {
                    return(false);
                }
            }
            else
            {
                //Halt registration for now
                return(false);
            }

            //TODO: Update basic Repo class to allow setting validation error message (enum or code that client can display)
            DataModels.User[] users = this.context.User.Where(x => x.EmailAddress == user.EmailAddress).ToArray();
            if (users.Count() > 0)
            {
                return(false);
            }

            return(true);
        }