nitweb: migrate /entity?json to /api/entity
[nit.git] / src / web / web_base.nit
1 # This file is part of NIT ( http://www.nitlanguage.org ).
2 #
3 # Licensed under the Apache License, Version 2.0 (the "License");
4 # you may not use this file except in compliance with the License.
5 # You may obtain a copy of the License at
6 #
7 # http://www.apache.org/licenses/LICENSE-2.0
8 #
9 # Unless required by applicable law or agreed to in writing, software
10 # distributed under the License is distributed on an "AS IS" BASIS,
11 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 # See the License for the specific language governing permissions and
13 # limitations under the License.
14
15 # Base classes used by `nitweb`.
16 module web_base
17
18 import model::model_views
19 import model::model_json
20 import doc_down
21 import popcorn
22
23 # Specific nitcorn Action that uses a Model
24 class ModelHandler
25 super Handler
26
27 # Model to use.
28 var model: Model
29
30 # MModule used to flatten model.
31 var mainmodule: MModule
32
33 # Find the MEntity ` with `full_name`.
34 fun find_mentity(model: ModelView, full_name: nullable String): nullable MEntity do
35 if full_name == null then return null
36 return model.mentity_by_full_name(full_name.from_percent_encoding)
37 end
38
39 # Init the model view from the `req` uri parameters.
40 fun init_model_view(req: HttpRequest): ModelView do
41 var view = new ModelView(model)
42 var show_private = req.bool_arg("private") or else false
43 if not show_private then view.min_visibility = protected_visibility
44
45 view.include_fictive = req.bool_arg("fictive") or else false
46 view.include_empty_doc = req.bool_arg("empty-doc") or else true
47 view.include_test_suite = req.bool_arg("test-suite") or else false
48 view.include_attribute = req.bool_arg("attributes") or else true
49
50 return view
51 end
52 end
53
54 # A NitView is rendered by an action.
55 interface NitView
56 # Renders this view and returns something that can be written to a HTTP response.
57 fun render: Writable is abstract
58 end
59
60 redef class HttpResponse
61 # Render a NitView as response.
62 fun send_view(view: NitView, status: nullable Int) do send(view.render, status)
63 end
64
65 redef class MEntity
66
67 # URL to `self` within the web interface.
68 fun web_url: String is abstract
69
70 # URL to `self` within the JSON api.
71 fun api_url: String do return "/api/entity/" / full_name
72
73 redef fun json do
74 var obj = super
75 obj["web_url"] = web_url
76 obj["api_url"] = api_url
77 return obj
78 end
79
80 # Get the full json repesentation of `self` with MEntityRefs resolved.
81 fun api_json(handler: ModelHandler): JsonObject do return json
82 end
83
84 redef class MEntityRef
85 redef fun json do
86 var obj = super
87 obj["web_url"] = mentity.web_url
88 obj["api_url"] = mentity.api_url
89 obj["name"] = mentity.name
90 obj["mdoc"] = mentity.mdoc_or_fallback
91 obj["visibility"] = mentity.visibility
92 obj["location"] = mentity.location
93 var modifiers = new JsonArray
94 for modifier in mentity.collect_modifiers do
95 modifiers.add modifier
96 end
97 obj["modifiers"] = modifiers
98 return obj
99 end
100 end
101
102 redef class MDoc
103
104 # Add doc down processing
105 redef fun json do
106 var obj = super
107 obj["synopsis"] = synopsis
108 obj["documentation"] = documentation
109 obj["comment"] = comment
110 obj["html_synopsis"] = html_synopsis.write_to_string
111 obj["html_documentation"] = html_documentation.write_to_string
112 obj["html_comment"] = html_comment.write_to_string
113 return obj
114 end
115 end
116
117 redef class MPackage
118 redef var web_url = "/package/{full_name}" is lazy
119 end
120
121 redef class MGroup
122 redef var web_url = "/group/{full_name}" is lazy
123 end
124
125 redef class MModule
126 redef var web_url = "/module/{full_name}" is lazy
127
128 redef fun api_json(handler) do
129 var obj = super
130 obj["intro_mclassdefs"] = to_mentity_refs(collect_intro_mclassdefs(private_view))
131 obj["redef_mclassdefs"] = to_mentity_refs(collect_redef_mclassdefs(private_view))
132 obj["imports"] = to_mentity_refs(in_importation.direct_greaters)
133 return obj
134 end
135 end
136
137 redef class MClass
138 redef var web_url = "/class/{full_name}" is lazy
139
140 redef fun api_json(handler) do
141 var obj = super
142 obj["all_mproperties"] = to_mentity_refs(collect_accessible_mproperties(private_view))
143 obj["intro_mproperties"] = to_mentity_refs(collect_intro_mproperties(private_view))
144 obj["redef_mproperties"] = to_mentity_refs(collect_redef_mproperties(private_view))
145 var poset = hierarchy_poset(handler.mainmodule, private_view)
146 obj["parents"] = to_mentity_refs(poset[self].direct_greaters)
147 return obj
148 end
149 end
150
151 redef class MClassDef
152 redef var web_url = "/classdef/{full_name}" is lazy
153
154 redef fun json do
155 var obj = super
156 obj["intro"] = to_mentity_ref(mclass.intro)
157 obj["mpackage"] = to_mentity_ref(mmodule.mpackage)
158 return obj
159 end
160
161 redef fun api_json(handler) do
162 var obj = super
163 obj["intro_mpropdefs"] = to_mentity_refs(collect_intro_mpropdefs(private_view))
164 obj["redef_mpropdefs"] = to_mentity_refs(collect_redef_mpropdefs(private_view))
165 return obj
166 end
167 end
168
169 redef class MProperty
170 redef var web_url = "/property/{full_name}" is lazy
171
172 redef fun json do
173 var obj = super
174 obj["intro_mclass"] = to_mentity_ref(intro_mclassdef.mclass)
175 obj["mpackage"] = to_mentity_ref(intro_mclassdef.mmodule.mpackage)
176 return obj
177 end
178 end
179
180 redef class MPropDef
181 redef var web_url = "/propdef/{full_name}" is lazy
182
183 redef fun json do
184 var obj = super
185 obj["intro"] = to_mentity_ref(mproperty.intro)
186 obj["intro_mclassdef"] = to_mentity_ref(mproperty.intro.mclassdef)
187 obj["mmodule"] = to_mentity_ref(mclassdef.mmodule)
188 obj["mgroup"] = to_mentity_ref(mclassdef.mmodule.mgroup)
189 obj["mpackage"] = to_mentity_ref(mclassdef.mmodule.mpackage)
190 return obj
191 end
192 end
193
194 redef class MClassType
195 redef var web_url = mclass.web_url is lazy
196 end
197
198 redef class MNullableType
199 redef var web_url = mtype.web_url is lazy
200 end
201
202 redef class MParameterType
203 redef var web_url = mclass.web_url is lazy
204 end
205
206 redef class MVirtualType
207 redef var web_url = mproperty.web_url is lazy
208 end