router.go 41 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891
  1. package router
  2. import (
  3. "net/http"
  4. "os"
  5. "path"
  6. "strings"
  7. "time"
  8. "github.com/go-chi/chi"
  9. "github.com/go-chi/chi/middleware"
  10. "github.com/porter-dev/porter/internal/auth/token"
  11. "github.com/porter-dev/porter/server/api"
  12. mw "github.com/porter-dev/porter/server/middleware"
  13. "github.com/porter-dev/porter/server/middleware/requestlog"
  14. "golang.org/x/oauth2"
  15. )
  16. // New creates a new Chi router instance and registers all routes supported by the
  17. // API
  18. func New(a *api.App) *chi.Mux {
  19. l := a.Logger
  20. r := chi.NewRouter()
  21. var ghAppConf *oauth2.Config
  22. if a.GithubAppConf != nil {
  23. ghAppConf = &a.GithubAppConf.Config
  24. }
  25. auth := mw.NewAuth(a.Store, a.ServerConf.CookieName, &token.TokenGeneratorConf{
  26. TokenSecret: a.ServerConf.TokenGeneratorSecret,
  27. }, a.Repo, ghAppConf)
  28. r.Route("/api", func(r chi.Router) {
  29. r.Use(mw.ContentTypeJSON)
  30. // Group for default operations with 10s timeout
  31. r.Group(func(r chi.Router) {
  32. r.Use(middleware.Timeout(10 * time.Second))
  33. // health checks
  34. r.Method("GET", "/livez", http.HandlerFunc(a.HandleLive))
  35. r.Method("GET", "/readyz", http.HandlerFunc(a.HandleReady))
  36. // /api/users routes
  37. r.Method(
  38. "GET",
  39. "/users/{user_id}",
  40. auth.DoesUserIDMatch(
  41. requestlog.NewHandler(a.HandleReadUser, l),
  42. mw.URLParam,
  43. ),
  44. )
  45. r.Method(
  46. "GET",
  47. "/users/{user_id}/projects",
  48. auth.DoesUserIDMatch(
  49. requestlog.NewHandler(a.HandleListUserProjects, l),
  50. mw.URLParam,
  51. ),
  52. )
  53. // only allow basic create user or basic login if BasicLogin feature is set
  54. if a.Capabilities.BasicLogin {
  55. r.Method(
  56. "POST",
  57. "/users",
  58. requestlog.NewHandler(a.HandleCreateUser, l),
  59. )
  60. r.Method(
  61. "POST",
  62. "/login",
  63. requestlog.NewHandler(a.HandleLoginUser, l),
  64. )
  65. }
  66. r.Method(
  67. "DELETE",
  68. "/users/{user_id}",
  69. auth.DoesUserIDMatch(
  70. requestlog.NewHandler(a.HandleDeleteUser, l),
  71. mw.URLParam,
  72. ),
  73. )
  74. r.Method(
  75. "GET",
  76. "/cli/login",
  77. auth.BasicAuthenticateWithRedirect(
  78. requestlog.NewHandler(a.HandleCLILoginUser, l),
  79. ),
  80. )
  81. r.Method(
  82. "GET",
  83. "/cli/login/exchange",
  84. requestlog.NewHandler(a.HandleCLILoginExchangeToken, l),
  85. )
  86. r.Method(
  87. "GET",
  88. "/auth/check",
  89. auth.BasicAuthenticate(
  90. requestlog.NewHandler(a.HandleAuthCheck, l),
  91. ),
  92. )
  93. r.Method(
  94. "POST",
  95. "/logout",
  96. auth.BasicAuthenticate(
  97. requestlog.NewHandler(a.HandleLogoutUser, l),
  98. ),
  99. )
  100. r.Method(
  101. "POST",
  102. "/email/verify/initiate",
  103. auth.BasicAuthenticate(
  104. requestlog.NewHandler(a.InitiateEmailVerifyUser, l),
  105. ),
  106. )
  107. r.Method(
  108. "GET",
  109. "/email/verify/finalize",
  110. auth.BasicAuthenticateWithRedirect(
  111. requestlog.NewHandler(a.FinalizEmailVerifyUser, l),
  112. ),
  113. )
  114. r.Method(
  115. "POST",
  116. "/password/reset/initiate",
  117. requestlog.NewHandler(a.InitiatePWResetUser, l),
  118. )
  119. r.Method(
  120. "POST",
  121. "/password/reset/verify",
  122. requestlog.NewHandler(a.VerifyPWResetUser, l),
  123. )
  124. r.Method(
  125. "POST",
  126. "/password/reset/finalize",
  127. requestlog.NewHandler(a.FinalizPWResetUser, l),
  128. )
  129. // /api/integrations routes
  130. r.Method(
  131. "GET",
  132. "/integrations/cluster",
  133. auth.BasicAuthenticate(
  134. requestlog.NewHandler(a.HandleListClusterIntegrations, l),
  135. ),
  136. )
  137. r.Method(
  138. "GET",
  139. "/integrations/registry",
  140. auth.BasicAuthenticate(
  141. requestlog.NewHandler(a.HandleListRegistryIntegrations, l),
  142. ),
  143. )
  144. r.Method(
  145. "GET",
  146. "/integrations/helm",
  147. auth.BasicAuthenticate(
  148. requestlog.NewHandler(a.HandleListHelmRepoIntegrations, l),
  149. ),
  150. )
  151. r.Method(
  152. "GET",
  153. "/integrations/repo",
  154. auth.BasicAuthenticate(
  155. requestlog.NewHandler(a.HandleListRepoIntegrations, l),
  156. ),
  157. )
  158. r.Method(
  159. "POST",
  160. "/integrations/github-app/webhook",
  161. requestlog.NewHandler(a.HandleGithubAppEvent, l),
  162. )
  163. r.Method(
  164. "GET",
  165. "/integrations/github-app/authorize",
  166. requestlog.NewHandler(a.HandleGithubAppAuthorize, l),
  167. )
  168. r.Method(
  169. "GET",
  170. "/integrations/github-app/oauth",
  171. requestlog.NewHandler(a.HandleGithubAppOauthInit, l),
  172. )
  173. r.Method(
  174. "GET",
  175. "/integrations/github-app/install",
  176. requestlog.NewHandler(a.HandleGithubAppInstall, l),
  177. )
  178. r.Method(
  179. "GET",
  180. "/integrations/github-app/access",
  181. auth.BasicAuthenticate(
  182. requestlog.NewHandler(a.HandleListGithubAppAccess, l),
  183. ),
  184. )
  185. // /api/templates routes
  186. r.Method(
  187. "GET",
  188. "/templates",
  189. auth.BasicAuthenticate(
  190. requestlog.NewHandler(a.HandleListTemplates, l),
  191. ),
  192. )
  193. r.Method(
  194. "GET",
  195. "/templates/{name}/{version}",
  196. auth.BasicAuthenticate(
  197. requestlog.NewHandler(a.HandleReadTemplate, l),
  198. ),
  199. )
  200. r.Method(
  201. "GET",
  202. "/templates/upgrade_notes/{name}/{version}",
  203. auth.BasicAuthenticate(
  204. requestlog.NewHandler(a.HandleGetTemplateUpgradeNotes, l),
  205. ),
  206. )
  207. // /api/oauth routes
  208. r.Method(
  209. "GET",
  210. "/oauth/projects/{project_id}/github",
  211. auth.DoesUserHaveProjectAccess(
  212. requestlog.NewHandler(a.HandleGithubOAuthStartProject, l),
  213. mw.URLParam,
  214. mw.WriteAccess,
  215. ),
  216. )
  217. r.Method(
  218. "GET",
  219. "/oauth/login/github",
  220. requestlog.NewHandler(a.HandleGithubOAuthStartUser, l),
  221. )
  222. r.Method(
  223. "GET",
  224. "/oauth/github/callback",
  225. requestlog.NewHandler(a.HandleGithubOAuthCallback, l),
  226. )
  227. r.Method(
  228. "GET",
  229. "/oauth/github-app/callback",
  230. requestlog.NewHandler(a.HandleGithubAppOAuthCallback, l),
  231. )
  232. r.Method(
  233. "GET",
  234. "/oauth/login/google",
  235. requestlog.NewHandler(a.HandleGoogleStartUser, l),
  236. )
  237. r.Method(
  238. "GET",
  239. "/oauth/google/callback",
  240. requestlog.NewHandler(a.HandleGoogleOAuthCallback, l),
  241. )
  242. r.Method(
  243. "GET",
  244. "/oauth/projects/{project_id}/digitalocean",
  245. auth.DoesUserHaveProjectAccess(
  246. requestlog.NewHandler(a.HandleDOOAuthStartProject, l),
  247. mw.URLParam,
  248. mw.WriteAccess,
  249. ),
  250. )
  251. r.Method(
  252. "GET",
  253. "/oauth/digitalocean/callback",
  254. requestlog.NewHandler(a.HandleDOOAuthCallback, l),
  255. )
  256. r.Method(
  257. "GET",
  258. "/oauth/projects/{project_id}/slack",
  259. auth.DoesUserHaveProjectAccess(
  260. requestlog.NewHandler(a.HandleSlackOAuthStartProject, l),
  261. mw.URLParam,
  262. mw.WriteAccess,
  263. ),
  264. )
  265. r.Method(
  266. "GET",
  267. "/oauth/slack/callback",
  268. requestlog.NewHandler(a.HandleSlackOAuthCallback, l),
  269. )
  270. // /api/projects routes
  271. r.Method(
  272. "GET",
  273. "/projects/{project_id}",
  274. auth.DoesUserHaveProjectAccess(
  275. requestlog.NewHandler(a.HandleReadProject, l),
  276. mw.URLParam,
  277. mw.ReadAccess,
  278. ),
  279. )
  280. r.Method(
  281. "GET",
  282. "/projects/{project_id}/policy",
  283. auth.DoesUserHaveProjectAccess(
  284. requestlog.NewHandler(a.HandleReadProjectPolicy, l),
  285. mw.URLParam,
  286. mw.ReadAccess,
  287. ),
  288. )
  289. r.Method(
  290. "GET",
  291. "/projects/{project_id}/roles",
  292. auth.DoesUserHaveProjectAccess(
  293. requestlog.NewHandler(a.HandleGetProjectRoles, l),
  294. mw.URLParam,
  295. mw.AdminAccess,
  296. ),
  297. )
  298. r.Method(
  299. "GET",
  300. "/projects/{project_id}/collaborators",
  301. auth.DoesUserHaveProjectAccess(
  302. requestlog.NewHandler(a.HandleListProjectCollaborators, l),
  303. mw.URLParam,
  304. mw.AdminAccess,
  305. ),
  306. )
  307. r.Method(
  308. "POST",
  309. "/projects/{project_id}/roles/{user_id}",
  310. auth.DoesUserHaveProjectAccess(
  311. requestlog.NewHandler(a.HandleUpdateProjectRole, l),
  312. mw.URLParam,
  313. mw.AdminAccess,
  314. ),
  315. )
  316. r.Method(
  317. "POST",
  318. "/projects",
  319. auth.BasicAuthenticate(
  320. requestlog.NewHandler(a.HandleCreateProject, l),
  321. ),
  322. )
  323. r.Method(
  324. "DELETE",
  325. "/projects/{project_id}",
  326. auth.DoesUserHaveProjectAccess(
  327. requestlog.NewHandler(a.HandleDeleteProject, l),
  328. mw.URLParam,
  329. mw.AdminAccess,
  330. ),
  331. )
  332. r.Method(
  333. "DELETE",
  334. "/projects/{project_id}/roles/{user_id}",
  335. auth.DoesUserHaveProjectAccess(
  336. requestlog.NewHandler(a.HandleDeleteProjectRole, l),
  337. mw.URLParam,
  338. mw.AdminAccess,
  339. ),
  340. )
  341. // /api/projects/{project_id}/ci routes
  342. r.Method(
  343. "POST",
  344. "/projects/{project_id}/ci/actions/generate",
  345. auth.DoesUserHaveProjectAccess(
  346. auth.DoesUserHaveClusterAccess(
  347. requestlog.NewHandler(a.HandleGenerateGitAction, l),
  348. mw.URLParam,
  349. mw.QueryParam,
  350. ),
  351. mw.URLParam,
  352. mw.WriteAccess,
  353. ),
  354. )
  355. r.Method(
  356. "POST",
  357. "/projects/{project_id}/ci/actions/create",
  358. auth.DoesUserHaveProjectAccess(
  359. auth.DoesUserHaveClusterAccess(
  360. requestlog.NewHandler(a.HandleCreateGitAction, l),
  361. mw.URLParam,
  362. mw.QueryParam,
  363. ),
  364. mw.URLParam,
  365. mw.WriteAccess,
  366. ),
  367. )
  368. // /api/projects/{project_id}/events routes
  369. r.Method(
  370. "POST",
  371. "/projects/{project_id}/clusters/{cluster_id}/events",
  372. auth.DoesUserHaveProjectAccess(
  373. auth.DoesUserHaveClusterAccess(
  374. requestlog.NewHandler(a.HandleCreateEvent, l),
  375. mw.URLParam,
  376. mw.URLParam,
  377. ),
  378. mw.URLParam,
  379. mw.AdminAccess,
  380. ),
  381. )
  382. r.Method(
  383. "GET",
  384. "/projects/{project_id}/clusters/{cluster_id}/events",
  385. auth.DoesUserHaveProjectAccess(
  386. auth.DoesUserHaveClusterAccess(
  387. requestlog.NewHandler(a.HandleListEvents, l),
  388. mw.URLParam,
  389. mw.URLParam,
  390. ),
  391. mw.URLParam,
  392. mw.AdminAccess,
  393. ),
  394. )
  395. r.Method(
  396. "GET",
  397. "/projects/{project_id}/clusters/{cluster_id}/events/{event_id}",
  398. auth.DoesUserHaveProjectAccess(
  399. auth.DoesUserHaveClusterAccess(
  400. requestlog.NewHandler(a.HandleGetEvent, l),
  401. mw.URLParam,
  402. mw.URLParam,
  403. ),
  404. mw.URLParam,
  405. mw.AdminAccess,
  406. ),
  407. )
  408. // /api/projects/{project_id}/invites routes
  409. r.Method(
  410. "POST",
  411. "/projects/{project_id}/invites",
  412. auth.DoesUserHaveProjectAccess(
  413. requestlog.NewHandler(a.HandleCreateInvite, l),
  414. mw.URLParam,
  415. mw.AdminAccess,
  416. ),
  417. )
  418. r.Method(
  419. "GET",
  420. "/projects/{project_id}/invites",
  421. auth.DoesUserHaveProjectAccess(
  422. requestlog.NewHandler(a.HandleListProjectInvites, l),
  423. mw.URLParam,
  424. mw.AdminAccess,
  425. ),
  426. )
  427. r.Method(
  428. "GET",
  429. "/projects/{project_id}/invites/{token}",
  430. auth.BasicAuthenticateWithRedirect(
  431. requestlog.NewHandler(a.HandleAcceptInvite, l),
  432. ),
  433. )
  434. r.Method(
  435. "POST",
  436. "/projects/{project_id}/invites/{invite_id}",
  437. auth.DoesUserHaveProjectAccess(
  438. auth.DoesUserHaveInviteAccess(
  439. requestlog.NewHandler(a.HandleUpdateInviteRole, l),
  440. mw.URLParam,
  441. mw.URLParam,
  442. ),
  443. mw.URLParam,
  444. mw.AdminAccess,
  445. ),
  446. )
  447. r.Method(
  448. "DELETE",
  449. "/projects/{project_id}/invites/{invite_id}",
  450. auth.DoesUserHaveProjectAccess(
  451. auth.DoesUserHaveInviteAccess(
  452. requestlog.NewHandler(a.HandleDeleteProjectInvite, l),
  453. mw.URLParam,
  454. mw.URLParam,
  455. ),
  456. mw.URLParam,
  457. mw.AdminAccess,
  458. ),
  459. )
  460. // /api/projects/{project_id}/infra routes
  461. r.Method(
  462. "GET",
  463. "/projects/{project_id}/infra",
  464. auth.DoesUserHaveProjectAccess(
  465. requestlog.NewHandler(a.HandleListProjectInfra, l),
  466. mw.URLParam,
  467. mw.ReadAccess,
  468. ),
  469. )
  470. // /api/projects/{project_id}/provision routes
  471. r.Method(
  472. "POST",
  473. "/projects/{project_id}/provision/test",
  474. auth.DoesUserHaveProjectAccess(
  475. requestlog.NewHandler(a.HandleProvisionTestInfra, l),
  476. mw.URLParam,
  477. mw.WriteAccess,
  478. ),
  479. )
  480. r.Method(
  481. "POST",
  482. "/projects/{project_id}/provision/ecr",
  483. auth.DoesUserHaveProjectAccess(
  484. auth.DoesUserHaveAWSIntegrationAccess(
  485. requestlog.NewHandler(a.HandleProvisionAWSECRInfra, l),
  486. mw.URLParam,
  487. mw.BodyParam,
  488. false,
  489. ),
  490. mw.URLParam,
  491. mw.WriteAccess,
  492. ),
  493. )
  494. r.Method(
  495. "POST",
  496. "/projects/{project_id}/provision/eks",
  497. auth.DoesUserHaveProjectAccess(
  498. auth.DoesUserHaveAWSIntegrationAccess(
  499. requestlog.NewHandler(a.HandleProvisionAWSEKSInfra, l),
  500. mw.URLParam,
  501. mw.BodyParam,
  502. false,
  503. ),
  504. mw.URLParam,
  505. mw.WriteAccess,
  506. ),
  507. )
  508. r.Method(
  509. "POST",
  510. "/projects/{project_id}/provision/gcr",
  511. auth.DoesUserHaveProjectAccess(
  512. auth.DoesUserHaveGCPIntegrationAccess(
  513. requestlog.NewHandler(a.HandleProvisionGCPGCRInfra, l),
  514. mw.URLParam,
  515. mw.BodyParam,
  516. false,
  517. ),
  518. mw.URLParam,
  519. mw.WriteAccess,
  520. ),
  521. )
  522. r.Method(
  523. "POST",
  524. "/projects/{project_id}/provision/gke",
  525. auth.DoesUserHaveProjectAccess(
  526. auth.DoesUserHaveGCPIntegrationAccess(
  527. requestlog.NewHandler(a.HandleProvisionGCPGKEInfra, l),
  528. mw.URLParam,
  529. mw.BodyParam,
  530. false,
  531. ),
  532. mw.URLParam,
  533. mw.WriteAccess,
  534. ),
  535. )
  536. r.Method(
  537. "POST",
  538. "/projects/{project_id}/provision/docr",
  539. auth.DoesUserHaveProjectAccess(
  540. auth.DoesUserHaveDOIntegrationAccess(
  541. requestlog.NewHandler(a.HandleProvisionDODOCRInfra, l),
  542. mw.URLParam,
  543. mw.BodyParam,
  544. false,
  545. ),
  546. mw.URLParam,
  547. mw.WriteAccess,
  548. ),
  549. )
  550. r.Method(
  551. "POST",
  552. "/projects/{project_id}/provision/doks",
  553. auth.DoesUserHaveProjectAccess(
  554. auth.DoesUserHaveDOIntegrationAccess(
  555. requestlog.NewHandler(a.HandleProvisionDODOKSInfra, l),
  556. mw.URLParam,
  557. mw.BodyParam,
  558. false,
  559. ),
  560. mw.URLParam,
  561. mw.WriteAccess,
  562. ),
  563. )
  564. r.Method(
  565. "GET",
  566. "/projects/{project_id}/provision/{kind}/{infra_id}/logs",
  567. auth.DoesUserHaveProjectAccess(
  568. auth.DoesUserHaveInfraAccess(
  569. requestlog.NewHandler(a.HandleGetProvisioningLogs, l),
  570. mw.URLParam,
  571. mw.URLParam,
  572. ),
  573. mw.URLParam,
  574. mw.ReadAccess,
  575. ),
  576. )
  577. r.Method(
  578. "POST",
  579. "/projects/{project_id}/infra/{infra_id}/ecr/destroy",
  580. auth.DoesUserHaveProjectAccess(
  581. auth.DoesUserHaveInfraAccess(
  582. requestlog.NewHandler(a.HandleDestroyAWSECRInfra, l),
  583. mw.URLParam,
  584. mw.URLParam,
  585. ),
  586. mw.URLParam,
  587. mw.WriteAccess,
  588. ),
  589. )
  590. r.Method(
  591. "POST",
  592. "/projects/{project_id}/infra/{infra_id}/test/destroy",
  593. auth.DoesUserHaveProjectAccess(
  594. auth.DoesUserHaveInfraAccess(
  595. requestlog.NewHandler(a.HandleDestroyTestInfra, l),
  596. mw.URLParam,
  597. mw.URLParam,
  598. ),
  599. mw.URLParam,
  600. mw.WriteAccess,
  601. ),
  602. )
  603. r.Method(
  604. "POST",
  605. "/projects/{project_id}/infra/{infra_id}/eks/destroy",
  606. auth.DoesUserHaveProjectAccess(
  607. auth.DoesUserHaveInfraAccess(
  608. requestlog.NewHandler(a.HandleDestroyAWSEKSInfra, l),
  609. mw.URLParam,
  610. mw.URLParam,
  611. ),
  612. mw.URLParam,
  613. mw.WriteAccess,
  614. ),
  615. )
  616. r.Method(
  617. "POST",
  618. "/projects/{project_id}/infra/{infra_id}/gke/destroy",
  619. auth.DoesUserHaveProjectAccess(
  620. auth.DoesUserHaveInfraAccess(
  621. requestlog.NewHandler(a.HandleDestroyGCPGKEInfra, l),
  622. mw.URLParam,
  623. mw.URLParam,
  624. ),
  625. mw.URLParam,
  626. mw.WriteAccess,
  627. ),
  628. )
  629. r.Method(
  630. "POST",
  631. "/projects/{project_id}/infra/{infra_id}/docr/destroy",
  632. auth.DoesUserHaveProjectAccess(
  633. auth.DoesUserHaveInfraAccess(
  634. requestlog.NewHandler(a.HandleDestroyDODOCRInfra, l),
  635. mw.URLParam,
  636. mw.URLParam,
  637. ),
  638. mw.URLParam,
  639. mw.WriteAccess,
  640. ),
  641. )
  642. r.Method(
  643. "POST",
  644. "/projects/{project_id}/infra/{infra_id}/doks/destroy",
  645. auth.DoesUserHaveProjectAccess(
  646. auth.DoesUserHaveInfraAccess(
  647. requestlog.NewHandler(a.HandleDestroyDODOKSInfra, l),
  648. mw.URLParam,
  649. mw.URLParam,
  650. ),
  651. mw.URLParam,
  652. mw.WriteAccess,
  653. ),
  654. )
  655. // /api/projects/{project_id}/clusters routes
  656. r.Method(
  657. "GET",
  658. "/projects/{project_id}/clusters",
  659. auth.DoesUserHaveProjectAccess(
  660. requestlog.NewHandler(a.HandleListProjectClusters, l),
  661. mw.URLParam,
  662. mw.ReadAccess,
  663. ),
  664. )
  665. r.Method(
  666. "POST",
  667. "/projects/{project_id}/clusters",
  668. auth.DoesUserHaveProjectAccess(
  669. auth.DoesUserHaveAWSIntegrationAccess(
  670. auth.DoesUserHaveGCPIntegrationAccess(
  671. requestlog.NewHandler(a.HandleCreateProjectCluster, l),
  672. mw.URLParam,
  673. mw.BodyParam,
  674. true,
  675. ),
  676. mw.URLParam,
  677. mw.BodyParam,
  678. true,
  679. ),
  680. mw.URLParam,
  681. mw.WriteAccess,
  682. ),
  683. )
  684. r.Method(
  685. "GET",
  686. "/projects/{project_id}/clusters/{cluster_id}",
  687. auth.DoesUserHaveProjectAccess(
  688. auth.DoesUserHaveClusterAccess(
  689. requestlog.NewHandler(a.HandleReadProjectCluster, l),
  690. mw.URLParam,
  691. mw.URLParam,
  692. ),
  693. mw.URLParam,
  694. mw.ReadAccess,
  695. ),
  696. )
  697. r.Method(
  698. "GET",
  699. "/projects/{project_id}/clusters/{cluster_id}/nodes",
  700. auth.DoesUserHaveProjectAccess(
  701. auth.DoesUserHaveClusterAccess(
  702. requestlog.NewHandler(a.HandleListNodes, l),
  703. mw.URLParam,
  704. mw.URLParam,
  705. ),
  706. mw.URLParam,
  707. mw.ReadAccess,
  708. ),
  709. )
  710. r.Method(
  711. "GET",
  712. "/projects/{project_id}/clusters/{cluster_id}/node/{node_name}",
  713. auth.DoesUserHaveProjectAccess(
  714. auth.DoesUserHaveClusterAccess(
  715. requestlog.NewHandler(a.HandleGetNode, l),
  716. mw.URLParam,
  717. mw.URLParam,
  718. ),
  719. mw.URLParam,
  720. mw.ReadAccess,
  721. ),
  722. )
  723. r.Method(
  724. "POST",
  725. "/projects/{project_id}/clusters/{cluster_id}",
  726. auth.DoesUserHaveProjectAccess(
  727. auth.DoesUserHaveClusterAccess(
  728. requestlog.NewHandler(a.HandleUpdateProjectCluster, l),
  729. mw.URLParam,
  730. mw.URLParam,
  731. ),
  732. mw.URLParam,
  733. mw.WriteAccess,
  734. ),
  735. )
  736. r.Method(
  737. "DELETE",
  738. "/projects/{project_id}/clusters/{cluster_id}",
  739. auth.DoesUserHaveProjectAccess(
  740. auth.DoesUserHaveClusterAccess(
  741. requestlog.NewHandler(a.HandleDeleteProjectCluster, l),
  742. mw.URLParam,
  743. mw.URLParam,
  744. ),
  745. mw.URLParam,
  746. mw.WriteAccess,
  747. ),
  748. )
  749. // /api/projects/{project_id}/clusters/candidates routes
  750. r.Method(
  751. "POST",
  752. "/projects/{project_id}/clusters/candidates",
  753. auth.DoesUserHaveProjectAccess(
  754. requestlog.NewHandler(a.HandleCreateProjectClusterCandidates, l),
  755. mw.URLParam,
  756. mw.WriteAccess,
  757. ),
  758. )
  759. r.Method(
  760. "GET",
  761. "/projects/{project_id}/clusters/candidates",
  762. auth.DoesUserHaveProjectAccess(
  763. requestlog.NewHandler(a.HandleListProjectClusterCandidates, l),
  764. mw.URLParam,
  765. mw.WriteAccess,
  766. ),
  767. )
  768. r.Method(
  769. "POST",
  770. "/projects/{project_id}/clusters/candidates/{candidate_id}/resolve",
  771. auth.DoesUserHaveProjectAccess(
  772. requestlog.NewHandler(a.HandleResolveClusterCandidate, l),
  773. mw.URLParam,
  774. mw.WriteAccess,
  775. ),
  776. )
  777. // /api/projects/{project_id}/integrations routes
  778. r.Method(
  779. "POST",
  780. "/projects/{project_id}/integrations/gcp",
  781. auth.DoesUserHaveProjectAccess(
  782. requestlog.NewHandler(a.HandleCreateGCPIntegration, l),
  783. mw.URLParam,
  784. mw.WriteAccess,
  785. ),
  786. )
  787. r.Method(
  788. "POST",
  789. "/projects/{project_id}/integrations/aws",
  790. auth.DoesUserHaveProjectAccess(
  791. requestlog.NewHandler(a.HandleCreateAWSIntegration, l),
  792. mw.URLParam,
  793. mw.WriteAccess,
  794. ),
  795. )
  796. r.Method(
  797. "POST",
  798. "/projects/{project_id}/integrations/aws/{aws_integration_id}/overwrite",
  799. auth.DoesUserHaveProjectAccess(
  800. auth.DoesUserHaveClusterAccess(
  801. auth.DoesUserHaveAWSIntegrationAccess(
  802. requestlog.NewHandler(a.HandleOverwriteAWSIntegration, l),
  803. mw.URLParam,
  804. mw.URLParam,
  805. false,
  806. ),
  807. mw.URLParam,
  808. mw.QueryParam,
  809. ),
  810. mw.URLParam,
  811. mw.WriteAccess,
  812. ),
  813. )
  814. r.Method(
  815. "POST",
  816. "/projects/{project_id}/integrations/basic",
  817. auth.DoesUserHaveProjectAccess(
  818. requestlog.NewHandler(a.HandleCreateBasicAuthIntegration, l),
  819. mw.URLParam,
  820. mw.WriteAccess,
  821. ),
  822. )
  823. r.Method(
  824. "GET",
  825. "/projects/{project_id}/integrations/oauth",
  826. auth.DoesUserHaveProjectAccess(
  827. requestlog.NewHandler(a.HandleListProjectOAuthIntegrations, l),
  828. mw.URLParam,
  829. mw.WriteAccess,
  830. ),
  831. )
  832. // /api/projects/{project_id}/slack_integrations routes
  833. r.Method(
  834. "GET",
  835. "/projects/{project_id}/slack_integrations",
  836. auth.DoesUserHaveProjectAccess(
  837. requestlog.NewHandler(a.HandleListSlackIntegrations, l),
  838. mw.URLParam,
  839. mw.WriteAccess,
  840. ),
  841. )
  842. r.Method(
  843. "DELETE",
  844. "/projects/{project_id}/slack_integrations/{slack_integration_id}",
  845. auth.DoesUserHaveProjectAccess(
  846. requestlog.NewHandler(a.HandleDeleteSlackIntegration, l),
  847. mw.URLParam,
  848. mw.WriteAccess,
  849. ),
  850. )
  851. r.Method(
  852. "GET",
  853. "/projects/{project_id}/slack_integrations/exists",
  854. auth.DoesUserHaveProjectAccess(
  855. requestlog.NewHandler(a.HandleSlackIntegrationExists, l),
  856. mw.URLParam,
  857. mw.WriteAccess,
  858. ),
  859. )
  860. // /projects/{project_id}/releases/{name}/notifications routes
  861. r.Method(
  862. "POST",
  863. "/projects/{project_id}/releases/{name}/notifications",
  864. auth.DoesUserHaveProjectAccess(
  865. requestlog.NewHandler(a.HandleUpdateNotificationConfig, l),
  866. mw.URLParam,
  867. mw.WriteAccess,
  868. ),
  869. )
  870. r.Method(
  871. "GET",
  872. "/projects/{project_id}/releases/{name}/notifications",
  873. auth.DoesUserHaveProjectAccess(
  874. requestlog.NewHandler(a.HandleGetNotificationConfig, l),
  875. mw.URLParam,
  876. mw.WriteAccess,
  877. ),
  878. )
  879. // /api/projects/{project_id}/helmrepos routes
  880. r.Method(
  881. "POST",
  882. "/projects/{project_id}/helmrepos",
  883. auth.DoesUserHaveProjectAccess(
  884. auth.DoesUserHaveAWSIntegrationAccess(
  885. auth.DoesUserHaveGCPIntegrationAccess(
  886. requestlog.NewHandler(a.HandleCreateHelmRepo, l),
  887. mw.URLParam,
  888. mw.BodyParam,
  889. true,
  890. ),
  891. mw.URLParam,
  892. mw.BodyParam,
  893. true,
  894. ),
  895. mw.URLParam,
  896. mw.WriteAccess,
  897. ),
  898. )
  899. r.Method(
  900. "GET",
  901. "/projects/{project_id}/helmrepos",
  902. auth.DoesUserHaveProjectAccess(
  903. requestlog.NewHandler(a.HandleListProjectHelmRepos, l),
  904. mw.URLParam,
  905. mw.ReadAccess,
  906. ),
  907. )
  908. r.Method(
  909. "GET",
  910. "/projects/{project_id}/helmrepos/{helm_id}/charts",
  911. auth.DoesUserHaveProjectAccess(
  912. requestlog.NewHandler(a.HandleListHelmRepoCharts, l),
  913. mw.URLParam,
  914. mw.ReadAccess,
  915. ),
  916. )
  917. // /api/projects/{project_id}/registries routes
  918. r.Method(
  919. "POST",
  920. "/projects/{project_id}/registries",
  921. auth.DoesUserHaveProjectAccess(
  922. auth.DoesUserHaveAWSIntegrationAccess(
  923. auth.DoesUserHaveGCPIntegrationAccess(
  924. auth.DoesUserHaveDOIntegrationAccess(
  925. requestlog.NewHandler(a.HandleCreateRegistry, l),
  926. mw.URLParam,
  927. mw.BodyParam,
  928. true,
  929. ),
  930. mw.URLParam,
  931. mw.BodyParam,
  932. true,
  933. ),
  934. mw.URLParam,
  935. mw.BodyParam,
  936. true,
  937. ),
  938. mw.URLParam,
  939. mw.WriteAccess,
  940. ),
  941. )
  942. r.Method(
  943. "GET",
  944. "/projects/{project_id}/registries",
  945. auth.DoesUserHaveProjectAccess(
  946. requestlog.NewHandler(a.HandleListProjectRegistries, l),
  947. mw.URLParam,
  948. mw.ReadAccess,
  949. ),
  950. )
  951. r.Method(
  952. "POST",
  953. "/projects/{project_id}/registries/{registry_id}",
  954. auth.DoesUserHaveProjectAccess(
  955. auth.DoesUserHaveRegistryAccess(
  956. requestlog.NewHandler(a.HandleUpdateProjectRegistry, l),
  957. mw.URLParam,
  958. mw.URLParam,
  959. ),
  960. mw.URLParam,
  961. mw.ReadAccess,
  962. ),
  963. )
  964. r.Method(
  965. "POST",
  966. "/projects/{project_id}/registries/{registry_id}/repository",
  967. auth.DoesUserHaveProjectAccess(
  968. auth.DoesUserHaveRegistryAccess(
  969. requestlog.NewHandler(a.HandleCreateRepository, l),
  970. mw.URLParam,
  971. mw.URLParam,
  972. ),
  973. mw.URLParam,
  974. mw.WriteAccess,
  975. ),
  976. )
  977. r.Method(
  978. "GET",
  979. "/projects/{project_id}/registries/ecr/{region}/token",
  980. auth.DoesUserHaveProjectAccess(
  981. requestlog.NewHandler(a.HandleGetProjectRegistryECRToken, l),
  982. mw.URLParam,
  983. mw.WriteAccess,
  984. ),
  985. )
  986. r.Method(
  987. "GET",
  988. "/projects/{project_id}/registries/gcr/token",
  989. auth.DoesUserHaveProjectAccess(
  990. requestlog.NewHandler(a.HandleGetProjectRegistryGCRToken, l),
  991. mw.URLParam,
  992. mw.WriteAccess,
  993. ),
  994. )
  995. r.Method(
  996. "GET",
  997. "/projects/{project_id}/registries/dockerhub/token",
  998. auth.DoesUserHaveProjectAccess(
  999. requestlog.NewHandler(a.HandleGetProjectRegistryDockerhubToken, l),
  1000. mw.URLParam,
  1001. mw.WriteAccess,
  1002. ),
  1003. )
  1004. r.Method(
  1005. "GET",
  1006. "/projects/{project_id}/registries/docr/token",
  1007. auth.DoesUserHaveProjectAccess(
  1008. requestlog.NewHandler(a.HandleGetProjectRegistryDOCRToken, l),
  1009. mw.URLParam,
  1010. mw.WriteAccess,
  1011. ),
  1012. )
  1013. r.Method(
  1014. "DELETE",
  1015. "/projects/{project_id}/registries/{registry_id}",
  1016. auth.DoesUserHaveProjectAccess(
  1017. auth.DoesUserHaveRegistryAccess(
  1018. requestlog.NewHandler(a.HandleDeleteProjectRegistry, l),
  1019. mw.URLParam,
  1020. mw.URLParam,
  1021. ),
  1022. mw.URLParam,
  1023. mw.WriteAccess,
  1024. ),
  1025. )
  1026. // /api/projects/{project_id}/registries/{registry_id}/repositories routes
  1027. r.Method(
  1028. "GET",
  1029. "/projects/{project_id}/registries/{registry_id}/repositories",
  1030. auth.DoesUserHaveProjectAccess(
  1031. auth.DoesUserHaveRegistryAccess(
  1032. requestlog.NewHandler(a.HandleListRepositories, l),
  1033. mw.URLParam,
  1034. mw.URLParam,
  1035. ),
  1036. mw.URLParam,
  1037. mw.WriteAccess,
  1038. ),
  1039. )
  1040. r.Method(
  1041. "GET",
  1042. // * is the repo name, which can itself be nested
  1043. // for example, for GCR this is project-id/repo
  1044. // need to use wildcard, see https://github.com/go-chi/chi/issues/243
  1045. "/projects/{project_id}/registries/{registry_id}/repositories/*",
  1046. auth.DoesUserHaveProjectAccess(
  1047. auth.DoesUserHaveRegistryAccess(
  1048. requestlog.NewHandler(a.HandleListImages, l),
  1049. mw.URLParam,
  1050. mw.URLParam,
  1051. ),
  1052. mw.URLParam,
  1053. mw.ReadAccess,
  1054. ),
  1055. )
  1056. // /api/projects/{project_id}/releases routes
  1057. r.Method(
  1058. "GET",
  1059. "/projects/{project_id}/releases",
  1060. auth.DoesUserHaveProjectAccess(
  1061. auth.DoesUserHaveClusterAccess(
  1062. requestlog.NewHandler(a.HandleListReleases, l),
  1063. mw.URLParam,
  1064. mw.QueryParam,
  1065. ),
  1066. mw.URLParam,
  1067. mw.ReadAccess,
  1068. ),
  1069. )
  1070. r.Method(
  1071. "GET",
  1072. "/projects/{project_id}/releases/{name}/{revision}/components",
  1073. auth.DoesUserHaveProjectAccess(
  1074. auth.DoesUserHaveClusterAccess(
  1075. requestlog.NewHandler(a.HandleGetReleaseComponents, l),
  1076. mw.URLParam,
  1077. mw.QueryParam,
  1078. ),
  1079. mw.URLParam,
  1080. mw.ReadAccess,
  1081. ),
  1082. )
  1083. r.Method(
  1084. "GET",
  1085. "/projects/{project_id}/releases/{name}/{revision}/controllers",
  1086. auth.DoesUserHaveProjectAccess(
  1087. auth.DoesUserHaveClusterAccess(
  1088. requestlog.NewHandler(a.HandleGetReleaseControllers, l),
  1089. mw.URLParam,
  1090. mw.QueryParam,
  1091. ),
  1092. mw.URLParam,
  1093. mw.ReadAccess,
  1094. ),
  1095. )
  1096. r.Method(
  1097. "GET",
  1098. "/projects/{project_id}/releases/{name}/{revision}/pods/all",
  1099. auth.DoesUserHaveProjectAccess(
  1100. auth.DoesUserHaveClusterAccess(
  1101. requestlog.NewHandler(a.HandleGetReleaseAllPods, l),
  1102. mw.URLParam,
  1103. mw.QueryParam,
  1104. ),
  1105. mw.URLParam,
  1106. mw.ReadAccess,
  1107. ),
  1108. )
  1109. r.Method(
  1110. "GET",
  1111. "/projects/{project_id}/releases/{name}/history",
  1112. auth.DoesUserHaveProjectAccess(
  1113. auth.DoesUserHaveClusterAccess(
  1114. requestlog.NewHandler(a.HandleListReleaseHistory, l),
  1115. mw.URLParam,
  1116. mw.QueryParam,
  1117. ),
  1118. mw.URLParam,
  1119. mw.ReadAccess,
  1120. ),
  1121. )
  1122. r.Method(
  1123. "GET",
  1124. "/projects/{project_id}/releases/{name}/webhook_token",
  1125. auth.DoesUserHaveProjectAccess(
  1126. auth.DoesUserHaveClusterAccess(
  1127. requestlog.NewHandler(a.HandleGetReleaseToken, l),
  1128. mw.URLParam,
  1129. mw.QueryParam,
  1130. ),
  1131. mw.URLParam,
  1132. mw.ReadAccess,
  1133. ),
  1134. )
  1135. r.Method(
  1136. "POST",
  1137. "/projects/{project_id}/releases/{name}/webhook_token",
  1138. auth.DoesUserHaveProjectAccess(
  1139. auth.DoesUserHaveClusterAccess(
  1140. requestlog.NewHandler(a.HandleCreateWebhookToken, l),
  1141. mw.URLParam,
  1142. mw.QueryParam,
  1143. ),
  1144. mw.URLParam,
  1145. mw.WriteAccess,
  1146. ),
  1147. )
  1148. r.Method(
  1149. "GET",
  1150. "/projects/{project_id}/releases/{name}/{revision}",
  1151. auth.DoesUserHaveProjectAccess(
  1152. auth.DoesUserHaveClusterAccess(
  1153. requestlog.NewHandler(a.HandleGetRelease, l),
  1154. mw.URLParam,
  1155. mw.QueryParam,
  1156. ),
  1157. mw.URLParam,
  1158. mw.ReadAccess,
  1159. ),
  1160. )
  1161. // /api/projects/{project_id}/gitrepos routes
  1162. r.Method(
  1163. "GET",
  1164. "/projects/{project_id}/gitrepos",
  1165. auth.DoesUserHaveProjectAccess(
  1166. requestlog.NewHandler(a.HandleListProjectGitRepos, l),
  1167. mw.URLParam,
  1168. mw.ReadAccess,
  1169. ),
  1170. )
  1171. r.Method(
  1172. "GET",
  1173. "/projects/{project_id}/gitrepos/{installation_id}/repos",
  1174. auth.DoesUserHaveProjectAccess(
  1175. auth.DoesUserHaveGitInstallationAccess(
  1176. requestlog.NewHandler(a.HandleListRepos, l),
  1177. mw.URLParam,
  1178. ),
  1179. mw.URLParam,
  1180. mw.ReadAccess,
  1181. ),
  1182. )
  1183. r.Method(
  1184. "GET",
  1185. "/projects/{project_id}/gitrepos/{installation_id}/repos/{kind}/{owner}/{name}/branches",
  1186. auth.DoesUserHaveProjectAccess(
  1187. auth.DoesUserHaveGitInstallationAccess(
  1188. requestlog.NewHandler(a.HandleGetBranches, l),
  1189. mw.URLParam,
  1190. ),
  1191. mw.URLParam,
  1192. mw.ReadAccess,
  1193. ),
  1194. )
  1195. r.Method(
  1196. "GET",
  1197. "/projects/{project_id}/gitrepos/{installation_id}/repos/{kind}/{owner}/{name}/{branch}/buildpack/detect",
  1198. auth.DoesUserHaveProjectAccess(
  1199. auth.DoesUserHaveGitInstallationAccess(
  1200. requestlog.NewHandler(a.HandleDetectBuildpack, l),
  1201. mw.URLParam,
  1202. ),
  1203. mw.URLParam,
  1204. mw.ReadAccess,
  1205. ),
  1206. )
  1207. r.Method(
  1208. "GET",
  1209. "/projects/{project_id}/gitrepos/{installation_id}/repos/{kind}/{owner}/{name}/{branch}/contents",
  1210. auth.DoesUserHaveProjectAccess(
  1211. auth.DoesUserHaveGitInstallationAccess(
  1212. requestlog.NewHandler(a.HandleGetBranchContents, l),
  1213. mw.URLParam,
  1214. ),
  1215. mw.URLParam,
  1216. mw.ReadAccess,
  1217. ),
  1218. )
  1219. r.Method(
  1220. "GET",
  1221. "/projects/{project_id}/gitrepos/{installation_id}/repos/{kind}/{owner}/{name}/{branch}/procfile",
  1222. auth.DoesUserHaveProjectAccess(
  1223. auth.DoesUserHaveGitInstallationAccess(
  1224. requestlog.NewHandler(a.HandleGetProcfileContents, l),
  1225. mw.URLParam,
  1226. ),
  1227. mw.URLParam,
  1228. mw.ReadAccess,
  1229. ),
  1230. )
  1231. r.Method(
  1232. "GET",
  1233. "/projects/{project_id}/gitrepos/{installation_id}/repos/{kind}/{owner}/{name}/{branch}/tarball_url",
  1234. auth.DoesUserHaveProjectAccess(
  1235. auth.DoesUserHaveGitInstallationAccess(
  1236. requestlog.NewHandler(a.HandleGetRepoZIPDownloadURL, l),
  1237. mw.URLParam,
  1238. ),
  1239. mw.URLParam,
  1240. mw.ReadAccess,
  1241. ),
  1242. )
  1243. // api/projects/{project_id}/agent routes
  1244. r.Method(
  1245. "POST",
  1246. "/projects/{project_id}/agent/deploy",
  1247. auth.DoesUserHaveProjectAccess(
  1248. auth.DoesUserHaveClusterAccess(
  1249. requestlog.NewHandler(a.HandleDeployAgent, l),
  1250. mw.URLParam,
  1251. mw.QueryParam,
  1252. ),
  1253. mw.URLParam,
  1254. mw.WriteAccess,
  1255. ),
  1256. )
  1257. r.Method(
  1258. "GET",
  1259. "/projects/{project_id}/agent/detect",
  1260. auth.DoesUserHaveProjectAccess(
  1261. auth.DoesUserHaveClusterAccess(
  1262. requestlog.NewHandler(a.HandleDetectPorterAgentInstalled, l),
  1263. mw.URLParam,
  1264. mw.QueryParam,
  1265. ),
  1266. mw.URLParam,
  1267. mw.ReadAccess,
  1268. ),
  1269. )
  1270. // /api/projects/{project_id}/k8s routes
  1271. r.Method(
  1272. "GET",
  1273. "/projects/{project_id}/k8s/namespaces",
  1274. auth.DoesUserHaveProjectAccess(
  1275. auth.DoesUserHaveClusterAccess(
  1276. requestlog.NewHandler(a.HandleListNamespaces, l),
  1277. mw.URLParam,
  1278. mw.QueryParam,
  1279. ),
  1280. mw.URLParam,
  1281. mw.ReadAccess,
  1282. ),
  1283. )
  1284. r.Method(
  1285. "POST",
  1286. "/projects/{project_id}/k8s/namespaces/create",
  1287. auth.DoesUserHaveProjectAccess(
  1288. auth.DoesUserHaveClusterAccess(
  1289. requestlog.NewHandler(a.HandleCreateNamespace, l),
  1290. mw.URLParam,
  1291. mw.QueryParam,
  1292. ),
  1293. mw.URLParam,
  1294. mw.ReadAccess,
  1295. ),
  1296. )
  1297. r.Method(
  1298. "DELETE",
  1299. "/projects/{project_id}/k8s/namespaces/delete",
  1300. auth.DoesUserHaveProjectAccess(
  1301. auth.DoesUserHaveClusterAccess(
  1302. requestlog.NewHandler(a.HandleDeleteNamespace, l),
  1303. mw.URLParam,
  1304. mw.QueryParam,
  1305. ),
  1306. mw.URLParam,
  1307. mw.ReadAccess,
  1308. ),
  1309. )
  1310. r.Method(
  1311. "GET",
  1312. "/projects/{project_id}/k8s/kubeconfig",
  1313. auth.DoesUserHaveProjectAccess(
  1314. auth.DoesUserHaveClusterAccess(
  1315. requestlog.NewHandler(a.HandleGetTemporaryKubeconfig, l),
  1316. mw.URLParam,
  1317. mw.QueryParam,
  1318. ),
  1319. mw.URLParam,
  1320. mw.WriteAccess,
  1321. ),
  1322. )
  1323. r.Method(
  1324. "GET",
  1325. "/projects/{project_id}/k8s/prometheus/detect",
  1326. auth.DoesUserHaveProjectAccess(
  1327. auth.DoesUserHaveClusterAccess(
  1328. requestlog.NewHandler(a.HandleDetectPrometheusInstalled, l),
  1329. mw.URLParam,
  1330. mw.QueryParam,
  1331. ),
  1332. mw.URLParam,
  1333. mw.ReadAccess,
  1334. ),
  1335. )
  1336. r.Method(
  1337. "GET",
  1338. "/projects/{project_id}/k8s/prometheus/ingresses",
  1339. auth.DoesUserHaveProjectAccess(
  1340. auth.DoesUserHaveClusterAccess(
  1341. requestlog.NewHandler(a.HandleListNGINXIngresses, l),
  1342. mw.URLParam,
  1343. mw.QueryParam,
  1344. ),
  1345. mw.URLParam,
  1346. mw.ReadAccess,
  1347. ),
  1348. )
  1349. r.Method(
  1350. "GET",
  1351. "/projects/{project_id}/k8s/metrics",
  1352. auth.DoesUserHaveProjectAccess(
  1353. auth.DoesUserHaveClusterAccess(
  1354. requestlog.NewHandler(a.HandleGetPodMetrics, l),
  1355. mw.URLParam,
  1356. mw.QueryParam,
  1357. ),
  1358. mw.URLParam,
  1359. mw.ReadAccess,
  1360. ),
  1361. )
  1362. r.Method(
  1363. "GET",
  1364. "/projects/{project_id}/k8s/{namespace}/pod/{name}/logs",
  1365. auth.DoesUserHaveProjectAccess(
  1366. auth.DoesUserHaveClusterAccess(
  1367. requestlog.NewHandler(a.HandleGetPodLogs, l),
  1368. mw.URLParam,
  1369. mw.QueryParam,
  1370. ),
  1371. mw.URLParam,
  1372. mw.ReadAccess,
  1373. ),
  1374. )
  1375. r.Method(
  1376. "GET",
  1377. "/projects/{project_id}/k8s/{namespace}/{chart}/{release_name}/jobs",
  1378. auth.DoesUserHaveProjectAccess(
  1379. auth.DoesUserHaveClusterAccess(
  1380. requestlog.NewHandler(a.HandleListJobsByChart, l),
  1381. mw.URLParam,
  1382. mw.QueryParam,
  1383. ),
  1384. mw.URLParam,
  1385. mw.ReadAccess,
  1386. ),
  1387. )
  1388. r.Method(
  1389. "GET",
  1390. "/projects/{project_id}/k8s/{namespace}/{name}/jobs/status",
  1391. auth.DoesUserHaveProjectAccess(
  1392. auth.DoesUserHaveClusterAccess(
  1393. requestlog.NewHandler(a.HandleGetJobStatus, l),
  1394. mw.URLParam,
  1395. mw.QueryParam,
  1396. ),
  1397. mw.URLParam,
  1398. mw.ReadAccess,
  1399. ),
  1400. )
  1401. r.Method(
  1402. "GET",
  1403. "/projects/{project_id}/k8s/jobs/{namespace}/{name}/pods",
  1404. auth.DoesUserHaveProjectAccess(
  1405. auth.DoesUserHaveClusterAccess(
  1406. requestlog.NewHandler(a.HandleListJobPods, l),
  1407. mw.URLParam,
  1408. mw.QueryParam,
  1409. ),
  1410. mw.URLParam,
  1411. mw.ReadAccess,
  1412. ),
  1413. )
  1414. r.Method(
  1415. "GET",
  1416. "/projects/{project_id}/k8s/{namespace}/ingress/{name}",
  1417. auth.DoesUserHaveProjectAccess(
  1418. auth.DoesUserHaveClusterAccess(
  1419. requestlog.NewHandler(a.HandleGetIngress, l),
  1420. mw.URLParam,
  1421. mw.QueryParam,
  1422. ),
  1423. mw.URLParam,
  1424. mw.ReadAccess,
  1425. ),
  1426. )
  1427. r.Method(
  1428. "GET",
  1429. "/projects/{project_id}/k8s/{kind}/status",
  1430. auth.DoesUserHaveProjectAccess(
  1431. auth.DoesUserHaveClusterAccess(
  1432. requestlog.NewHandler(a.HandleStreamControllerStatus, l),
  1433. mw.URLParam,
  1434. mw.QueryParam,
  1435. ),
  1436. mw.URLParam,
  1437. mw.ReadAccess,
  1438. ),
  1439. )
  1440. r.Method(
  1441. "GET",
  1442. "/projects/{project_id}/k8s/helm_releases",
  1443. auth.DoesUserHaveProjectAccess(
  1444. auth.DoesUserHaveClusterAccess(
  1445. requestlog.NewHandler(a.HandleStreamHelmReleases, l),
  1446. mw.URLParam,
  1447. mw.QueryParam,
  1448. ),
  1449. mw.URLParam,
  1450. mw.ReadAccess,
  1451. ),
  1452. )
  1453. r.Method(
  1454. "GET",
  1455. "/projects/{project_id}/k8s/pods",
  1456. auth.DoesUserHaveProjectAccess(
  1457. auth.DoesUserHaveClusterAccess(
  1458. requestlog.NewHandler(a.HandleListPods, l),
  1459. mw.URLParam,
  1460. mw.QueryParam,
  1461. ),
  1462. mw.URLParam,
  1463. mw.ReadAccess,
  1464. ),
  1465. )
  1466. r.Method(
  1467. "DELETE",
  1468. "/projects/{project_id}/k8s/pods/{namespace}/{name}",
  1469. auth.DoesUserHaveProjectAccess(
  1470. auth.DoesUserHaveClusterAccess(
  1471. requestlog.NewHandler(a.HandleDeletePod, l),
  1472. mw.URLParam,
  1473. mw.QueryParam,
  1474. ),
  1475. mw.URLParam,
  1476. mw.WriteAccess,
  1477. ),
  1478. )
  1479. r.Method(
  1480. "GET",
  1481. "/projects/{project_id}/k8s/pods/{namespace}/{name}/events/list",
  1482. auth.DoesUserHaveProjectAccess(
  1483. auth.DoesUserHaveClusterAccess(
  1484. requestlog.NewHandler(a.HandleListPodEvents, l),
  1485. mw.URLParam,
  1486. mw.QueryParam,
  1487. ),
  1488. mw.URLParam,
  1489. mw.ReadAccess,
  1490. ),
  1491. )
  1492. r.Method(
  1493. "POST",
  1494. "/projects/{project_id}/k8s/configmap/create",
  1495. auth.DoesUserHaveProjectAccess(
  1496. auth.DoesUserHaveClusterAccess(
  1497. requestlog.NewHandler(a.HandleCreateConfigMap, l),
  1498. mw.URLParam,
  1499. mw.QueryParam,
  1500. ),
  1501. mw.URLParam,
  1502. mw.WriteAccess,
  1503. ),
  1504. )
  1505. r.Method(
  1506. "DELETE",
  1507. "/projects/{project_id}/k8s/configmap/delete",
  1508. auth.DoesUserHaveProjectAccess(
  1509. auth.DoesUserHaveClusterAccess(
  1510. requestlog.NewHandler(a.HandleDeleteConfigMap, l),
  1511. mw.URLParam,
  1512. mw.QueryParam,
  1513. ),
  1514. mw.URLParam,
  1515. mw.WriteAccess,
  1516. ),
  1517. )
  1518. r.Method(
  1519. "GET",
  1520. "/projects/{project_id}/k8s/configmap",
  1521. auth.DoesUserHaveProjectAccess(
  1522. auth.DoesUserHaveClusterAccess(
  1523. requestlog.NewHandler(a.HandleGetConfigMap, l),
  1524. mw.URLParam,
  1525. mw.QueryParam,
  1526. ),
  1527. mw.URLParam,
  1528. mw.ReadAccess,
  1529. ),
  1530. )
  1531. r.Method(
  1532. "GET",
  1533. "/projects/{project_id}/k8s/configmap/list",
  1534. auth.DoesUserHaveProjectAccess(
  1535. auth.DoesUserHaveClusterAccess(
  1536. requestlog.NewHandler(a.HandleListConfigMaps, l),
  1537. mw.URLParam,
  1538. mw.QueryParam,
  1539. ),
  1540. mw.URLParam,
  1541. mw.ReadAccess,
  1542. ),
  1543. )
  1544. r.Method(
  1545. "POST",
  1546. "/projects/{project_id}/k8s/configmap/update",
  1547. auth.DoesUserHaveProjectAccess(
  1548. auth.DoesUserHaveClusterAccess(
  1549. requestlog.NewHandler(a.HandleUpdateConfigMap, l),
  1550. mw.URLParam,
  1551. mw.QueryParam,
  1552. ),
  1553. mw.URLParam,
  1554. mw.WriteAccess,
  1555. ),
  1556. )
  1557. r.Method(
  1558. "POST",
  1559. "/projects/{project_id}/k8s/configmap/rename",
  1560. auth.DoesUserHaveProjectAccess(
  1561. auth.DoesUserHaveClusterAccess(
  1562. requestlog.NewHandler(a.HandleRenameConfigMap, l),
  1563. mw.URLParam,
  1564. mw.QueryParam,
  1565. ),
  1566. mw.URLParam,
  1567. mw.WriteAccess,
  1568. ),
  1569. )
  1570. r.Method(
  1571. "DELETE",
  1572. "/projects/{project_id}/k8s/jobs/{namespace}/{name}",
  1573. auth.DoesUserHaveProjectAccess(
  1574. auth.DoesUserHaveClusterAccess(
  1575. requestlog.NewHandler(a.HandleDeleteJob, l),
  1576. mw.URLParam,
  1577. mw.QueryParam,
  1578. ),
  1579. mw.URLParam,
  1580. mw.WriteAccess,
  1581. ),
  1582. )
  1583. r.Method(
  1584. "POST",
  1585. "/projects/{project_id}/k8s/jobs/{namespace}/{name}/stop",
  1586. auth.DoesUserHaveProjectAccess(
  1587. auth.DoesUserHaveClusterAccess(
  1588. requestlog.NewHandler(a.HandleStopJob, l),
  1589. mw.URLParam,
  1590. mw.QueryParam,
  1591. ),
  1592. mw.URLParam,
  1593. mw.WriteAccess,
  1594. ),
  1595. )
  1596. // /api/projects/{project_id}/subdomain routes
  1597. r.Method(
  1598. "POST",
  1599. "/projects/{project_id}/k8s/subdomain",
  1600. auth.DoesUserHaveProjectAccess(
  1601. auth.DoesUserHaveClusterAccess(
  1602. requestlog.NewHandler(a.HandleCreateDNSRecord, l),
  1603. mw.URLParam,
  1604. mw.QueryParam,
  1605. ),
  1606. mw.URLParam,
  1607. mw.WriteAccess,
  1608. ),
  1609. )
  1610. // capabilities
  1611. r.Method(
  1612. "GET",
  1613. "/capabilities",
  1614. http.HandlerFunc(a.HandleGetCapabilities),
  1615. )
  1616. // /api/projects/{project_id}/deploy routes
  1617. r.Method(
  1618. "POST",
  1619. "/projects/{project_id}/deploy/{name}/{version}",
  1620. auth.DoesUserHaveProjectAccess(
  1621. auth.DoesUserHaveClusterAccess(
  1622. requestlog.NewHandler(a.HandleDeployTemplate, l),
  1623. mw.URLParam,
  1624. mw.QueryParam,
  1625. ),
  1626. mw.URLParam,
  1627. mw.WriteAccess,
  1628. ),
  1629. )
  1630. r.Method(
  1631. "POST",
  1632. "/projects/{project_id}/deploy/addon/{name}/{version}",
  1633. auth.DoesUserHaveProjectAccess(
  1634. auth.DoesUserHaveClusterAccess(
  1635. requestlog.NewHandler(a.HandleDeployAddon, l),
  1636. mw.URLParam,
  1637. mw.QueryParam,
  1638. ),
  1639. mw.URLParam,
  1640. mw.WriteAccess,
  1641. ),
  1642. )
  1643. })
  1644. // Create group for long-running Helm operations
  1645. r.Group(func(r chi.Router) {
  1646. r.Use(middleware.Timeout(300 * time.Second))
  1647. r.Method(
  1648. "POST",
  1649. "/projects/{project_id}/releases/{name}/rollback",
  1650. auth.DoesUserHaveProjectAccess(
  1651. auth.DoesUserHaveClusterAccess(
  1652. requestlog.NewHandler(a.HandleRollbackRelease, l),
  1653. mw.URLParam,
  1654. mw.QueryParam,
  1655. ),
  1656. mw.URLParam,
  1657. mw.WriteAccess,
  1658. ),
  1659. )
  1660. r.Method(
  1661. "POST",
  1662. "/webhooks/deploy/{token}",
  1663. requestlog.NewHandler(a.HandleReleaseDeployWebhook, l),
  1664. )
  1665. r.Method(
  1666. "POST",
  1667. "/projects/{project_id}/delete/{name}",
  1668. auth.DoesUserHaveProjectAccess(
  1669. auth.DoesUserHaveClusterAccess(
  1670. requestlog.NewHandler(a.HandleUninstallTemplate, l),
  1671. mw.URLParam,
  1672. mw.QueryParam,
  1673. ),
  1674. mw.URLParam,
  1675. mw.WriteAccess,
  1676. ),
  1677. )
  1678. r.Method(
  1679. "POST",
  1680. "/projects/{project_id}/releases/{name}/upgrade",
  1681. auth.DoesUserHaveProjectAccess(
  1682. auth.DoesUserHaveClusterAccess(
  1683. requestlog.NewHandler(a.HandleUpgradeRelease, l),
  1684. mw.URLParam,
  1685. mw.QueryParam,
  1686. ),
  1687. mw.URLParam,
  1688. mw.WriteAccess,
  1689. ),
  1690. )
  1691. r.Method(
  1692. "POST",
  1693. "/projects/{project_id}/releases/image/update/batch",
  1694. auth.DoesUserHaveProjectAccess(
  1695. auth.DoesUserHaveClusterAccess(
  1696. requestlog.NewHandler(a.HandleReleaseUpdateJobImages, l),
  1697. mw.URLParam,
  1698. mw.QueryParam,
  1699. ),
  1700. mw.URLParam,
  1701. mw.WriteAccess,
  1702. ),
  1703. )
  1704. })
  1705. })
  1706. staticFilePath := a.ServerConf.StaticFilePath
  1707. fs := http.FileServer(http.Dir(staticFilePath))
  1708. r.Get("/*", func(w http.ResponseWriter, r *http.Request) {
  1709. if _, err := os.Stat(staticFilePath + r.RequestURI); os.IsNotExist(err) {
  1710. w.Header().Set("Cache-Control", "no-cache")
  1711. http.StripPrefix(r.URL.Path, fs).ServeHTTP(w, r)
  1712. } else {
  1713. // Set static files involving html, js, or empty cache to "no-cache", which means they must be validated
  1714. // for changes before the browser uses the cache
  1715. if base := path.Base(r.URL.Path); strings.Contains(base, "html") || strings.Contains(base, "js") || base == "." || base == "/" {
  1716. w.Header().Set("Cache-Control", "no-cache")
  1717. }
  1718. fs.ServeHTTP(w, r)
  1719. }
  1720. })
  1721. return r
  1722. }