OSDN Git Service

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