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;
    }
}