diff --git a/api/routes.xqm b/api/routes.xqm index 5d17e3d..df6a2f2 100644 --- a/api/routes.xqm +++ b/api/routes.xqm @@ -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"; (:~ @@ -33,15 +32,15 @@ function routes:entryPoint() { /api/dts/EntryPoint.jsonld /api/dts EntryPoint - /api/dts/collections + /api/dts/collection /api/dts/document /api/dts/navigation }; (:~ -: 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 @@ -49,7 +48,7 @@ function routes:entryPoint() { : @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") @@ -57,11 +56,21 @@ declare %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() }; (:~ @@ -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)) }; (:~ @@ -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 - ( - - - - - , - $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 + ( + + + + + , + $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) +}; \ No newline at end of file diff --git a/api/utils.xqm b/api/utils.xqm index 8a7db5a..de690a8 100644 --- a/api/utils.xqm +++ b/api/utils.xqm @@ -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() { + + {$G:root} + collection + {$G:rootTitle} + 0 + {utils:getContext("")} + +}; + (:~ : 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 @@ -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) { @@ -687,4 +697,4 @@ declare function utils:getChildMembers($projectName as xs:string, $resourceId as {$candidat} return $child -}; +}; \ No newline at end of file diff --git a/tests/launcher.xq b/tests/launcher.xq index 557cdee..2b75f37 100644 --- a/tests/launcher.xq +++ b/tests/launcher.xq @@ -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 :)