From: Alexandre Terrasa Date: Tue, 19 Apr 2016 01:20:38 +0000 (-0400) Subject: web: redefine model_json for API ready json objets of Model X-Git-Url: http://nitlanguage.org web: redefine model_json for API ready json objets of Model Signed-off-by: Alexandre Terrasa --- diff --git a/src/nitweb.nit b/src/nitweb.nit index c055ee9..8757a30 100644 --- a/src/nitweb.nit +++ b/src/nitweb.nit @@ -49,11 +49,11 @@ private class NitwebPhase var app = new App app.use("/random", new RandomAction(model)) - app.use("/doc/:namespace", new DocAction(model, modelbuilder)) + app.use("/doc/:namespace", new DocAction(model, mainmodule, modelbuilder)) app.use("/code/:namespace", new CodeAction(model, modelbuilder)) app.use("/search/:namespace", new SearchAction(model)) app.use("/uml/:namespace", new UMLDiagramAction(model, mainmodule)) - app.use("/", new TreeAction(model)) + app.use("/", new TreeAction(model, mainmodule)) app.listen(host, port.to_i) end diff --git a/src/web/web_base.nit b/src/web/web_base.nit index 258ec60..6060768 100644 --- a/src/web/web_base.nit +++ b/src/web/web_base.nit @@ -17,6 +17,7 @@ module web_base import model::model_views import model::model_json +import doc_down import popcorn # Specific nitcorn Action that uses a Model @@ -26,6 +27,9 @@ class ModelAction # Model to use. var model: Model + # MModule used to flatten model. + var mainmodule: MModule + # Find the MEntity ` with `full_name`. fun find_mentity(model: ModelView, full_name: nullable String): nullable MEntity do if full_name == null then return null @@ -64,3 +68,148 @@ redef class HttpRequest # Checks the URL get parameter `?json=true`. fun is_json_asked: Bool do return bool_arg("json") or else false end + +redef class MEntity + + # URL to `self` within the web interface. + fun web_url: String is abstract + + # URL to `self` within the JSON api. + fun api_url: String do return "/api/entity/" / full_name + + redef fun json do + var obj = super + obj["web_url"] = web_url + obj["api_url"] = api_url + return obj + end + + # Get the full json repesentation of `self` with MEntityRefs resolved. + fun api_json(handler: ModelHandler): JsonObject do return json +end + +redef class MEntityRef + redef fun json do + var obj = super + obj["web_url"] = mentity.web_url + obj["api_url"] = mentity.api_url + obj["name"] = mentity.name + obj["mdoc"] = mentity.mdoc_or_fallback + obj["visibility"] = mentity.visibility + obj["location"] = mentity.location + var modifiers = new JsonArray + for modifier in mentity.collect_modifiers do + modifiers.add modifier + end + obj["modifiers"] = modifiers + return obj + end +end + +redef class MDoc + + # Add doc down processing + redef fun json do + var obj = super + obj["synopsis"] = synopsis + obj["documentation"] = documentation + obj["comment"] = comment + obj["html_synopsis"] = html_synopsis.write_to_string + obj["html_documentation"] = html_documentation.write_to_string + obj["html_comment"] = html_comment.write_to_string + return obj + end +end + +redef class MPackage + redef var web_url = "/package/{full_name}" is lazy +end + +redef class MGroup + redef var web_url = "/group/{full_name}" is lazy +end + +redef class MModule + redef var web_url = "/module/{full_name}" is lazy + + redef fun api_json(handler) do + var obj = super + obj["intro_mclassdefs"] = to_mentity_refs(collect_intro_mclassdefs(private_view)) + obj["redef_mclassdefs"] = to_mentity_refs(collect_redef_mclassdefs(private_view)) + obj["imports"] = to_mentity_refs(in_importation.direct_greaters) + return obj + end +end + +redef class MClass + redef var web_url = "/class/{full_name}" is lazy + + redef fun api_json(handler) do + var obj = super + obj["all_mproperties"] = to_mentity_refs(collect_accessible_mproperties(private_view)) + obj["intro_mproperties"] = to_mentity_refs(collect_intro_mproperties(private_view)) + obj["redef_mproperties"] = to_mentity_refs(collect_redef_mproperties(private_view)) + var poset = hierarchy_poset(handler.mainmodule, private_view) + obj["parents"] = to_mentity_refs(poset[self].direct_greaters) + return obj + end +end + +redef class MClassDef + redef var web_url = "/classdef/{full_name}" is lazy + + redef fun json do + var obj = super + obj["intro"] = to_mentity_ref(mclass.intro) + obj["mpackage"] = to_mentity_ref(mmodule.mpackage) + return obj + end + + redef fun api_json(handler) do + var obj = super + obj["intro_mpropdefs"] = to_mentity_refs(collect_intro_mpropdefs(private_view)) + obj["redef_mpropdefs"] = to_mentity_refs(collect_redef_mpropdefs(private_view)) + return obj + end +end + +redef class MProperty + redef var web_url = "/property/{full_name}" is lazy + + redef fun json do + var obj = super + obj["intro_mclass"] = to_mentity_ref(intro_mclassdef.mclass) + obj["mpackage"] = to_mentity_ref(intro_mclassdef.mmodule.mpackage) + return obj + end +end + +redef class MPropDef + redef var web_url = "/propdef/{full_name}" is lazy + + redef fun json do + var obj = super + obj["intro"] = to_mentity_ref(mproperty.intro) + obj["intro_mclassdef"] = to_mentity_ref(mproperty.intro.mclassdef) + obj["mmodule"] = to_mentity_ref(mclassdef.mmodule) + obj["mgroup"] = to_mentity_ref(mclassdef.mmodule.mgroup) + obj["mpackage"] = to_mentity_ref(mclassdef.mmodule.mpackage) + return obj + end +end + +redef class MClassType + redef var web_url = mclass.web_url is lazy +end + +redef class MNullableType + redef var web_url = mtype.web_url is lazy +end + +redef class MParameterType + redef var web_url = mclass.web_url is lazy +end + +redef class MVirtualType + redef var web_url = mproperty.web_url is lazy +end