API: Controladores


1Introducción

Como vimos en la página de visión general de la API, vamos a crear dos controladores, uno para devolver la lista de etiquetas, y el otro que ofrece varias acciones relacionadas con las notas.

Como vimos en la configuración, estamos usando el plugin API, que se encarga de la autenticación de acceso a la API (con pares de claves pública/privada). Tras la autenticación, este plugin proporciona las variables de plantilla currentUser y currentUserId, que se pueden usar en los controladores.

Junto con el plugin, usaremos el atributo Auth para asegurarnos de que todos los accesos a los controladores estén correctamente autenticados.


2Controlador Tag

Este controlador es bastante simple, y ofrece una única acción.

<?php

use \Temma\Attributes\Auth as TµAuth;

/** Controlador Tag. */
#[TµAuth]
class Tag extends \Temma\Web\Controller {
    /** Acción que devuelve la lista de etiquetas del usuario actual. */
    public function list() {
        $this['json'] = $this->_loader->NoteDao->getTags($this['currentUserId']);
    }
}
  • Línea 3: Definición de un atajo para el atributo Auth.
  • Línea 6: Uso del atributo Auth, para que este controlador solo pueda usarse con autenticación correcta.
  • Línea 7: Definición del controlador Tag.
  • Línea 9: Definición de la acción list.
  • Línea 10: Recupera las etiquetas vinculadas a las notas del usuario actual. Estas etiquetas se pasan a la vista JSON.

3Controlador Note

Este controlador contiene todas las acciones relativas a la gestión de notas.

<?php

use \Temma\Attributes\Auth as TµAuth;

/** Controlador Note. */
#[TµAuth]
class Note extends \Temma\Web\Controller {
    /** Devuelve la lista de notas del usuario actual. */
    public function list() {
        $this['json'] = $this->_loader->NoteDao->getNotes($this['currentUserId']);
    }
    /** Devuelve el resultado de una búsqueda basada en criterios. */
    public function search() {
        $tag = $_GET['tag'] ?? null;
        $title = $_GET['title'] ?? null;
        $this['json'] = $this->_loader->NoteDao->searchNotes($this['currentUserId'],
                                                             $tag, $title);
    }
    /**
     * Devuelve los datos de una nota.
     * @param   int    $id   Identificador de la nota.
     */
    public function get(int $id) {
        $note = $this->_loader->NoteDao->getNote($id);
        if ($note['userId'] != $this['currentUserId']) {
            return $this->_httpError(403);
        }
        $this['json'] = $note;
    }
    /** Añade una nueva nota. */
    public function add() {
        // recuperación de los parámetros
        $title = $_GET['title'] ?? null;
        $content = $_GET['content'] ?? null;
        $tag = $_GET['tag'] ?? null;
        if (isset($tag) && !is_array($tag))
            $tag = [$tag];
        // estandarización de las etiquetas
        $tags = array_map(function($t) {
            return \Temma\Utils\Text::urlize($t);
        }, $tag);
        // añade la nota
        $this['json'] = $this->_loader->NoteDao->create($this['currentUserId'],
                                                        $title, $content, $tags);
    }
    /**
     * Actualiza una nota.
     * @param   int   $noteId   Identificador de la nota.
     */
    public function update(int $noteId) {
        // recuperación de la nota
        $note = $this->_loader->NoteDao->getNote($noteId);
        // comprobación de la autorización
        if ($note['userId'] != $this['currentUserId']) {
            return $this->_httpError(403);
        }
        // recuperación de los parámetros
        $title = $_GET['title'] ?? null;
        $content = $_GET['content'] ?? null;
        $tag = $_GET['tag'] ?? null;
        if (isset($tag) && !is_array($tag))
            $tag = [$tag];
        // actualización de la nota
        $this->_loader->NoteDao->update($noteId, $title, $content, $tag);
        $this['json'] = true;
    }
    /**
     * Elimina una nota.
     * @param   int   $noteId   Identificador de la nota.
     */
    public function remove(int $noteId) {
        // recuperación de la nota
        $note = $this->_loader->NoteDao->getNote($noteId);
        // comprobación de la autorización
        if ($note['userId'] != $this['currentUserId']) {
            return $this->_httpError(403);
        }
        // eliminación de la nota
        $this->_loader->NoteDao->remove($noteId);
        $this['json'] = true;
    }
}