Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
/vendor
2 changes: 1 addition & 1 deletion .htaccess
Original file line number Diff line number Diff line change
Expand Up @@ -4,5 +4,5 @@
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f

# RewriteRule
#RewriteRule ^ index.php [L]
</IfModule>
5 changes: 0 additions & 5 deletions Carro.class.php

This file was deleted.

67 changes: 15 additions & 52 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,64 +1,27 @@
Teste para desenvolvedor do Estadão
Resultado do teste
==============================

Olá candidato,

Esse teste consiste em 2 etapas para avaliarmos seu conhecimento em PHP e Front-End (HTML5, CSS e JavaScript)

Para realizar o teste, você deve dar um fork neste repositório e depois clona-lo na pasta <document_root> da máquina que está realizando o teste.

Crie um branch com seu nome, e quando finalizar todo o desenvolvimento, você deverá enviar um pull-request com sua versão.

O teste
--------

### Back-End/PHP
Rode o comando no terminal na raiz da aplicação:
```sh
composer install
```

A primeira etapa será o desenvolvimento **backend/PHP**:

**Descrição:**

- Você deverá desenvolver uma 'mini api' para que seja possível realizar operações CRUD do objeto Carro.
> **Obs:**
> - Você pode usar arquivo (txt, json) como banco de dados.
> - Cada carro deve ter ID, Marca, Modelo, Ano.

Sugerimos o retorno dessa 'mini api' nas seguinte urls:
- `/marcas` - [GET] retorna todas as marcas.
- `/carros` - [GET] retornar todos os carros cadastrados.
- `/carros` - [POST] cadastra um novo carro.
- `/carros/{id}` - [GET] retornar o carro com ID especificado.
- `/carros/{id}` - [PUT] atualizar os dados do carro com ID especificado.
- `/carros/{id}` - [DELETE] apaga o carro com ID especificado.

- `/carros` - [GET] deve retornar todos os carros cadastrados.
- `/carros` - [POST] deve cadastrar um novo carro.
- `/carros/{id}`[GET] deve retornar o carro com ID especificado.
- `/carros/{id}`[PUT] deve atualizar os dados do carro com ID especificado.
- `/carros/{id}`[DELETE] deve apagar o carro com ID especificado.

### Front-End

Para a segunda etapa do teste, você deverá desenvolver uma SPA (Single Page Application) e nela deve ser possível:
Desenvolvido em react, porém não consegui rodar no Docker.
Todo o código está no diretório **web**.

Das funcionalidade exigidas:
- Ver a lista de carros cadastrados
- Criar um novo carro
- Editar um carro existente
- Apagar um carro existente

> **Obs:**
> - A página deve ser responsiva.
> - A página deve funcionar 100% via AJAX, sem outros carregamentos de páginas.
> - Ao criar/editar um carro, o campo "marca" deverá ser um `SELECT`

### Ambiente

Esse teste com um ambiente Docker funcional, ou seja, basta rodar os comandos para subir o container da aplicação e acessar a URL do projeto no navegador.

Para rodar o ambiente, é necessário ter o Docker Compose instalado, e rodar o seguinte comando:
> docker-compose up -d nginx

Após o ambiente subir, basta acessar a URL abaixo e começar a desenvolver:
> http://localhost:8080

### Observações importantes:
- O teste só será considerado se rodar através do Docker.
- Caso seja necessário, você pode alterar **qualquer** configuração do Docker. Atente-se apenas para que o ambiente não precise de nenhuma configuração adicional.
- Você não deve se prender aos arquivos do repositório. Fique a vontade para criar outros.
- Você pode usar frameworks, tanto para o front-end, quanto para o back-end, mas um código limpo será melhor avaliado.
- Você pode usar ferramentas de automação (Grunt, Gulp), mas deverá informar o uso completo para funcionamento do teste.
- Será considerado ponto positivo no teste a utilização de JS puro, orientação a objetos, design patterns e rotinas para testes.
- Campo select na tela de criar um novo carro, carrega as marcas da API
4 changes: 0 additions & 4 deletions api.php

This file was deleted.

44 changes: 44 additions & 0 deletions app/Controllers/CarroController.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
<?php

namespace App\Controllers;

use App\Models\Carro;

class CarroController {

private $carro;

public function __construct()
{
$this->carro = new Carro();
}

public function index($id = null)
{
$carros = $this->carro->getCars($id);

return json_encode($carros);
}

public function store()
{
$carro = $this->carro->saveCar(file_get_contents('php://input'));

return json_encode($carro);
}

public function update($id)
{
$carros = $this->carro->updateCar($id, file_get_contents('php://input'));

return json_encode($carros);
}

public function destroy($id)
{
$carros = $this->carro->deleteCar($id);

return json_encode($carros);
}

}
22 changes: 22 additions & 0 deletions app/Controllers/MarcaController.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
<?php

namespace App\Controllers;

use App\Models\Marca;

class MarcaController {

private $marca;

public function __construct()
{
$this->marca = new Marca();
}

public function index()
{
$marcas = $this->marca->getBrands();
return json_encode($marcas);
}

}
79 changes: 79 additions & 0 deletions app/Models/Carro.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
<?php

namespace App\Models;

class Carro {

private $db;

public function __construct()
{
$this->db = json_decode( file_get_contents(getcwd().'/app/Models/db.json'), true );
}

private function getCarsById(Int $id)
{
return array_filter($this->db, function ($key) use ($id) {
return $this->db[$key]['id'] == $id;
}, ARRAY_FILTER_USE_KEY);
}

public function getAllBrands(String $marca)
{

}

public function getCars(Int $id = null)
{
return is_null($id) ? $this->db : $this->getCarrosById($id);
}

public function saveCar(String $data)
{
$last = end($this->db);
$data = json_decode($data, true);
//$data['id'] = intval($last['id'], 10) + 1;

$data = ['id' => intval($last['id'], 10) + 1] + $data;

array_push($this->db, $data);
file_put_contents(getcwd().'/app/Models/db.json', json_encode($this->db, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE));

return $this->getCars();
}

public function updateCar($id, String $data)
{
$data = json_decode($data, true);

foreach ($this->db as $k => $v) {
if ($v['id'] == $id) {

$this->db[$k]['marca'] = $data['marca'];
$this->db[$k]['modelo'] = $data['modelo'];
$this->db[$k]['ano'] = $data['ano'];

file_put_contents(getcwd().'/app/Models/db.json', json_encode($this->db, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE));

return $this->getCars();
}
}

return ['status' => false];
}

public function deleteCar($id)
{
foreach ($this->db as $k => $v) {
if ($v['id'] == $id) {
unset($this->db[$k]);
file_put_contents(getcwd().'/app/Models/db.json', json_encode($this->db, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE));

return $this->getCars();
}
}

return ['status' => false];
}

}
27 changes: 27 additions & 0 deletions app/Models/Marca.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
<?php

namespace App\Models;

class Marca {

private $db;

public function __construct()
{
$this->db = json_decode( file_get_contents(getcwd().'/app/Models/db.json') );
}

public function getBrands()
{
$marcas = array_map(function ($key) {
return $key->marca;
}, $this->db);

if ( is_array($marcas) ) {
return array_values( array_unique($marcas) );
}

return [];
}

}
62 changes: 62 additions & 0 deletions app/Models/db.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
[
{
"id": 1,
"marca": "HONDA",
"modelo": "CIVIC",
"ano": 2012
},
{
"id": 2,
"marca": "HONDA",
"modelo": "CITY",
"ano": 2013
},
{
"id": 3,
"marca": "FORD",
"modelo": "FOCUS",
"ano": 1334
},
{
"id": 4,
"marca": "ford",
"modelo": "ka sedan",
"ano": 1334
},
{
"id": 5,
"marca": "FORD",
"modelo": "FIESTA",
"ano": "1231"
},
{
"id": 6,
"marca": "ford",
"modelo": "ka sedan",
"ano": 1334
},
{
"id": 7,
"marca": "ford",
"modelo": "ka sedan",
"ano": 1334
},
{
"id": 8,
"marca": "ford",
"modelo": "ka sedan",
"ano": 1334
},
{
"id": 9,
"marca": "ford",
"modelo": "ka sedan",
"ano": 1334
},
{
"id": 10,
"marca": "ford",
"modelo": "ka sedan",
"ano": 1334
}
]
6 changes: 6 additions & 0 deletions bootstrap.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
<?php

date_default_timezone_set('America/Sao_Paulo');

require_once __DIR__.'/vendor/autoload.php';
require_once __DIR__.'/routes/api.php';
11 changes: 11 additions & 0 deletions composer.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
{
"name": "felipecaue-lb/estadao",
"type": "project",
"require": {},
"autoload": {
"psr-4": {
"App\\": "app/",
"Core\\": "core/"
}
}
}
Loading