router.go 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080
  1. package router
  2. import (
  3. "net/http"
  4. "os"
  5. "github.com/go-chi/chi"
  6. "github.com/porter-dev/porter/internal/auth/token"
  7. "github.com/porter-dev/porter/server/api"
  8. "github.com/porter-dev/porter/server/requestlog"
  9. mw "github.com/porter-dev/porter/server/router/middleware"
  10. )
  11. // New creates a new Chi router instance and registers all routes supported by the
  12. // API
  13. func New(a *api.App) *chi.Mux {
  14. l := a.Logger
  15. r := chi.NewRouter()
  16. auth := mw.NewAuth(a.Store, a.ServerConf.CookieName, &token.TokenGeneratorConf{
  17. TokenSecret: a.ServerConf.TokenGeneratorSecret,
  18. }, a.Repo)
  19. r.Route("/api", func(r chi.Router) {
  20. r.Use(mw.ContentTypeJSON)
  21. // health checks
  22. r.Method("GET", "/livez", http.HandlerFunc(a.HandleLive))
  23. r.Method("GET", "/readyz", http.HandlerFunc(a.HandleReady))
  24. // /api/users routes
  25. r.Method(
  26. "GET",
  27. "/users/{user_id}",
  28. auth.DoesUserIDMatch(
  29. requestlog.NewHandler(a.HandleReadUser, l),
  30. mw.URLParam,
  31. ),
  32. )
  33. r.Method(
  34. "GET",
  35. "/users/{user_id}/projects",
  36. auth.DoesUserIDMatch(
  37. requestlog.NewHandler(a.HandleListUserProjects, l),
  38. mw.URLParam,
  39. ),
  40. )
  41. r.Method(
  42. "POST",
  43. "/users",
  44. requestlog.NewHandler(a.HandleCreateUser, l),
  45. )
  46. r.Method(
  47. "DELETE",
  48. "/users/{user_id}",
  49. auth.DoesUserIDMatch(
  50. requestlog.NewHandler(a.HandleDeleteUser, l),
  51. mw.URLParam,
  52. ),
  53. )
  54. r.Method(
  55. "POST",
  56. "/login",
  57. requestlog.NewHandler(a.HandleLoginUser, l),
  58. )
  59. r.Method(
  60. "GET",
  61. "/auth/check",
  62. auth.BasicAuthenticate(
  63. requestlog.NewHandler(a.HandleAuthCheck, l),
  64. ),
  65. )
  66. r.Method(
  67. "POST",
  68. "/logout",
  69. auth.BasicAuthenticate(
  70. requestlog.NewHandler(a.HandleLogoutUser, l),
  71. ),
  72. )
  73. // /api/integrations routes
  74. r.Method(
  75. "GET",
  76. "/integrations/cluster",
  77. auth.BasicAuthenticate(
  78. requestlog.NewHandler(a.HandleListClusterIntegrations, l),
  79. ),
  80. )
  81. r.Method(
  82. "GET",
  83. "/integrations/registry",
  84. auth.BasicAuthenticate(
  85. requestlog.NewHandler(a.HandleListRegistryIntegrations, l),
  86. ),
  87. )
  88. r.Method(
  89. "GET",
  90. "/integrations/helm",
  91. auth.BasicAuthenticate(
  92. requestlog.NewHandler(a.HandleListHelmRepoIntegrations, l),
  93. ),
  94. )
  95. r.Method(
  96. "GET",
  97. "/integrations/repo",
  98. auth.BasicAuthenticate(
  99. requestlog.NewHandler(a.HandleListRepoIntegrations, l),
  100. ),
  101. )
  102. // /api/templates routes
  103. r.Method(
  104. "GET",
  105. "/templates",
  106. auth.BasicAuthenticate(
  107. requestlog.NewHandler(a.HandleListTemplates, l),
  108. ),
  109. )
  110. r.Method(
  111. "GET",
  112. "/templates/{name}/{version}",
  113. auth.BasicAuthenticate(
  114. requestlog.NewHandler(a.HandleReadTemplate, l),
  115. ),
  116. )
  117. // /api/oauth routes
  118. r.Method(
  119. "GET",
  120. "/oauth/projects/{project_id}/github",
  121. auth.DoesUserHaveProjectAccess(
  122. requestlog.NewHandler(a.HandleGithubOAuthStartProject, l),
  123. mw.URLParam,
  124. mw.WriteAccess,
  125. ),
  126. )
  127. r.Method(
  128. "GET",
  129. "/oauth/github/callback",
  130. requestlog.NewHandler(a.HandleGithubOAuthCallback, l),
  131. )
  132. r.Method(
  133. "GET",
  134. "/oauth/projects/{project_id}/digitalocean",
  135. auth.DoesUserHaveProjectAccess(
  136. requestlog.NewHandler(a.HandleDOOAuthStartProject, l),
  137. mw.URLParam,
  138. mw.WriteAccess,
  139. ),
  140. )
  141. r.Method(
  142. "GET",
  143. "/oauth/digitalocean/callback",
  144. requestlog.NewHandler(a.HandleDOOAuthCallback, l),
  145. )
  146. // /api/projects routes
  147. r.Method(
  148. "GET",
  149. "/projects/{project_id}",
  150. auth.DoesUserHaveProjectAccess(
  151. requestlog.NewHandler(a.HandleReadProject, l),
  152. mw.URLParam,
  153. mw.ReadAccess,
  154. ),
  155. )
  156. r.Method(
  157. "POST",
  158. "/projects",
  159. auth.BasicAuthenticate(
  160. requestlog.NewHandler(a.HandleCreateProject, l),
  161. ),
  162. )
  163. r.Method(
  164. "DELETE",
  165. "/projects/{project_id}",
  166. auth.DoesUserHaveProjectAccess(
  167. requestlog.NewHandler(a.HandleDeleteProject, l),
  168. mw.URLParam,
  169. mw.WriteAccess,
  170. ),
  171. )
  172. // /api/projects/{project_id}/ci routes
  173. r.Method(
  174. "POST",
  175. "/projects/{project_id}/ci/actions",
  176. auth.DoesUserHaveProjectAccess(
  177. auth.DoesUserHaveClusterAccess(
  178. requestlog.NewHandler(a.HandleCreateGitAction, l),
  179. mw.URLParam,
  180. mw.QueryParam,
  181. ),
  182. mw.URLParam,
  183. mw.ReadAccess,
  184. ),
  185. )
  186. // /api/projects/{project_id}/invites routes
  187. r.Method(
  188. "POST",
  189. "/projects/{project_id}/invites",
  190. auth.DoesUserHaveProjectAccess(
  191. requestlog.NewHandler(a.HandleCreateInvite, l),
  192. mw.URLParam,
  193. mw.WriteAccess,
  194. ),
  195. )
  196. r.Method(
  197. "GET",
  198. "/projects/{project_id}/invites",
  199. auth.DoesUserHaveProjectAccess(
  200. requestlog.NewHandler(a.HandleListProjectInvites, l),
  201. mw.URLParam,
  202. mw.ReadAccess,
  203. ),
  204. )
  205. r.Method(
  206. "GET",
  207. "/projects/{project_id}/invites/{token}",
  208. auth.BasicAuthenticateWithRedirect(
  209. requestlog.NewHandler(a.HandleAcceptInvite, l),
  210. ),
  211. )
  212. r.Method(
  213. "DELETE",
  214. "/projects/{project_id}/invites/{invite_id}",
  215. auth.DoesUserHaveProjectAccess(
  216. auth.DoesUserHaveInviteAccess(
  217. requestlog.NewHandler(a.HandleDeleteProjectInvite, l),
  218. mw.URLParam,
  219. mw.URLParam,
  220. ),
  221. mw.URLParam,
  222. mw.WriteAccess,
  223. ),
  224. )
  225. // /api/projects/{project_id}/infra routes
  226. r.Method(
  227. "GET",
  228. "/projects/{project_id}/infra",
  229. auth.DoesUserHaveProjectAccess(
  230. requestlog.NewHandler(a.HandleListProjectInfra, l),
  231. mw.URLParam,
  232. mw.ReadAccess,
  233. ),
  234. )
  235. // /api/projects/{project_id}/provision routes
  236. r.Method(
  237. "POST",
  238. "/projects/{project_id}/provision/test",
  239. auth.DoesUserHaveProjectAccess(
  240. requestlog.NewHandler(a.HandleProvisionTestInfra, l),
  241. mw.URLParam,
  242. mw.ReadAccess,
  243. ),
  244. )
  245. r.Method(
  246. "POST",
  247. "/projects/{project_id}/provision/ecr",
  248. auth.DoesUserHaveProjectAccess(
  249. auth.DoesUserHaveAWSIntegrationAccess(
  250. requestlog.NewHandler(a.HandleProvisionAWSECRInfra, l),
  251. mw.URLParam,
  252. mw.BodyParam,
  253. false,
  254. ),
  255. mw.URLParam,
  256. mw.ReadAccess,
  257. ),
  258. )
  259. r.Method(
  260. "POST",
  261. "/projects/{project_id}/provision/eks",
  262. auth.DoesUserHaveProjectAccess(
  263. auth.DoesUserHaveAWSIntegrationAccess(
  264. requestlog.NewHandler(a.HandleProvisionAWSEKSInfra, l),
  265. mw.URLParam,
  266. mw.BodyParam,
  267. false,
  268. ),
  269. mw.URLParam,
  270. mw.ReadAccess,
  271. ),
  272. )
  273. r.Method(
  274. "POST",
  275. "/projects/{project_id}/provision/gcr",
  276. auth.DoesUserHaveProjectAccess(
  277. auth.DoesUserHaveGCPIntegrationAccess(
  278. requestlog.NewHandler(a.HandleProvisionGCPGCRInfra, l),
  279. mw.URLParam,
  280. mw.BodyParam,
  281. false,
  282. ),
  283. mw.URLParam,
  284. mw.ReadAccess,
  285. ),
  286. )
  287. r.Method(
  288. "POST",
  289. "/projects/{project_id}/provision/gke",
  290. auth.DoesUserHaveProjectAccess(
  291. auth.DoesUserHaveGCPIntegrationAccess(
  292. requestlog.NewHandler(a.HandleProvisionGCPGKEInfra, l),
  293. mw.URLParam,
  294. mw.BodyParam,
  295. false,
  296. ),
  297. mw.URLParam,
  298. mw.ReadAccess,
  299. ),
  300. )
  301. r.Method(
  302. "POST",
  303. "/projects/{project_id}/provision/docr",
  304. auth.DoesUserHaveProjectAccess(
  305. auth.DoesUserHaveDOIntegrationAccess(
  306. requestlog.NewHandler(a.HandleProvisionDODOCRInfra, l),
  307. mw.URLParam,
  308. mw.BodyParam,
  309. false,
  310. ),
  311. mw.URLParam,
  312. mw.ReadAccess,
  313. ),
  314. )
  315. r.Method(
  316. "POST",
  317. "/projects/{project_id}/provision/doks",
  318. auth.DoesUserHaveProjectAccess(
  319. auth.DoesUserHaveDOIntegrationAccess(
  320. requestlog.NewHandler(a.HandleProvisionDODOKSInfra, l),
  321. mw.URLParam,
  322. mw.BodyParam,
  323. false,
  324. ),
  325. mw.URLParam,
  326. mw.ReadAccess,
  327. ),
  328. )
  329. r.Method(
  330. "GET",
  331. "/projects/{project_id}/provision/{kind}/{infra_id}/logs",
  332. auth.DoesUserHaveProjectAccess(
  333. auth.DoesUserHaveInfraAccess(
  334. requestlog.NewHandler(a.HandleGetProvisioningLogs, l),
  335. mw.URLParam,
  336. mw.URLParam,
  337. ),
  338. mw.URLParam,
  339. mw.ReadAccess,
  340. ),
  341. )
  342. r.Method(
  343. "POST",
  344. "/projects/{project_id}/provision/{kind}/{infra_id}/logs",
  345. auth.DoesUserHaveProjectAccess(
  346. auth.DoesUserHaveInfraAccess(
  347. requestlog.NewHandler(a.HandleGetProvisioningLogs, l),
  348. mw.URLParam,
  349. mw.URLParam,
  350. ),
  351. mw.URLParam,
  352. mw.ReadAccess,
  353. ),
  354. )
  355. r.Method(
  356. "POST",
  357. "/projects/{project_id}/infra/{infra_id}/ecr/destroy",
  358. auth.DoesUserHaveProjectAccess(
  359. auth.DoesUserHaveInfraAccess(
  360. requestlog.NewHandler(a.HandleDestroyAWSECRInfra, l),
  361. mw.URLParam,
  362. mw.URLParam,
  363. ),
  364. mw.URLParam,
  365. mw.ReadAccess,
  366. ),
  367. )
  368. r.Method(
  369. "POST",
  370. "/projects/{project_id}/infra/{infra_id}/test/destroy",
  371. auth.DoesUserHaveProjectAccess(
  372. auth.DoesUserHaveInfraAccess(
  373. requestlog.NewHandler(a.HandleDestroyTestInfra, l),
  374. mw.URLParam,
  375. mw.URLParam,
  376. ),
  377. mw.URLParam,
  378. mw.ReadAccess,
  379. ),
  380. )
  381. r.Method(
  382. "POST",
  383. "/projects/{project_id}/infra/{infra_id}/eks/destroy",
  384. auth.DoesUserHaveProjectAccess(
  385. auth.DoesUserHaveInfraAccess(
  386. requestlog.NewHandler(a.HandleDestroyAWSEKSInfra, l),
  387. mw.URLParam,
  388. mw.URLParam,
  389. ),
  390. mw.URLParam,
  391. mw.ReadAccess,
  392. ),
  393. )
  394. r.Method(
  395. "POST",
  396. "/projects/{project_id}/infra/{infra_id}/gke/destroy",
  397. auth.DoesUserHaveProjectAccess(
  398. auth.DoesUserHaveInfraAccess(
  399. requestlog.NewHandler(a.HandleDestroyGCPGKEInfra, l),
  400. mw.URLParam,
  401. mw.URLParam,
  402. ),
  403. mw.URLParam,
  404. mw.ReadAccess,
  405. ),
  406. )
  407. r.Method(
  408. "POST",
  409. "/projects/{project_id}/infra/{infra_id}/docr/destroy",
  410. auth.DoesUserHaveProjectAccess(
  411. auth.DoesUserHaveInfraAccess(
  412. requestlog.NewHandler(a.HandleDestroyDODOCRInfra, l),
  413. mw.URLParam,
  414. mw.URLParam,
  415. ),
  416. mw.URLParam,
  417. mw.ReadAccess,
  418. ),
  419. )
  420. r.Method(
  421. "POST",
  422. "/projects/{project_id}/infra/{infra_id}/doks/destroy",
  423. auth.DoesUserHaveProjectAccess(
  424. auth.DoesUserHaveInfraAccess(
  425. requestlog.NewHandler(a.HandleDestroyDODOKSInfra, l),
  426. mw.URLParam,
  427. mw.URLParam,
  428. ),
  429. mw.URLParam,
  430. mw.ReadAccess,
  431. ),
  432. )
  433. // /api/projects/{project_id}/clusters routes
  434. r.Method(
  435. "GET",
  436. "/projects/{project_id}/clusters",
  437. auth.DoesUserHaveProjectAccess(
  438. requestlog.NewHandler(a.HandleListProjectClusters, l),
  439. mw.URLParam,
  440. mw.ReadAccess,
  441. ),
  442. )
  443. r.Method(
  444. "POST",
  445. "/projects/{project_id}/clusters",
  446. auth.DoesUserHaveProjectAccess(
  447. auth.DoesUserHaveAWSIntegrationAccess(
  448. auth.DoesUserHaveGCPIntegrationAccess(
  449. requestlog.NewHandler(a.HandleCreateProjectCluster, l),
  450. mw.URLParam,
  451. mw.BodyParam,
  452. true,
  453. ),
  454. mw.URLParam,
  455. mw.BodyParam,
  456. true,
  457. ),
  458. mw.URLParam,
  459. mw.WriteAccess,
  460. ),
  461. )
  462. r.Method(
  463. "GET",
  464. "/projects/{project_id}/clusters/{cluster_id}",
  465. auth.DoesUserHaveProjectAccess(
  466. auth.DoesUserHaveClusterAccess(
  467. requestlog.NewHandler(a.HandleReadProjectCluster, l),
  468. mw.URLParam,
  469. mw.URLParam,
  470. ),
  471. mw.URLParam,
  472. mw.ReadAccess,
  473. ),
  474. )
  475. r.Method(
  476. "POST",
  477. "/projects/{project_id}/clusters/{cluster_id}",
  478. auth.DoesUserHaveProjectAccess(
  479. auth.DoesUserHaveClusterAccess(
  480. requestlog.NewHandler(a.HandleUpdateProjectCluster, l),
  481. mw.URLParam,
  482. mw.URLParam,
  483. ),
  484. mw.URLParam,
  485. mw.WriteAccess,
  486. ),
  487. )
  488. r.Method(
  489. "DELETE",
  490. "/projects/{project_id}/clusters/{cluster_id}",
  491. auth.DoesUserHaveProjectAccess(
  492. auth.DoesUserHaveClusterAccess(
  493. requestlog.NewHandler(a.HandleDeleteProjectCluster, l),
  494. mw.URLParam,
  495. mw.URLParam,
  496. ),
  497. mw.URLParam,
  498. mw.WriteAccess,
  499. ),
  500. )
  501. // /api/projects/{project_id}/clusters/candidates routes
  502. r.Method(
  503. "POST",
  504. "/projects/{project_id}/clusters/candidates",
  505. auth.DoesUserHaveProjectAccess(
  506. requestlog.NewHandler(a.HandleCreateProjectClusterCandidates, l),
  507. mw.URLParam,
  508. mw.WriteAccess,
  509. ),
  510. )
  511. r.Method(
  512. "GET",
  513. "/projects/{project_id}/clusters/candidates",
  514. auth.DoesUserHaveProjectAccess(
  515. requestlog.NewHandler(a.HandleListProjectClusterCandidates, l),
  516. mw.URLParam,
  517. mw.WriteAccess,
  518. ),
  519. )
  520. r.Method(
  521. "POST",
  522. "/projects/{project_id}/clusters/candidates/{candidate_id}/resolve",
  523. auth.DoesUserHaveProjectAccess(
  524. requestlog.NewHandler(a.HandleResolveClusterCandidate, l),
  525. mw.URLParam,
  526. mw.WriteAccess,
  527. ),
  528. )
  529. // /api/projects/{project_id}/integrations routes
  530. r.Method(
  531. "POST",
  532. "/projects/{project_id}/integrations/gcp",
  533. auth.DoesUserHaveProjectAccess(
  534. requestlog.NewHandler(a.HandleCreateGCPIntegration, l),
  535. mw.URLParam,
  536. mw.WriteAccess,
  537. ),
  538. )
  539. r.Method(
  540. "POST",
  541. "/projects/{project_id}/integrations/aws",
  542. auth.DoesUserHaveProjectAccess(
  543. requestlog.NewHandler(a.HandleCreateAWSIntegration, l),
  544. mw.URLParam,
  545. mw.WriteAccess,
  546. ),
  547. )
  548. r.Method(
  549. "POST",
  550. "/projects/{project_id}/integrations/basic",
  551. auth.DoesUserHaveProjectAccess(
  552. requestlog.NewHandler(a.HandleCreateBasicAuthIntegration, l),
  553. mw.URLParam,
  554. mw.WriteAccess,
  555. ),
  556. )
  557. r.Method(
  558. "GET",
  559. "/projects/{project_id}/integrations/oauth",
  560. auth.DoesUserHaveProjectAccess(
  561. requestlog.NewHandler(a.HandleListProjectOAuthIntegrations, l),
  562. mw.URLParam,
  563. mw.WriteAccess,
  564. ),
  565. )
  566. // /api/projects/{project_id}/helmrepos routes
  567. r.Method(
  568. "POST",
  569. "/projects/{project_id}/helmrepos",
  570. auth.DoesUserHaveProjectAccess(
  571. auth.DoesUserHaveAWSIntegrationAccess(
  572. auth.DoesUserHaveGCPIntegrationAccess(
  573. requestlog.NewHandler(a.HandleCreateHelmRepo, l),
  574. mw.URLParam,
  575. mw.BodyParam,
  576. true,
  577. ),
  578. mw.URLParam,
  579. mw.BodyParam,
  580. true,
  581. ),
  582. mw.URLParam,
  583. mw.WriteAccess,
  584. ),
  585. )
  586. r.Method(
  587. "GET",
  588. "/projects/{project_id}/helmrepos",
  589. auth.DoesUserHaveProjectAccess(
  590. requestlog.NewHandler(a.HandleListProjectHelmRepos, l),
  591. mw.URLParam,
  592. mw.WriteAccess,
  593. ),
  594. )
  595. r.Method(
  596. "GET",
  597. "/projects/{project_id}/helmrepos/{helm_id}/charts",
  598. auth.DoesUserHaveProjectAccess(
  599. requestlog.NewHandler(a.HandleListHelmRepoCharts, l),
  600. mw.URLParam,
  601. mw.WriteAccess,
  602. ),
  603. )
  604. // /api/projects/{project_id}/registries routes
  605. r.Method(
  606. "POST",
  607. "/projects/{project_id}/registries",
  608. auth.DoesUserHaveProjectAccess(
  609. auth.DoesUserHaveAWSIntegrationAccess(
  610. auth.DoesUserHaveGCPIntegrationAccess(
  611. auth.DoesUserHaveDOIntegrationAccess(
  612. requestlog.NewHandler(a.HandleCreateRegistry, l),
  613. mw.URLParam,
  614. mw.BodyParam,
  615. true,
  616. ),
  617. mw.URLParam,
  618. mw.BodyParam,
  619. true,
  620. ),
  621. mw.URLParam,
  622. mw.BodyParam,
  623. true,
  624. ),
  625. mw.URLParam,
  626. mw.WriteAccess,
  627. ),
  628. )
  629. r.Method(
  630. "GET",
  631. "/projects/{project_id}/registries",
  632. auth.DoesUserHaveProjectAccess(
  633. requestlog.NewHandler(a.HandleListProjectRegistries, l),
  634. mw.URLParam,
  635. mw.WriteAccess,
  636. ),
  637. )
  638. r.Method(
  639. "POST",
  640. "/projects/{project_id}/registries/{registry_id}",
  641. auth.DoesUserHaveProjectAccess(
  642. auth.DoesUserHaveRegistryAccess(
  643. requestlog.NewHandler(a.HandleUpdateProjectRegistry, l),
  644. mw.URLParam,
  645. mw.URLParam,
  646. ),
  647. mw.URLParam,
  648. mw.WriteAccess,
  649. ),
  650. )
  651. r.Method(
  652. "GET",
  653. "/projects/{project_id}/registries/ecr/{region}/token",
  654. auth.DoesUserHaveProjectAccess(
  655. requestlog.NewHandler(a.HandleGetProjectRegistryECRToken, l),
  656. mw.URLParam,
  657. mw.WriteAccess,
  658. ),
  659. )
  660. r.Method(
  661. "GET",
  662. "/projects/{project_id}/registries/gcr/token",
  663. auth.DoesUserHaveProjectAccess(
  664. requestlog.NewHandler(a.HandleGetProjectRegistryGCRToken, l),
  665. mw.URLParam,
  666. mw.WriteAccess,
  667. ),
  668. )
  669. r.Method(
  670. "GET",
  671. "/projects/{project_id}/registries/docr/token",
  672. auth.DoesUserHaveProjectAccess(
  673. requestlog.NewHandler(a.HandleGetProjectRegistryDOCRToken, l),
  674. mw.URLParam,
  675. mw.WriteAccess,
  676. ),
  677. )
  678. r.Method(
  679. "DELETE",
  680. "/projects/{project_id}/registries/{registry_id}",
  681. auth.DoesUserHaveProjectAccess(
  682. auth.DoesUserHaveRegistryAccess(
  683. requestlog.NewHandler(a.HandleDeleteProjectRegistry, l),
  684. mw.URLParam,
  685. mw.URLParam,
  686. ),
  687. mw.URLParam,
  688. mw.WriteAccess,
  689. ),
  690. )
  691. // /api/projects/{project_id}/registries/{registry_id}/repositories routes
  692. r.Method(
  693. "GET",
  694. "/projects/{project_id}/registries/{registry_id}/repositories",
  695. auth.DoesUserHaveProjectAccess(
  696. auth.DoesUserHaveRegistryAccess(
  697. requestlog.NewHandler(a.HandleListRepositories, l),
  698. mw.URLParam,
  699. mw.URLParam,
  700. ),
  701. mw.URLParam,
  702. mw.WriteAccess,
  703. ),
  704. )
  705. r.Method(
  706. "GET",
  707. // * is the repo name, which can itself be nested
  708. // for example, for GCR this is project-id/repo
  709. // need to use wildcard, see https://github.com/go-chi/chi/issues/243
  710. "/projects/{project_id}/registries/{registry_id}/repositories/*",
  711. auth.DoesUserHaveProjectAccess(
  712. auth.DoesUserHaveRegistryAccess(
  713. requestlog.NewHandler(a.HandleListImages, l),
  714. mw.URLParam,
  715. mw.URLParam,
  716. ),
  717. mw.URLParam,
  718. mw.WriteAccess,
  719. ),
  720. )
  721. // /api/projects/{project_id}/releases routes
  722. r.Method(
  723. "GET",
  724. "/projects/{project_id}/releases",
  725. auth.DoesUserHaveProjectAccess(
  726. auth.DoesUserHaveClusterAccess(
  727. requestlog.NewHandler(a.HandleListReleases, l),
  728. mw.URLParam,
  729. mw.QueryParam,
  730. ),
  731. mw.URLParam,
  732. mw.ReadAccess,
  733. ),
  734. )
  735. r.Method(
  736. "GET",
  737. "/projects/{project_id}/releases/{name}/{revision}/components",
  738. auth.DoesUserHaveProjectAccess(
  739. auth.DoesUserHaveClusterAccess(
  740. requestlog.NewHandler(a.HandleGetReleaseComponents, l),
  741. mw.URLParam,
  742. mw.QueryParam,
  743. ),
  744. mw.URLParam,
  745. mw.ReadAccess,
  746. ),
  747. )
  748. r.Method(
  749. "GET",
  750. "/projects/{project_id}/releases/{name}/{revision}/controllers",
  751. auth.DoesUserHaveProjectAccess(
  752. auth.DoesUserHaveClusterAccess(
  753. requestlog.NewHandler(a.HandleGetReleaseControllers, l),
  754. mw.URLParam,
  755. mw.QueryParam,
  756. ),
  757. mw.URLParam,
  758. mw.ReadAccess,
  759. ),
  760. )
  761. r.Method(
  762. "GET",
  763. "/projects/{project_id}/releases/{name}/history",
  764. auth.DoesUserHaveProjectAccess(
  765. auth.DoesUserHaveClusterAccess(
  766. requestlog.NewHandler(a.HandleListReleaseHistory, l),
  767. mw.URLParam,
  768. mw.QueryParam,
  769. ),
  770. mw.URLParam,
  771. mw.ReadAccess,
  772. ),
  773. )
  774. r.Method(
  775. "GET",
  776. "/projects/{project_id}/releases/{name}/webhook_token",
  777. auth.DoesUserHaveProjectAccess(
  778. auth.DoesUserHaveClusterAccess(
  779. requestlog.NewHandler(a.HandleGetReleaseToken, l),
  780. mw.URLParam,
  781. mw.QueryParam,
  782. ),
  783. mw.URLParam,
  784. mw.ReadAccess,
  785. ),
  786. )
  787. r.Method(
  788. "POST",
  789. "/projects/{project_id}/releases/{name}/upgrade",
  790. auth.DoesUserHaveProjectAccess(
  791. auth.DoesUserHaveClusterAccess(
  792. requestlog.NewHandler(a.HandleUpgradeRelease, l),
  793. mw.URLParam,
  794. mw.QueryParam,
  795. ),
  796. mw.URLParam,
  797. mw.ReadAccess,
  798. ),
  799. )
  800. r.Method(
  801. "GET",
  802. "/projects/{project_id}/releases/{name}/{revision}",
  803. auth.DoesUserHaveProjectAccess(
  804. auth.DoesUserHaveClusterAccess(
  805. requestlog.NewHandler(a.HandleGetRelease, l),
  806. mw.URLParam,
  807. mw.QueryParam,
  808. ),
  809. mw.URLParam,
  810. mw.ReadAccess,
  811. ),
  812. )
  813. r.Method(
  814. "POST",
  815. "/projects/{project_id}/releases/{name}/rollback",
  816. auth.DoesUserHaveProjectAccess(
  817. auth.DoesUserHaveClusterAccess(
  818. requestlog.NewHandler(a.HandleRollbackRelease, l),
  819. mw.URLParam,
  820. mw.QueryParam,
  821. ),
  822. mw.URLParam,
  823. mw.ReadAccess,
  824. ),
  825. )
  826. r.Method(
  827. "POST",
  828. "/webhooks/deploy/{token}",
  829. requestlog.NewHandler(a.HandleReleaseDeployWebhook, l),
  830. )
  831. // /api/projects/{project_id}/gitrepos routes
  832. r.Method(
  833. "GET",
  834. "/projects/{project_id}/gitrepos",
  835. auth.DoesUserHaveProjectAccess(
  836. requestlog.NewHandler(a.HandleListProjectGitRepos, l),
  837. mw.URLParam,
  838. mw.ReadAccess,
  839. ),
  840. )
  841. r.Method(
  842. "GET",
  843. "/projects/{project_id}/gitrepos/{git_repo_id}/repos",
  844. auth.DoesUserHaveProjectAccess(
  845. auth.DoesUserHaveGitRepoAccess(
  846. requestlog.NewHandler(a.HandleListRepos, l),
  847. mw.URLParam,
  848. mw.URLParam,
  849. ),
  850. mw.URLParam,
  851. mw.ReadAccess,
  852. ),
  853. )
  854. r.Method(
  855. "GET",
  856. "/projects/{project_id}/gitrepos/{git_repo_id}/repos/{kind}/{owner}/{name}/branches",
  857. auth.DoesUserHaveProjectAccess(
  858. auth.DoesUserHaveGitRepoAccess(
  859. requestlog.NewHandler(a.HandleGetBranches, l),
  860. mw.URLParam,
  861. mw.URLParam,
  862. ),
  863. mw.URLParam,
  864. mw.ReadAccess,
  865. ),
  866. )
  867. r.Method(
  868. "GET",
  869. "/projects/{project_id}/gitrepos/{git_repo_id}/repos/{kind}/{owner}/{name}/{branch}/contents",
  870. auth.DoesUserHaveProjectAccess(
  871. auth.DoesUserHaveGitRepoAccess(
  872. requestlog.NewHandler(a.HandleGetBranchContents, l),
  873. mw.URLParam,
  874. mw.URLParam,
  875. ),
  876. mw.URLParam,
  877. mw.ReadAccess,
  878. ),
  879. )
  880. // /api/projects/{project_id}/deploy routes
  881. r.Method(
  882. "POST",
  883. "/projects/{project_id}/deploy/{name}/{version}",
  884. auth.DoesUserHaveProjectAccess(
  885. auth.DoesUserHaveClusterAccess(
  886. requestlog.NewHandler(a.HandleDeployTemplate, l),
  887. mw.URLParam,
  888. mw.QueryParam,
  889. ),
  890. mw.URLParam,
  891. mw.ReadAccess,
  892. ),
  893. )
  894. // /api/projects/{project_id}/deploy routes
  895. r.Method(
  896. "POST",
  897. "/projects/{project_id}/deploy/{name}",
  898. auth.DoesUserHaveProjectAccess(
  899. auth.DoesUserHaveClusterAccess(
  900. requestlog.NewHandler(a.HandleUninstallTemplate, l),
  901. mw.URLParam,
  902. mw.QueryParam,
  903. ),
  904. mw.URLParam,
  905. mw.ReadAccess,
  906. ),
  907. )
  908. // /api/projects/{project_id}/k8s routes
  909. r.Method(
  910. "GET",
  911. "/projects/{project_id}/k8s/namespaces",
  912. auth.DoesUserHaveProjectAccess(
  913. auth.DoesUserHaveClusterAccess(
  914. requestlog.NewHandler(a.HandleListNamespaces, l),
  915. mw.URLParam,
  916. mw.QueryParam,
  917. ),
  918. mw.URLParam,
  919. mw.ReadAccess,
  920. ),
  921. )
  922. r.Method(
  923. "GET",
  924. "/projects/{project_id}/k8s/{namespace}/pod/{name}/logs",
  925. auth.DoesUserHaveProjectAccess(
  926. auth.DoesUserHaveClusterAccess(
  927. requestlog.NewHandler(a.HandleGetPodLogs, l),
  928. mw.URLParam,
  929. mw.QueryParam,
  930. ),
  931. mw.URLParam,
  932. mw.ReadAccess,
  933. ),
  934. )
  935. r.Method(
  936. "GET",
  937. "/projects/{project_id}/k8s/{namespace}/ingress/{name}",
  938. auth.DoesUserHaveProjectAccess(
  939. auth.DoesUserHaveClusterAccess(
  940. requestlog.NewHandler(a.HandleGetIngress, l),
  941. mw.URLParam,
  942. mw.QueryParam,
  943. ),
  944. mw.URLParam,
  945. mw.ReadAccess,
  946. ),
  947. )
  948. r.Method(
  949. "GET",
  950. "/projects/{project_id}/k8s/{kind}/status",
  951. auth.DoesUserHaveProjectAccess(
  952. auth.DoesUserHaveClusterAccess(
  953. requestlog.NewHandler(a.HandleStreamControllerStatus, l),
  954. mw.URLParam,
  955. mw.QueryParam,
  956. ),
  957. mw.URLParam,
  958. mw.ReadAccess,
  959. ),
  960. )
  961. r.Method(
  962. "GET",
  963. "/projects/{project_id}/k8s/pods",
  964. auth.DoesUserHaveProjectAccess(
  965. auth.DoesUserHaveClusterAccess(
  966. requestlog.NewHandler(a.HandleListPods, l),
  967. mw.URLParam,
  968. mw.QueryParam,
  969. ),
  970. mw.URLParam,
  971. mw.ReadAccess,
  972. ),
  973. )
  974. })
  975. staticFilePath := a.ServerConf.StaticFilePath
  976. fs := http.FileServer(http.Dir(staticFilePath))
  977. r.Get("/*", func(w http.ResponseWriter, r *http.Request) {
  978. if _, err := os.Stat(staticFilePath + r.RequestURI); os.IsNotExist(err) {
  979. http.StripPrefix(r.URL.Path, fs).ServeHTTP(w, r)
  980. } else {
  981. fs.ServeHTTP(w, r)
  982. }
  983. })
  984. return r
  985. }