lib: Update sha1 and base64 to use Bytes instead of String
[nit.git] / contrib / opportunity / src / opportunity_controller.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 # Actions for Opportunity web application
16 module opportunity_controller
17
18 import nitcorn
19 import templates
20 import opportunity_model
21
22 # Any kind of opportunity `Action` (serves a request)
23 abstract class OpportunityAction
24 super Action
25
26 # Path to db
27 var db_path = "opportunity"
28
29 # Returns a bad request with an error code 400
30 #
31 # TODO: Add a specific body to the bad request page.
32 fun bad_req: HttpResponse do
33 var rsp = new HttpResponse(400)
34 rsp.body = (new OpportunityHomePage).write_to_string
35 return rsp
36 end
37 end
38
39 # Welcome page for Opportunity
40 class OpportunityWelcome
41 super OpportunityAction
42
43 redef fun answer(request, url) do
44 print "Received request for {url}"
45 var get = request.get_args
46 var rq = url.split("/")
47 if rq.has("meetup_create") then
48 var ansset = new HashSet[String]
49 var ans_tmp = "answer_"
50 var cnt = 1
51 loop
52 var anss = request.string_arg(ans_tmp + cnt.to_s)
53 cnt += 1
54 if anss == null then break
55 if ansset.has(anss) then continue
56 ansset.add anss
57 end
58
59 var mname = request.string_arg("meetup_name")
60 var mdate = request.string_arg("meetup_date")
61 var mplace = request.string_arg("meetup_place")
62 var mmodestr = request.string_arg("meetup_mode")
63 var mmode = 0
64 if mdate == null then mdate = ""
65 if mplace == null then mplace = ""
66 if mmodestr != null then
67 mmode = 1
68 end
69 if mname == null then
70 mname = ""
71 var rsp = new HttpResponse(200)
72 var meetpage = new MeetupCreationPage
73 var meet = new Meetup(mname, mdate, mplace, mmode)
74 meetpage.ans = ansset
75 meetpage.meet = meet
76 meetpage.error = "'Meetup name' is a mandatory fields."
77 rsp.body = meetpage.write_to_string
78 return rsp
79
80 end
81 var db = new OpportunityDB.open(db_path)
82 var meet = new Meetup(mname, mdate, mplace, mmode)
83 if ansset.is_empty then
84 db.close
85 var rsp = new HttpResponse(200)
86 var meetpage = new MeetupCreationPage
87 meetpage.meet = meet
88 meetpage.error = "You need to input at least one answer."
89 rsp.body = meetpage.write_to_string
90 return rsp
91 end
92 if not meet.commit(db) then
93 db.close
94 var rsp = new HttpResponse(200)
95 var meetpage = new MeetupCreationPage
96 meetpage.meet = meet
97 meetpage.ans = ansset
98 meetpage.error = """<p>Could not create Meetup.</p>
99 <p>Hmm, that's embarassing, the database indicates that your meetup already exists.</p>
100 <p>If this is not a duplicated submission, please contact the mainainers of the website, you might have found a bug !</p>"""
101 rsp.body = meetpage.write_to_string
102 return rsp
103 end
104 for v in ansset do
105 var ans = new Answer(v)
106 ans.meetup = meet
107 ans.commit(db)
108 end
109 db.close
110 var rsp = new HttpResponse(200)
111 rsp.body = (new MeetupConfirmation(meet)).write_to_string
112 return rsp
113 end
114 if rq.has("new_meetup") then
115 var rsp = new HttpResponse(200)
116 var page = new MeetupCreationPage
117 rsp.body = page.write_to_string
118 return rsp
119 end
120 if get.has_key("meetup_id") then
121 var rsp = new HttpResponse(200)
122 rsp.body = (new OpportunityMeetupPage.from_id(get["meetup_id"])).write_to_string
123 return rsp
124 end
125 var rsp = new HttpResponse(200)
126 rsp.body = (new OpportunityHomePage).write_to_string
127 return rsp
128 end
129
130 end
131
132 # Any kind of REST request to Opportunity
133 class OpportunityRESTAction
134 super OpportunityAction
135
136 redef fun answer(request, uri) do
137 print "Received REST request from {uri}"
138 var req = uri.split("/")
139 if req.has("people") then
140 return (new OpportunityPeopleREST).answer(request, uri)
141 else if req.has("answer") then
142 return (new OpportunityAnswerREST).answer(request, uri)
143 else if req.has("meetup") then
144 return (new OpportunityMeetupREST).answer(request, uri)
145 else
146 return new HttpResponse(400)
147 end
148 end
149
150 end
151
152 # REST Actions working on People
153 class OpportunityPeopleREST
154 super OpportunityAction
155
156 redef fun answer(request, uri) do
157 # Should be DELETE for true REST API
158 # TODO : change method to DELETE once supported by Nitcorn
159 if request.method == "POST" then
160 var meth = request.string_arg("method")
161 if meth == null then return bad_req
162 if meth != "DELETE" then return bad_req
163 var pid = request.int_arg("p_id")
164 if pid == null then return bad_req
165 var db = new OpportunityDB.open(db_path)
166 db.remove_people_by_id(pid)
167 db.close
168 return new HttpResponse(200)
169 end
170 return new HttpResponse(400)
171 end
172
173 end
174
175 # REST Actions working on Answers
176 class OpportunityAnswerREST
177 super OpportunityAction
178
179 redef fun answer(request, uri) do
180 var persid = request.int_arg("pers_id")
181 var ansid = request.int_arg("answer_id")
182 var ans = request.int_arg("answer")
183 if persid == null or ansid == null or ans == null then return bad_req
184 var db = new OpportunityDB.open(db_path)
185 db.change_answer(ansid, persid, ans)
186 db.close
187 return new HttpResponse(200)
188 end
189 end
190
191 # REST Actions working on Meetups
192 class OpportunityMeetupREST
193 super OpportunityAction
194
195 redef fun answer(request, uri) do
196 var args = uri.split("/")
197 if args.has("new_pers") then
198 var name = request.string_arg("persname")
199 var m_id = request.string_arg("meetup_id")
200 var ans_str = request.string_arg("answers")
201 if name == null or m_id == null or ans_str == null then return bad_req
202 var ans = ans_str.split("&")
203 var ansmap = new HashMap[Int, Int]
204 for i in ans do
205 var mp = i.split("=")
206 var id = mp.first.split("_").last
207 var b = mp.last.to_i
208 if not id.is_numeric then continue
209 ansmap[id.to_i] = b
210 end
211 var db = new OpportunityDB.open(db_path)
212 var m = db.find_meetup_by_id(m_id)
213 var sublen = name.index_of(' ')
214 var rname = ""
215 var rsurname = ""
216 if sublen == -1 then
217 rsurname = name
218 else
219 rsurname = name.substring(0, sublen)
220 rname = name.substring_from(sublen + 1)
221 end
222 var p = new People(rname, rsurname)
223 for i in m.answers(db) do
224 if not ansmap.has_key(i.id) then
225 p.answers[i] = 0
226 else
227 p.answers[i] = ansmap[i.id]
228 end
229 end
230 p.commit(db)
231 db.close
232 var rsp = new HttpResponse(200)
233 rsp.body = p.id.to_s
234 return rsp
235 end
236 return new HttpResponse(400)
237 end
238 end