OSDN Git Service

fix gate
[pettanr/pettanr.git] / app / assets / javascripts / routes.js.coffee
1 class Pettanr.BeforeUnload\r
2   \r
3   constructor: (options) ->\r
4   \r
5   test: () ->\r
6     if @is_lock()\r
7       if confirm('leave? edit data unsaved')\r
8         return 1\r
9       else\r
10         return -1\r
11     0\r
12   \r
13   is_lock: () ->\r
14     if @params\r
15       true\r
16     else\r
17       false\r
18   \r
19   lock: (params, form) ->\r
20     @form = form\r
21     @params = params\r
22   \r
23   unlock: () ->\r
24     @form.quit()\r
25     @params = null\r
26   \r
27   url: () ->\r
28     Pettanr.params_to_url(@params)\r
29   \r
30 class Pettanr.Router extends Backbone.Router\r
31   \r
32   initialize: (options) ->\r
33     super()\r
34     _.extend(this, Backbone.Events)\r
35     @operators = options.operators\r
36   \r
37   parse_query_string: (query_string) ->\r
38     params = {}\r
39     if query_string\r
40       ary = _.map decodeURI(query_string).split(/&/g), (el, i) ->\r
41         aux = el.split('=')\r
42         o = {}\r
43         if aux.length >= 1\r
44           val = undefined\r
45           if aux.length == 2\r
46             val = aux[1]\r
47           o[aux[0]] = val\r
48           o\r
49       _.each ary, (o) -> \r
50         _.extend(params, o)\r
51     params\r
52   \r
53   peta_routes: () ->\r
54     [\r
55       {route: '', callback: 'home'}, \r
56       {route: 'top/:action', callback: 'top_a'}, \r
57       {route: 'users/:action', callback: 'users_a'},   # no manifest route\r
58       {route: 'user_sessions/:action', callback: 'user_sessions_a'},    # no manifest route\r
59       {route: ':controller/:id/:action?*query_string', callback: 'c_i_a'}, \r
60       {route: ':controller/:id/:action', callback: 'c_i_a'}, \r
61       {route: ':controller/:id?*query_string', callback: 'c_i'}, \r
62       {route: ':controller/:id', callback: 'c_i'}, \r
63       {route: ':controller?*query_string', callback: 'c'}, \r
64       {route: ':controller', callback: 'c'}, \r
65     ]\r
66   \r
67   find_route: (url) ->\r
68     r = null\r
69     _.any @peta_routes(), (route) =>\r
70       route.regex = @_routeToRegExp(route.route)\r
71       if route.regex.test(url)\r
72         r = route\r
73     r\r
74   \r
75   url_to_params: (url) ->\r
76     if route = @find_route(url)\r
77       args = @_extractParameters(route.regex, url)\r
78       n = route.callback  # callback function name by string\r
79       this[n + '_params'].apply(this, args)  # call to c_i_a_params, c_i_params, c_params\r
80     else\r
81       {}\r
82   \r
83   filters: () ->\r
84     if Pettanr.is_sns()\r
85       Pettanr.ActionFilter.sns_filters()\r
86     else\r
87       Pettanr.ActionFilter.blog_filters()\r
88   \r
89   my_filters: (role, params) ->\r
90     f = @filters()\r
91     c = f[params['controller']] || {}\r
92     r = c[role]\r
93     r\r
94   \r
95   # return false if allow\r
96   # return true if deny\r
97   authenticate: (role, params) ->\r
98     n = 'is_' + role\r
99     if not @operators[n]()  # ex: operators.is_user()\r
100       filter = @my_filters(role, params)\r
101       if Pettanr.before_filter(params['action'], filter)\r
102         return true\r
103     false\r
104   \r
105   # access block\r
106   # return sign in form if invalid url\r
107   # return null if url is valid\r
108   block: (params) ->\r
109     return @guest_url() if @authenticate('reader', params) or @authenticate('resource_reader', params) or @authenticate('user', params)\r
110     return @new_author_url() if @authenticate('author', params)\r
111     return @new_artist_url() if @authenticate('artist', params)\r
112     null\r
113   \r
114   guest_url: () ->\r
115     'user_seeeions/new'\r
116   \r
117   new_author_url: () ->\r
118     'authors/new'\r
119   \r
120   new_artist_url: () ->\r
121     'artists/new'\r
122   \r
123   # render App(render:all)\r
124   home: () ->\r
125     params = @home_params()\r
126     @trigger('go', params)\r
127   \r
128   home_params: () ->\r
129     params = {}\r
130     params['controller'] = 'folders'\r
131     params['action'] = 'root'\r
132     params\r
133   \r
134   # controller/id/action case\r
135   # ex) scrolls/3/edit\r
136   c_i_a: (controller, id, action, query_string, form) ->\r
137     params = @c_i_a_params(controller, id, action, query_string)\r
138     if safe_url = @block(params)\r
139       @trigger('deny', params, form, safe_url)\r
140     else\r
141       @trigger('go', params, form)\r
142   \r
143   c_i_a_params: (controller, id, action, query_string) ->\r
144     params = @parse_query_string(query_string)\r
145     params['controller'] = controller\r
146     params['format'] = 'html'\r
147     t = id.split('.')\r
148     if t.length > 1\r
149       params['format'] = t[1]\r
150       id = t[0]\r
151     t = action.split('.')\r
152     if t.length > 1\r
153       params['format'] = t[1]\r
154       action = t[0]\r
155     if Pettanr.is_number(action)\r
156       params['action'] = id\r
157       params['id'] = action\r
158     else\r
159       params['action'] = action\r
160       params['id'] = id\r
161     params\r
162   \r
163   # controller and id case\r
164   # ex) scrolls/3\r
165   c_i: (controller, id, query_string, form) ->\r
166     params = @c_i_params(controller, id, query_string)\r
167     if safe_url = @block(params)\r
168       @trigger('deny', params, form, safe_url)\r
169     else\r
170       @trigger('go', params, form)\r
171   \r
172   c_i_params: (controller, id, query_string) ->\r
173     params = @parse_query_string(query_string)\r
174     params['controller'] = controller\r
175     params['format'] = 'html'\r
176     t = id.split('.')\r
177     if t.length > 1\r
178       params['format'] = t[1]\r
179       id = t[0]\r
180     if Pettanr.is_number(id)\r
181       params['action'] = 'show'\r
182       params['id'] = id\r
183     else\r
184       if id\r
185         params['action'] = id\r
186       else\r
187         params['action'] = 'index'\r
188     params\r
189   \r
190   # controller only case\r
191   # ex) scrolls\r
192   c: (controller, query_string, form) ->\r
193     params = @c_params(controller, query_string)\r
194     if safe_url = @block(params)\r
195       @trigger('deny', params, form, safe_url)\r
196     else\r
197       @trigger('go', params, form)\r
198   \r
199   c_params: (controller, query_string) ->\r
200     params = @parse_query_string(query_string)\r
201     params['controller'] = controller\r
202     params['format'] = 'html'\r
203     params['action'] = 'index'\r
204     params\r
205   \r
206   top_a: (action, query_string, form) ->\r
207     params = @users_a_params(action, query_string)\r
208     if safe_url = @block(params)\r
209       @trigger('deny', params, safe_url)\r
210     else\r
211       @trigger('go', params, form)\r
212   \r
213   top_a_params: (action, query_string) ->\r
214     params = @parse_query_string(query_string)\r
215     params['controller'] = 'top'\r
216     params['format'] = 'html'\r
217     params['action'] = action\r
218     params\r
219   \r
220   user_sessions_a: (action, query_string, form) ->\r
221     params = @user_sessions_a_params(action, query_string)\r
222     if safe_url = @block(params)\r
223       @trigger('deny', params, safe_url)\r
224     else\r
225       @trigger('go', params, form)\r
226   \r
227   user_sessions_a_params: (action, query_string) ->\r
228     params = @parse_query_string(query_string)\r
229     params['controller'] = 'user_sessions'\r
230     params['format'] = 'html'\r
231     params['action'] = action\r
232     params\r
233   \r
234   users_a: (action, query_string, form) ->\r
235     params = @users_a_params(action, query_string)\r
236     if safe_url = @block(params)\r
237       @trigger('deny', params, safe_url)\r
238     else\r
239       @trigger('go', params, form)\r
240   \r
241   users_a_params: (action, query_string) ->\r
242     params = @parse_query_string(query_string)\r
243     params['controller'] = 'users'\r
244     params['format'] = 'html'\r
245     params['action'] = action\r
246     params\r
247 \r
248 class Pettanr.GlobalRouter extends Pettanr.Router\r
249   \r
250   initialize: (options) ->\r
251     super(options)\r
252     _.each @peta_routes(), (r) =>\r
253       @route(r.route, r.callback)\r
254   \r
255 class Pettanr.LocalRouter extends Pettanr.Router\r
256   \r
257   initialize: (options) ->\r
258     super(options)\r
259   \r
260   # selfish navigate\r
261   navigate: (url, form) ->\r
262     if route = @find_route(url)\r
263       args = @_extractParameters(route.regex, url)\r
264       args.push(form)\r
265       n = route.callback  # callback function name by string\r
266       this[n].apply(this, args)  # call to c_i_a, c_i, c\r
267   \r