├── AVALIAÇÃO PRÁTICA - DEV PHP.pdf ├── .htaccess ├── index.php ├── views ├── includes │ ├── footer.view.php │ └── header.view.php ├── users.delete.view.php ├── log.view.php ├── login.view.php ├── home.view.php ├── users.view.php ├── users.add.view.php └── users.edit.view.php ├── core ├── autoload.php ├── config.php ├── functions.php ├── controller.php ├── app.php ├── model.php └── database.php ├── readme ├── controllers ├── Home.php ├── Log.php ├── Users.php └── Login.php └── models ├── User.php └── Auth.php /AVALIAÇÃO PRÁTICA - DEV PHP.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/erik-monteiro/desafio-manyminds/HEAD/AVALIAÇÃO PRÁTICA - DEV PHP.pdf -------------------------------------------------------------------------------- /.htaccess: -------------------------------------------------------------------------------- 1 | RewriteEngine On 2 | 3 | RewriteCond %{REQUEST_FILENAME} !-f 4 | RewriteCond %{REQUEST_FILENAME} !-d 5 | RewriteRule ^(.*)$ index.php?url=$1 [L,QSA] -------------------------------------------------------------------------------- /index.php: -------------------------------------------------------------------------------- 1 | connect(); 9 | 10 | $app = new App(); 11 | 12 | ?> -------------------------------------------------------------------------------- /views/includes/footer.view.php: -------------------------------------------------------------------------------- 1 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /core/autoload.php: -------------------------------------------------------------------------------- 1 | 16 | -------------------------------------------------------------------------------- /controllers/Home.php: -------------------------------------------------------------------------------- 1 | redirect('/login'); 9 | } 10 | 11 | $user = new User(); 12 | $data = $user->getAll(); 13 | $numberOfUsers = count($data); 14 | 15 | return Controller::view('home', ['users' => $numberOfUsers, 'data' => $data]); 16 | } 17 | } 18 | 19 | ?> -------------------------------------------------------------------------------- /core/functions.php: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /models/User.php: -------------------------------------------------------------------------------- 1 | errors = []; 8 | 9 | if (empty($data['name']) || empty($data['email']) || empty($data['password']) || empty($data['address']) || empty($data['cep']) || empty($data['city'])) { 10 | $this->errors['emptyFields'] = 'Todos os campos devem ser preenchidos'; 11 | return false; 12 | } 13 | 14 | return true; 15 | } 16 | } 17 | 18 | ?> -------------------------------------------------------------------------------- /controllers/Log.php: -------------------------------------------------------------------------------- 1 | redirect('/login'); 9 | } 10 | 11 | $user = new User(); 12 | $dataUser = $user->getAll(); 13 | $logs = $this->getLoginAttempts(); 14 | 15 | 16 | return Controller::view('log', ['dataUser' => $dataUser, 'logs' => $logs]); 17 | } 18 | 19 | public function getLoginAttempts() 20 | { 21 | $user = new User(); 22 | $query = "SELECT * FROM login_attempts"; 23 | $logs = $user->query($query); 24 | return $logs; 25 | } 26 | } 27 | 28 | ?> -------------------------------------------------------------------------------- /models/Auth.php: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /views/users.delete.view.php: -------------------------------------------------------------------------------- 1 | 2 | 3 |
4 |
5 | 6 |
7 |
8 |
Realmente deseja excluir?
9 | 10 | Cancelar 11 | 12 | 13 | 14 |
15 |
16 | 17 |
18 |
19 | 20 | 21 | -------------------------------------------------------------------------------- /core/controller.php: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /views/log.view.php: -------------------------------------------------------------------------------- 1 | 2 | 3 |
4 |
5 | 6 |

Informações sobre usuários

7 | 11 | 12 |
13 |

Informações sobre logins

14 | 15 |
    16 |
  • Endereço IP: ip_address ?>
  • 17 |
  • Hora da tentativa: attempt_time)); ?>
  • 18 |
19 | 20 |
21 |
22 |
23 | 24 | -------------------------------------------------------------------------------- /core/app.php: -------------------------------------------------------------------------------- 1 | getURL(); 12 | 13 | if (file_exists("controllers/" . $pageURL[0] . ".php")) { 14 | $this->controller = ucfirst($pageURL[0]); 15 | unset($pageURL[0]); 16 | } else { 17 | echo "Controller não encontrado"; 18 | } 19 | 20 | require "controllers/" . $this->controller . ".php"; 21 | $this->controller = new $this->controller(); 22 | 23 | if (isset($pageURL[1])) { 24 | if (method_exists($this->controller, $pageURL[1])) { 25 | $this->method = ucfirst($pageURL[1]); 26 | unset($pageURL[1]); 27 | } 28 | } 29 | 30 | $pageURL = array_values($pageURL); 31 | $this->params = $pageURL; 32 | 33 | call_user_func_array([$this->controller, $this->method], $this->params); 34 | } 35 | 36 | public function getURL() { 37 | $url = isset($_GET['url']) ? $_GET['url'] : "login"; 38 | return explode("/", filter_var(trim($url, "/")), FILTER_SANITIZE_URL); 39 | } 40 | } 41 | 42 | ?> 43 | 44 | 45 | table = strtolower($this::class) . "s"; 11 | } 12 | } 13 | 14 | public function getAll() 15 | { 16 | $query = "SELECT * FROM $this->table"; 17 | $data = $this->query($query); 18 | 19 | return $data; 20 | } 21 | 22 | public function where($column, $value) 23 | { 24 | $column = addslashes($column); 25 | $query = "SELECT * FROM $this->table WHERE $column = :value"; 26 | $data = $this->query($query, [ 27 | 'value' => $value 28 | ]); 29 | 30 | return $data; 31 | } 32 | 33 | public function insert($data) 34 | { 35 | $keys = array_keys($data); 36 | $columns = implode(",", $keys); 37 | $values = implode(",:", $keys); 38 | 39 | $query = "INSERT INTO $this->table ($columns) VALUES (:$values)"; 40 | return Database::query($query, $data); 41 | } 42 | 43 | public function update($id, $data) 44 | { 45 | $str = ""; 46 | foreach ($data as $key => $value) { 47 | $str .= $key. "=:". $key.","; 48 | } 49 | 50 | $str = trim($str,","); 51 | 52 | $data['id'] = $id; 53 | $query = "update $this->table set $str where id = :id"; 54 | 55 | return $this->query($query, $data); 56 | } 57 | 58 | public function delete($id) 59 | { 60 | $query = "DELETE FROM $this->table WHERE id = :id"; 61 | $data['id'] = $id; 62 | return Database::query($query, $data); 63 | } 64 | 65 | 66 | } 67 | 68 | ?> -------------------------------------------------------------------------------- /views/includes/header.view.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Desafio - Manyminds 7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 32 |
33 | -------------------------------------------------------------------------------- /controllers/Users.php: -------------------------------------------------------------------------------- 1 | redirect('/login'); 9 | } 10 | 11 | $user = new User(); 12 | $data = $user->getAll(); 13 | 14 | return Controller::view('users', ['data' => $data]); 15 | } 16 | 17 | public function add() 18 | { 19 | $errors = []; 20 | 21 | if (count($_POST) > 0) { 22 | $user = new User(); 23 | 24 | if ($user->validateData($_POST)) { 25 | $_POST['status'] = 'active'; 26 | $_POST['created_at'] = date('Y-m-d H:i:s'); 27 | 28 | $user->insert($_POST); 29 | $this->redirect('/home'); 30 | } else { 31 | $errors = $user->errors; 32 | } 33 | } 34 | 35 | $this->view('users.add', ['errors' => $errors]); 36 | } 37 | 38 | public function edit($id = null) 39 | { 40 | $user = new User(); 41 | 42 | if (count($_POST) > 0) { 43 | $_POST['updated_at'] = date('Y-m-d H:i:s'); 44 | $user->update($id, $_POST); 45 | $this->redirect('users'); 46 | } 47 | 48 | $rows = $user->where('id', $id); 49 | 50 | if ($rows) { 51 | $row = $rows[0]; // Acessar o primeiro objeto da coleção 52 | $this->view('users.edit', ['row' => $row]); 53 | } 54 | } 55 | 56 | 57 | public function delete($id = null) 58 | { 59 | $user = new User(); 60 | 61 | if (count($_POST) > 0) { 62 | $user->delete($id); 63 | $this->redirect('users'); 64 | } 65 | 66 | $row = $user->where('id', $id); 67 | if ($row) { 68 | $this->view('users.delete', ['row' => $row]); 69 | } 70 | } 71 | } 72 | 73 | ?> -------------------------------------------------------------------------------- /views/login.view.php: -------------------------------------------------------------------------------- 1 | 2 | 3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |

Login

11 |

Consulte o arquivo login.txt

12 | 13 |
14 | 15 |
16 | 17 |
18 | 19 |
20 | 21 | 22 |
23 |
24 |
25 | 26 | 27 | 34 | 35 |
36 |
37 |
38 |
39 | 40 | -------------------------------------------------------------------------------- /views/home.view.php: -------------------------------------------------------------------------------- 1 | 2 | 3 |
4 |
5 |
6 |

Bem vindo a home!

7 | 8 |
9 |
10 |
11 |
Número de usuários cadastrados
12 |

Há um total de usuários cadastrados!

13 | Ver todos 14 |
15 |
16 |
17 | 18 |
19 |
20 |
21 |
Suas informações
22 |

email:

23 | email == $_SESSION['user']) { 25 | if ($user->status == 'active') { 26 | echo "

Usuário ativo

"; 27 | } else { 28 | echo "

Usuário inativo

"; 29 | } 30 | } 31 | } 32 | ?> 33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
Logs do sistema
42 |

Todas as alterações feitas no sistema

43 | Ver todos 44 |
45 |
46 |
47 |
48 |
49 |
50 | 51 | -------------------------------------------------------------------------------- /controllers/Login.php: -------------------------------------------------------------------------------- 1 | $email, 20 | 'password' => $password 21 | ]; 22 | $result = $user->query($query, $data); 23 | 24 | if ($result) { 25 | Auth::authenticate($email); 26 | $this->redirect('/home'); 27 | } else { 28 | $this->registerFailedLoginAttempt($ipAddress); 29 | if ($this->checkLoginAttempts($ipAddress)) { 30 | $errors['ipBlocked'] = "IP BLOQUEADO: você errou as credenciais muitas vezes. Tente novamente em 1 minuto."; 31 | } else { 32 | $errors['logginFailed'] = "Email ou senha incorretos!"; 33 | } 34 | } 35 | } else { 36 | $errors['emptyField'] = "Email ou senha não preenchidos!"; 37 | } 38 | } 39 | 40 | return Controller::view('login', ['errors' => $errors]); 41 | } 42 | 43 | public function checkLoginAttempts($ipAddress) 44 | { 45 | if ($ipAddress != null) { 46 | $user = new User(); 47 | $maxAttempts = 3; 48 | $blockDuration = 1; 49 | $blockTime = date('Y-m-d H:i:s', strtotime("-$blockDuration minute")); 50 | 51 | $query = "SELECT COUNT(*) as num_attempts FROM login_attempts WHERE ip_address = :ip AND attempt_time > :block_time"; 52 | $data = [ 53 | ':ip' => $ipAddress, 54 | ':block_time' => $blockTime 55 | ]; 56 | $result = $user->query($query, $data); 57 | 58 | if ($result && $result[0]->num_attempts >= $maxAttempts) { 59 | return true; 60 | } 61 | } 62 | 63 | return false; 64 | } 65 | 66 | 67 | public function registerFailedLoginAttempt($ipAddress) 68 | { 69 | if ($ipAddress != null) { 70 | $user = new User(); 71 | 72 | $query = "INSERT INTO login_attempts (ip_address) VALUES (:ip)"; 73 | $data = [':ip' => $ipAddress]; 74 | $user->query($query, $data); 75 | } 76 | } 77 | } 78 | 79 | ?> 80 | -------------------------------------------------------------------------------- /core/database.php: -------------------------------------------------------------------------------- 1 | exec($query); 14 | $conn->exec("USE " . DBNAME); 15 | 16 | $query = "SHOW TABLES LIKE 'users'"; 17 | $result = $conn->query($query); 18 | 19 | if ($result->rowCount() == 0) { 20 | $query = "CREATE TABLE users ( 21 | id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY, 22 | name VARCHAR(40) NOT NULL, 23 | email VARCHAR(50) NOT NULL, 24 | password VARCHAR(50) NOT NULL, 25 | status ENUM('active', 'not_active') NOT NULL DEFAULT 'active', 26 | address VARCHAR(100) NOT NULL, 27 | cep VARCHAR(9) NOT NULL, 28 | city VARCHAR(40) NOT NULL, 29 | created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, 30 | updated_at TIMESTAMP DEFAULT NULL 31 | )"; 32 | $conn->exec($query); 33 | 34 | $query = "INSERT INTO users 35 | (name, email, password, status, address, cep, city, created_at, updated_at) 36 | VALUES 37 | ('Erik', 'erik@hotmail.com', '123', 'active', 'Endereço teste', '95322999', 'Porto Alegre', NOW(), null)"; 38 | $conn->exec($query); 39 | 40 | $query = "CREATE TABLE login_attempts ( 41 | id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY, 42 | ip_address VARCHAR(50), 43 | attempt_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP 44 | )"; 45 | $conn->exec($query); 46 | } 47 | } 48 | return $conn; 49 | } 50 | 51 | public function query($query, $data = array(), $data_type = "object") 52 | { 53 | $conn = $this->connect(); 54 | $stm = $conn->prepare($query); 55 | 56 | $result = false; 57 | if ($stm) { 58 | $check = $stm->execute($data); 59 | if ($check) { 60 | if($data_type == "object"){ 61 | $result = $stm->fetchAll(PDO::FETCH_OBJ); 62 | }else{ 63 | $result = $stm->fetchAll(PDO::FETCH_ASSOC); 64 | } 65 | 66 | } 67 | } 68 | 69 | if(is_array($result) && count($result) >0){ 70 | return $result; 71 | } 72 | 73 | return false; 74 | } 75 | } 76 | 77 | ?> -------------------------------------------------------------------------------- /views/users.view.php: -------------------------------------------------------------------------------- 1 | 2 | 3 |
4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 33 | 37 | 38 | 39 | 40 |
#NomeEmailEndereçoCidadeCEPSituaçãoAções
id ?>name ?>email ?>address ?>city ?>cep ?> 27 | status == 'active') { ?> 28 | Usuário ativo 29 | 30 | Usuário inativo 31 | 32 | 34 | Editar 35 | Excluir 36 |
41 | 42 |
43 | Adicionar 44 |
45 |
46 | 47 | 48 | 49 | -------------------------------------------------------------------------------- /views/users.add.view.php: -------------------------------------------------------------------------------- 1 | 2 | 3 |
4 |
5 |
6 |
7 |
8 |

Cadastrar usuário

9 |

Preencha todos os campos abaixo

10 |
11 |
12 | 13 |
14 | 15 |
16 | 17 |
18 | 19 |
20 | 21 |
22 | 23 |
24 | 25 |
26 | 27 |
28 | 29 |
30 | 31 |
32 | 33 |
34 | 35 |
36 |
37 | 38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 | 47 | 48 | 55 | 56 | 57 | 58 | 59 | 60 | -------------------------------------------------------------------------------- /views/users.edit.view.php: -------------------------------------------------------------------------------- 1 | 2 | 3 |
4 |
5 |
6 |
7 |
8 |

Editar usuário

9 |

Edite os campos que achar necessário

10 | 11 |
12 |
13 | 14 |
15 | 16 |
17 | 18 |
19 | 20 |
21 | 26 |
27 | 28 |
29 | 30 |
31 | 32 |
33 | 34 |
35 | 36 |
37 | 38 |
39 | 40 |
41 | 42 |
43 | 44 |
45 |
46 | 47 |
48 |
49 |
50 | 51 |
52 |
53 |
54 |
55 |
56 | 57 | 58 | 65 | 66 | 67 | 68 | 69 | 70 | --------------------------------------------------------------------------------