API : Contrôleurs


1Présentation

Comme vu dans la page de présentation de l'API, nous allons créer deux contrôleurs, l'un servant à retourner la liste des tags, l'autre proposant plusieurs actions relatives aux notes.

Comme vu dans la configuration de l'API, nous utilisons le plugin API, qui prend en charge l'authentification des accès à l'API (avec des paires de clés publiques/privées). Après authentification, ce plugin met à disposition les variables de template currentUser et currentUserId, qui peuvent être utilisées dans les contrôleurs.

En conjonction avec le plugin, nous utiliserons l'attribut Auth pour nous assurer que tous les accès aux contrôleur sont correctement authentifiés.


2Contrôleur Tag

Ce contrôleur est assez simple dans la mesure où il ne propose qu'une seule action.

<?php

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

/** Contrôleur Tag. */
#[TµAuth]
class Tag extends \Temma\Web\Controller {
    /** Action qui retourne la liste des tags de l'utilisateur courant. */
    public function list() {
        $this['json'] = $this->_loader->NoteDao->getTags($this['currentUserId']);
    }
}
  • Ligne 3 : Définition d'un raccourci pour l'attribut Auth.
  • Ligne 6 : Utilisation de l'attribut Auth, pour que ce contrôleur ne soit utilisable qu'avec une authentification correcte.
  • Ligne 7 : Définition du contrôleur Tag.
  • Ligne 9 : Définition de l'action list.
  • Ligne 10 : Récupération des tags liés aux notes de l'utilisateur courant. Ces tags sont passés à la vue JSON.

3Contrôleur Note

Ce contrôleur contient toutes les actions relatives à la gestion des notes.

<?php

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

/** Contrôleur Note. */
#[TµAuth]
class Note extends \Temma\Web\Controller {
    /** Retourne la liste des notes de l'utilisateur courant. */
    public function list() {
        $this['json'] = $this->_loader->NoteDao->getNotes($this['currentUserId']);
    }
    /** Retourne le résultat d'une recherche à partir de critères. */
    public function search() {
        $tag = $_GET['tag'] ?? null;
        $title = $_GET['title'] ?? null;
        $this['json'] = $this->_loader->NoteDao->searchNotes($this['currentUserId'],
                                                             $tag, $title);
    }
    /**
     * Retourne les données d'une note.
     * @param   int    $id    Identifiant de la note.
     */
    public function get(int $id) {
        $note = $this->_loader->NoteDao->getNote($id);
        if ($note['userId'] != $this['currentUserId']) {
            return $this->_httpError(403);
        }
        $this['json'] = $note;
    }
    /** Ajoute une nouvelle note. */
    public function add() {
        // récupération des paramètres
        $title = $_GET['title'] ?? null;
        $content = $_GET['content'] ?? null;
        $tag = $_GET['tag'] ?? null;
        if (isset($tag) && !is_array($tag))
            $tag = [$tag];
        // normalisation des tags
        $tags = array_map(function($t) {
            return \Temma\Utils\Text::urlize($t);
        }, $tags);
        // ajout de la note
        $this['json'] = $this->_loader->NoteDao->create($this['currentUserId'],
                                                        $title, $content, $tag);
    }
    /**
     * Met à jour une note.
     * @param   int   $noteId   Identifiant de la note
     */
    public function update(int $noteId) {
        // récupération de la note
        $note = $this->_loader->NoteDao->getNote($id);
        // vérification de l'autorisation
        if ($note['userId'] != $this['currentUserId']) {
            return $this->_httpError(403);
        }
        // récupération des paramètres
        $title = $_GET['title'] ?? null;
        $content = $_GET['content'] ?? null;
        $tag = $_GET['tag'] ?? null;
        if (isset($tag) && !is_array($tag))
            $tag = [$tag];
        // mise à jour de la note
        $this->_loader->NoteDao->update($noteId, $title, $content, $tag);
        $this['json'] = true;
    }
    /**
     * Efface une note.
     * @param   int   $noteId   Identifiant de la note
     */
    public function remove(int $noteId) {
        // récupération de la note
        $note = $this->_loader->NoteDao->getNote($id);
        // vérification de l'autorisation
        if ($note['userId'] != $this['currentUserId']) {
            return $this->_httpError(403);
        }
        // effacement de la note
        $this->_loader->NoteDao->remove($noteId);
        $this['json'] = true;
    }
}