xymus.net: update xymus.net nitcorn config to include an opportunity client
[nit.git] / examples / nitcorn / src / xymus_net.nit
1 # This file is part of NIT ( http://www.nitlanguage.org ).
2 #
3 # Copyright 2014 Alexis Laferrière <alexis.laf@xymus.net>
4 #
5 # Licensed under the Apache License, Version 2.0 (the "License");
6 # you may not use this file except in compliance with the License.
7 # You may obtain a copy of the License at
8 #
9 # http://www.apache.org/licenses/LICENSE-2.0
10 #
11 # Unless required by applicable law or agreed to in writing, software
12 # distributed under the License is distributed on an "AS IS" BASIS,
13 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 # See the License for the specific language governing permissions and
15 # limitations under the License.
16
17 # Configuration of the Web server of xymus.net
18 module xymus_net
19
20 import nitcorn
21 import privileges
22
23 # Use actions defined by contribs
24 import tnitter
25 import benitlux_controller
26 import opportunity_controller
27
28 # Header for the whole site
29 class MasterHeader
30 super Template
31
32 # Current page id, is used to set the `active` class on the header tab
33 var page: nullable String
34
35 # Make room for a login or logout placeholder (used by tnitter)
36 var login_placeholder: Bool
37
38 redef fun rendering
39 do
40 var actives = new HashMap[String, String]
41 var page = page
42 if page != null then actives[page] = " class=\"active\""
43
44 add """
45 <nav class="navbar navbar-default" role="navigation">
46 <div class="container-fluid">
47 <div class="navbar-header">
48 <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1">
49 <span class="sr-only">Toggle navigation</span>
50 <span class="icon-bar"></span>
51 <span class="icon-bar"></span>
52 <span class="icon-bar"></span>
53 </button>
54 <a class="navbar-brand" href="http://xymus.net/">Xymus.net</a>
55 </div>
56
57 <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
58 <ul class="nav navbar-nav">
59 <li{{{actives.get_or_default("ens", "")}}}><a href="http://xymus.net/ens/">Enseignement</a></li>
60 <li><a href="http://pep8.xymus.net/">Pep/8 Analysis</a></li>
61 <li{{{actives.get_or_default("tnitter", "")}}}><a href="http://tnitter.xymus.net/">Tnitter</a></li>
62 <li{{{actives.get_or_default("benitlux", "")}}}><a href="http://benitlux.xymus.net/">Benitlux</a></li>
63 <li><a href="http://nitlanguage.org/">Nit</a></li>
64 </ul>
65
66 <ul class="nav navbar-nav pull-right">
67 """
68 if login_placeholder then add "%header_right%"
69
70 add """
71 </ul>
72 </div>
73 </div>
74 </nav>"""
75 end
76
77 redef fun to_s do return write_to_string
78 end
79
80 redef class Tnitter
81 redef var header: String = (new MasterHeader("tnitter", true)).to_s
82 end
83
84 redef class BenitluxDocument
85 redef var header = new MasterHeader("benitlux", false)
86 end
87
88 redef class ErrorTemplate
89 redef var header = new MasterHeader(null, false)
90 end
91
92 # Avoid executing when running tests
93 if "NIT_TESTING".environ == "true" then exit 0
94
95 # Setup server interfaces
96 #
97 # Change these to use this config on your own server!
98 var default_vh = new VirtualHost("xymus.net:80")
99 var vps_vh = new VirtualHost("vps.xymus.net:80")
100 var tnitter_vh = new VirtualHost("tnitter.xymus.net:80")
101 var pep8_vh = new VirtualHost("pep8.xymus.net:80")
102 var benitlux_vh = new VirtualHost("benitlux.xymus.net:80")
103
104 var factory = new HttpFactory.and_libevent
105 factory.config.virtual_hosts.add default_vh
106 factory.config.virtual_hosts.add vps_vh
107 factory.config.virtual_hosts.add tnitter_vh
108 factory.config.virtual_hosts.add pep8_vh
109 factory.config.virtual_hosts.add benitlux_vh
110
111 # Ports are open, drop to a low-privileged user if we are root
112 var user_group = new UserGroup("nitcorn", "nitcorn")
113 if sys.uid == 0 then user_group.drop_privileges
114
115 # Tnitter is available at `tnitter.xymus.net` and `xymus.net/tnitter/`
116 var tnitter = new Tnitter
117 default_vh.routes.add new Route("/tnitter/", tnitter)
118 tnitter_vh.routes.add new Route(null, tnitter)
119
120 # Pep/8 Analysis is only a file server. It is available at `pep8.xymus.net`
121 # and through the global/default file server at `xymus.net/pep8/`
122 #
123 # TODO Implement pep8analysis server-side with a nitcorn action
124 pep8_vh.routes.add new Route(null, new FileServer("/var/www/pep8/"))
125
126 # Benitlux is available at `benitlux.xymus.net` and `xymus.net/benitlux/`
127 #
128 # It has 2 actions/Web interfaces. The Web user UI to subscribe and unsubscribe
129 # to the mailing list. And the RESTful interface used by the Android app.
130 var benitlux_sub = new BenitluxSubscriptionAction
131 var benitlux_rest = new BenitluxRESTAction
132 default_vh.routes.add new Route("/benitlux/rest/", benitlux_rest)
133 default_vh.routes.add new Route("/benitlux/", benitlux_sub)
134 benitlux_vh.routes.add new Route("/rest/", benitlux_rest)
135 benitlux_vh.routes.add new Route(null, benitlux_sub)
136
137 var opportunity = new OpportunityWelcome
138 var opportunity_rest = new OpportunityRESTAction
139 default_vh.routes.add new Route("/opportunity/rest/", opportunity_rest)
140 default_vh.routes.add new Route("/opportunity/", opportunity)
141
142 # We use a special file server for the path `xymus.net/ens` only to display
143 # a different header.
144 var file_server_ens = new FileServer("/var/www/ens/")
145 file_server_ens.header = (new MasterHeader("ens", false))
146 default_vh.routes.add new Route("/ens/", file_server_ens)
147
148 # Default file server is used for the main page at `xymus.net` and it is
149 # the default action for any path not caught by other actions.
150 var file_server = new FileServer("/var/www/")
151 file_server.header = (new MasterHeader(null, false))
152 default_vh.routes.add new Route(null, file_server)
153 vps_vh.routes.add new Route(null, file_server)
154
155 # Launch server main loop
156 factory.run