public async Task <Result <UserLogin> > Login(Request <UserLogin> request)
        {
            try
            {
                if (string.IsNullOrWhiteSpace(request.Model.Username))
                {
                    return(new Result <UserLogin>("Username is required"));
                }
                if (string.IsNullOrWhiteSpace(request.Model.Password))
                {
                    return(new Result <UserLogin>("Password is required"));
                }

                var searchUserLoginRes = new UserLoginDataRepository().Search(new SearchRequest <UserLoginData>()
                {
                    Filter = f => f.Username == request.Model.Username && f.Password == request.Model.Password
                });

                if (searchUserLoginRes.SearchTotal <= 0)
                {
                    return(new Result <UserLogin>("Invalid Credentials"));
                }

                if (searchUserLoginRes.Items.FirstOrDefault().Attempt > 3)
                {
                    return(new Result <UserLogin>("Account is locked"));
                }

                var data = searchUserLoginRes.Items.FirstOrDefault();

                data.AuthCode = "at_" + RandomString().ToLower();

                data.LastSuccessfulLogin = DateTime.Now;


                var updateUserLoginRes = new UserLoginDataRepository().Update(data);

                var searchUserInfo = new UserInfoDataRepository().GetById(data.UserInfoId);

                UserLogin result = new UserLogin();
                result          = Mapper.Map <UserLogin>(data);
                result.UserInfo = Mapper.Map <UserInfo>(searchUserInfo);

                return(new Result <UserLogin>()
                {
                    Successful = true, Message = "Successfully Logged In", Model = result
                });
            }
            catch (Exception e)
            {
                return(new Result <UserLogin>(e.Message)
                {
                    ResultCode = ErrorCodes.Exception_Error
                });
            }
        }
        public async Task <Result <EmployeeReview> > GetById(Request <long> id)
        {
            try
            {
                var searchData = _repo.GetById(id.Model);

                if (searchData == null)
                {
                    return(new Result <EmployeeReview>("Record not found"));
                }

                var result = Mapper.Map <EmployeeReview>(searchData);

                var searchEmployee   = new UserInfoDataRepository().GetById(result.EmployeeId);
                var searchSupervisor = new UserInfoDataRepository().GetById(result.SupervisorId);

                result.EmployeeName   = searchEmployee.LastName + ", " + searchEmployee.FirstName;
                result.SupervisorName = searchSupervisor.LastName + ", " + searchSupervisor.FirstName;

                var searchAnswerItem = new AnswerItemDataRepository().Search(new SearchRequest <AnswerItemData>()
                {
                    Filter = f => f.EmployeeReviewId == searchData.Id
                });

                List <AnswerItem> data = new List <AnswerItem>();

                var searchRatingList = new RatingDataRepository().Search(new SearchRequest <RatingData>()
                {
                    Filter = f => f.ReviewTemplateId == result.ReviewTemplateId
                });

                List <Rating> ratingList = new List <Rating>();

                foreach (var rating in searchRatingList.Items)
                {
                    ratingList.Add(Mapper.Map <Rating>(rating));
                }

                result.RatingArray = ratingList.OrderBy(x => x.RangeFrom).ToList();
                data = Mapper.Map <List <AnswerItem> >(searchAnswerItem.Items.ToList());

                result.AnswerScore = data;

                return(new Result <EmployeeReview>()
                {
                    Successful = true, Message = "Successfully retrieve records", Model = result
                });
            }
            catch (Exception e)
            {
                return(new Result <EmployeeReview>(e.Message));
            }
        }
        public async Task <SearchResult <EmployeeReview> > Search(SearchRequest <EmployeeReview> request)
        {
            var result = new SearchResult <EmployeeReview>();

            try
            {
                var dataSearchRequest = new SearchRequest <EmployeeReviewData>();

                new ConvertSearchRequest <EmployeeReview, EmployeeReviewData>().ConvertToDataSearchRequest(request, dataSearchRequest);

                var searchRes = _repo.Search(dataSearchRequest);

                if (searchRes.SearchTotal <= 0)
                {
                    return(new SearchResult <EmployeeReview>("No record found"));
                }

                List <EmployeeReview> list = new List <EmployeeReview>();

                foreach (var item in searchRes.Items)
                {
                    var itemdata = Mapper.Map <EmployeeReview>(item);

                    var searchemployee = new UserInfoDataRepository().GetById(item.EmployeeId);

                    itemdata.EmployeeName = searchemployee.LastName + ", " + searchemployee.FirstName;

                    var searchSupervisor = new UserInfoDataRepository().GetById(item.SupervisorId);

                    itemdata.SupervisorName = searchSupervisor.LastName + ", " + searchSupervisor.FirstName;

                    list.Add(itemdata);
                }

                result.Items       = list.AsQueryable <EmployeeReview>();
                result.SearchTotal = searchRes.SearchTotal;
                result.SearchPages = searchRes.SearchPages;
                result.Successful  = true;
                result.Message     = "Successfully retrieve records";

                return(result);
            }
            catch (Exception e)
            {
                return(new SearchResult <EmployeeReview>(e.Message));
            }
        }
        public async Task <SearchResult <EmployeeReview> > SearchAllByEmployee(Request <long> id)
        {
            var result = new SearchResult <EmployeeReview>();

            try
            {
                var searchRes = _repo.Search(new SearchRequest <EmployeeReviewData>()
                {
                    Filter = f => (f.EmployeeId == id.Model && (f.Status == "Employee Review" || f.Status == "Reviewed")) || (f.SupervisorId == id.Model && (f.Status == "Supervisor Review" || f.Status == "Reviewed"))
                });

                if (searchRes.SearchTotal <= 0)
                {
                    return(new SearchResult <EmployeeReview>("No record found"));
                }

                List <EmployeeReview> list = new List <EmployeeReview>();

                foreach (var item in searchRes.Items)
                {
                    var itemdata = Mapper.Map <EmployeeReview>(item);

                    var searchemployee = new UserInfoDataRepository().GetById(item.EmployeeId);

                    itemdata.EmployeeName = searchemployee.LastName + ", " + searchemployee.FirstName;

                    var searchSupervisor = new UserInfoDataRepository().GetById(item.SupervisorId);

                    itemdata.SupervisorName = searchSupervisor.LastName + ", " + searchSupervisor.FirstName;

                    list.Add(itemdata);
                }

                result.Items       = list.AsQueryable <EmployeeReview>();
                result.SearchTotal = searchRes.SearchTotal;
                result.SearchPages = searchRes.SearchPages;
                result.Successful  = true;
                result.Message     = "Successfully retrieve records";

                return(result);
            }
            catch (Exception e)
            {
                return(new SearchResult <EmployeeReview>(e.Message));
            }
        }
        public async Task <SearchResult <UserInfo> > Search(SearchRequest <UserInfo> request)
        {
            var result = new SearchResult <UserInfo>();

            try
            {
                var dataSearchRequest = new SearchRequest <UserInfoData>();

                new ConvertSearchRequest <UserInfoData, UserInfo>().ConvertToDataSearchRequest(dataSearchRequest, request);

                var searchRes = new UserInfoDataRepository().Search(dataSearchRequest);

                if (searchRes.SearchTotal <= 0)
                {
                    return(new SearchResult <UserInfo>("No record found"));
                }

                List <UserInfo> list = new List <UserInfo>();

                foreach (var item in searchRes.Items)
                {
                    list.Add(Mapper.Map <UserInfo>(item));
                }

                result.Items       = list.AsQueryable <UserInfo>();
                result.SearchTotal = searchRes.SearchTotal;
                result.SearchPages = searchRes.SearchPages;
                result.Successful  = true;
                result.Message     = "Successfully retrieve records";

                return(result);
            }
            catch (Exception e)
            {
                return(new SearchResult <UserInfo>(e.Message));
            }
        }
        public async Task <Result <UserLogin> > CreateUser(Request <UserInfo> request)
        {
            try
            {
                if (string.IsNullOrWhiteSpace(request.Model.FirstName))
                {
                    return new Result <UserLogin>("First Name is required")
                           {
                               ResultCode = ErrorCodes.Field_value_Is_Required_Error
                           }
                }
                ;

                if (string.IsNullOrWhiteSpace(request.Model.LastName))
                {
                    return new Result <UserLogin>("Last Name is required")
                           {
                               ResultCode = ErrorCodes.Field_value_Is_Required_Error
                           }
                }
                ;

                if (string.IsNullOrWhiteSpace(request.Model.Email))
                {
                    return new Result <UserLogin>("Email is required")
                           {
                               ResultCode = ErrorCodes.Field_value_Is_Required_Error
                           }
                }
                ;

                var searchUser = new UserInfoDataRepository().Search(new SearchRequest <UserInfoData>()
                {
                    Filter = f => (f.FirstName == request.Model.FirstName && f.LastName == request.Model.LastName) || f.Email == request.Model.Email
                });

                if (searchUser.SearchTotal > 0)
                {
                    return(new Result <UserLogin>("User is already have a record"));
                }

                request.Model.DateCreated = DateTime.Now;

                var data = Mapper.Map <UserInfoData>(request.Model);

                var createRes = new UserInfoDataRepository().Insert(data);

                if (!createRes)
                {
                    return(new Result <UserLogin>("User can not be inserted."));
                }

                var searchuserdata = new UserInfoDataRepository().Search(new SearchRequest <UserInfoData>());

                var userdata = searchuserdata.Items.OrderByDescending(x => x.Id).FirstOrDefault();

                var userlogin = new UserLoginData()
                {
                    UserInfoId = userdata.Id,
                    Username   = request.Model.Email,
                    Password   = request.Model.FirstName
                };

                var createUserLoginRes = new UserLoginDataRepository().Insert(Mapper.Map <UserLoginData>(userlogin));

                if (!createUserLoginRes)
                {
                    return(new Result <UserLogin>("Unable to create user login"));
                }

                return(new Result <UserLogin> {
                    Successful = true, Message = "Successfully created user"
                });
            }
            catch (Exception e)
            {
                return(new Result <UserLogin>(e.Message)
                {
                    Successful = false, ResultCode = ErrorCodes.Exception_Error
                });
            }
        }