1 class Pettanr.Router extends Backbone.Router
\r
3 parse_query_string: (query_string) ->
\r
6 ary = _.map decodeURI(query_string).split(/&/g), (el, i) ->
\r
21 {route: '', callback: 'home'},
\r
22 {route: 'top/:action', callback: 'top_a'},
\r
23 {route: 'users/:action', callback: 'users_a'},
\r
24 {route: 'user_sessions/:action', callback: 'user_sessions_a'},
\r
25 {route: ':controller/:id/:action?*query_string', callback: 'c_i_a'},
\r
26 {route: ':controller/:id/:action', callback: 'c_i_a'},
\r
27 {route: ':controller/:id?*query_string', callback: 'c_i'},
\r
28 {route: ':controller/:id', callback: 'c_i'},
\r
29 {route: ':controller?*query_string', callback: 'c'},
\r
30 {route: ':controller', callback: 'c'},
\r
33 find_route: (url) ->
\r
35 _.any @peta_routes(), (route) =>
\r
36 route.regex = @_routeToRegExp(route.route)
\r
37 if route.regex.test(url)
\r
41 url_to_params: (url) ->
\r
42 if route = @find_route(url)
\r
43 n = route.callback # callback function name by string
\r
44 this[n + '_params'].apply(this, args) # call to c_i_a_params, c_i_params, c_params
\r
46 # render App(render:all)
\r
48 params = @home_params()
\r
49 @trigger('fire', params)
\r
53 params['controller'] = 'folders'
\r
54 params['action'] = 'root'
\r
57 # controller/id/action case
\r
58 # ex) scrolls/3/edit
\r
59 c_i_a: (controller, id, action, query_string) ->
\r
60 params = @c_i_a_params(controller, id, action, query_string)
\r
61 @trigger('fire', params)
\r
63 c_i_a_params: (controller, id, action, query_string) ->
\r
64 params = @parse_query_string(query_string)
\r
65 params['controller'] = controller
\r
66 params['format'] = 'html'
\r
69 params['format'] = t[1]
\r
71 t = action.split('.')
\r
73 params['format'] = t[1]
\r
75 if Pettanr.is_number(action)
\r
76 params['action'] = id
\r
77 params['id'] = action
\r
79 params['action'] = action
\r
83 # controller and id case
\r
85 c_i: (controller, id, query_string) ->
\r
86 params = @c_i_params(controller, id, query_string)
\r
87 @trigger('fire', params)
\r
89 c_i_params: (controller, id, query_string) ->
\r
90 params = @parse_query_string(query_string)
\r
91 params['controller'] = controller
\r
92 params['format'] = 'html'
\r
95 params['format'] = t[1]
\r
97 if Pettanr.is_number(id)
\r
98 params['action'] = 'show'
\r
102 params['action'] = id
\r
104 params['action'] = 'index'
\r
107 # controller only case
\r
109 c: (controller, query_string) ->
\r
110 params = @c_params(controller, query_string)
\r
111 @trigger('fire', params)
\r
113 c_params: (controller, query_string) ->
\r
114 params = @parse_query_string(query_string)
\r
115 params['controller'] = controller
\r
116 params['format'] = 'html'
\r
117 params['action'] = 'index'
\r
120 top_a: (action, query_string) ->
\r
121 params = @users_a_params(action, query_string)
\r
122 @trigger('fire', params)
\r
124 top_a_params: (action, query_string) ->
\r
125 params = @parse_query_string(query_string)
\r
126 params['controller'] = 'top'
\r
127 params['format'] = 'html'
\r
128 params['action'] = action
\r
131 user_sessions_a: (action, query_string) ->
\r
132 params = @user_sessions_a_params(action, query_string)
\r
133 @trigger('fire', params)
\r
135 user_sessions_a_params: (action, query_string) ->
\r
136 params = @parse_query_string(query_string)
\r
137 params['controller'] = 'user_sessions'
\r
138 params['format'] = 'html'
\r
139 params['action'] = action
\r
142 users_a: (action, query_string) ->
\r
143 params = @users_a_params(action, query_string)
\r
144 @trigger('fire', params)
\r
146 users_a_params: (action, query_string) ->
\r
147 params = @parse_query_string(query_string)
\r
148 params['controller'] = 'users'
\r
149 params['format'] = 'html'
\r
150 params['action'] = action
\r
154 class Pettanr.GlobalRouter extends Pettanr.Router
\r
157 _.extend(this, Backbone.Events)
\r
158 _.each @peta_routes(), (r) =>
\r
159 @route(r.route, r.callback)
\r
161 navigate: (fragment, options) ->
\r
163 if confirm('leave? edit data unsaved')
\r
164 window.editor.quit()
\r
165 super(fragment, options)
\r
169 super(fragment, options)
\r
171 class Pettanr.LocalRouter extends Pettanr.Router
\r
174 _.extend(this, Backbone.Events)
\r
178 if route = @find_route(url)
\r
179 args = @_extractParameters(route.regex, url)
\r
180 n = route.callback # callback function name by string
\r
181 this[n].apply(this, args) # call to c_i_a, c_i, c
\r
183 class Pettanr.RouterFilter
\r
186 if Pettanr.is_sns()
\r
187 Pettanr.ActionFilter.sns_filters()
\r
189 Pettanr.ActionFilter.blog_filters()
\r
191 my_filters: (role, params) ->
\r
193 c = f[params['controller']] || {}
\r
197 authenticate: (role, params, operators) ->
\r
198 if not operators[('is_' + role)]() # ex: operators.is_user()
\r
199 filter = @my_filters(role, params)
\r
200 if Pettanr.before_filter(params['action'], filter)
\r
204 class Pettanr.HeaderRouter extends Pettanr.LocalRouter
\r
208 _.extend(this, Pettanr.RouterFilter)
\r
210 class Pettanr.BodyRouter extends Pettanr.GlobalRouter
\r
214 _.extend(this, Pettanr.RouterFilter)
\r
216 navigate: (url, operators) ->
\r
217 safe_url = @block(url, operators) || url
\r
221 # return sign in form if invalid url
\r
222 # return null if url is valid
\r
223 block: (url, operators) ->
\r
224 params = @url_to_params(url)
\r
225 return @guest_url() if @authenticate('reader', params, operators) or @authenticate('resource_reader', params, operators) or @authenticate('user', params, operators)
\r
226 return @new_author_url() if @authenticate('author', params, operators)
\r
227 return @new_artist_url() if @authenticate('artist', params, operators)
\r
231 'user_seeeions/new'
\r
233 new_author_url: () ->
\r
236 new_artist_url: () ->
\r