project.go 34 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375
  1. package router
  2. import (
  3. "fmt"
  4. "github.com/go-chi/chi"
  5. apiContract "github.com/porter-dev/porter/api/server/handlers/api_contract"
  6. "github.com/porter-dev/porter/api/server/handlers/api_token"
  7. "github.com/porter-dev/porter/api/server/handlers/billing"
  8. "github.com/porter-dev/porter/api/server/handlers/cluster"
  9. "github.com/porter-dev/porter/api/server/handlers/gitinstallation"
  10. "github.com/porter-dev/porter/api/server/handlers/helmrepo"
  11. "github.com/porter-dev/porter/api/server/handlers/infra"
  12. "github.com/porter-dev/porter/api/server/handlers/policy"
  13. "github.com/porter-dev/porter/api/server/handlers/project"
  14. "github.com/porter-dev/porter/api/server/handlers/registry"
  15. "github.com/porter-dev/porter/api/server/shared"
  16. "github.com/porter-dev/porter/api/server/shared/config"
  17. "github.com/porter-dev/porter/api/server/shared/router"
  18. "github.com/porter-dev/porter/api/types"
  19. )
  20. func NewProjectScopedRegisterer(children ...*router.Registerer) *router.Registerer {
  21. return &router.Registerer{
  22. GetRoutes: GetProjectScopedRoutes,
  23. Children: children,
  24. }
  25. }
  26. func GetProjectScopedRoutes(
  27. r chi.Router,
  28. config *config.Config,
  29. basePath *types.Path,
  30. factory shared.APIEndpointFactory,
  31. children ...*router.Registerer,
  32. ) []*router.Route {
  33. routes, projPath := getProjectRoutes(r, config, basePath, factory)
  34. if len(children) > 0 {
  35. r.Route(projPath.RelativePath, func(r chi.Router) {
  36. for _, child := range children {
  37. childRoutes := child.GetRoutes(r, config, basePath, factory, child.Children...)
  38. routes = append(routes, childRoutes...)
  39. }
  40. })
  41. }
  42. return routes
  43. }
  44. func getProjectRoutes(
  45. r chi.Router,
  46. config *config.Config,
  47. basePath *types.Path,
  48. factory shared.APIEndpointFactory,
  49. ) ([]*router.Route, *types.Path) {
  50. relPath := "/projects/{project_id}"
  51. newPath := &types.Path{
  52. Parent: basePath,
  53. RelativePath: relPath,
  54. }
  55. routes := make([]*router.Route, 0)
  56. // GET /api/projects/{project_id} -> project.NewProjectGetHandler
  57. getEndpoint := factory.NewAPIEndpoint(
  58. &types.APIRequestMetadata{
  59. Verb: types.APIVerbGet,
  60. Method: types.HTTPVerbGet,
  61. Path: &types.Path{
  62. Parent: basePath,
  63. RelativePath: relPath,
  64. },
  65. Scopes: []types.PermissionScope{
  66. types.UserScope,
  67. types.ProjectScope,
  68. },
  69. },
  70. )
  71. getHandler := project.NewProjectGetHandler(
  72. config,
  73. factory.GetResultWriter(),
  74. )
  75. routes = append(routes, &router.Route{
  76. Endpoint: getEndpoint,
  77. Handler: getHandler,
  78. Router: r,
  79. })
  80. // DELETE /api/projects/{project_id} -> project.NewProjectDeleteHandler
  81. deleteEndpoint := factory.NewAPIEndpoint(
  82. &types.APIRequestMetadata{
  83. Verb: types.APIVerbDelete,
  84. Method: types.HTTPVerbDelete,
  85. Path: &types.Path{
  86. Parent: basePath,
  87. RelativePath: relPath,
  88. },
  89. Scopes: []types.PermissionScope{
  90. types.UserScope,
  91. types.ProjectScope,
  92. },
  93. },
  94. )
  95. deleteHandler := project.NewProjectDeleteHandler(
  96. config,
  97. factory.GetResultWriter(),
  98. )
  99. routes = append(routes, &router.Route{
  100. Endpoint: deleteEndpoint,
  101. Handler: deleteHandler,
  102. Router: r,
  103. })
  104. // GET /api/projects/{project_id}/policy -> project.NewProjectGetPolicyHandler
  105. getPolicyEndpoint := factory.NewAPIEndpoint(
  106. &types.APIRequestMetadata{
  107. Verb: types.APIVerbGet,
  108. Method: types.HTTPVerbGet,
  109. Path: &types.Path{
  110. Parent: basePath,
  111. RelativePath: relPath + "/policy",
  112. },
  113. Scopes: []types.PermissionScope{
  114. types.UserScope,
  115. types.ProjectScope,
  116. },
  117. },
  118. )
  119. getPolicyHandler := project.NewProjectGetPolicyHandler(
  120. config,
  121. factory.GetResultWriter(),
  122. )
  123. routes = append(routes, &router.Route{
  124. Endpoint: getPolicyEndpoint,
  125. Handler: getPolicyHandler,
  126. Router: r,
  127. })
  128. // GET /api/projects/{project_id}/onboarding -> project.NewProjectGetOnboardingHandler
  129. getOnboardingEndpoint := factory.NewAPIEndpoint(
  130. &types.APIRequestMetadata{
  131. Verb: types.APIVerbGet,
  132. Method: types.HTTPVerbGet,
  133. Path: &types.Path{
  134. Parent: basePath,
  135. RelativePath: relPath + "/onboarding",
  136. },
  137. Scopes: []types.PermissionScope{
  138. types.UserScope,
  139. types.ProjectScope,
  140. },
  141. },
  142. )
  143. getOnboardingHandler := project.NewOnboardingGetHandler(
  144. config,
  145. factory.GetDecoderValidator(),
  146. factory.GetResultWriter(),
  147. )
  148. routes = append(routes, &router.Route{
  149. Endpoint: getOnboardingEndpoint,
  150. Handler: getOnboardingHandler,
  151. Router: r,
  152. })
  153. // POST /api/projects/{project_id}/onboarding -> project.NewProjectGetOnboardingHandler
  154. updateOnboardingEndpoint := factory.NewAPIEndpoint(
  155. &types.APIRequestMetadata{
  156. Verb: types.APIVerbUpdate,
  157. Method: types.HTTPVerbPost,
  158. Path: &types.Path{
  159. Parent: basePath,
  160. RelativePath: relPath + "/onboarding",
  161. },
  162. Scopes: []types.PermissionScope{
  163. types.UserScope,
  164. types.ProjectScope,
  165. },
  166. },
  167. )
  168. updateOnboardingHandler := project.NewOnboardingUpdateHandler(
  169. config,
  170. factory.GetDecoderValidator(),
  171. factory.GetResultWriter(),
  172. )
  173. routes = append(routes, &router.Route{
  174. Endpoint: updateOnboardingEndpoint,
  175. Handler: updateOnboardingHandler,
  176. Router: r,
  177. })
  178. // POST /api/projects/{project_id}/invite_admin -> project.NewProjectInviteAdminHandler
  179. projectInviteAdminEndpoint := factory.NewAPIEndpoint(
  180. &types.APIRequestMetadata{
  181. Verb: types.APIVerbCreate,
  182. Method: types.HTTPVerbPost,
  183. Path: &types.Path{
  184. Parent: basePath,
  185. RelativePath: relPath + "/invite_admin",
  186. },
  187. Scopes: []types.PermissionScope{types.ProjectScope},
  188. },
  189. )
  190. projectInviteAdminHandler := project.NewProjectInviteAdminHandler(
  191. config,
  192. factory.GetDecoderValidator(),
  193. factory.GetResultWriter(),
  194. )
  195. routes = append(routes, &router.Route{
  196. Endpoint: projectInviteAdminEndpoint,
  197. Handler: projectInviteAdminHandler,
  198. Router: r,
  199. })
  200. // GET /api/projects/{project_id}/usage -> project.NewProjectGetUsageHandler
  201. getUsageEndpoint := factory.NewAPIEndpoint(
  202. &types.APIRequestMetadata{
  203. Verb: types.APIVerbGet,
  204. Method: types.HTTPVerbGet,
  205. Path: &types.Path{
  206. Parent: basePath,
  207. RelativePath: relPath + "/usage",
  208. },
  209. Scopes: []types.PermissionScope{
  210. types.UserScope,
  211. types.ProjectScope,
  212. },
  213. },
  214. )
  215. getUsageHandler := project.NewProjectGetUsageHandler(
  216. config,
  217. factory.GetResultWriter(),
  218. )
  219. routes = append(routes, &router.Route{
  220. Endpoint: getUsageEndpoint,
  221. Handler: getUsageHandler,
  222. Router: r,
  223. })
  224. // GET /api/project/{project_id}/billing/redirect -> billing.NewRedirectBillingHandler
  225. redirectBillingEndpoint := factory.NewAPIEndpoint(
  226. &types.APIRequestMetadata{
  227. Verb: types.APIVerbGet,
  228. Method: types.HTTPVerbGet,
  229. Path: &types.Path{
  230. Parent: basePath,
  231. RelativePath: relPath + "/billing/redirect",
  232. },
  233. Scopes: []types.PermissionScope{
  234. types.UserScope,
  235. types.ProjectScope,
  236. },
  237. },
  238. )
  239. redirectBillingHandler := billing.NewRedirectBillingHandler(
  240. config,
  241. factory.GetResultWriter(),
  242. )
  243. routes = append(routes, &router.Route{
  244. Endpoint: redirectBillingEndpoint,
  245. Handler: redirectBillingHandler,
  246. Router: r,
  247. })
  248. // GET /api/projects/{project_id}/billing -> project.NewProjectGetBillingHandler
  249. getBillingEndpoint := factory.NewAPIEndpoint(
  250. &types.APIRequestMetadata{
  251. Verb: types.APIVerbGet,
  252. Method: types.HTTPVerbGet,
  253. Path: &types.Path{
  254. Parent: basePath,
  255. RelativePath: relPath + "/billing",
  256. },
  257. Scopes: []types.PermissionScope{
  258. types.UserScope,
  259. types.ProjectScope,
  260. },
  261. },
  262. )
  263. getBillingHandler := project.NewProjectGetBillingHandler(
  264. config,
  265. factory.GetResultWriter(),
  266. )
  267. routes = append(routes, &router.Route{
  268. Endpoint: getBillingEndpoint,
  269. Handler: getBillingHandler,
  270. Router: r,
  271. })
  272. // GET /api/billing_webhook -> billing.NewBillingWebhookHandler
  273. getBillingWebhookEndpoint := factory.NewAPIEndpoint(
  274. &types.APIRequestMetadata{
  275. Verb: types.APIVerbCreate,
  276. Method: types.HTTPVerbPost,
  277. Path: &types.Path{
  278. Parent: basePath,
  279. RelativePath: "/billing_webhook",
  280. },
  281. Scopes: []types.PermissionScope{},
  282. },
  283. )
  284. getBillingWebhookHandler := billing.NewBillingWebhookHandler(
  285. config,
  286. factory.GetDecoderValidator(),
  287. )
  288. routes = append(routes, &router.Route{
  289. Endpoint: getBillingWebhookEndpoint,
  290. Handler: getBillingWebhookHandler,
  291. Router: r,
  292. })
  293. // GET /api/projects/{project_id}/clusters -> cluster.NewClusterListHandler
  294. listClusterEndpoint := factory.NewAPIEndpoint(
  295. &types.APIRequestMetadata{
  296. Verb: types.APIVerbList,
  297. Method: types.HTTPVerbGet,
  298. Path: &types.Path{
  299. Parent: basePath,
  300. RelativePath: relPath + "/clusters",
  301. },
  302. Scopes: []types.PermissionScope{
  303. types.UserScope,
  304. types.ProjectScope,
  305. },
  306. },
  307. )
  308. listClusterHandler := cluster.NewClusterListHandler(
  309. config,
  310. factory.GetResultWriter(),
  311. )
  312. routes = append(routes, &router.Route{
  313. Endpoint: listClusterEndpoint,
  314. Handler: listClusterHandler,
  315. Router: r,
  316. })
  317. // GET /api/projects/{project_id}/gitrepos -> gitinstallation.NewGitRepoListHandler
  318. listGitReposEndpoint := factory.NewAPIEndpoint(
  319. &types.APIRequestMetadata{
  320. Verb: types.APIVerbList,
  321. Method: types.HTTPVerbGet,
  322. Path: &types.Path{
  323. Parent: basePath,
  324. RelativePath: relPath + "/gitrepos",
  325. },
  326. Scopes: []types.PermissionScope{
  327. types.UserScope,
  328. types.ProjectScope,
  329. },
  330. },
  331. )
  332. listGitReposHandler := gitinstallation.NewGitRepoListHandler(
  333. config,
  334. factory.GetResultWriter(),
  335. )
  336. routes = append(routes, &router.Route{
  337. Endpoint: listGitReposEndpoint,
  338. Handler: listGitReposHandler,
  339. Router: r,
  340. })
  341. // GET /api/projects/{project_id}/collaborators -> project.NewCollaboratorsListHandler
  342. listCollaboratorsEndpoint := factory.NewAPIEndpoint(
  343. &types.APIRequestMetadata{
  344. Verb: types.APIVerbList,
  345. Method: types.HTTPVerbGet,
  346. Path: &types.Path{
  347. Parent: basePath,
  348. RelativePath: relPath + "/collaborators",
  349. },
  350. Scopes: []types.PermissionScope{
  351. types.UserScope,
  352. types.ProjectScope,
  353. },
  354. },
  355. )
  356. listCollaboratorsHandler := project.NewCollaboratorsListHandler(
  357. config,
  358. factory.GetResultWriter(),
  359. )
  360. routes = append(routes, &router.Route{
  361. Endpoint: listCollaboratorsEndpoint,
  362. Handler: listCollaboratorsHandler,
  363. Router: r,
  364. })
  365. // GET /api/projects/{project_id}/roles -> project.NewRolesListHandler
  366. listRolesEndpoint := factory.NewAPIEndpoint(
  367. &types.APIRequestMetadata{
  368. Verb: types.APIVerbList,
  369. Method: types.HTTPVerbGet,
  370. Path: &types.Path{
  371. Parent: basePath,
  372. RelativePath: relPath + "/roles",
  373. },
  374. Scopes: []types.PermissionScope{
  375. types.UserScope,
  376. types.ProjectScope,
  377. },
  378. },
  379. )
  380. listRolesHandler := project.NewRolesListHandler(
  381. config,
  382. factory.GetResultWriter(),
  383. )
  384. routes = append(routes, &router.Route{
  385. Endpoint: listRolesEndpoint,
  386. Handler: listRolesHandler,
  387. Router: r,
  388. })
  389. // POST /api/projects/{project_id}/roles -> project.NewRoleUpdateHandler
  390. updateRoleEndpoint := factory.NewAPIEndpoint(
  391. &types.APIRequestMetadata{
  392. Verb: types.APIVerbUpdate,
  393. Method: types.HTTPVerbPost,
  394. Path: &types.Path{
  395. Parent: basePath,
  396. RelativePath: relPath + "/roles",
  397. },
  398. Scopes: []types.PermissionScope{
  399. types.UserScope,
  400. types.ProjectScope,
  401. },
  402. },
  403. )
  404. updateRoleHandler := project.NewRoleUpdateHandler(
  405. config,
  406. factory.GetDecoderValidator(),
  407. factory.GetResultWriter(),
  408. )
  409. routes = append(routes, &router.Route{
  410. Endpoint: updateRoleEndpoint,
  411. Handler: updateRoleHandler,
  412. Router: r,
  413. })
  414. // DELETE /api/projects/{project_id}/roles -> project.NewRoleDeleteHandler
  415. deleteRoleEndpoint := factory.NewAPIEndpoint(
  416. &types.APIRequestMetadata{
  417. Verb: types.APIVerbDelete,
  418. Method: types.HTTPVerbDelete,
  419. Path: &types.Path{
  420. Parent: basePath,
  421. RelativePath: relPath + "/roles",
  422. },
  423. Scopes: []types.PermissionScope{
  424. types.UserScope,
  425. types.ProjectScope,
  426. },
  427. },
  428. )
  429. deleteRoleHandler := project.NewRoleDeleteHandler(
  430. config,
  431. factory.GetDecoderValidator(),
  432. factory.GetResultWriter(),
  433. )
  434. routes = append(routes, &router.Route{
  435. Endpoint: deleteRoleEndpoint,
  436. Handler: deleteRoleHandler,
  437. Router: r,
  438. })
  439. // GET /api/projects/{project_id}/registries -> registry.NewRegistryListHandler
  440. listRegistriesEndpoint := factory.NewAPIEndpoint(
  441. &types.APIRequestMetadata{
  442. Verb: types.APIVerbList,
  443. Method: types.HTTPVerbGet,
  444. Path: &types.Path{
  445. Parent: basePath,
  446. RelativePath: relPath + "/registries",
  447. },
  448. Scopes: []types.PermissionScope{
  449. types.UserScope,
  450. types.ProjectScope,
  451. },
  452. },
  453. )
  454. listRegistriesHandler := registry.NewRegistryListHandler(
  455. config,
  456. factory.GetResultWriter(),
  457. )
  458. routes = append(routes, &router.Route{
  459. Endpoint: listRegistriesEndpoint,
  460. Handler: listRegistriesHandler,
  461. Router: r,
  462. })
  463. // POST /api/projects/{project_id}/registries -> registry.NewRegistryCreateHandler
  464. createRegistryEndpoint := factory.NewAPIEndpoint(
  465. &types.APIRequestMetadata{
  466. Verb: types.APIVerbCreate,
  467. Method: types.HTTPVerbPost,
  468. Path: &types.Path{
  469. Parent: basePath,
  470. RelativePath: relPath + "/registries",
  471. },
  472. Scopes: []types.PermissionScope{
  473. types.UserScope,
  474. types.ProjectScope,
  475. },
  476. },
  477. )
  478. createRegistryHandler := registry.NewRegistryCreateHandler(
  479. config,
  480. factory.GetDecoderValidator(),
  481. factory.GetResultWriter(),
  482. )
  483. routes = append(routes, &router.Route{
  484. Endpoint: createRegistryEndpoint,
  485. Handler: createRegistryHandler,
  486. Router: r,
  487. })
  488. // GET /api/projects/{project_id}/registries/ecr/token -> registry.NewRegistryGetECRTokenHandler
  489. getECRTokenEndpoint := factory.NewAPIEndpoint(
  490. &types.APIRequestMetadata{
  491. Verb: types.APIVerbGet,
  492. Method: types.HTTPVerbGet,
  493. Path: &types.Path{
  494. Parent: basePath,
  495. RelativePath: relPath + "/registries/ecr/token",
  496. },
  497. Scopes: []types.PermissionScope{
  498. types.UserScope,
  499. types.ProjectScope,
  500. },
  501. },
  502. )
  503. getECRTokenHandler := registry.NewRegistryGetECRTokenHandler(
  504. config,
  505. factory.GetDecoderValidator(),
  506. factory.GetResultWriter(),
  507. )
  508. routes = append(routes, &router.Route{
  509. Endpoint: getECRTokenEndpoint,
  510. Handler: getECRTokenHandler,
  511. Router: r,
  512. })
  513. // GET /api/projects/{project_id}/registries/docr/token -> registry.NewRegistryGetDOCRTokenHandler
  514. getDOCRTokenEndpoint := factory.NewAPIEndpoint(
  515. &types.APIRequestMetadata{
  516. Verb: types.APIVerbGet,
  517. Method: types.HTTPVerbGet,
  518. Path: &types.Path{
  519. Parent: basePath,
  520. RelativePath: relPath + "/registries/docr/token",
  521. },
  522. Scopes: []types.PermissionScope{
  523. types.UserScope,
  524. types.ProjectScope,
  525. },
  526. },
  527. )
  528. getDOCRTokenHandler := registry.NewRegistryGetDOCRTokenHandler(
  529. config,
  530. factory.GetDecoderValidator(),
  531. factory.GetResultWriter(),
  532. )
  533. routes = append(routes, &router.Route{
  534. Endpoint: getDOCRTokenEndpoint,
  535. Handler: getDOCRTokenHandler,
  536. Router: r,
  537. })
  538. // GET /api/projects/{project_id}/registries/gcr/token -> registry.NewRegistryGetGCRTokenHandler
  539. getGCRTokenEndpoint := factory.NewAPIEndpoint(
  540. &types.APIRequestMetadata{
  541. Verb: types.APIVerbGet,
  542. Method: types.HTTPVerbGet,
  543. Path: &types.Path{
  544. Parent: basePath,
  545. RelativePath: relPath + "/registries/gcr/token",
  546. },
  547. Scopes: []types.PermissionScope{
  548. types.UserScope,
  549. types.ProjectScope,
  550. },
  551. },
  552. )
  553. getGCRTokenHandler := registry.NewRegistryGetGCRTokenHandler(
  554. config,
  555. factory.GetDecoderValidator(),
  556. factory.GetResultWriter(),
  557. )
  558. routes = append(routes, &router.Route{
  559. Endpoint: getGCRTokenEndpoint,
  560. Handler: getGCRTokenHandler,
  561. Router: r,
  562. })
  563. // GET /api/projects/{project_id}/registries/gar/token -> registry.NewRegistryGetGARTokenHandler
  564. getGARTokenEndpoint := factory.NewAPIEndpoint(
  565. &types.APIRequestMetadata{
  566. Verb: types.APIVerbGet,
  567. Method: types.HTTPVerbGet,
  568. Path: &types.Path{
  569. Parent: basePath,
  570. RelativePath: relPath + "/registries/gar/token",
  571. },
  572. Scopes: []types.PermissionScope{
  573. types.UserScope,
  574. types.ProjectScope,
  575. },
  576. },
  577. )
  578. getGARTokenHandler := registry.NewRegistryGetGARTokenHandler(
  579. config,
  580. factory.GetDecoderValidator(),
  581. factory.GetResultWriter(),
  582. )
  583. routes = append(routes, &router.Route{
  584. Endpoint: getGARTokenEndpoint,
  585. Handler: getGARTokenHandler,
  586. Router: r,
  587. })
  588. // GET /api/projects/{project_id}/registries/acr/token -> registry.NewRegistryGetACRTokenHandler
  589. getACRTokenEndpoint := factory.NewAPIEndpoint(
  590. &types.APIRequestMetadata{
  591. Verb: types.APIVerbGet,
  592. Method: types.HTTPVerbGet,
  593. Path: &types.Path{
  594. Parent: basePath,
  595. RelativePath: relPath + "/registries/acr/token",
  596. },
  597. Scopes: []types.PermissionScope{
  598. types.UserScope,
  599. types.ProjectScope,
  600. },
  601. },
  602. )
  603. getACRTokenHandler := registry.NewRegistryGetACRTokenHandler(
  604. config,
  605. factory.GetDecoderValidator(),
  606. factory.GetResultWriter(),
  607. )
  608. routes = append(routes, &router.Route{
  609. Endpoint: getACRTokenEndpoint,
  610. Handler: getACRTokenHandler,
  611. Router: r,
  612. })
  613. // GET /api/projects/{project_id}/registries/dockerhub/token -> registry.NewRegistryGetDockerhubTokenHandler
  614. getDockerhubTokenEndpoint := factory.NewAPIEndpoint(
  615. &types.APIRequestMetadata{
  616. Verb: types.APIVerbGet,
  617. Method: types.HTTPVerbGet,
  618. Path: &types.Path{
  619. Parent: basePath,
  620. RelativePath: relPath + "/registries/dockerhub/token",
  621. },
  622. Scopes: []types.PermissionScope{
  623. types.UserScope,
  624. types.ProjectScope,
  625. },
  626. },
  627. )
  628. getDockerhubTokenHandler := registry.NewRegistryGetDockerhubTokenHandler(
  629. config,
  630. factory.GetDecoderValidator(),
  631. factory.GetResultWriter(),
  632. )
  633. routes = append(routes, &router.Route{
  634. Endpoint: getDockerhubTokenEndpoint,
  635. Handler: getDockerhubTokenHandler,
  636. Router: r,
  637. })
  638. // POST /api/projects/{project_id}/infras -> infra.NewInfraCreateHandler
  639. createInfraEndpoint := factory.NewAPIEndpoint(
  640. &types.APIRequestMetadata{
  641. Verb: types.APIVerbCreate,
  642. Method: types.HTTPVerbPost,
  643. Path: &types.Path{
  644. Parent: basePath,
  645. RelativePath: relPath + "/infras",
  646. },
  647. Scopes: []types.PermissionScope{
  648. types.UserScope,
  649. types.ProjectScope,
  650. },
  651. },
  652. )
  653. createInfraHandler := infra.NewInfraCreateHandler(
  654. config,
  655. factory.GetDecoderValidator(),
  656. factory.GetResultWriter(),
  657. )
  658. routes = append(routes, &router.Route{
  659. Endpoint: createInfraEndpoint,
  660. Handler: createInfraHandler,
  661. Router: r,
  662. })
  663. // GET /api/projects/{project_id}/infras/templates -> infra.NewInfraGetHandler
  664. getTemplatesEndpoint := factory.NewAPIEndpoint(
  665. &types.APIRequestMetadata{
  666. Verb: types.APIVerbGet,
  667. Method: types.HTTPVerbGet,
  668. Path: &types.Path{
  669. Parent: basePath,
  670. RelativePath: relPath + "/infras/templates",
  671. },
  672. Scopes: []types.PermissionScope{
  673. types.UserScope,
  674. types.ProjectScope,
  675. },
  676. },
  677. )
  678. getTemplatesHandler := infra.NewInfraListTemplateHandler(
  679. config,
  680. factory.GetResultWriter(),
  681. )
  682. routes = append(routes, &router.Route{
  683. Endpoint: getTemplatesEndpoint,
  684. Handler: getTemplatesHandler,
  685. Router: r,
  686. })
  687. // GET /api/projects/{project_id}/infras/templates -> infra.NewInfraGetHandler
  688. getTemplateEndpoint := factory.NewAPIEndpoint(
  689. &types.APIRequestMetadata{
  690. Verb: types.APIVerbGet,
  691. Method: types.HTTPVerbGet,
  692. Path: &types.Path{
  693. Parent: basePath,
  694. RelativePath: fmt.Sprintf("%s/infras/templates/{%s}/{%s}", relPath, types.URLParamTemplateName, types.URLParamTemplateVersion),
  695. },
  696. Scopes: []types.PermissionScope{
  697. types.UserScope,
  698. types.ProjectScope,
  699. },
  700. },
  701. )
  702. getTemplateHandler := infra.NewInfraGetTemplateHandler(
  703. config,
  704. factory.GetResultWriter(),
  705. )
  706. routes = append(routes, &router.Route{
  707. Endpoint: getTemplateEndpoint,
  708. Handler: getTemplateHandler,
  709. Router: r,
  710. })
  711. // // POST /api/projects/{project_id}/provision/ecr -> provision.NewProvisionECRHandler
  712. // provisionECREndpoint := factory.NewAPIEndpoint(
  713. // &types.APIRequestMetadata{
  714. // Verb: types.APIVerbCreate,
  715. // Method: types.HTTPVerbPost,
  716. // Path: &types.Path{
  717. // Parent: basePath,
  718. // RelativePath: relPath + "/provision/ecr",
  719. // },
  720. // Scopes: []types.PermissionScope{
  721. // types.UserScope,
  722. // types.ProjectScope,
  723. // },
  724. // },
  725. // )
  726. // provisionECRHandler := provision.NewProvisionECRHandler(
  727. // config,
  728. // factory.GetDecoderValidator(),
  729. // factory.GetResultWriter(),
  730. // )
  731. // routes = append(routes, &router.Route{
  732. // Endpoint: provisionECREndpoint,
  733. // Handler: provisionECRHandler,
  734. // Router: r,
  735. // })
  736. // // POST /api/projects/{project_id}/provision/eks -> provision.NewProvisionEKSHandler
  737. // provisionEKSEndpoint := factory.NewAPIEndpoint(
  738. // &types.APIRequestMetadata{
  739. // Verb: types.APIVerbCreate,
  740. // Method: types.HTTPVerbPost,
  741. // Path: &types.Path{
  742. // Parent: basePath,
  743. // RelativePath: relPath + "/provision/eks",
  744. // },
  745. // Scopes: []types.PermissionScope{
  746. // types.UserScope,
  747. // types.ProjectScope,
  748. // },
  749. // CheckUsage: true,
  750. // UsageMetric: types.Clusters,
  751. // },
  752. // )
  753. // provisionEKSHandler := provision.NewProvisionEKSHandler(
  754. // config,
  755. // factory.GetDecoderValidator(),
  756. // factory.GetResultWriter(),
  757. // )
  758. // routes = append(routes, &router.Route{
  759. // Endpoint: provisionEKSEndpoint,
  760. // Handler: provisionEKSHandler,
  761. // Router: r,
  762. // })
  763. // // POST /api/projects/{project_id}/provision/docr -> provision.NewProvisionDOCRHandler
  764. // provisionDOCREndpoint := factory.NewAPIEndpoint(
  765. // &types.APIRequestMetadata{
  766. // Verb: types.APIVerbCreate,
  767. // Method: types.HTTPVerbPost,
  768. // Path: &types.Path{
  769. // Parent: basePath,
  770. // RelativePath: relPath + "/provision/docr",
  771. // },
  772. // Scopes: []types.PermissionScope{
  773. // types.UserScope,
  774. // types.ProjectScope,
  775. // },
  776. // },
  777. // )
  778. // provisionDOCRHandler := provision.NewProvisionDOCRHandler(
  779. // config,
  780. // factory.GetDecoderValidator(),
  781. // factory.GetResultWriter(),
  782. // )
  783. // routes = append(routes, &router.Route{
  784. // Endpoint: provisionDOCREndpoint,
  785. // Handler: provisionDOCRHandler,
  786. // Router: r,
  787. // })
  788. // // POST /api/projects/{project_id}/provision/doks -> provision.NewProvisionDOKSHandler
  789. // provisionDOKSEndpoint := factory.NewAPIEndpoint(
  790. // &types.APIRequestMetadata{
  791. // Verb: types.APIVerbCreate,
  792. // Method: types.HTTPVerbPost,
  793. // Path: &types.Path{
  794. // Parent: basePath,
  795. // RelativePath: relPath + "/provision/doks",
  796. // },
  797. // Scopes: []types.PermissionScope{
  798. // types.UserScope,
  799. // types.ProjectScope,
  800. // },
  801. // CheckUsage: true,
  802. // UsageMetric: types.Clusters,
  803. // },
  804. // )
  805. // provisionDOKSHandler := provision.NewProvisionDOKSHandler(
  806. // config,
  807. // factory.GetDecoderValidator(),
  808. // factory.GetResultWriter(),
  809. // )
  810. // routes = append(routes, &router.Route{
  811. // Endpoint: provisionDOKSEndpoint,
  812. // Handler: provisionDOKSHandler,
  813. // Router: r,
  814. // })
  815. // // POST /api/projects/{project_id}/provision/gcr -> provision.NewProvisionGCRHandler
  816. // provisionGCREndpoint := factory.NewAPIEndpoint(
  817. // &types.APIRequestMetadata{
  818. // Verb: types.APIVerbCreate,
  819. // Method: types.HTTPVerbPost,
  820. // Path: &types.Path{
  821. // Parent: basePath,
  822. // RelativePath: relPath + "/provision/gcr",
  823. // },
  824. // Scopes: []types.PermissionScope{
  825. // types.UserScope,
  826. // types.ProjectScope,
  827. // },
  828. // },
  829. // )
  830. // provisionGCRHandler := provision.NewProvisionGCRHandler(
  831. // config,
  832. // factory.GetDecoderValidator(),
  833. // factory.GetResultWriter(),
  834. // )
  835. // routes = append(routes, &router.Route{
  836. // Endpoint: provisionGCREndpoint,
  837. // Handler: provisionGCRHandler,
  838. // Router: r,
  839. // })
  840. // // POST /api/projects/{project_id}/provision/gke -> provision.NewProvisionGKEHandler
  841. // provisionGKEEndpoint := factory.NewAPIEndpoint(
  842. // &types.APIRequestMetadata{
  843. // Verb: types.APIVerbCreate,
  844. // Method: types.HTTPVerbPost,
  845. // Path: &types.Path{
  846. // Parent: basePath,
  847. // RelativePath: relPath + "/provision/gke",
  848. // },
  849. // Scopes: []types.PermissionScope{
  850. // types.UserScope,
  851. // types.ProjectScope,
  852. // },
  853. // CheckUsage: true,
  854. // UsageMetric: types.Clusters,
  855. // },
  856. // )
  857. // provisionGKEHandler := provision.NewProvisionGKEHandler(
  858. // config,
  859. // factory.GetDecoderValidator(),
  860. // factory.GetResultWriter(),
  861. // )
  862. // routes = append(routes, &router.Route{
  863. // Endpoint: provisionGKEEndpoint,
  864. // Handler: provisionGKEHandler,
  865. // Router: r,
  866. // })
  867. // POST /api/projects/{project_id}/policy -> policy.NewPolicyCreateHandler
  868. policyCreateEndpoint := factory.NewAPIEndpoint(
  869. &types.APIRequestMetadata{
  870. Verb: types.APIVerbCreate,
  871. Method: types.HTTPVerbPost,
  872. Path: &types.Path{
  873. Parent: basePath,
  874. RelativePath: relPath + "/policy",
  875. },
  876. Scopes: []types.PermissionScope{
  877. types.UserScope,
  878. types.ProjectScope,
  879. types.SettingsScope,
  880. },
  881. },
  882. )
  883. policyCreateHandler := policy.NewPolicyCreateHandler(
  884. config,
  885. factory.GetDecoderValidator(),
  886. factory.GetResultWriter(),
  887. )
  888. routes = append(routes, &router.Route{
  889. Endpoint: policyCreateEndpoint,
  890. Handler: policyCreateHandler,
  891. Router: r,
  892. })
  893. // GET /api/projects/{project_id}/policies -> policy.NewPolicyListHandler
  894. policyListEndpoint := factory.NewAPIEndpoint(
  895. &types.APIRequestMetadata{
  896. Verb: types.APIVerbList,
  897. Method: types.HTTPVerbGet,
  898. Path: &types.Path{
  899. Parent: basePath,
  900. RelativePath: relPath + "/policies",
  901. },
  902. Scopes: []types.PermissionScope{
  903. types.UserScope,
  904. types.ProjectScope,
  905. types.SettingsScope,
  906. },
  907. },
  908. )
  909. policyListHandler := policy.NewPolicyListHandler(
  910. config,
  911. factory.GetDecoderValidator(),
  912. factory.GetResultWriter(),
  913. )
  914. routes = append(routes, &router.Route{
  915. Endpoint: policyListEndpoint,
  916. Handler: policyListHandler,
  917. Router: r,
  918. })
  919. // GET /api/projects/{project_id}/policy/{policy_id} -> policy.NewPolicyGetHandler
  920. policyGetEndpoint := factory.NewAPIEndpoint(
  921. &types.APIRequestMetadata{
  922. Verb: types.APIVerbGet,
  923. Method: types.HTTPVerbGet,
  924. Path: &types.Path{
  925. Parent: basePath,
  926. RelativePath: fmt.Sprintf("%s/policy/{%s}", relPath, types.URLParamPolicyID),
  927. },
  928. Scopes: []types.PermissionScope{
  929. types.UserScope,
  930. types.ProjectScope,
  931. types.SettingsScope,
  932. },
  933. },
  934. )
  935. policyGetHandler := policy.NewPolicyGetHandler(
  936. config,
  937. factory.GetDecoderValidator(),
  938. factory.GetResultWriter(),
  939. )
  940. routes = append(routes, &router.Route{
  941. Endpoint: policyGetEndpoint,
  942. Handler: policyGetHandler,
  943. Router: r,
  944. })
  945. // POST /api/projects/{project_id}/api_token -> api_token.NewAPITokenCreateHandler
  946. apiTokenCreateEndpoint := factory.NewAPIEndpoint(
  947. &types.APIRequestMetadata{
  948. Verb: types.APIVerbCreate,
  949. Method: types.HTTPVerbPost,
  950. Path: &types.Path{
  951. Parent: basePath,
  952. RelativePath: relPath + "/api_token",
  953. },
  954. Scopes: []types.PermissionScope{
  955. types.UserScope,
  956. types.ProjectScope,
  957. types.SettingsScope,
  958. },
  959. },
  960. )
  961. apiTokenCreateHandler := api_token.NewAPITokenCreateHandler(
  962. config,
  963. factory.GetDecoderValidator(),
  964. factory.GetResultWriter(),
  965. )
  966. routes = append(routes, &router.Route{
  967. Endpoint: apiTokenCreateEndpoint,
  968. Handler: apiTokenCreateHandler,
  969. Router: r,
  970. })
  971. // GET /api/projects/{project_id}/api_token -> api_token.NewAPITokenListHandler
  972. apiTokenListEndpoint := factory.NewAPIEndpoint(
  973. &types.APIRequestMetadata{
  974. Verb: types.APIVerbList,
  975. Method: types.HTTPVerbGet,
  976. Path: &types.Path{
  977. Parent: basePath,
  978. RelativePath: fmt.Sprintf("%s/api_token", relPath),
  979. },
  980. Scopes: []types.PermissionScope{
  981. types.UserScope,
  982. types.ProjectScope,
  983. types.SettingsScope,
  984. },
  985. },
  986. )
  987. apiTokenListHandler := api_token.NewAPITokenListHandler(
  988. config,
  989. factory.GetDecoderValidator(),
  990. factory.GetResultWriter(),
  991. )
  992. routes = append(routes, &router.Route{
  993. Endpoint: apiTokenListEndpoint,
  994. Handler: apiTokenListHandler,
  995. Router: r,
  996. })
  997. // GET /api/projects/{project_id}/api_token/{api_token_id} -> api_token.NewAPITokenGetHandler
  998. apiTokenGetEndpoint := factory.NewAPIEndpoint(
  999. &types.APIRequestMetadata{
  1000. Verb: types.APIVerbGet,
  1001. Method: types.HTTPVerbGet,
  1002. Path: &types.Path{
  1003. Parent: basePath,
  1004. RelativePath: fmt.Sprintf("%s/api_token/{%s}", relPath, types.URLParamTokenID),
  1005. },
  1006. Scopes: []types.PermissionScope{
  1007. types.UserScope,
  1008. types.ProjectScope,
  1009. types.SettingsScope,
  1010. },
  1011. },
  1012. )
  1013. apiTokenGetHandler := api_token.NewAPITokenGetHandler(
  1014. config,
  1015. factory.GetDecoderValidator(),
  1016. factory.GetResultWriter(),
  1017. )
  1018. routes = append(routes, &router.Route{
  1019. Endpoint: apiTokenGetEndpoint,
  1020. Handler: apiTokenGetHandler,
  1021. Router: r,
  1022. })
  1023. // POST /api/projects/{project_id}/api_token/{api_token_id}/revoke -> api_token.NewAPITokenRevokeHandler
  1024. apiTokenRevokeEndpoint := factory.NewAPIEndpoint(
  1025. &types.APIRequestMetadata{
  1026. Verb: types.APIVerbUpdate,
  1027. Method: types.HTTPVerbPost,
  1028. Path: &types.Path{
  1029. Parent: basePath,
  1030. RelativePath: fmt.Sprintf("%s/api_token/{%s}/revoke", relPath, types.URLParamTokenID),
  1031. },
  1032. Scopes: []types.PermissionScope{
  1033. types.UserScope,
  1034. types.ProjectScope,
  1035. types.SettingsScope,
  1036. },
  1037. },
  1038. )
  1039. apiTokenRevokeHandler := api_token.NewAPITokenRevokeHandler(
  1040. config,
  1041. factory.GetDecoderValidator(),
  1042. factory.GetResultWriter(),
  1043. )
  1044. routes = append(routes, &router.Route{
  1045. Endpoint: apiTokenRevokeEndpoint,
  1046. Handler: apiTokenRevokeHandler,
  1047. Router: r,
  1048. })
  1049. // POST /api/projects/{project_id}/helmrepos -> helmrepo.NewHelmRepoCreateHandler
  1050. hrCreateEndpoint := factory.NewAPIEndpoint(
  1051. &types.APIRequestMetadata{
  1052. Verb: types.APIVerbCreate,
  1053. Method: types.HTTPVerbPost,
  1054. Path: &types.Path{
  1055. Parent: basePath,
  1056. RelativePath: relPath + "/helmrepos",
  1057. },
  1058. Scopes: []types.PermissionScope{
  1059. types.UserScope,
  1060. types.ProjectScope,
  1061. },
  1062. },
  1063. )
  1064. hrCreateHandler := helmrepo.NewHelmRepoCreateHandler(
  1065. config,
  1066. factory.GetDecoderValidator(),
  1067. factory.GetResultWriter(),
  1068. )
  1069. routes = append(routes, &router.Route{
  1070. Endpoint: hrCreateEndpoint,
  1071. Handler: hrCreateHandler,
  1072. Router: r,
  1073. })
  1074. // GET /api/projects/{project_id}/helmrepos -> helmrepo.NewHelmRepoListHandler
  1075. hrListEndpoint := factory.NewAPIEndpoint(
  1076. &types.APIRequestMetadata{
  1077. Verb: types.APIVerbList,
  1078. Method: types.HTTPVerbGet,
  1079. Path: &types.Path{
  1080. Parent: basePath,
  1081. RelativePath: relPath + "/helmrepos",
  1082. },
  1083. Scopes: []types.PermissionScope{
  1084. types.UserScope,
  1085. types.ProjectScope,
  1086. },
  1087. },
  1088. )
  1089. hrListHandler := helmrepo.NewHelmRepoListHandler(
  1090. config,
  1091. factory.GetResultWriter(),
  1092. )
  1093. routes = append(routes, &router.Route{
  1094. Endpoint: hrListEndpoint,
  1095. Handler: hrListHandler,
  1096. Router: r,
  1097. })
  1098. // GET /api/projects/{project_id}/tags -> project.NewGetTagsHandler
  1099. getTagsEndpoint := factory.NewAPIEndpoint(
  1100. &types.APIRequestMetadata{
  1101. Verb: types.APIVerbGet,
  1102. Method: types.HTTPVerbGet,
  1103. Path: &types.Path{
  1104. Parent: basePath,
  1105. RelativePath: relPath + "/tags",
  1106. },
  1107. Scopes: []types.PermissionScope{
  1108. types.UserScope,
  1109. types.ProjectScope,
  1110. },
  1111. },
  1112. )
  1113. getTagsHandler := project.NewGetTagsHandler(
  1114. config,
  1115. factory.GetResultWriter(),
  1116. )
  1117. routes = append(routes, &router.Route{
  1118. Endpoint: getTagsEndpoint,
  1119. Handler: getTagsHandler,
  1120. Router: r,
  1121. })
  1122. // POST /api/projects/{project_id}/tags -> project.NewCreateTagHandler
  1123. createTagEndpoint := factory.NewAPIEndpoint(
  1124. &types.APIRequestMetadata{
  1125. Verb: types.APIVerbCreate,
  1126. Method: types.HTTPVerbPost,
  1127. Path: &types.Path{
  1128. Parent: basePath,
  1129. RelativePath: relPath + "/tags",
  1130. },
  1131. Scopes: []types.PermissionScope{
  1132. types.UserScope,
  1133. types.ProjectScope,
  1134. },
  1135. },
  1136. )
  1137. createTagHandler := project.NewCreateTagHandler(
  1138. config,
  1139. factory.GetDecoderValidator(),
  1140. factory.GetResultWriter(),
  1141. )
  1142. routes = append(routes, &router.Route{
  1143. Endpoint: createTagEndpoint,
  1144. Handler: createTagHandler,
  1145. Router: r,
  1146. })
  1147. // POST /api/projects/{project_id}/contract -> apiContract.NewAPIContractUpdateHandler
  1148. updateAPIContractEndpoint := factory.NewAPIEndpoint(
  1149. &types.APIRequestMetadata{
  1150. Verb: types.APIVerbCreate,
  1151. Method: types.HTTPVerbPost,
  1152. Path: &types.Path{
  1153. Parent: basePath,
  1154. RelativePath: relPath + "/contract",
  1155. },
  1156. Scopes: []types.PermissionScope{
  1157. types.UserScope,
  1158. types.ProjectScope,
  1159. },
  1160. },
  1161. )
  1162. updateAPIContractHandler := apiContract.NewAPIContractUpdateHandler(
  1163. config,
  1164. factory.GetDecoderValidator(),
  1165. factory.GetResultWriter(),
  1166. )
  1167. routes = append(routes, &router.Route{
  1168. Endpoint: updateAPIContractEndpoint,
  1169. Handler: updateAPIContractHandler,
  1170. Router: r,
  1171. })
  1172. // GET /api/projects/{project_id}/contracts -> apiContract.NewAPIContractRevisionListHandler
  1173. listAPIContractRevisionsEndpoint := factory.NewAPIEndpoint(
  1174. &types.APIRequestMetadata{
  1175. Verb: types.APIVerbGet,
  1176. Method: types.HTTPVerbGet,
  1177. Path: &types.Path{
  1178. Parent: basePath,
  1179. RelativePath: relPath + "/contracts",
  1180. },
  1181. Scopes: []types.PermissionScope{
  1182. types.UserScope,
  1183. types.ProjectScope,
  1184. },
  1185. },
  1186. )
  1187. listAPIContractRevisionHandler := apiContract.NewAPIContractRevisionListHandler(
  1188. config,
  1189. factory.GetDecoderValidator(),
  1190. factory.GetResultWriter(),
  1191. )
  1192. routes = append(routes, &router.Route{
  1193. Endpoint: listAPIContractRevisionsEndpoint,
  1194. Handler: listAPIContractRevisionHandler,
  1195. Router: r,
  1196. })
  1197. // DELETE /api/projects/{project_id}/contracts/{revision_id} -> apiContract.NewAPIContractUpdateHandler
  1198. deleteAPIContractRevisionsEndpoint := factory.NewAPIEndpoint(
  1199. &types.APIRequestMetadata{
  1200. Verb: types.APIVerbDelete,
  1201. Method: types.HTTPVerbDelete,
  1202. Path: &types.Path{
  1203. Parent: basePath,
  1204. RelativePath: fmt.Sprintf("%s/contracts/{%s}", relPath, types.URLParamAPIContractRevisionID),
  1205. },
  1206. Scopes: []types.PermissionScope{
  1207. types.UserScope,
  1208. types.ProjectScope,
  1209. types.APIContractRevisionScope,
  1210. },
  1211. },
  1212. )
  1213. deleteAPIContractRevisionHandler := apiContract.NewAPIContractRevisionDeleteHandler(
  1214. config,
  1215. factory.GetDecoderValidator(),
  1216. factory.GetResultWriter(),
  1217. )
  1218. routes = append(routes, &router.Route{
  1219. Endpoint: deleteAPIContractRevisionsEndpoint,
  1220. Handler: deleteAPIContractRevisionHandler,
  1221. Router: r,
  1222. })
  1223. return routes, newPath
  1224. }