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