X-Git-Url: http://nitlanguage.org?ds=sidebyside diff --git a/src/web/api_model.nit b/src/web/api_model.nit index 2b39462..31077c4 100644 --- a/src/web/api_model.nit +++ b/src/web/api_model.nit @@ -17,6 +17,7 @@ module api_model import web_base import highlight import uml +import model::model_index redef class APIRouter redef init do @@ -49,25 +50,35 @@ class APIList var k = req.string_arg("k") var mentities = new Array[MEntity] if k == "package" then - for mentity in view.mpackages do mentities.add mentity + for mentity in config.view.mpackages do mentities.add mentity else if k == "group" then - for mentity in view.mgroups do mentities.add mentity + for mentity in config.view.mgroups do mentities.add mentity else if k == "module" then - for mentity in view.mmodules do mentities.add mentity + for mentity in config.view.mmodules do mentities.add mentity else if k == "class" then - for mentity in view.mclasses do mentities.add mentity + for mentity in config.view.mclasses do mentities.add mentity else if k == "classdef" then - for mentity in view.mclassdefs do mentities.add mentity + for mentity in config.view.mclassdefs do mentities.add mentity else if k == "property" then - for mentity in view.mproperties do mentities.add mentity + for mentity in config.view.mproperties do mentities.add mentity else if k == "propdef" then - for mentity in view.mpropdefs do mentities.add mentity + for mentity in config.view.mpropdefs do mentities.add mentity else - for mentity in view.mentities do mentities.add mentity + for mentity in config.view.mentities do mentities.add mentity end 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") @@ -79,6 +90,7 @@ class APIList 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 @@ -90,14 +102,14 @@ end class APISearch super APIList - redef fun list_mentities(req) do + redef fun get(req, res) do var q = req.string_arg("q") - var mentities = new Array[MEntity] - if q == null then return mentities - for mentity in view.mentities do - if mentity.name.has_prefix(q) then mentities.add mentity + if q == null then + res.json new JsonArray + return end - return mentities + var n = req.int_arg("n") + res.json new JsonArray.from(config.view.find(q, n)) end end @@ -116,8 +128,8 @@ class APIRandom redef fun get(req, res) do var mentities = list_mentities(req) - mentities = limit_mentities(req, mentities) mentities = randomize_mentities(req, mentities) + mentities = limit_mentities(req, mentities) res.json new JsonArray.from(mentities) end end @@ -131,7 +143,7 @@ class APIEntity 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 @@ -143,11 +155,8 @@ class APIEntityInheritance redef fun get(req, res) do var mentity = mentity_from_uri(req, res) - if mentity == null then - res.error 404 - return - end - res.json mentity.hierarchy_poset(view)[mentity] + if mentity == null then return + res.json mentity.hierarchy_poset(config.view)[mentity] end end @@ -159,16 +168,15 @@ class APIEntityLinearization redef fun get(req, res) do var mentity = mentity_from_uri(req, res) - if mentity == null then - res.error 404 - return - end + if mentity == null then return var lin = mentity.collect_linearization(config.mainmodule) if lin == null then - res.error 404 + res.api_error(404, "No linearization for mentity `{mentity.full_name}`") return end - res.json new JsonArray.from(lin) + var mentities = new JsonArray + for e in lin do mentities.add e + res.json mentities end end @@ -176,24 +184,27 @@ 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) - var arr = new JsonArray + if mentity == null then return + var mentities: Array[MEntity] if mentity isa MModule then - for mclassdef in mentity.mclassdefs do arr.add mclassdef + mentities = mentity.mclassdefs else if mentity isa MClass then - for mclassdef in mentity.mclassdefs do arr.add mclassdef + mentities = mentity.mclassdefs else if mentity isa MClassDef then - for mpropdef in mentity.mpropdefs do arr.add mpropdef + mentities = mentity.mpropdefs else if mentity isa MProperty then - for mpropdef in mentity.mpropdefs do arr.add mpropdef + mentities = mentity.mpropdefs else - res.error 404 + 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 @@ -218,16 +229,17 @@ class APIEntityUML redef fun get(req, res) do var mentity = mentity_from_uri(req, res) + if mentity == null then return var dot if mentity isa MClassDef then mentity = mentity.mclass if mentity isa MClass then - var uml = new UMLModel(view, config.mainmodule) + var uml = new UMLModel(config.view, config.mainmodule) dot = uml.generate_class_uml.write_to_string else if mentity isa MModule then - var uml = new UMLModel(view, mentity) + var uml = new UMLModel(config.view, mentity) dot = uml.generate_package_uml.write_to_string else - res.error 404 + res.api_error(404, "No UML for mentity `{mentity.full_name}`") return end res.send render_dot(dot) @@ -245,7 +257,7 @@ class APIEntityCode if mentity == null then return var source = render_source(mentity) if source == null then - res.error 404 + res.api_error(404, "No code for mentity `{mentity.full_name}`") return end res.send source