router.go 22 KB

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