Observação: Este tutorial refere-se ao Laravel-4-BETA, estando totalmente DESATUALIZADO para a versão atual. Muita coisa mudou no framework…
Agora precisamos refatorar as tasks.
O que aconteceu na evolução do nosso aplicativo foi o seguinte: nasceram as tasks.
Depois nasceram as listas.
As listas viraram pai (ou mãe) das tasks.
E ai nasceu o usuário.
O usuário passou a ser pai das listas e, no sentido da coisa, avô das tasks.
Já refatoramos as listas para que o usuário só possa ver e alterar as listas que são suas.
Agora vamos refatorar as tasks para os usuários só poderem ver e alterar as tasks que são suas (ou o mais difícil, tasks que são das listas que são suas).
Controller
No TaskController temos 3 métodos muito importantes: getAdd para mostrar a página com o formulário para criarmos uma task, postAdd para receber o formulário e criar a task e check para marcar a task como concluída.
Os dois primeiros métodos são os mais simples de resolver e daremos a mesma solução para os dois.
Farei a alteração, tomando como exemplo o getAdd, e fica como dever de casa para vocês alterar o postAdd.
public function getAdd($lista_id) { //verifica se a lista existe if ( Lista::findOrFail($lista_id)->usuario->id != Auth::user()->id ) return Redirect::to('list'); return View::make('add_task')->with('lista_id', $lista_id); }
O que eu fiz foi o seguinte: onde tinhamos Lista::findOrFail($lista_id), que verifica se a lista passada existe, coloquei o if com o redirect que está ai no código.
O novo if ainda verifica se a lista existe.
Ele também aproveita, se a lista existir, pega o usuário que é dono da lista e verifica se o id dele é o mesmo do usuário logado.
No postAdd é só fazer a mesma coisa.
Atualizando o Model
Vamos fazer algo bem legal agora.
Imagine que você quer pegar o id do usuário que é dono da task.
O comando é (mais ou menos) Task::lista->usuario->id.
Facinho.
Mas se quisessemos deixar nosso código mais legível ainda, e assim mais legalzudo?
#comofas?
Vamos criar um método dentro do model/Task.php:
public function getUsuarioId() { return $this->lista->usuario->id; }
Agora, para pegarmos o id do usuário que é “dono” da task basta fazermos Task::getUsuarioId().
Quer ver em prática?
Refatorando o Método Check
Vamos refatorar o método Check para verificar se o dono da task é o usuário logado.
Para isso, vamos alterar o bloco try/catch da linha 57.
try { $task = Task::findOrFail(Input::get('task_id')); if ($task->getUsuarioId() != Auth::user()->id) throw new Exception("você não é o dono dessa task"); $task->status = TRUE; $task->save(); return Response::json( array("status" => TRUE, "titulo" => $task->titulo) ); }
O nosso novo getUserId está lá, bem legal, na linha 60.
Ficou legal, né?
Refatoramos bem boladamente nosso código!
O código fonte do projeto encontra-se no GitHub:
https://github.com/frenetic/todovel