/**
  * Processa o formulário de login
  */
 protected static function processLoginForm()
 {
     // proteção contra CSRF
     \CSRF::Check();
     $email = isset($_POST['email']) ? $_POST['email'] : null;
     $password = isset($_POST['password']) ? $_POST['password'] : null;
     $hashedPassword = \Hash::password($password);
     $errors = [];
     if (empty($email)) {
         $errors[] = 'Informe seu email';
     }
     if (empty($password)) {
         $errors[] = 'Informe sua senha';
     }
     if (count($errors) > 0) {
         return \View::make('login', compact('errors'));
     }
     $DB = new \DB();
     $sql = "SELECT id, password, status FROM users WHERE email = :email";
     $stmt = $DB->prepare($sql);
     $stmt->bindParam(':email', $email);
     $stmt->execute();
     $rows = $stmt->fetchAll(\PDO::FETCH_OBJ);
     if (count($rows) <= 0) {
         $errors[] = 'Usuário não encontrado';
     } else {
         $user = $rows[0];
         if ($hashedPassword != $user->password) {
             $errors[] = 'Senha incorreta';
         } elseif ($user->status != \Models\User::STATUS_ACTIVE) {
             $errors[] = 'Ative sua conta antes de fazer login';
         } else {
             // busca os dados do usuário para criar os dados no cookie
             $objUser = new \Models\User();
             $objUser->find($user->id);
             // gera um token de acesso
             $token = $objUser->generateToken();
             // salva o cookie com os dados do usuário
             self::saveSessionCookieForUser($objUser);
             // redireciona para a página inicial
             redirect(getBaseURL());
         }
     }
     if (count($errors) > 0) {
         return \View::make('login', compact('errors'));
     }
 }
 /**
  * Salva a resposta
  */
 public static function store()
 {
     // impede acesso a usuário não logado
     \Auth::denyNotLoggedInUsers();
     // impede ataque por CSRF
     \CSRF::Check();
     $questionID = isset($_POST['question_id']) ? (int) $_POST['question_id'] : null;
     $description = isset($_POST['description']) ? $_POST['description'] : null;
     $errors = [];
     if (empty($questionID)) {
         $errors[] = 'ID da pergunta inválido';
     }
     if (empty($description)) {
         $errors[] = 'Informe a resposta';
     }
     if (count($errors) > 0) {
         // se ocorrer erro, exibe-os e encerra a execução deste método, usando o return
         return \View::make('answer.create', compact('errors'));
     }
     // busca o usuário logado
     $user = \Auth::user();
     $user_id = $user->getId();
     $now = date('Y-m-d H:i:s');
     $DB = new \DB();
     $sql = "INSERT INTO answers(user_id, question_id, description, created_at, updated_at) VALUES(:user_id, :question_id, :description, :created_at, :updated_at)";
     $stmt = $DB->prepare($sql);
     $stmt->bindParam(':question_id', $questionID, \PDO::PARAM_INT);
     $stmt->bindParam(':description', $description);
     $stmt->bindParam(':user_id', $user_id, \PDO::PARAM_INT);
     $stmt->bindParam(':created_at', $now);
     $stmt->bindParam(':updated_at', $now);
     if ($stmt->execute()) {
         // redireciona para a pergunta, já com a resposta criada
         redirect(getBaseURL() . '/pergunta/' . $questionID);
     } else {
         // exibe erro e gera um log com os detalhes do problema
         echo "Erro ao criar resposta";
         \Log::error("Erro ao criar resposta: " . print_r($stmt->errorInfo(), true));
     }
 }
 /**
  * Processa o formulário de criação de pergunta
  */
 public static function store()
 {
     \Auth::denyNotLoggedInUsers();
     \CSRF::Check();
     $title = isset($_POST['title']) ? $_POST['title'] : null;
     $description = isset($_POST['description']) ? $_POST['description'] : null;
     $errors = [];
     if (empty($title)) {
         $errors[] = 'Informe o título da pergunta';
     }
     if (empty($description)) {
         $errors[] = 'Informe a descrição da pergunta';
     }
     if (count($errors) > 0) {
         // se ocorrer erro, exibe-os e encerra o método usando return
         return \View::make('question.create', compact('errors'));
     }
     $user = \Auth::user();
     $user_id = $user->getId();
     $now = date('Y-m-d H:i:s');
     $DB = new \DB();
     $sql = "INSERT INTO questions(user_id, title, description, created_at, updated_at) VALUES(:user_id, :title, :description, :created_at, :updated_at)";
     $stmt = $DB->prepare($sql);
     $stmt->bindParam(':title', $title);
     $stmt->bindParam(':description', $description);
     $stmt->bindParam(':user_id', $user_id, \PDO::PARAM_INT);
     $stmt->bindParam(':created_at', $now);
     $stmt->bindParam(':updated_at', $now);
     if ($stmt->execute()) {
         // busca o ID gerado na inserção
         $id = $DB->lastInsertId();
         // redireciona para a páginca com o pergunta criada
         redirect(getBaseURL() . '/pergunta/' . $id);
     } else {
         echo "Erro ao criar pergunta";
         \Log::error("Erro ao criar pergunta: " . print_r($stmt->errorInfo(), true));
     }
 }
 /**
  * Registra o usuário
  */
 public static function store()
 {
     \CSRF::Check();
     $nickname = isset($_POST['nickname']) ? $_POST['nickname'] : null;
     $email = isset($_POST['email']) ? $_POST['email'] : null;
     $password = isset($_POST['password']) ? $_POST['password'] : null;
     $passwordConfirmation = isset($_POST['password_confirmation']) ? $_POST['password_confirmation'] : null;
     $hashedPassword = \Hash::password($password);
     $hasErrors = false;
     $errorMessages = [];
     if ($nickname == null) {
         $errorMessages[] = "Informe seu apelido";
         $hasErrors = true;
     }
     if ($email == null) {
         $errorMessages[] = "Informe seu email";
         $hasErrors = true;
     }
     if ($password == null) {
         $errorMessages[] = "Informe uma senha";
         $hasErrors = true;
     }
     if ($passwordConfirmation == null) {
         $errorMessages[] = "Confirme sua senha";
         $hasErrors = true;
     }
     if ($password != $passwordConfirmation) {
         $errorMessages[] = "Senhas não coincidem";
         $hasErrors = true;
     }
     if ($hasErrors) {
         return \View::make('user.create', compact('errorMessages'));
     }
     $sql = "INSERT INTO users(name, nickname, email, password, status, admin, created_at, updated_at) VALUES(:name, :nickname, :email, :password, :status, :admin, :created_at, :updated_at)";
     $DB = new \DB();
     $stmt = $DB->prepare($sql);
     $date = date('Y-m-d H:i:s');
     $stmt->bindParam(':name', $name);
     $stmt->bindParam(':nickname', $nickname);
     $stmt->bindParam(':email', $email);
     $stmt->bindParam(':password', $hashedPassword);
     $stmt->bindValue(':status', \Models\User::STATUS_ACTIVE, \PDO::PARAM_INT);
     $stmt->bindValue(':admin', '0');
     $stmt->bindParam(':created_at', $date);
     $stmt->bindParam(':updated_at', $date);
     if ($stmt->execute()) {
         // em vez de apenas exibir uma mensagem de sucesso, faremos um redirecionamento.
         // isso é melhor pois evita que o usuário atualize a página e crie uma nova conta
         redirect(getBaseURL() . '/cadastro_finalizado');
     } else {
         list($error, $sgbdErrorCode, $sgbdErrorMessage) = $stmt->errorInfo();
         if ($sgbdErrorCode == 1062) {
             // erro 1062 é o código do MySQL de violação de chave única
             // veja mais em: http://dev.mysql.com/doc/refman/5.5/en/error-messages-server.html
             if (preg_match("/for key .?nickname/iu", $sgbdErrorMessage)) {
                 // nickname já em uso
                 $errorMessages[] = "Apelido já está em uso";
             } else {
                 // email já em uso
                 $errorMessages[] = "Email já está em uso";
             }
         }
         return \View::make('user.create', compact('errorMessages'));
     }
 }