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 :)