use("/search", new APISearch(config))
use("/random", new APIRandom(config))
use("/entity/:id", new APIEntity(config))
+ use("/entity/:id/doc", new APIEntityDoc(config))
use("/code/:id", new APIEntityCode(config))
use("/uml/:id", new APIEntityUML(config))
use("/linearization/:id", new APIEntityLinearization(config))
return mentities
end
+ # Sort mentities by lexicographic order
+ #
+ # TODO choose order from request
+ fun sort_mentities(req: HttpRequest, mentities: Array[MEntity]) : Array[MEntity] do
+ var sorted = mentities.to_a
+ var sorter = new MEntityNameSorter
+ sorter.sort(sorted)
+ return sorted
+ end
+
# Limit mentities depending on the `n` parameter.
fun limit_mentities(req: HttpRequest, mentities: Array[MEntity]): Array[MEntity] do
var n = req.int_arg("n")
redef fun get(req, res) do
var mentities = list_mentities(req)
+ mentities = sort_mentities(req, mentities)
mentities = limit_mentities(req, mentities)
res.json new JsonArray.from(mentities)
end
super APIList
redef fun get(req, res) do
- var q = req.string_arg("q")
- if q == null then
- res.json new JsonArray
+ var query = req.string_arg("q")
+ if query == null then
+ res.api_error(400, "Missing search string")
return
end
- var n = req.int_arg("n")
- res.json new JsonArray.from(config.view.find(q, n))
+ var page = req.int_arg("p")
+ var limit = req.int_arg("n")
+ var response = new JsonArray.from(search(query, limit))
+ res.json paginate(response, response.length, page, limit)
+ end
+
+ fun search(query: String, limit: nullable Int): Array[MEntity] do
+ return config.view.find(query)
end
end
redef fun get(req, res) do
var mentity = mentity_from_uri(req, res)
if mentity == null then return
- res.json mentity.api_json(self)
+ res.raw_json mentity.to_full_json
+ end
+end
+
+# Return the full MDoc of a MEntity.
+#
+# Example: `GET /entity/core::Array/doc`
+class APIEntityDoc
+ super APIHandler
+
+ redef fun get(req, res) do
+ var mentity = mentity_from_uri(req, res)
+ if mentity == null then return
+
+ var obj = new JsonObject
+ var mdoc = mentity.mdoc_or_fallback
+ if mdoc != null then
+ obj["documentation"] = mdoc.html_documentation.write_to_string
+ obj["location"] = mdoc.location
+ end
+ res.json obj
end
end
return
end
var mentities = new JsonArray
- for e in lin do mentities.add e.full_json
+ for e in lin do mentities.add e
res.json mentities
end
end
#
# Example: `GET /defs/core::Array`
class APIEntityDefs
- super APIHandler
+ super APIList
redef fun get(req, res) do
var mentity = mentity_from_uri(req, res)
if mentity == null then return
- var arr = new JsonArray
- if mentity isa MModule then
- for mclassdef in mentity.mclassdefs do arr.add mclassdef
+ var mentities = new Array[MEntity]
+ if mentity isa MPackage then
+ mentities.add_all mentity.collect_mgroups(config.view)
+ mentities.add_all mentity.collect_mmodules(config.view)
+ else if mentity isa MGroup then
+ mentities.add_all mentity.collect_mgroups(config.view)
+ mentities.add_all mentity.collect_mmodules(config.view)
+ else if mentity isa MModule then
+ mentities.add_all mentity.collect_local_mclassdefs(config.view)
else if mentity isa MClass then
- for mclassdef in mentity.mclassdefs do arr.add mclassdef
+ mentities.add_all mentity.collect_mclassdefs(config.view)
else if mentity isa MClassDef then
- for mpropdef in mentity.mpropdefs do arr.add mpropdef
+ mentities.add_all mentity.collect_mpropdefs(config.view)
else if mentity isa MProperty then
- for mpropdef in mentity.mpropdefs do arr.add mpropdef
+ mentities.add_all mentity.collect_mpropdefs(config.view)
else
res.api_error(404, "No definition list for mentity `{mentity.full_name}`")
return
end
- res.json arr
+ mentities = sort_mentities(req, mentities)
+ mentities = limit_mentities(req, mentities)
+ res.json new JsonArray.from(mentities)
end
end