-
Notifications
You must be signed in to change notification settings - Fork 3
/
minisculus.rb
112 lines (92 loc) · 1.97 KB
/
minisculus.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
require 'rubygems'
require 'sinatra'
require 'json'
get '/' do
redirect '/index.html', 303
end
get '/start' do
redirect first_question_path, 303
end
get '/finish/:key' do
if params[:key] == ending_key
cache_long
return_json ending_data
else
halt 406
end
end
get '/:key' do
cache_long
return_json :question => question,
:'reference-url' => reference_url
end
put '/:key' do
begin
if correct_answer?
redirect next_question_path, 303
else
halt 406
end
rescue JSON::ParserError => exception
halt 406, "Unable to parse JSON.\n#{exception.message}"
end
end
helpers do
def question
question = find_question(params[:key])
question[:question] if question
end
def reference_url
question = find_question(params[:key])
"/#{question[:'reference-url']}" if question
end
def answer
question = find_question(params[:key])
question[:answer] if question
end
def index(key)
questions.index(find_question(key))
end
def find_question(key)
questions.find { |q| q[:key] == key }
end
def first_question_path
"/#{questions.first[:key]}"
end
def next_question_path
if next_question
"/#{next_question[:key]}"
else
"/finish/#{ending_key}"
end
end
def ending_key
settings.ending[:key]
end
def ending_data
{
:code => settings.ending[:code],
:email => settings.ending[:email],
:'reference-url' => "/finish/#{settings.ending[:'reference-url']}"
}
end
def next_question
next_question = questions[index(params[:key]) + 1]
end
def questions
settings.questions
end
def return_json(data)
content_type 'application/json'
data.to_json
end
def correct_answer?
answer == user_answer
end
def user_answer
JSON.parse(request.env["rack.input"].read, :symbolize_names => true)[:answer]
end
def cache_long
response['Cache-Control'] = "public, max-age=#{60 * 60}" unless development?
end
end