router.go 21 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001
  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}/infra routes
  170. r.Method(
  171. "GET",
  172. "/projects/{project_id}/infra",
  173. auth.DoesUserHaveProjectAccess(
  174. requestlog.NewHandler(a.HandleListProjectInfra, l),
  175. mw.URLParam,
  176. mw.ReadAccess,
  177. ),
  178. )
  179. // /api/projects/{project_id}/provision routes
  180. r.Method(
  181. "POST",
  182. "/projects/{project_id}/provision/ecr",
  183. auth.DoesUserHaveProjectAccess(
  184. auth.DoesUserHaveAWSIntegrationAccess(
  185. requestlog.NewHandler(a.HandleProvisionAWSECRInfra, l),
  186. mw.URLParam,
  187. mw.BodyParam,
  188. false,
  189. ),
  190. mw.URLParam,
  191. mw.ReadAccess,
  192. ),
  193. )
  194. r.Method(
  195. "POST",
  196. "/projects/{project_id}/provision/eks",
  197. auth.DoesUserHaveProjectAccess(
  198. auth.DoesUserHaveAWSIntegrationAccess(
  199. requestlog.NewHandler(a.HandleProvisionAWSEKSInfra, l),
  200. mw.URLParam,
  201. mw.BodyParam,
  202. false,
  203. ),
  204. mw.URLParam,
  205. mw.ReadAccess,
  206. ),
  207. )
  208. r.Method(
  209. "POST",
  210. "/projects/{project_id}/provision/gcr",
  211. auth.DoesUserHaveProjectAccess(
  212. auth.DoesUserHaveGCPIntegrationAccess(
  213. requestlog.NewHandler(a.HandleProvisionGCPGCRInfra, l),
  214. mw.URLParam,
  215. mw.BodyParam,
  216. false,
  217. ),
  218. mw.URLParam,
  219. mw.ReadAccess,
  220. ),
  221. )
  222. r.Method(
  223. "POST",
  224. "/projects/{project_id}/provision/gke",
  225. auth.DoesUserHaveProjectAccess(
  226. auth.DoesUserHaveGCPIntegrationAccess(
  227. requestlog.NewHandler(a.HandleProvisionGCPGKEInfra, l),
  228. mw.URLParam,
  229. mw.BodyParam,
  230. false,
  231. ),
  232. mw.URLParam,
  233. mw.ReadAccess,
  234. ),
  235. )
  236. r.Method(
  237. "POST",
  238. "/projects/{project_id}/provision/docr",
  239. auth.DoesUserHaveProjectAccess(
  240. auth.DoesUserHaveDOIntegrationAccess(
  241. requestlog.NewHandler(a.HandleProvisionDODOCRInfra, l),
  242. mw.URLParam,
  243. mw.BodyParam,
  244. false,
  245. ),
  246. mw.URLParam,
  247. mw.ReadAccess,
  248. ),
  249. )
  250. r.Method(
  251. "POST",
  252. "/projects/{project_id}/provision/doks",
  253. auth.DoesUserHaveProjectAccess(
  254. auth.DoesUserHaveDOIntegrationAccess(
  255. requestlog.NewHandler(a.HandleProvisionDODOKSInfra, l),
  256. mw.URLParam,
  257. mw.BodyParam,
  258. false,
  259. ),
  260. mw.URLParam,
  261. mw.ReadAccess,
  262. ),
  263. )
  264. r.Method(
  265. "GET",
  266. "/projects/{project_id}/provision/{kind}/{infra_id}/logs",
  267. auth.DoesUserHaveProjectAccess(
  268. auth.DoesUserHaveInfraAccess(
  269. requestlog.NewHandler(a.HandleGetProvisioningLogs, l),
  270. mw.URLParam,
  271. mw.URLParam,
  272. ),
  273. mw.URLParam,
  274. mw.ReadAccess,
  275. ),
  276. )
  277. r.Method(
  278. "POST",
  279. "/projects/{project_id}/provision/{kind}/{infra_id}/logs",
  280. auth.DoesUserHaveProjectAccess(
  281. auth.DoesUserHaveInfraAccess(
  282. requestlog.NewHandler(a.HandleGetProvisioningLogs, l),
  283. mw.URLParam,
  284. mw.URLParam,
  285. ),
  286. mw.URLParam,
  287. mw.ReadAccess,
  288. ),
  289. )
  290. r.Method(
  291. "POST",
  292. "/projects/{project_id}/infra/{infra_id}/ecr/destroy",
  293. auth.DoesUserHaveProjectAccess(
  294. auth.DoesUserHaveInfraAccess(
  295. requestlog.NewHandler(a.HandleDestroyAWSECRInfra, l),
  296. mw.URLParam,
  297. mw.URLParam,
  298. ),
  299. mw.URLParam,
  300. mw.ReadAccess,
  301. ),
  302. )
  303. r.Method(
  304. "POST",
  305. "/projects/{project_id}/infra/{infra_id}/eks/destroy",
  306. auth.DoesUserHaveProjectAccess(
  307. auth.DoesUserHaveInfraAccess(
  308. requestlog.NewHandler(a.HandleDestroyAWSEKSInfra, l),
  309. mw.URLParam,
  310. mw.URLParam,
  311. ),
  312. mw.URLParam,
  313. mw.ReadAccess,
  314. ),
  315. )
  316. r.Method(
  317. "POST",
  318. "/projects/{project_id}/infra/{infra_id}/gke/destroy",
  319. auth.DoesUserHaveProjectAccess(
  320. auth.DoesUserHaveInfraAccess(
  321. requestlog.NewHandler(a.HandleDestroyGCPGKEInfra, l),
  322. mw.URLParam,
  323. mw.URLParam,
  324. ),
  325. mw.URLParam,
  326. mw.ReadAccess,
  327. ),
  328. )
  329. r.Method(
  330. "POST",
  331. "/projects/{project_id}/infra/{infra_id}/docr/destroy",
  332. auth.DoesUserHaveProjectAccess(
  333. auth.DoesUserHaveInfraAccess(
  334. requestlog.NewHandler(a.HandleDestroyDODOCRInfra, 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}/infra/{infra_id}/doks/destroy",
  345. auth.DoesUserHaveProjectAccess(
  346. auth.DoesUserHaveInfraAccess(
  347. requestlog.NewHandler(a.HandleDestroyDODOKSInfra, l),
  348. mw.URLParam,
  349. mw.URLParam,
  350. ),
  351. mw.URLParam,
  352. mw.ReadAccess,
  353. ),
  354. )
  355. // /api/projects/{project_id}/clusters routes
  356. r.Method(
  357. "GET",
  358. "/projects/{project_id}/clusters",
  359. auth.DoesUserHaveProjectAccess(
  360. requestlog.NewHandler(a.HandleListProjectClusters, l),
  361. mw.URLParam,
  362. mw.ReadAccess,
  363. ),
  364. )
  365. r.Method(
  366. "POST",
  367. "/projects/{project_id}/clusters",
  368. auth.DoesUserHaveProjectAccess(
  369. auth.DoesUserHaveAWSIntegrationAccess(
  370. auth.DoesUserHaveGCPIntegrationAccess(
  371. requestlog.NewHandler(a.HandleCreateProjectCluster, l),
  372. mw.URLParam,
  373. mw.BodyParam,
  374. true,
  375. ),
  376. mw.URLParam,
  377. mw.BodyParam,
  378. true,
  379. ),
  380. mw.URLParam,
  381. mw.WriteAccess,
  382. ),
  383. )
  384. r.Method(
  385. "GET",
  386. "/projects/{project_id}/clusters/{cluster_id}",
  387. auth.DoesUserHaveProjectAccess(
  388. auth.DoesUserHaveClusterAccess(
  389. requestlog.NewHandler(a.HandleReadProjectCluster, l),
  390. mw.URLParam,
  391. mw.URLParam,
  392. ),
  393. mw.URLParam,
  394. mw.ReadAccess,
  395. ),
  396. )
  397. r.Method(
  398. "POST",
  399. "/projects/{project_id}/clusters/{cluster_id}",
  400. auth.DoesUserHaveProjectAccess(
  401. auth.DoesUserHaveClusterAccess(
  402. requestlog.NewHandler(a.HandleUpdateProjectCluster, l),
  403. mw.URLParam,
  404. mw.URLParam,
  405. ),
  406. mw.URLParam,
  407. mw.WriteAccess,
  408. ),
  409. )
  410. r.Method(
  411. "DELETE",
  412. "/projects/{project_id}/clusters/{cluster_id}",
  413. auth.DoesUserHaveProjectAccess(
  414. auth.DoesUserHaveClusterAccess(
  415. requestlog.NewHandler(a.HandleDeleteProjectCluster, l),
  416. mw.URLParam,
  417. mw.URLParam,
  418. ),
  419. mw.URLParam,
  420. mw.WriteAccess,
  421. ),
  422. )
  423. // /api/projects/{project_id}/clusters/candidates routes
  424. r.Method(
  425. "POST",
  426. "/projects/{project_id}/clusters/candidates",
  427. auth.DoesUserHaveProjectAccess(
  428. requestlog.NewHandler(a.HandleCreateProjectClusterCandidates, l),
  429. mw.URLParam,
  430. mw.WriteAccess,
  431. ),
  432. )
  433. r.Method(
  434. "GET",
  435. "/projects/{project_id}/clusters/candidates",
  436. auth.DoesUserHaveProjectAccess(
  437. requestlog.NewHandler(a.HandleListProjectClusterCandidates, l),
  438. mw.URLParam,
  439. mw.WriteAccess,
  440. ),
  441. )
  442. r.Method(
  443. "POST",
  444. "/projects/{project_id}/clusters/candidates/{candidate_id}/resolve",
  445. auth.DoesUserHaveProjectAccess(
  446. requestlog.NewHandler(a.HandleResolveClusterCandidate, l),
  447. mw.URLParam,
  448. mw.WriteAccess,
  449. ),
  450. )
  451. // /api/projects/{project_id}/integrations routes
  452. r.Method(
  453. "POST",
  454. "/projects/{project_id}/integrations/gcp",
  455. auth.DoesUserHaveProjectAccess(
  456. requestlog.NewHandler(a.HandleCreateGCPIntegration, l),
  457. mw.URLParam,
  458. mw.WriteAccess,
  459. ),
  460. )
  461. r.Method(
  462. "POST",
  463. "/projects/{project_id}/integrations/aws",
  464. auth.DoesUserHaveProjectAccess(
  465. requestlog.NewHandler(a.HandleCreateAWSIntegration, l),
  466. mw.URLParam,
  467. mw.WriteAccess,
  468. ),
  469. )
  470. r.Method(
  471. "POST",
  472. "/projects/{project_id}/integrations/basic",
  473. auth.DoesUserHaveProjectAccess(
  474. requestlog.NewHandler(a.HandleCreateBasicAuthIntegration, l),
  475. mw.URLParam,
  476. mw.WriteAccess,
  477. ),
  478. )
  479. r.Method(
  480. "GET",
  481. "/projects/{project_id}/integrations/oauth",
  482. auth.DoesUserHaveProjectAccess(
  483. requestlog.NewHandler(a.HandleListProjectOAuthIntegrations, l),
  484. mw.URLParam,
  485. mw.WriteAccess,
  486. ),
  487. )
  488. // /api/projects/{project_id}/helmrepos routes
  489. r.Method(
  490. "POST",
  491. "/projects/{project_id}/helmrepos",
  492. auth.DoesUserHaveProjectAccess(
  493. auth.DoesUserHaveAWSIntegrationAccess(
  494. auth.DoesUserHaveGCPIntegrationAccess(
  495. requestlog.NewHandler(a.HandleCreateHelmRepo, l),
  496. mw.URLParam,
  497. mw.BodyParam,
  498. true,
  499. ),
  500. mw.URLParam,
  501. mw.BodyParam,
  502. true,
  503. ),
  504. mw.URLParam,
  505. mw.WriteAccess,
  506. ),
  507. )
  508. r.Method(
  509. "GET",
  510. "/projects/{project_id}/helmrepos",
  511. auth.DoesUserHaveProjectAccess(
  512. requestlog.NewHandler(a.HandleListProjectHelmRepos, l),
  513. mw.URLParam,
  514. mw.WriteAccess,
  515. ),
  516. )
  517. r.Method(
  518. "GET",
  519. "/projects/{project_id}/helmrepos/{helm_id}/charts",
  520. auth.DoesUserHaveProjectAccess(
  521. requestlog.NewHandler(a.HandleListHelmRepoCharts, l),
  522. mw.URLParam,
  523. mw.WriteAccess,
  524. ),
  525. )
  526. // /api/projects/{project_id}/registries routes
  527. r.Method(
  528. "POST",
  529. "/projects/{project_id}/registries",
  530. auth.DoesUserHaveProjectAccess(
  531. auth.DoesUserHaveAWSIntegrationAccess(
  532. auth.DoesUserHaveGCPIntegrationAccess(
  533. auth.DoesUserHaveDOIntegrationAccess(
  534. requestlog.NewHandler(a.HandleCreateRegistry, l),
  535. mw.URLParam,
  536. mw.BodyParam,
  537. true,
  538. ),
  539. mw.URLParam,
  540. mw.BodyParam,
  541. true,
  542. ),
  543. mw.URLParam,
  544. mw.BodyParam,
  545. true,
  546. ),
  547. mw.URLParam,
  548. mw.WriteAccess,
  549. ),
  550. )
  551. r.Method(
  552. "GET",
  553. "/projects/{project_id}/registries",
  554. auth.DoesUserHaveProjectAccess(
  555. requestlog.NewHandler(a.HandleListProjectRegistries, l),
  556. mw.URLParam,
  557. mw.WriteAccess,
  558. ),
  559. )
  560. r.Method(
  561. "POST",
  562. "/projects/{project_id}/registries/{registry_id}",
  563. auth.DoesUserHaveProjectAccess(
  564. auth.DoesUserHaveRegistryAccess(
  565. requestlog.NewHandler(a.HandleUpdateProjectRegistry, l),
  566. mw.URLParam,
  567. mw.URLParam,
  568. ),
  569. mw.URLParam,
  570. mw.WriteAccess,
  571. ),
  572. )
  573. r.Method(
  574. "GET",
  575. "/projects/{project_id}/registries/ecr/{region}/token",
  576. auth.DoesUserHaveProjectAccess(
  577. requestlog.NewHandler(a.HandleGetProjectRegistryECRToken, l),
  578. mw.URLParam,
  579. mw.WriteAccess,
  580. ),
  581. )
  582. r.Method(
  583. "GET",
  584. "/projects/{project_id}/registries/gcr/token",
  585. auth.DoesUserHaveProjectAccess(
  586. requestlog.NewHandler(a.HandleGetProjectRegistryGCRToken, l),
  587. mw.URLParam,
  588. mw.WriteAccess,
  589. ),
  590. )
  591. r.Method(
  592. "GET",
  593. "/projects/{project_id}/registries/docr/token",
  594. auth.DoesUserHaveProjectAccess(
  595. requestlog.NewHandler(a.HandleGetProjectRegistryDOCRToken, l),
  596. mw.URLParam,
  597. mw.WriteAccess,
  598. ),
  599. )
  600. r.Method(
  601. "DELETE",
  602. "/projects/{project_id}/registries/{registry_id}",
  603. auth.DoesUserHaveProjectAccess(
  604. auth.DoesUserHaveRegistryAccess(
  605. requestlog.NewHandler(a.HandleDeleteProjectRegistry, l),
  606. mw.URLParam,
  607. mw.URLParam,
  608. ),
  609. mw.URLParam,
  610. mw.WriteAccess,
  611. ),
  612. )
  613. // /api/projects/{project_id}/registries/{registry_id}/repositories routes
  614. r.Method(
  615. "GET",
  616. "/projects/{project_id}/registries/{registry_id}/repositories",
  617. auth.DoesUserHaveProjectAccess(
  618. auth.DoesUserHaveRegistryAccess(
  619. requestlog.NewHandler(a.HandleListRepositories, l),
  620. mw.URLParam,
  621. mw.URLParam,
  622. ),
  623. mw.URLParam,
  624. mw.WriteAccess,
  625. ),
  626. )
  627. r.Method(
  628. "GET",
  629. // * is the repo name, which can itself be nested
  630. // for example, for GCR this is project-id/repo
  631. // need to use wildcard, see https://github.com/go-chi/chi/issues/243
  632. "/projects/{project_id}/registries/{registry_id}/repositories/*",
  633. auth.DoesUserHaveProjectAccess(
  634. auth.DoesUserHaveRegistryAccess(
  635. requestlog.NewHandler(a.HandleListImages, l),
  636. mw.URLParam,
  637. mw.URLParam,
  638. ),
  639. mw.URLParam,
  640. mw.WriteAccess,
  641. ),
  642. )
  643. // /api/projects/{project_id}/releases routes
  644. r.Method(
  645. "GET",
  646. "/projects/{project_id}/releases",
  647. auth.DoesUserHaveProjectAccess(
  648. auth.DoesUserHaveClusterAccess(
  649. requestlog.NewHandler(a.HandleListReleases, l),
  650. mw.URLParam,
  651. mw.QueryParam,
  652. ),
  653. mw.URLParam,
  654. mw.ReadAccess,
  655. ),
  656. )
  657. r.Method(
  658. "GET",
  659. "/projects/{project_id}/releases/{name}/{revision}/components",
  660. auth.DoesUserHaveProjectAccess(
  661. auth.DoesUserHaveClusterAccess(
  662. requestlog.NewHandler(a.HandleGetReleaseComponents, l),
  663. mw.URLParam,
  664. mw.QueryParam,
  665. ),
  666. mw.URLParam,
  667. mw.ReadAccess,
  668. ),
  669. )
  670. r.Method(
  671. "GET",
  672. "/projects/{project_id}/releases/{name}/{revision}/controllers",
  673. auth.DoesUserHaveProjectAccess(
  674. auth.DoesUserHaveClusterAccess(
  675. requestlog.NewHandler(a.HandleGetReleaseControllers, l),
  676. mw.URLParam,
  677. mw.QueryParam,
  678. ),
  679. mw.URLParam,
  680. mw.ReadAccess,
  681. ),
  682. )
  683. r.Method(
  684. "GET",
  685. "/projects/{project_id}/releases/{name}/history",
  686. auth.DoesUserHaveProjectAccess(
  687. auth.DoesUserHaveClusterAccess(
  688. requestlog.NewHandler(a.HandleListReleaseHistory, l),
  689. mw.URLParam,
  690. mw.QueryParam,
  691. ),
  692. mw.URLParam,
  693. mw.ReadAccess,
  694. ),
  695. )
  696. r.Method(
  697. "GET",
  698. "/projects/{project_id}/releases/{name}/webhook_token",
  699. auth.DoesUserHaveProjectAccess(
  700. auth.DoesUserHaveClusterAccess(
  701. requestlog.NewHandler(a.HandleGetReleaseToken, l),
  702. mw.URLParam,
  703. mw.QueryParam,
  704. ),
  705. mw.URLParam,
  706. mw.ReadAccess,
  707. ),
  708. )
  709. r.Method(
  710. "POST",
  711. "/projects/{project_id}/releases/{name}/upgrade",
  712. auth.DoesUserHaveProjectAccess(
  713. auth.DoesUserHaveClusterAccess(
  714. requestlog.NewHandler(a.HandleUpgradeRelease, l),
  715. mw.URLParam,
  716. mw.QueryParam,
  717. ),
  718. mw.URLParam,
  719. mw.ReadAccess,
  720. ),
  721. )
  722. r.Method(
  723. "GET",
  724. "/projects/{project_id}/releases/{name}/{revision}",
  725. auth.DoesUserHaveProjectAccess(
  726. auth.DoesUserHaveClusterAccess(
  727. requestlog.NewHandler(a.HandleGetRelease, l),
  728. mw.URLParam,
  729. mw.QueryParam,
  730. ),
  731. mw.URLParam,
  732. mw.ReadAccess,
  733. ),
  734. )
  735. r.Method(
  736. "POST",
  737. "/projects/{project_id}/releases/{name}/rollback",
  738. auth.DoesUserHaveProjectAccess(
  739. auth.DoesUserHaveClusterAccess(
  740. requestlog.NewHandler(a.HandleRollbackRelease, l),
  741. mw.URLParam,
  742. mw.QueryParam,
  743. ),
  744. mw.URLParam,
  745. mw.ReadAccess,
  746. ),
  747. )
  748. // r.Method(
  749. // "POST",
  750. // "/projects/{project_id}/releases/{name}/upgrade/hook",
  751. // requestlog.NewHandler(a.HandleReleaseDeployHook, l),
  752. // )
  753. r.Method(
  754. "POST",
  755. "/webhooks/deploy/{token}",
  756. requestlog.NewHandler(a.HandleReleaseDeployWebhook, l),
  757. )
  758. // /api/projects/{project_id}/gitrepos routes
  759. r.Method(
  760. "GET",
  761. "/projects/{project_id}/gitrepos",
  762. auth.DoesUserHaveProjectAccess(
  763. requestlog.NewHandler(a.HandleListProjectGitRepos, l),
  764. mw.URLParam,
  765. mw.ReadAccess,
  766. ),
  767. )
  768. r.Method(
  769. "GET",
  770. "/projects/{project_id}/gitrepos/{git_repo_id}/repos",
  771. auth.DoesUserHaveProjectAccess(
  772. auth.DoesUserHaveGitRepoAccess(
  773. requestlog.NewHandler(a.HandleListRepos, l),
  774. mw.URLParam,
  775. mw.QueryParam,
  776. ),
  777. mw.URLParam,
  778. mw.ReadAccess,
  779. ),
  780. )
  781. r.Method(
  782. "GET",
  783. "/projects/{project_id}/gitrepos/{git_repo_id}/repos/{kind}/{name}/branches",
  784. auth.DoesUserHaveProjectAccess(
  785. auth.DoesUserHaveGitRepoAccess(
  786. requestlog.NewHandler(a.HandleGetBranches, l),
  787. mw.URLParam,
  788. mw.QueryParam,
  789. ),
  790. mw.URLParam,
  791. mw.ReadAccess,
  792. ),
  793. )
  794. r.Method(
  795. "GET",
  796. "/projects/{project_id}/gitrepos/{git_repo_id}/repos/{kind}/{name}/{branch}/contents",
  797. auth.DoesUserHaveProjectAccess(
  798. auth.DoesUserHaveGitRepoAccess(
  799. requestlog.NewHandler(a.HandleGetBranchContents, l),
  800. mw.URLParam,
  801. mw.QueryParam,
  802. ),
  803. mw.URLParam,
  804. mw.ReadAccess,
  805. ),
  806. )
  807. // /api/projects/{project_id}/deploy routes
  808. r.Method(
  809. "POST",
  810. "/projects/{project_id}/deploy/{name}/{version}",
  811. auth.DoesUserHaveProjectAccess(
  812. auth.DoesUserHaveClusterAccess(
  813. requestlog.NewHandler(a.HandleDeployTemplate, l),
  814. mw.URLParam,
  815. mw.QueryParam,
  816. ),
  817. mw.URLParam,
  818. mw.ReadAccess,
  819. ),
  820. )
  821. // /api/projects/{project_id}/deploy routes
  822. r.Method(
  823. "POST",
  824. "/projects/{project_id}/deploy/{name}",
  825. auth.DoesUserHaveProjectAccess(
  826. auth.DoesUserHaveClusterAccess(
  827. requestlog.NewHandler(a.HandleUninstallTemplate, l),
  828. mw.URLParam,
  829. mw.QueryParam,
  830. ),
  831. mw.URLParam,
  832. mw.ReadAccess,
  833. ),
  834. )
  835. // /api/projects/{project_id}/k8s routes
  836. r.Method(
  837. "GET",
  838. "/projects/{project_id}/k8s/namespaces",
  839. auth.DoesUserHaveProjectAccess(
  840. auth.DoesUserHaveClusterAccess(
  841. requestlog.NewHandler(a.HandleListNamespaces, l),
  842. mw.URLParam,
  843. mw.QueryParam,
  844. ),
  845. mw.URLParam,
  846. mw.ReadAccess,
  847. ),
  848. )
  849. r.Method(
  850. "GET",
  851. "/projects/{project_id}/k8s/{namespace}/pod/{name}/logs",
  852. auth.DoesUserHaveProjectAccess(
  853. auth.DoesUserHaveClusterAccess(
  854. requestlog.NewHandler(a.HandleGetPodLogs, l),
  855. mw.URLParam,
  856. mw.QueryParam,
  857. ),
  858. mw.URLParam,
  859. mw.ReadAccess,
  860. ),
  861. )
  862. r.Method(
  863. "GET",
  864. "/projects/{project_id}/k8s/{namespace}/ingress/{name}",
  865. auth.DoesUserHaveProjectAccess(
  866. auth.DoesUserHaveClusterAccess(
  867. requestlog.NewHandler(a.HandleGetIngress, l),
  868. mw.URLParam,
  869. mw.QueryParam,
  870. ),
  871. mw.URLParam,
  872. mw.ReadAccess,
  873. ),
  874. )
  875. r.Method(
  876. "GET",
  877. "/projects/{project_id}/k8s/{kind}/status",
  878. auth.DoesUserHaveProjectAccess(
  879. auth.DoesUserHaveClusterAccess(
  880. requestlog.NewHandler(a.HandleStreamControllerStatus, l),
  881. mw.URLParam,
  882. mw.QueryParam,
  883. ),
  884. mw.URLParam,
  885. mw.ReadAccess,
  886. ),
  887. )
  888. r.Method(
  889. "GET",
  890. "/projects/{project_id}/k8s/pods",
  891. auth.DoesUserHaveProjectAccess(
  892. auth.DoesUserHaveClusterAccess(
  893. requestlog.NewHandler(a.HandleListPods, l),
  894. mw.URLParam,
  895. mw.QueryParam,
  896. ),
  897. mw.URLParam,
  898. mw.ReadAccess,
  899. ),
  900. )
  901. })
  902. staticFilePath := a.ServerConf.StaticFilePath
  903. fs := http.FileServer(http.Dir(staticFilePath))
  904. r.Get("/*", func(w http.ResponseWriter, r *http.Request) {
  905. if _, err := os.Stat(staticFilePath + r.RequestURI); os.IsNotExist(err) {
  906. http.StripPrefix(r.URL.Path, fs).ServeHTTP(w, r)
  907. } else {
  908. fs.ServeHTTP(w, r)
  909. }
  910. })
  911. return r
  912. }