Skip to content

Commit

Permalink
met à jour les réponses http des endpoints
Browse files Browse the repository at this point in the history
  • Loading branch information
philippepons committed Mar 7, 2024
1 parent 4c858ab commit e680e67
Show file tree
Hide file tree
Showing 3 changed files with 95 additions and 53 deletions.
118 changes: 75 additions & 43 deletions api/routes.xqm
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,7 @@ import module namespace functx = "http://www.functx.com";
import module namespace G = "https://github.com/chartes/dots/globals" at "../globals.xqm";
import module namespace utils = "https://github.com/chartes/dots/api/utils" at "utils.xqm";

import module namespace openapi="https://lab.sub.uni-goettingen.de/restxqopenapi" at "../../content/openapi.xqm";

declare namespace dots = "https://github.com/chartes/dots/";
declare namespace tei = "http://www.tei-c.org/ns/1.0";

(:~
Expand All @@ -33,35 +32,45 @@ function routes:entryPoint() {
<pair name="@context">/api/dts/EntryPoint.jsonld</pair>
<pair name="@id">/api/dts</pair>
<pair name="@type">EntryPoint</pair>
<pair name="collections">/api/dts/collections</pair>
<pair name="collection">/api/dts/collection</pair>
<pair name="documents">/api/dts/document</pair>
<pair name="navigation">/api/dts/navigation</pair>
</json>
};

(:~
: Cette fonction gère le endpoint Collections. Elle dispatche vers les fonctions permettant de donner les informations concernants la/les collection(s) DTS existante(s) si le paramètre $id n'est pas précisé. Sinon, les informations concernant la collection DTS identifiée par le paramètre $id
: @return réponse JSON pour le endpoints Collections de la spécification d'API DTS
: Cette fonction gère le endpoint Collection. Elle dispatche vers les fonctions permettant de donner les informations concernants la/les collection(s) DTS existante(s) si le paramètre $id n'est pas précisé. Sinon, les informations concernant la collection DTS identifiée par le paramètre $id
: @return réponse JSON pour le endpoints Collection de la spécification d'API DTS
: @param $id chaîne de caractère qui permet d'identifier une collection DTS
: @param $nav chaîne de caractère dont la valeur est children (par défaut) ou parents. Ce paramètre permet de définir si les membres à lister sont les enfants ou les parents
: @see https://distributed-text-services.github.io/specifications/Collections-Endpoint.html
: @see utils.xqm;utils:collectionById
: @see utils.xqm;utils:collections
:)
declare
%rest:path("/api/dts/collections")
%rest:path("/api/dts/collection")
%rest:GET
%output:method("json")
%rest:produces("application/ld+json")
%output:json("format=attributes")
%rest:query-param("id", "{$id}", "")
%rest:query-param("nav", "{$nav}", "")
function routes:collections($id as xs:string, $nav as xs:string) {
if ($id)
then
utils:collectionById($id, $nav)
else
utils:collections()
if (db:exists($G:dots))
then
if ($id)
then
let $dbName := normalize-space(db:get($G:dots)//dots:member/node()[@dtsResourceId = $id]/@dbName)
return
if ($dbName != "")
then
utils:collectionById($id, $nav)
else
routes:badIdResource(xs:string($id))
else
utils:collections()
else
utils:noCollection()
};

(:~
Expand All @@ -86,7 +95,12 @@ declare
%rest:query-param("end", "{$end}", "")
%rest:query-param("down", "{$down}", 0)
function routes:navigation($id as xs:string, $ref as xs:string, $start as xs:string, $end as xs:string, $down as xs:integer) {
utils:navigation($id, $ref, $start, $end, $down)
let $dbName := normalize-space(db:get($G:dots)//dots:member/node()[@dtsResourceId = $id]/@dbName)
return
if ($dbName != "")
then utils:navigation($id, $ref, $start, $end, $down)
else
routes:badIdResource(xs:string($id))
};

(:~
Expand All @@ -110,39 +124,57 @@ declare
%rest:query-param("end", "{$end}", "")
%rest:query-param("format", "{$format}", "")
function routes:document($id as xs:string, $ref as xs:string, $start as xs:string, $end as xs:string, $format as xs:string) {
let $ref := if ($ref) then $ref else ""
let $start := if ($start) then $start else ""
let $end := if ($end) then $end else ""
let $result := utils:document($id, $ref, $start, $end)
let $dbName := normalize-space(db:get($G:dots)//dots:member/node()[@dtsResourceId = $id]/@dbName)
return
if ($format)
if ($dbName != "")
then
let $f :=
switch ($format)
case ($format[. = "html"]) return "text/html;"
case ($format[. = "txt"]) return "text/plain"
default return "xml"
let $style := concat($G:webapp, $G:xsl)
let $project := db:get($G:dots)//node()[@dtsResourceId = $id]/@dbName
let $doc :=
if (db:get($project)/tei:TEI[@xml:id = $id])
then db:get($project)/tei:TEI[@xml:id = $id]
else
db:get($project, $id)/tei:TEI
let $trans :=
if ($format = "html")
then
xslt:transform($result, $style)
else $result
let $ref := if ($ref) then $ref else ""
let $start := if ($start) then $start else ""
let $end := if ($end) then $end else ""
let $result := utils:document($id, $ref, $start, $end)
return
(
<rest:response>
<http:response status="200">
<http:header name="Content-Type" value="{concat($f, ' charset=utf-8')}"/>
</http:response>
</rest:response>,
$trans
)
if ($format)
then
let $f :=
switch ($format)
case ($format[. = "html"]) return "text/html;"
case ($format[. = "txt"]) return "text/plain"
default return "application/xml"
let $style := concat($G:webapp, $G:xsl)
let $project := db:get($G:dots)//node()[@dtsResourceId = $id]/@dbName
let $doc :=
if (db:get($project)/tei:TEI[@xml:id = $id])
then db:get($project)/tei:TEI[@xml:id = $id]
else
db:get($project, $id)/tei:TEI
let $trans :=
if ($format = "html")
then
xslt:transform($result, $style)
else $result
return
(
<rest:response>
<http:response status="200">
<http:header name="Content-Type" value="{concat($f, ' charset=utf-8')}"/>
</http:response>
</rest:response>,
$trans
)
else
$result
else
$result
routes:badIdResource(xs:string($id))
};

declare
%rest:error("err:badIdResource")
%rest:error-param("description", "{$id}")
function routes:badIdResource($id) {
let $message :=
if ($id)
then concat("Error 400 : resource ID ", "'", $id, "' not found")
else "Error 400 : no resource ID specified"
return
web:error(400, $message)
};
20 changes: 15 additions & 5 deletions api/utils.xqm
Original file line number Diff line number Diff line change
Expand Up @@ -19,15 +19,25 @@ declare namespace dct = "http://purl.org/dc/terms/";
declare namespace tei = "http://www.tei-c.org/ns/1.0";

(:~
: Cette variable permet de choisir l'identifiant d'une collection "racine" (pour le endpoint Collections sans paramètre d'identifiant)
: @todo pouvoir choisir l'identifiant de collection Route à un autre endroit? (le title du endpoint collections sans paramètres)
: Cette variable permet de choisir l'identifiant d'une collection "racine" (pour le endpoint Collection sans paramètre d'identifiant)
: @todo pouvoir choisir l'identifiant de collection Route à un autre endroit? (le title du endpoint collection sans paramètres)
: à déplacer dans globals.xqm ou dans un CLI?
:)

(: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Fonctions d'entrée dans le endPoint "Collections" de l'API DTS
Fonctions d'entrée dans le endPoint "Collection" de l'API DTS
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~:)

declare function utils:noCollection() {
<json type="object">
<pair name="@id">{$G:root}</pair>
<pair name="@type">collection</pair>
<pair name="title">{$G:rootTitle}</pair>
<pair name="totalItems" type="number">0</pair>
{utils:getContext("")}
</json>
};

(:~
: Cette fonction permet de lister les collections DTS dépendant d'une collection racine $utils:root.
: @return réponse donnée en XML pour être sérialisée en JSON selon le format "attributes" proposé par BaseX
Expand Down Expand Up @@ -542,7 +552,7 @@ declare function utils:getStringJson($key as xs:string, $metadata) {
: Cette fonction permet de donner la liste des vocabulaires présents dans la réponse à la requête d'API
: @return réponse XML, pour être ensuite sérialisées en JSON (format: attributes)
: @param $response séquence XML pour trouver les namespaces présents (si nécessaire)
: @todo revoir cette fonction et la gestion des namespace?
: @todo utiliser la fonction namespace:uri() pour une meilleur gestion des namespaces?
:)
declare function utils:getContext($response) {
<pair name="@context" type="object">
Expand Down Expand Up @@ -687,4 +697,4 @@ declare function utils:getChildMembers($projectName as xs:string, $resourceId as
<test>{$candidat}</test>
return
$child
};
};
10 changes: 5 additions & 5 deletions tests/launcher.xq
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,9 @@ import module namespace test = "https://github.com/chartes/dots/tests" at "utils
import module namespace initTests = "https://github.com/chartes/dots/initTests" at "initTestsEndpoint.xqm";


(: :)
initTests:check-value-response200("http://localhost:8080/api/dts"),
initTests:check-value-response200("http://localhost:8080/api/dts/collection"),
initTests:check-value-response400("http://localhost:8080/api/dts/navigation"),
initTests:check-value-response400("http://localhost:8080/api/dts/document")
(: Lance les tests pour vérifier que la base du résolveur DTS est opérationnelle :)
initTests:check-value-response200("http://localhost:8080/api/dts"), (: le entrypoint doit renvoyer une réponse 200 :)
initTests:check-value-response200("http://localhost:8080/api/dts/collection"), (: le endpoint collection doit renvoyer une réponse 200 :)
initTests:check-value-response400("http://localhost:8080/api/dts/navigation"),
initTests:check-value-response400("http://localhost:8080/api/dts/document") (: les endpoints navigation et document ne peuvent pas être opérationnels avant la création d'un projet-racine. La réponse correctement paramétrée est donc une erreur 400 :)

0 comments on commit e680e67

Please sign in to comment.