API: Controladores
1Introdução
Como visto na página de visão geral da API, vamos criar dois controladores, um para retornar a lista de tags, o outro oferecendo várias ações relacionadas a notas.
Como visto na configuração, estamos usando o plugin da API, que cuida da autenticação de acesso à API (com pares de chaves pública/privada). Após a autenticação, esse plugin fornece as variáveis de template currentUser e currentUserId, que podem ser usadas nos controladores.
Junto com o plugin, vamos usar o atributo Auth para garantir que todos os acessos aos controladores sejam corretamente autenticados.
2Controlador Tag
Este controlador é bem simples, oferecendo apenas uma ação.
<?php
use \Temma\Attributes\Auth as TµAuth;
/** Controlador Tag. */
#[TµAuth]
class Tag extends \Temma\Web\Controller {
/** Ação que retorna a lista de tags do usuário atual. */
public function list() {
$this['json'] = $this->_loader->NoteDao->getTags($this['currentUserId']);
}
}
- Linha 3: Definição de um atalho para o atributo Auth.
- Linha 6: Uso do atributo Auth, para que este controlador só possa ser usado com autenticação correta.
- Linha 7: Definição do controlador Tag.
- Linha 9: Definição da ação list.
- Linha 10: Recupera as tags vinculadas às notas do usuário atual. Essas tags são passadas para a visão JSON.
3Controlador Note
Este controlador contém todas as ações relativas ao gerenciamento de notas.
<?php
use \Temma\Attributes\Auth as TµAuth;
/** Controlador Note. */
#[TµAuth]
class Note extends \Temma\Web\Controller {
/** Retorna a lista de notas do usuário atual. */
public function list() {
$this['json'] = $this->_loader->NoteDao->getNotes($this['currentUserId']);
}
/** Retorna o resultado de uma busca baseada em critérios. */
public function search() {
$tag = $_GET['tag'] ?? null;
$title = $_GET['title'] ?? null;
$this['json'] = $this->_loader->NoteDao->searchNotes($this['currentUserId'],
$tag, $title);
}
/**
* Retorna os dados de uma nota.
* @param int $id Identificador da nota.
*/
public function get(int $id) {
$note = $this->_loader->NoteDao->getNote($id);
if ($note['userId'] != $this['currentUserId']) {
return $this->_httpError(403);
}
$this['json'] = $note;
}
/** Adiciona uma nova nota. */
public function add() {
// recuperação dos parâmetros
$title = $_GET['title'] ?? null;
$content = $_GET['content'] ?? null;
$tag = $_GET['tag'] ?? null;
if (isset($tag) && !is_array($tag))
$tag = [$tag];
// padronização das tags
$tags = array_map(function($t) {
return \Temma\Utils\Text::urlize($t);
}, $tag);
// adiciona a nota
$this['json'] = $this->_loader->NoteDao->create($this['currentUserId'],
$title, $content, $tags);
}
/**
* Atualiza uma nota.
* @param int $noteId Identificador da nota.
*/
public function update(int $noteId) {
// recuperação da nota
$note = $this->_loader->NoteDao->getNote($noteId);
// verificação da autorização
if ($note['userId'] != $this['currentUserId']) {
return $this->_httpError(403);
}
// recuperação dos parâmetros
$title = $_GET['title'] ?? null;
$content = $_GET['content'] ?? null;
$tag = $_GET['tag'] ?? null;
if (isset($tag) && !is_array($tag))
$tag = [$tag];
// atualização da nota
$this->_loader->NoteDao->update($noteId, $title, $content, $tag);
$this['json'] = true;
}
/**
* Apaga uma nota.
* @param int $noteId Identificador da nota.
*/
public function remove(int $noteId) {
// recuperação da nota
$note = $this->_loader->NoteDao->getNote($noteId);
// verificação da autorização
if ($note['userId'] != $this['currentUserId']) {
return $this->_httpError(403);
}
// exclusão da nota
$this->_loader->NoteDao->remove($noteId);
$this['json'] = true;
}
}