blob: 1ceb4863e5a45b583279b1841302c50873dc5c86 [file] [log] [blame]
Adrià Vilanova Martínezf19ea432024-01-23 20:20:52 +01001# Copyright 2022 The Chromium Authors
2# Use of this source code is governed by a BSD-style license that can be
3# found in the LICENSE file.
Copybara854996b2021-09-07 19:36:02 +00004"""This file sets up all the urls for monorail pages."""
Copybara854996b2021-09-07 19:36:02 +00005
Adrià Vilanova Martínezf19ea432024-01-23 20:20:52 +01006import flask
Copybara854996b2021-09-07 19:36:02 +00007
Adrià Vilanova Martínezf19ea432024-01-23 20:20:52 +01008import urllib
9
10from components import endpoints_flask
Copybara854996b2021-09-07 19:36:02 +000011from components import prpc
12
Copybara854996b2021-09-07 19:36:02 +000013from features import banspammer
Adrià Vilanova Martínezf19ea432024-01-23 20:20:52 +010014from features import inboundemail
15from features import hotlistcreate
Copybara854996b2021-09-07 19:36:02 +000016from features import savedqueries
Adrià Vilanova Martínezf19ea432024-01-23 20:20:52 +010017from features import userhotlists
18from framework import banned
19from framework import clientmon
Copybara854996b2021-09-07 19:36:02 +000020from framework import csp_report
Adrià Vilanova Martínezf19ea432024-01-23 20:20:52 +010021from framework import warmup
Copybara854996b2021-09-07 19:36:02 +000022from framework import reap
Adrià Vilanova Martínezf19ea432024-01-23 20:20:52 +010023from framework import deleteusers
24from framework import excessiveactivity
25from framework import teardown
26from framework import ts_mon_js
27from framework import trimvisitedpages
Copybara854996b2021-09-07 19:36:02 +000028from project import peopledetail
29from project import peoplelist
Copybara854996b2021-09-07 19:36:02 +000030from project import projectadmin
31from project import projectadminadvanced
32from project import projectexport
33from project import projectsummary
34from project import projectupdates
Adrià Vilanova Martínezf19ea432024-01-23 20:20:52 +010035from project import project_constants
Copybara854996b2021-09-07 19:36:02 +000036from project import redirects
Adrià Vilanova Martínezf19ea432024-01-23 20:20:52 +010037from services import api_svc_v1
Copybara854996b2021-09-07 19:36:02 +000038from services import cachemanager_svc
39from services import client_config_svc
Copybara854996b2021-09-07 19:36:02 +000040from sitewide import custom_404
Adrià Vilanova Martínezf19ea432024-01-23 20:20:52 +010041from sitewide import hostinghome
42from sitewide import moved
Copybara854996b2021-09-07 19:36:02 +000043from sitewide import userclearbouncing
44from sitewide import userupdates
Adrià Vilanova Martínezf19ea432024-01-23 20:20:52 +010045from sitewide import userprofile
46from sitewide import projectcreate
47from sitewide import usersettings
48from sitewide import groupadmin
49from sitewide import groupcreate
50from sitewide import groupdetail
51from sitewide import grouplist
52from features import rerankhotlist
53from features import hotlistdetails
54from features import hotlistissues
55from features import hotlistissuescsv
56from features import hotlistpeople
57from features import dateaction
58from features import filterrules
59from features import pubsub
60from features import notify
61from features import hotlistcreate
62from features import savedqueries
63from features import userhotlists
64from features import banspammer
65from search import backendnonviewable
66from search import backendsearch
Copybara854996b2021-09-07 19:36:02 +000067from tracker import componentcreate
68from tracker import componentdetail
Adrià Vilanova Martínezf19ea432024-01-23 20:20:52 +010069from tracker import fltconversion
Copybara854996b2021-09-07 19:36:02 +000070from tracker import fieldcreate
71from tracker import fielddetail
Adrià Vilanova Martínezf19ea432024-01-23 20:20:52 +010072from tracker import templatecreate
73from tracker import templatedetail
Copybara854996b2021-09-07 19:36:02 +000074from tracker import issueadmin
75from tracker import issueadvsearch
76from tracker import issueattachment
77from tracker import issueattachmenttext
78from tracker import issuebulkedit
Copybara854996b2021-09-07 19:36:02 +000079from tracker import issuedetailezt
80from tracker import issueentry
81from tracker import issueentryafterlogin
82from tracker import issueexport
Copybara854996b2021-09-07 19:36:02 +000083from tracker import issueoriginal
84from tracker import issuereindex
85from tracker import issuetips
Adrià Vilanova Martínezf19ea432024-01-23 20:20:52 +010086from tracker import issueimport
87
88from tracker import webcomponentspage
Copybara854996b2021-09-07 19:36:02 +000089
90from api import api_routes as api_routes_v0
91from api.v3 import api_routes as api_routes_v3
92
93
94class ServletRegistry(object):
95
96 _PROJECT_NAME_REGEX = project_constants.PROJECT_NAME_PATTERN
97 _USERNAME_REGEX = r'[-+\w=.%]+(@([-a-z0-9]+\.)*[a-z0-9]+)?'
98 _HOTLIST_ID_NAME_REGEX = r'\d+|[a-zA-Z][-0-9a-zA-Z\.]*'
99
100 def __init__(self):
101 self.routes = []
102
Adrià Vilanova Martínezf19ea432024-01-23 20:20:52 +0100103 def _AppendUrlToRoutes(self, rule_tuple, base=''):
104 """Register each of the given servlets."""
105 for rule in rule_tuple:
106 self.routes.append([base + rule[0], rule[1], rule[2]])
107
108 def Register(self, services, flask_instance):
109 """Register all the monorail request handlers."""
110 self._RegisterGroupUrls(services)
111 self._RegisterHostingUrl(services)
112 self._RegisterOldHostUrl(services)
113 self._RegisterRedirectProjectUrl()
114 self._RegisterCSPUrl()
115 self._RegisterProjectUrls(services, flask_instance)
116 self._RegisterUserUrls(services)
117 self._RegisterTaskUrl(services)
118 self._RegisterCronUrl(services)
119 self._RegisterBackendUrl(services)
120 self._RegisterMONSetUrl(services)
121 self._RegisterAHUrl(services)
122 self._RegisterPrpcUrl(services)
123 self._RegisterWebComponentsUrl(services)
124 self._RegisterFlaskUrlRules(flask_instance, self.routes)
125
126 def _RegisterFlaskUrlRules(
127 self, flask_instance, rule_tuple, removed_prefix=''):
128 """Add url rules to a given Flask instance.
Copybara854996b2021-09-07 19:36:02 +0000129
130 Args:
Adrià Vilanova Martínezf19ea432024-01-23 20:20:52 +0100131 flask_instance: The Flask app to add URLs to.
132 rule_tuple: List of tuple of path, module and method to call, HTTP method
133
134 Returns:
135 The Flask instance.
Copybara854996b2021-09-07 19:36:02 +0000136 """
Adrià Vilanova Martínezf19ea432024-01-23 20:20:52 +0100137 for rule in rule_tuple:
138 url = rule[0][len(removed_prefix):] if rule[0].startswith(
139 removed_prefix) else rule[0]
140 flask_instance.add_url_rule(url, view_func=rule[1], methods=rule[2])
141 return flask_instance
Copybara854996b2021-09-07 19:36:02 +0000142
Adrià Vilanova Martínezf19ea432024-01-23 20:20:52 +0100143 # pylint: disable=unused-argument
144 def _RegisterGroupUrls(self, services):
145 _GROUP_URL = [
146 (
147 '/', grouplist.GroupList(services=services).GetGroupList,
148 ['GET']),
149 (
150 '/<string:viewed_username>/',
151 groupdetail.GroupDetail(services=services).GetGroupDetail, ['GET']),
152 (
153 '/<string:viewed_username>/edit.do',
154 groupdetail.GroupDetail(services=services).PostGroupDetail,
155 ['POST']),
156 (
157 '/<string:viewed_username>/groupadmin',
158 groupadmin.GroupAdmin(services=services).GetGroupAdmin, ['GET']),
159 (
160 '/<string:viewed_username>/groupadmin.do',
161 groupadmin.GroupAdmin(services=services).PostGroupAdmin, ['POST']),
162 ]
163 self._AppendUrlToRoutes(_GROUP_URL, '/g')
Copybara854996b2021-09-07 19:36:02 +0000164
Adrià Vilanova Martínezf19ea432024-01-23 20:20:52 +0100165 # pylint: disable=unused-argument
166 def _RegisterHostingUrl(self, service):
Copybara854996b2021-09-07 19:36:02 +0000167
Adrià Vilanova Martínezf19ea432024-01-23 20:20:52 +0100168 def DefaultToMainPage():
169 url = flask.request.host_url
170 return flask.redirect(url)
Copybara854996b2021-09-07 19:36:02 +0000171
Adrià Vilanova Martínezf19ea432024-01-23 20:20:52 +0100172 _HOSTING_URL = [
173 (
174 '/',
175 DefaultToMainPage,
176 ['GET'],
177 ),
178 (
179 '/excessiveActivity',
180 excessiveactivity.ExcessiveActivity(
181 services=service).GetExcessiveActivity, ['GET']),
182 (
183 '/settings',
184 usersettings.UserSettings(services=service).GetUserSetting, ['GET'
185 ]),
186 (
187 '/settings.do',
188 usersettings.UserSettings(services=service).PostUserSetting,
189 ['POST']),
190 ('/noAccess', banned.Banned(services=service).GetNoAccessPage, ['GET']),
191 (
192 '/moved', moved.ProjectMoved(services=service).GetProjectMoved,
193 ['GET']),
194 (
195 '/createProject',
196 projectcreate.ProjectCreate(services=service).GetCreateProject,
197 ['GET']),
198 (
199 '/createProject.do',
200 projectcreate.ProjectCreate(services=service).PostCreateProject,
201 ['POST']),
202 (
203 '/createHotlist',
204 hotlistcreate.HotlistCreate(services=service).GetCreateHotlist,
205 ['GET']),
206 (
207 '/createHotlist.do',
208 hotlistcreate.HotlistCreate(services=service).PostCreateHotlist,
209 ['POST']),
210 (
211 '/createGroup',
212 groupcreate.GroupCreate(services=service).GetGroupCreate, ['GET']),
213 (
214 '/createGroup.do',
215 groupcreate.GroupCreate(services=service).PostGroupCreate, ['POST'
216 ]),
217 (
218 '/deleteGroup',
219 grouplist.GroupList(services=service).GetGroupDelete, ['GET']),
220 (
221 '/deleteGroup.do',
222 grouplist.GroupList(services=service).PostGroupDelete,
223 ['POST']),
224 ]
Copybara854996b2021-09-07 19:36:02 +0000225
Adrià Vilanova Martínezf19ea432024-01-23 20:20:52 +0100226 self._AppendUrlToRoutes(_HOSTING_URL, '/hosting')
Copybara854996b2021-09-07 19:36:02 +0000227
Adrià Vilanova Martínezf19ea432024-01-23 20:20:52 +0100228 def _RegisterOldHostUrl(self, service):
229 _OLD_HOSTING_URL = [
230 (
231 '/hosting_old/',
232 hostinghome.HostingHome(services=service).GetOldHostingHome,
233 ['GET']),
234 ]
235 self._AppendUrlToRoutes(_OLD_HOSTING_URL, '')
Copybara854996b2021-09-07 19:36:02 +0000236
Adrià Vilanova Martínezf19ea432024-01-23 20:20:52 +0100237 def _RegisterRedirectProjectUrl(self):
238
239 def GetRedirectProject():
240 url = flask.request.host_url
241 return flask.redirect(url)
242
243 _PROJECT_REDIRECT_URL = [
244 ('/projects/', GetRedirectProject, ['GET']),
245 ]
246 self._AppendUrlToRoutes(_PROJECT_REDIRECT_URL, '')
247
248 def _RegisterCSPUrl(self):
249 self._AppendUrlToRoutes([('/csp.do', csp_report.postCsp, ['POST'])], '')
250
251 def _RegisterProjectUrls(self, service, flaskapp_project):
252 _PROJECT_URLS = [
253 (
254 '/<string:project_name>/<string:unrecognized>',
255 custom_404.ErrorPage(services=service).Get404Page,
256 ['GET'],
257 ),
258 (
259 '/<string:project_name>/adminComponents',
260 issueadmin.AdminComponents(services=service).GetAdminComponentsPage,
261 ['GET']),
262 (
263 '/<string:project_name>/adminComponents.do',
264 issueadmin.AdminComponents(
265 services=service).PostAdminComponentsPage, ['POST']),
266 (
267 '/<string:project_name>/adminIntro',
268 projectsummary.ProjectSummary(
269 services=service).GetProjectSummaryPage, ['GET']),
270 (
271 '/<string:project_name>/adminLabels',
272 issueadmin.AdminLabels(services=service).GetAdminLabelsPage,
273 ['GET']),
274 (
275 '/<string:project_name>/adminLabels.do',
276 issueadmin.AdminLabels(services=service).PostAdminLabelsPage,
277 ['POST']),
278 (
279 '/<string:project_name>/adminRules',
280 issueadmin.AdminRules(services=service).GetAdminRulesPage, ['GET']),
281 (
282 '/<string:project_name>/adminRules.do',
283 issueadmin.AdminRules(services=service).PostAdminRulesPage,
284 ['POST']),
285 (
286 '/<string:project_name>/adminStatuses',
287 issueadmin.AdminStatuses(services=service).GetAdminStatusesPage,
288 ['GET']),
289 (
290 '/<string:project_name>/adminStatuses.do',
291 issueadmin.AdminStatuses(services=service).PostAdminStatusesPage,
292 ['POST']),
293 (
294 '/<string:project_name>/adminTemplates',
295 issueadmin.AdminTemplates(services=service).GetAdminTemplatesPage,
296 ['GET']),
297 (
298 '/<string:project_name>/adminTemplates.do',
299 issueadmin.AdminTemplates(services=service).PostAdminTemplatesPage,
300 ['POST']),
301 (
302 '/<string:project_name>/adminViews',
303 issueadmin.AdminViews(services=service).GetAdminViewsPage, ['GET']),
304 (
305 '/<string:project_name>/adminViews.do',
306 issueadmin.AdminViews(services=service).PostAdminViewsPage,
307 ['POST']),
308 (
309 '/<string:project_name>/admin',
310 projectadmin.ProjectAdmin(services=service).GetProjectAdminPage,
311 ['GET']),
312 (
313 '/<string:project_name>/admin.do',
314 projectadmin.ProjectAdmin(services=service).PostProjectAdminPage,
315 ['POST']),
316 (
317 '/<string:project_name>/adminAdvanced',
318 projectadminadvanced.ProjectAdminAdvanced(
319 services=service).GetProjectAdminAdvancedPage, ['GET']),
320 (
321 '/<string:project_name>/adminAdvanced.do',
322 projectadminadvanced.ProjectAdminAdvanced(
323 services=service).PostProjectAdminAdvancedPage, ['POST']),
324 (
325 '/<string:project_name>/components/create',
326 componentcreate.ComponentCreate(
327 services=service).GetComponentCreatePage, ['GET']),
328 (
329 '/<string:project_name>/components/create.do',
330 componentcreate.ComponentCreate(
331 services=service).PostComponentCreatePage, ['POST']),
332 (
333 '/<string:project_name>/components/detail',
334 componentdetail.ComponentDetail(
335 services=service).GetComponentDetailPage, ['GET']),
336 (
337 '/<string:project_name>/components/detail.do',
338 componentdetail.ComponentDetail(
339 services=service).PostComponentDetailPage, ['POST']),
340 (
341 '/<string:project_name>/fields/create',
342 fieldcreate.FieldCreate(services=service).GetFieldCreate, ['GET']),
343 (
344 '/<string:project_name>/fields/create.do',
345 fieldcreate.FieldCreate(services=service).PostFieldCreate, ['POST'
346 ]),
347 (
348 '/<string:project_name>/fields/detail',
349 fielddetail.FieldDetail(services=service).GetFieldDetail, ['GET']),
350 (
351 '/<string:project_name>/fields/detail.do',
352 fielddetail.FieldDetail(services=service).PostFieldDetail, ['POST'
353 ]),
354 (
355 '/<string:project_name>/issues/advsearch',
356 issueadvsearch.IssueAdvancedSearch(
357 services=service).GetIssueAdvSearchPage, ['GET']),
358 (
359 '/<string:project_name>/issues/advsearch.do',
360 issueadvsearch.IssueAdvancedSearch(
361 services=service).PostIssueAdvSearchPage, ['POST']),
362 (
363 '/<string:project_name>/issues/detail',
364 webcomponentspage.WebComponentsPage(
365 services=service).GetWebComponentsIssueDetail, ['GET']),
366 (
367 '/<string:project_name>/issues/export',
368 issueexport.IssueExport(services=service).GetIssueExport, ['GET']),
369 (
370 '/<string:project_name>/issues/export/json',
371 issueexport.IssueExportJSON(services=service).GetIssueExportJSON,
372 ['GET']),
373 (
374 '/<string:project_name>/issues/export/json.do',
375 issueexport.IssueExportJSON(services=service).PostIssueExportJSON,
376 ['POST']),
377 (
378 '/<string:project_name>/issues/import',
379 issueimport.IssueImport(services=service).GetIssueImport, ['GET']),
380 (
381 '/<string:project_name>/issues/import.do',
382 issueimport.IssueImport(services=service).PostIssueImport, ['POST'
383 ]),
384 (
385 '/<string:project_name>/issues/original',
386 issueoriginal.IssueOriginal(services=service).GetIssueOriginal,
387 ['GET']),
388 (
389 '/<string:project_name>/issues/entry',
390 issueentry.IssueEntry(services=service).GetIssueEntry, ['GET']),
391 (
392 '/<string:project_name>/issues/entry.do',
393 issueentry.IssueEntry(services=service).PostIssueEntry, ['POST']),
394 (
395 '/<string:project_name>/issues/entry_new',
396 webcomponentspage.WebComponentsPage(
397 services=service).GetWebComponentsIssueNewEntry, ['GET']),
398 (
399 '/<string:project_name>/issues/list',
400 webcomponentspage.WebComponentsPage(
401 services=service).GetWebComponentsIssueList, ['GET']),
402 (
403 '/<string:project_name>/issues/reindex',
404 issuereindex.IssueReindex(services=service).GetIssueReindex,
405 ['GET']),
406 (
407 '/<string:project_name>/issues/reindex.do',
408 issuereindex.IssueReindex(services=service).PostIssueReindex,
409 ['POST']),
410 (
411 '/<string:project_name>/issues/detail/list',
412 issuedetailezt.FlipperList(services=service).GetFlipperList,
413 ['GET']),
414 (
415 '/<string:project_name>/issues/detail/flipper',
416 issuedetailezt.FlipperIndex(services=service).GetFlipperIndex,
417 ['GET']),
418 (
419 '/<string:project_name>/issues/detail/flipper.do',
420 issuedetailezt.FlipperIndex(services=service).PostFlipperIndex,
421 ['POST']),
422 (
423 '/<string:project_name>/issues/wizard',
424 webcomponentspage.WebComponentsPage(
425 services=service).GetWebComponentsIssueWizard, ['GET']),
426 (
427 '/<string:project_name>/templates/create',
428 templatecreate.TemplateCreate(services=service).GetTemplateCreate,
429 ['GET']),
430 (
431 '/<string:project_name>/templates/create.do',
432 templatecreate.TemplateCreate(services=service).PostTemplateCreate,
433 ['POST']),
434 (
435 '/<string:project_name>/templates/detail',
436 templatedetail.TemplateDetail(services=service).GetTemplateDetail,
437 ['GET']),
438 (
439 '/<string:project_name>/templates/detail.do',
440 templatedetail.TemplateDetail(services=service).PostTemplateDetail,
441 ['POST']),
442 (
443 '/<string:project_name>/people/list',
444 peoplelist.PeopleList(services=service).GetPeopleListPage, ['GET']),
445 (
446 '/<string:project_name>/people/list.do',
447 peoplelist.PeopleList(services=service).PostPeopleListPage,
448 ['POST']),
449 (
450 '/<string:project_name>/people/detail',
451 peopledetail.PeopleDetail(services=service).GetPeopleDetailPage,
452 ['GET']),
453 (
454 '/<string:project_name>/people/detail.do',
455 peopledetail.PeopleDetail(services=service).PostPeopleDetailPage,
456 ['POST']),
457 (
458 '/<string:project_name>/projectExport',
459 projectexport.ProjectExport(services=service).GetProjectExportPage,
460 ['GET']),
461 (
462 '/<string:project_name>/projectExport/json',
463 projectexport.ProjectExportJSON(
464 services=service).GetProjectExportJSONPage, ['GET']),
465 (
466 '/<string:project_name>/projectExport/json.do',
467 projectexport.ProjectExportJSON(
468 services=service).PostProjectExportJSONPage, ['POST']),
469 (
470 '/<string:project_name>/updates/list',
471 projectupdates.ProjectUpdates(
472 services=service).GetProjectUpdatesPage, ['GET']),
473 (
474 '/<string:project_name>/w/list',
475 redirects.WikiRedirect(services=service).GetWikiListRedirect,
476 ['GET']),
477 (
478 '/<string:project_name>/wiki/<string:wiki_page>',
479 redirects.WikiRedirect(services=service).GetWikiRedirect, ['GET']),
480 (
481 '/<string:project_name>/source/<string:source_page>',
482 redirects.SourceRedirect(services=service).GetSourceRedirect,
483 ['GET']),
484 (
485 '/<string:project_name>/issues/entryafterlogin',
486 issueentryafterlogin.IssueEntryAfterLogin(
487 services=service).GetIssueEntryAfterLogin,
488 ['GET'],
489 ),
490 (
491 '/<string:project_name>/issues/searchtips',
492 issuetips.IssueSearchTips(services=service).GetIssueSearchTips,
493 ['GET'],
494 ),
495 (
496 '/<string:project_name>/issues/attachment',
497 issueattachment.AttachmentPage(services=service).GetAttachmentPage,
498 ['GET'],
499 ),
500 (
501 '/<string:project_name>/issues/attachmentText',
502 issueattachmenttext.AttachmentText(
503 services=service).GetAttachmentText,
504 ['GET'],
505 ),
506 (
507 '/<string:project_name>/issues/bulkedit',
508 issuebulkedit.IssueBulkEdit(services=service).GetIssueBulkEdit,
509 ['GET']),
510 (
511 '/<string:project_name>/issues/bulkedit.do',
512 issuebulkedit.IssueBulkEdit(services=service).PostIssueBulkEdit,
513 ['POST']),
514 (
515 '/<string:project_name>/issues/detail/next',
516 issuedetailezt.FlipperNext(
517 services=service).GetFlipperNextRedirectPage, ['GET']),
518 (
519 '/<string:project_name>/issues/detail/previous',
520 issuedetailezt.FlipperPrev(
521 services=service).GetFlipperPrevRedirectPage, ['GET']),
522 ]
523 self._AppendUrlToRoutes(_PROJECT_URLS, '/p')
524
525 # pylint: disable=unused-variable
526 @flaskapp_project.route('/p/<string:project_name>/issues/approval')
527 @flaskapp_project.route('/p/<string:project_name>/issues/detail_ezt')
528 def ProjectRedirectToIssueDetail(project_name):
529 host_url = flask.request.host_url
530 url = host_url + 'p/' + project_name + '/issues/detail'
531 query_string = flask.request.query_string
532 if query_string:
533 url = '%s?%s' % (url, query_string)
534 return flask.redirect(url)
535
536 # pylint: disable=unused-variable
537 @flaskapp_project.route('/p/<string:project_name>/issues/list_new')
538 @flaskapp_project.route('/p/<string:project_name>/')
539 @flaskapp_project.route('/p/<string:project_name>/issues/')
540 def ProjectRedirectToIssueList(project_name):
541 host_url = flask.request.host_url
542 url = host_url + 'p/' + project_name + '/issues/list'
543 query_string = urllib.parse.urlencode(flask.request.args)
544 if query_string:
545 url = '%s?%s' % (url, query_string)
546 return flask.redirect(url)
547
548 # pylint: disable=unused-variable
549 @flaskapp_project.route('/p/')
550 def ProjectRedirectToMainPage():
551 url = flask.request.host_url
552 return flask.redirect(url)
553
554 # pylint: disable=unused-variable
555 @flaskapp_project.route('/p/<string:project_name>/people/')
556 def ProjectRedirectToPeopleList(project_name):
557 host_url = flask.request.host_url
558 url = host_url + 'p/' + project_name + '/people/list'
559 return flask.redirect(url)
560
561 def _RegisterUserUrls(self, service):
562
563 def UserRedirectToMainPage():
564 url = flask.request.host_url
565 return flask.redirect(url)
566
567 _USER_URLS = [
568 (
569 '/',
570 UserRedirectToMainPage,
571 ['GET'],
572 ),
573 (
574 '/<string:viewed_username>/queries',
575 savedqueries.SavedQueries(services=service).GetSavedQueriesPage,
576 ['GET']),
577 (
578 '/<string:viewed_username>/queries.do',
579 savedqueries.SavedQueries(services=service).PostSavedQueriesPage,
580 ['Post']),
581 (
582 '/<string:viewed_username>/hotlists',
583 userhotlists.UserHotlists(services=service).GetUserHotlistsPage,
584 ['GET']),
585 (
586 '/<string:viewed_username>/hotlists.do',
587 userhotlists.UserHotlists(services=service).PostUserHotlistsPage,
588 ['Post']),
589 (
590 '/<string:viewed_username>/',
591 userprofile.UserProfile(services=service).GetUserProfilePage,
592 ['GET']),
593 (
594 '/<string:viewed_username>/edit.do',
595 userprofile.UserProfile(services=service).PostUserProfilePage,
596 ['POST']),
597 (
598 '/<string:viewed_username>/ban.do',
599 userprofile.BanUser(services=service).PostBanUserPage, ['POST']),
600 (
601 '/<string:viewed_username>/banSpammer.do',
602 banspammer.BanSpammer(services=service).PostBanSpammerPage,
603 ['POST']),
604 (
605 '/<string:viewed_username>/clearBouncing',
606 userclearbouncing.UserClearBouncing(
607 services=service).GetUserClearBouncingPage, ['GET']),
608 (
609 '/<string:viewed_username>/clearBouncing.do',
610 userclearbouncing.UserClearBouncing(
611 services=service).PostUserClearBouncingPage, ['Post']),
612 (
613 '/<string:viewed_username>/updates/projects',
614 userupdates.UserUpdatesProjects(
615 services=service).GetUserUpdatesProjectsPage, ['GET']),
616 (
617 '/<string:viewed_username>/updates/developers',
618 userupdates.UserUpdatesDevelopers(
619 services=service).GetUserUpdatesDevelopersPage, ['GET']),
620 (
621 '/<string:viewed_username>/updates',
622 userupdates.UserUpdatesIndividual(
623 services=service).GetUserUpdatesPage, ['GET']),
624 (
625 '/<string:viewed_username>/hotlists/<string:hotlist_id>',
626 hotlistissues.HotlistIssues(services=service).GetHotlistIssuesPage,
627 ['GET']),
628 (
629 '/<string:viewed_username>/hotlists/<string:hotlist_id>.do',
630 hotlistissues.HotlistIssues(services=service).PostHotlistIssuesPage,
631 ['POST']),
632 (
633 '/<string:viewed_username>/hotlists/<string:hotlist_id>/csv',
634 hotlistissuescsv.HotlistIssuesCsv(
635 services=service).GetHotlistIssuesCsvPage, ['GET']),
636 (
637 '/<string:viewed_username>/hotlists/<string:hotlist_id>/people',
638 hotlistpeople.HotlistPeopleList(
639 services=service).GetHotlistPeoplePage, ['GET']),
640 (
641 '/<string:viewed_username>/hotlists/<string:hotlist_id>/people.do',
642 hotlistpeople.HotlistPeopleList(
643 services=service).PostHotlistPeoplePage, ['POST']),
644 (
645 '/<string:viewed_username>/hotlists/<string:hotlist_id>/details',
646 hotlistdetails.HotlistDetails(
647 services=service).GetHotlistDetailsPage, ['GET']),
648 (
649 '/<string:viewed_username>/hotlists/<string:hotlist_id>/details.do',
650 hotlistdetails.HotlistDetails(
651 services=service).PostHotlistDetailsPage, ['POST']),
652 (
653 '/<string:viewed_username>/hotlists/<string:hotlist_id>/rerank',
654 rerankhotlist.RerankHotlistIssue(
655 services=service).GetRerankHotlistIssuePage, ['GET']),
656 (
657 '/<string:viewed_username>/hotlists/<string:hotlist_id>/rerank.do',
658 rerankhotlist.RerankHotlistIssue(
659 services=service).PostRerankHotlistIssuePage, ['POST']),
660 ]
661
662 self._AppendUrlToRoutes(_USER_URLS, '/u')
663
664 # pylint: disable=unused-argument
665 def _RegisterTaskUrl(self, service):
666 _TASK_URL = [
667 (
668 '/banSpammer.do',
669 banspammer.BanSpammerTask(services=service).PostBanSpammer,
670 ['POST']),
671 (
672 '/sendWipeoutUserListsTask.do',
673 deleteusers.SendWipeoutUserListsTask(
674 services=service).PostSendWipeoutUserListsTask, ['POST']),
675 (
676 '/deleteWipeoutUsersTask.do',
677 deleteusers.DeleteWipeoutUsersTask(
678 services=service).PostDeleteWipeoutUsersTask, ['POST']),
679 (
680 '/deleteUsersTask.do',
681 deleteusers.DeleteUsersTask(services=service).PostDeleteUsersTask,
682 ['POST']),
683 (
684 '/notifyRulesDeleted.do',
685 notify.NotifyRulesDeletedTask(
686 services=service).PostNotifyRulesDeletedTask, ['POST']),
687 (
688 '/notifyIssueChange.do',
689 notify.NotifyIssueChangeTask(
690 services=service).PostNotifyIssueChangeTask, ['POST']),
691 (
692 '/notifyBlockingChange.do',
693 notify.NotifyBlockingChangeTask(
694 services=service).PostNotifyBlockingChangeTask, ['POST']),
695 (
696 '/notifyBulkEdit.do', notify.NotifyBulkChangeTask(
697 services=service).PostNotifyBulkChangeTask, ['POST']),
698 (
699 '/notifyApprovalChange.do',
700 notify.NotifyApprovalChangeTask(
701 services=service).PostNotifyApprovalChangeTask, ['POST']),
702 (
703 '/publishPubsubIssueChange.do',
704 pubsub.PublishPubsubIssueChangeTask(
705 services=service).PostPublishPubsubIssueChangeTask, ['POST']),
706 (
707 '/issueDateAction.do',
708 dateaction.IssueDateActionTask(
709 services=service).PostIssueDateActionTask, ['POST']),
710 (
711 '/fltConversionTask.do',
712 fltconversion.FLTConvertTask(services=service).PostFLTConvertTask,
713 ['POST']),
714 (
715 '/outboundEmail.do',
716 notify.OutboundEmailTask(services=service).PostOutboundEmailTask,
717 ['POST']),
718 (
719 '/recomputeDerivedFields.do',
720 filterrules.RecomputeDerivedFieldsTask(
721 services=service).PostRecomputeDerivedFieldsTask, ['POST']),
722 ]
723 self._AppendUrlToRoutes(_TASK_URL, '/_task')
724
725 # pylint: disable=unused-argument
726 def _RegisterCronUrl(self, service):
727 _CRON_URL = [
728 (
729 '/wipeoutSync',
730 deleteusers.WipeoutSyncCron(services=service).GetWipeoutSyncCron,
731 ['GET']),
732 (
733 '/reindexQueue',
734 filterrules.ReindexQueueCron(services=service).GetReindexQueueCron,
735 ['GET']),
736 (
737 '/dateAction',
738 dateaction.DateActionCron(services=service).GetDateActionCron,
739 ['GET']),
740 (
741 '/ramCacheConsolidate',
742 cachemanager_svc.RamCacheConsolidate(
743 services=service).GetRamCacheConsolidate, ['GET']),
744 ('/reap', reap.Reap(services=service).GetReap, ['GET']),
745 (
746 '/loadApiClientConfigs', client_config_svc.GetLoadApiClientConfigs,
747 ['GET']),
748 (
749 '/trimVisitedPages',
750 trimvisitedpages.TrimVisitedPages(
751 services=service).GetTrimVisitedPages, ['GET']),
752 ]
753 self._AppendUrlToRoutes(_CRON_URL, '/_cron')
754
755 # pylint: disable=unused-argument
756 def _RegisterBackendUrl(self, service):
757 _BACKEND_URL = [
758 (
759 '/search',
760 backendsearch.BackendSearch(services=service).GetBackendSearch,
761 ['GET']),
762 (
763 '/nonviewable',
764 backendnonviewable.BackendNonviewable(
765 services=service).GetBackendNonviewable, ['GET']),
766 ]
767 self._AppendUrlToRoutes(_BACKEND_URL, '/_backend')
768
769 # pylint: disable=unused-argument
770 def _RegisterMONSetUrl(self, service):
771 _MON_URL = [
772 (
773 '/clientmon.do',
774 clientmon.ClientMonitor(services=service).PostClientMonitor,
775 ['POST']),
776 (
777 '/jstsmon.do',
778 ts_mon_js.MonorailTSMonJSHandler(
779 services=service).PostMonorailTSMonJSHandler,
780 ['POST'],
781 )
782 ]
783 self._AppendUrlToRoutes(_MON_URL, '/_')
784
785 def _RegisterAHUrl(self, service):
786 _AH_URL = [
787 ('/warmup', warmup.Warmup, ['GET']), ('/start', warmup.Start, ['GET']),
788 ('/stop', warmup.Stop, ['GET']),
789 (
790 '/bounce',
791 inboundemail.BouncedEmail(services=service).postBouncedEmail,
792 ['POST']),
793 (
794 '/mail/<string:project_addr>',
795 inboundemail.InboundEmail(services=service).HandleInboundEmail,
796 ['GET', 'POST'])
797 ]
798 self._AppendUrlToRoutes(_AH_URL, '/_ah')
799
800 def _RegisterPrpcUrl(self, service):
801 prpc_server = prpc.FlaskServer(
Copybara854996b2021-09-07 19:36:02 +0000802 allowed_origins=client_config_svc.GetAllowedOriginsSet())
Adrià Vilanova Martínezf19ea432024-01-23 20:20:52 +0100803 api_routes_v0.RegisterApiHandlers(prpc_server, service)
804 api_routes_v3.RegisterApiHandlers(prpc_server, service)
805 routes = prpc_server.get_routes()
806 self._AppendUrlToRoutes(routes, '')
Copybara854996b2021-09-07 19:36:02 +0000807
Adrià Vilanova Martínezf19ea432024-01-23 20:20:52 +0100808 def _RegisterWebComponentsUrl(self, service):
809 self.routes.append(
810 [
811 '/',
812 webcomponentspage.ProjectListPage(
813 services=service).GetProjectListPage, ['GET']
814 ])
815 self.routes.append(
816 [
817 '/hotlists/<path:subpath>',
818 webcomponentspage.WebComponentsPage(
819 services=service).GetWebComponentsHotlist, ['GET']
820 ])
821 self.routes.append(
822 [
823 '/users/<path:subpath>',
824 webcomponentspage.WebComponentsPage(
825 services=service).GetWebComponentsUser, ['GET']
826 ])
Copybara854996b2021-09-07 19:36:02 +0000827
Copybara854996b2021-09-07 19:36:02 +0000828
Adrià Vilanova Martínezf19ea432024-01-23 20:20:52 +0100829def RegisterEndpointsUrls(app):
830 api_classes = [api_svc_v1.MonorailApi, api_svc_v1.ClientConfigApi]
831 routes = endpoints_flask.api_routes(api_classes, '/_ah/api')
832 for rule, endpoint, view_func, methods in routes:
833 app.add_url_rule(
834 rule, endpoint=endpoint, view_func=view_func, methods=methods)
835 app.view_functions['cors_handler'] = endpoints_flask.cors_handler
Copybara854996b2021-09-07 19:36:02 +0000836
Copybara854996b2021-09-07 19:36:02 +0000837
Adrià Vilanova Martínezf19ea432024-01-23 20:20:52 +0100838def RegisterTeardown(app):
839 app.teardown_request(teardown.Teardown)