public HttpResponseMessage GetPlanTypes()
        {
            ItemsResponse<PlanType> response = new ItemsResponse<PlanType>();

            response.Items = _plansService.GetPlanTypes();

            if (response == null)
            {
                ErrorResponse er = new ErrorResponse("NOPE, NADA, YOU FAIL!");
                return Request.CreateResponse(HttpStatusCode.BadRequest, er);
            }

            return Request.CreateResponse(response);
        }
        public HttpResponseMessage SubscribeUser(MailChimpAddRequest model)
        {
            if (!ModelState.IsValid)
            {
                return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState);
            }

            try
            {
                EmailParameter result = _emailCampaignService.AddSubscriber(model.Email, model.FirstName, model.LastName);

                SuccessResponse response = new SuccessResponse();
                return Request.CreateResponse(HttpStatusCode.OK, response);
            }
            catch (MailChimpAPIException ex)
            {
                var error = ex.MailChimpAPIError;

                if(error.Code == "214")
                {
                    //e-mail already subscribed
                    ErrorResponse er = new ErrorResponse("214");
                    return Request.CreateResponse(HttpStatusCode.BadRequest, er);
                }
                else if (error.Code == "100")
                {
                    //invalid e-mail
                    ErrorResponse er = new ErrorResponse("100");
                    return Request.CreateResponse(HttpStatusCode.BadRequest, er);
                }
            }
            catch (Exception e)
            {
                Console.WriteLine("Exception: " + e);

                ErrorResponse er = new ErrorResponse("General error occurred.");
                return Request.CreateResponse(HttpStatusCode.BadRequest, er);
            }

            ItemResponse<EmailParameter> emailParam = new ItemResponse<EmailParameter>();
            return Request.CreateResponse(emailParam);
        }
        public HttpResponseMessage ConfirmedEmail(Guid Token)
        {
            if (!ModelState.IsValid)
            {
                return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState);
            }

            SuccessResponse response = new SuccessResponse();
            UserTokens thisToken = TokensService.GetById(Token);
            string userId = thisToken.UserId;

            bool confirmed = _userService.ConfirmEmail(userId);

            if (!confirmed)
            {
                ErrorResponse er = new ErrorResponse("We could not Confirm your email at this time.");
                return Request.CreateResponse(HttpStatusCode.BadRequest, er);
            }

            bool deleted = TokensService.DeleteToken(Token);

            if (!deleted)
            {
                ErrorResponse er = new ErrorResponse("Your token wasn't deleted.");
                return Request.CreateResponse(HttpStatusCode.BadRequest, er);
            }

            return Request.CreateResponse(response);
        }
        public HttpResponseMessage UserPlans(string userHandle)
        {
            if (!ModelState.IsValid)
            {
                return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState);
            }

            List<UserPlans> u = new List<UserPlans>();

            ItemResponse<List<UserPlans>> response = new ItemResponse<List<UserPlans>>();

            bool status = _userService.IsCurrentUser(userHandle);

            if (!status)
            {
                ErrorResponse er = new ErrorResponse("The current user is not authorized to access the requested information.");
                return Request.CreateResponse(HttpStatusCode.BadRequest, er);
            }

            string userId = _userService.GetCurrentUserId();
            u = _plansService.GetPlanByUserId(userId);
            response.Item = u;
            return Request.CreateResponse(response);
        }
        public HttpResponseMessage SendComfirmEmail(VerifyEmailRequest model)
        {
            if (!ModelState.IsValid)
            {
                return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState);
            }

            BaseResponse response = null;
            response = new SuccessResponse();

            HttpStatusCode code = HttpStatusCode.OK;

            ApplicationUser userVerification = _userService.GetUser(model.Email);

            if (userVerification == null)
            {
                response = new ErrorResponse("Cannot find a user with that email.");
                code = HttpStatusCode.BadRequest;
            }

            string userId = userVerification.Id;
            TokensRequest request = new TokensRequest();
            request.UserId = userId;
            request.Token = Guid.NewGuid();
            request.TokenTypeId = 2;

            ItemResponse<int> tokenAddResponse = new ItemResponse<int>();
            tokenAddResponse.Item = TokensService.Insert(request, userId);

            if (tokenAddResponse.Item <= 0)
            {
                response = new ErrorResponse("A new token was not inserted.");
                code = HttpStatusCode.BadRequest;
            }

            Guid uniqueId = request.Token;
            EmailRequest emailRequest = new EmailRequest();
            emailRequest.Email = model.Email;
            emailRequest.Subject = "Confirm Email";
            bool emailSent = MailService.ConfirmationEmail(emailRequest, uniqueId);

            if (!emailSent)
            {
                response = new ErrorResponse("The confirmation email failed to send.");
                code = HttpStatusCode.BadRequest;
            }

            return Request.CreateResponse(code, response);
        }
        public HttpResponseMessage PasswordReset(NewPasswordRequest model)
        {
            if (!ModelState.IsValid)
            {
                return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState);
            }

            SuccessResponse response = new SuccessResponse();
            UserTokens thisToken = TokensService.GetById(model.ResetToken);
            string userId = thisToken.UserId;
            bool changed = _userService.ChangePassWord(userId, model.ConfirmPassword);

            if (!changed)
            {
                ErrorResponse er = new ErrorResponse("There was something wrong with your password format.");
                return Request.CreateResponse(HttpStatusCode.BadRequest, er);
            }

            bool deleted = TokensService.DeleteToken(model.ResetToken);

            if (!deleted)
            {
                ErrorResponse er = new ErrorResponse("Your token wasn't deleted.");
                return Request.CreateResponse(HttpStatusCode.BadRequest, er);
            }

            return Request.CreateResponse(response);
        }
        public HttpResponseMessage forgotPassword(VerifyEmailRequest model)
        {
            if (!ModelState.IsValid)
            {
                return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState);
            }

            SuccessResponse response = new SuccessResponse();
            ApplicationUser userVerification = _userService.GetUser(model.Email);

            if (userVerification == null)
            {
                ErrorResponse er = new ErrorResponse("Cannot find a user with that email.");
                return Request.CreateResponse(HttpStatusCode.BadRequest, er);
            }

            string userId = userVerification.Id;
            TokensRequest request = new TokensRequest();
            request.UserId = userId;
            request.Token = Guid.NewGuid();
            request.TokenTypeId = 1;

            ItemResponse<int> tokenAddResponse = new ItemResponse<int>();
            tokenAddResponse.Item = TokensService.Insert(request, userId);

            if (tokenAddResponse.Item <= 0)
            {
                ErrorResponse er = new ErrorResponse("A new token was not inserted.");
                return Request.CreateResponse(HttpStatusCode.BadRequest, er);
            }

            Guid uniqueId = request.Token;
            EmailRequest emailRequest = new EmailRequest();
            emailRequest.Email = model.Email;
            emailRequest.Subject = "Password Reset";
            bool emailSent = MailService.resetPasswordEmail(emailRequest, uniqueId);

            if (!emailSent)
            {
                return Request.CreateResponse(HttpStatusCode.BadRequest, "The reset password email failed to send.");
            }

            return Request.CreateResponse(response);
        }
        public HttpResponseMessage AddEmail(ForgotPasswordRequest model)
        {
            HttpResponseMessage responseMessage = null;
            BaseResponse response = null;

            if (!ModelState.IsValid)
            {
                return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState); //if email is NOT valid return error response
            }

            ApplicationUser user = UserService.GetUserByEmail(model.Email); //grabs user email

            if (user != null)
            {

                UserTokensAddRequest foo = new UserTokensAddRequest();
                foo.UserName = user.UserName;
                foo.TokenType = 2;
                Guid tokenId = UserTokensService.Add(foo);

                SendConfirmationEmailRequest request = new SendConfirmationEmailRequest();
                request.UserName = user.UserName;
                request.Email = user.Email;
                request.Token = tokenId;

                Task t = _messagingService.SendForgotPasswordEmail(request); //calling it to run
            }
            else
            {
                response = new ErrorResponse("I'm sorry, but your email can't be found, Please use correct Email");
                responseMessage = Request.CreateResponse(HttpStatusCode.BadRequest, response);
                return responseMessage;
            }

            return Request.CreateResponse(user);
        }
        public HttpResponseMessage RegisterAdd(IdentityUser model)
        {
            if (!ModelState.IsValid)
            {
                return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState); //if email is NOT valid return error response
            }
            try
            {
                IdentityUser register = UserService.CreateUser(model.UserName, model.Email, model.PasswordHash);

                if (register != null)
                {
                    UserTokensAddRequest tokensAddRequest = new UserTokensAddRequest();

                    tokensAddRequest.UserName = register.UserName;
                    tokensAddRequest.TokenType = 1;
                    tokensAddRequest.TokenId = UserTokensService.Add(tokensAddRequest);

                    SendConfirmationEmailRequest request = new SendConfirmationEmailRequest();
                    request.UserName = register.UserName;
                    request.Email = register.Email;
                    request.Token = tokensAddRequest.TokenId;

                    Task t = _messagingService.SendConfirmationEmail(request);
                }
                else
                {
                    return Request.CreateErrorResponse(HttpStatusCode.BadRequest,
                        "Register wasn't successfull Please try again");
                }
                return Request.CreateResponse(register);
            }

            catch (IdentityResultException iex)
            {

                ErrorResponse er = new ErrorResponse(iex.Result.Errors);
                return Request.CreateResponse(HttpStatusCode.BadRequest, er);

            }

            catch (Exception ex)
            {

                ErrorResponse er = new ErrorResponse(ex.Message);
                return Request.CreateResponse(HttpStatusCode.BadRequest, er);

            }
        }
        public HttpResponseMessage NewPassword(ResetPasswordRequest model)
        {
            BaseResponse resp = null;

            if (!ModelState.IsValid)  //if my data is NOT valid
            {
                return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState); //it will return as error response
            }

            var success = UserService.ResetPassword(model);

            if (!success)
            {
                resp = new ErrorResponse("Unable to change password! Your password must have the following: At least one uppercase ('A'-'Z'), at least one digit ('0'-'9'), and at least one special character.");
                return Request.CreateResponse(HttpStatusCode.BadRequest, resp);
            }

            ItemResponse<bool> response = new ItemResponse<bool>();
            response.Item = success;
            return Request.CreateResponse(response);
        }
        public HttpResponseMessage Login(LoginRequest model)
        {
            HttpResponseMessage responseMessage = null;
            BaseResponse response = null;

            if (!ModelState.IsValid)
            {
                return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState);
            }

            ApplicationUser user = UserService.GetUser(model.UserName);

            if (user != null)
            {
                Boolean emailConfirmed = UserService.GetEmailConfirmed(model.UserName);

                if (emailConfirmed)
                {
                    bool isValidLogin = false;

                    isValidLogin = UserService.Signin(model.UserName, model.Password);

                    if (isValidLogin)
                    {
                        response = new SucessResponse();
                        responseMessage = Request.CreateResponse(response);
                    }
                    else
                    {
                        response = new ErrorResponse("Login failed! Please check if you typed in the correct Username and Password.");
                        responseMessage = Request.CreateResponse(HttpStatusCode.BadRequest, response);
                    }
                }
                else
                {
                    response = new ErrorResponse("Please confirm your email before logging in.");
                    responseMessage = Request.CreateResponse(HttpStatusCode.BadRequest, response);
                }
            }
            else
            {
                response = new ErrorResponse("Username does not exist! Please register.");
                responseMessage = Request.CreateResponse(HttpStatusCode.BadRequest, response);
            }
            return responseMessage;
        }
        public HttpResponseMessage Post()
        {
            HttpResponseMessage result = null;
            var currentUser = UserService.GetCurrentUserId();

            List<Media> existingImages = new List<Media>();
            existingImages = _MediaService.GetPictureByCurrentUser();
            if (existingImages == null || existingImages.Count<Media>() < 5)
            {

                var httpRequest = HttpContext.Current.Request;
                if (httpRequest.Files.Count > 0)
                {
                    var docfiles = new List<string>();
                    foreach (string file in httpRequest.Files)
                    {
                        var postedFile = httpRequest.Files[file];
                        var fileType = postedFile.ContentType;
                        var filePath = HttpContext.Current.Server.MapPath("~/PhotoDemo/" + postedFile.FileName); //sets filepath for server storage
                        postedFile.SaveAs(filePath);           //saves file to specified path
                        docfiles.Add(filePath);

                        ImageModel model = new ImageModel       //create model for INSERT
                        {
                              //AppUserId taken from the Id of Organization
                            Path = Guid.NewGuid()+postedFile.FileName,
                            Media = MediaType.EntityImage,      //Uses Enum to specify type of media/image
                            User = SessionService.getCurrentUserType(),       // change when we can access login information
                            Title = postedFile.FileName,
                            ContentType = fileType
                        };
                        var id = _MediaService.UploadPicture(model, currentUser);
                        _fileService.UploadFile(filePath, model.Path, fileType);
                    }

                    result = Request.CreateResponse(HttpStatusCode.Created);
                }
                else
                {
                    ErrorResponse noFiles = new ErrorResponse("Cannot have more than 5 images");
                    result = Request.CreateResponse(HttpStatusCode.BadRequest, noFiles);
                }
            }
            else
            {
                ErrorResponse tooMany = new ErrorResponse("Cannot have more than 5 images");
                result = Request.CreateResponse(HttpStatusCode.BadRequest, tooMany);
            }
            return result;
        }