user.go 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234
  1. package router
  2. import (
  3. "github.com/go-chi/chi"
  4. "github.com/porter-dev/porter/api/server/handlers/project"
  5. "github.com/porter-dev/porter/api/server/handlers/user"
  6. "github.com/porter-dev/porter/api/server/shared"
  7. "github.com/porter-dev/porter/api/types"
  8. )
  9. func NewUserScopedRegisterer(children ...*Registerer) *Registerer {
  10. return &Registerer{
  11. GetRoutes: GetUserScopedRoutes,
  12. Children: children,
  13. }
  14. }
  15. func GetUserScopedRoutes(
  16. r chi.Router,
  17. config *shared.Config,
  18. basePath *types.Path,
  19. factory shared.APIEndpointFactory,
  20. children ...*Registerer,
  21. ) []*Route {
  22. routes := getUserRoutes(r, config, basePath, factory)
  23. for _, child := range children {
  24. r.Group(func(r chi.Router) {
  25. childRoutes := child.GetRoutes(r, config, basePath, factory, child.Children...)
  26. routes = append(routes, childRoutes...)
  27. })
  28. }
  29. return routes
  30. }
  31. func getUserRoutes(
  32. r chi.Router,
  33. config *shared.Config,
  34. basePath *types.Path,
  35. factory shared.APIEndpointFactory,
  36. ) []*Route {
  37. routes := make([]*Route, 0)
  38. // GET /api/cli/login -> user.user.NewCLILoginHandler
  39. cliLoginUserEndpoint := factory.NewAPIEndpoint(
  40. &types.APIRequestMetadata{
  41. Verb: types.APIVerbGet,
  42. Method: types.HTTPVerbGet,
  43. Path: &types.Path{
  44. Parent: basePath,
  45. RelativePath: "/cli/login",
  46. },
  47. Scopes: []types.PermissionScope{types.UserScope},
  48. ShouldRedirect: true,
  49. },
  50. )
  51. cliLoginUserHandler := user.NewCLILoginHandler(
  52. config,
  53. factory.GetDecoderValidator(),
  54. factory.GetResultWriter(),
  55. )
  56. routes = append(routes, &Route{
  57. Endpoint: cliLoginUserEndpoint,
  58. Handler: cliLoginUserHandler,
  59. Router: r,
  60. })
  61. // POST /api/logout -> user.NewUserLogoutHandler
  62. logoutUserEndpoint := factory.NewAPIEndpoint(
  63. &types.APIRequestMetadata{
  64. Verb: types.APIVerbUpdate,
  65. Method: types.HTTPVerbPost,
  66. Path: &types.Path{
  67. Parent: basePath,
  68. RelativePath: "/logout",
  69. },
  70. Scopes: []types.PermissionScope{types.UserScope},
  71. },
  72. )
  73. logoutUserHandler := user.NewUserLogoutHandler(config)
  74. routes = append(routes, &Route{
  75. Endpoint: logoutUserEndpoint,
  76. Handler: logoutUserHandler,
  77. Router: r,
  78. })
  79. // GET /api/users/current -> user.NewUserGetCurrentHandler
  80. authCheckEndpoint := factory.NewAPIEndpoint(
  81. &types.APIRequestMetadata{
  82. Verb: types.APIVerbGet,
  83. Method: types.HTTPVerbGet,
  84. Path: &types.Path{
  85. Parent: basePath,
  86. RelativePath: "/users/current",
  87. },
  88. Scopes: []types.PermissionScope{types.UserScope},
  89. },
  90. )
  91. authCheckHandler := user.NewUserGetCurrentHandler(
  92. config,
  93. factory.GetResultWriter(),
  94. )
  95. routes = append(routes, &Route{
  96. Endpoint: authCheckEndpoint,
  97. Handler: authCheckHandler,
  98. Router: r,
  99. })
  100. // DELETE /api/users/current -> user.NewUserDeleteHandler
  101. deleteUserEndpoint := factory.NewAPIEndpoint(
  102. &types.APIRequestMetadata{
  103. Verb: types.APIVerbDelete,
  104. Method: types.HTTPVerbDelete,
  105. Path: &types.Path{
  106. Parent: basePath,
  107. RelativePath: "/users/current",
  108. },
  109. Scopes: []types.PermissionScope{types.UserScope},
  110. },
  111. )
  112. deleteUserHandler := user.NewUserDeleteHandler(
  113. config,
  114. factory.GetResultWriter(),
  115. )
  116. routes = append(routes, &Route{
  117. Endpoint: deleteUserEndpoint,
  118. Handler: deleteUserHandler,
  119. Router: r,
  120. })
  121. // POST /api/projects -> project.NewProjectCreateHandler
  122. createEndpoint := factory.NewAPIEndpoint(
  123. &types.APIRequestMetadata{
  124. Verb: types.APIVerbCreate,
  125. Method: types.HTTPVerbPost,
  126. Path: &types.Path{
  127. Parent: basePath,
  128. RelativePath: "/projects",
  129. },
  130. Scopes: []types.PermissionScope{types.UserScope},
  131. },
  132. )
  133. createHandler := project.NewProjectCreateHandler(
  134. config,
  135. factory.GetDecoderValidator(),
  136. factory.GetResultWriter(),
  137. )
  138. routes = append(routes, &Route{
  139. Endpoint: createEndpoint,
  140. Handler: createHandler,
  141. Router: r,
  142. })
  143. // GET /api/projects -> project.NewProjectListHandler
  144. listEndpoint := factory.NewAPIEndpoint(
  145. &types.APIRequestMetadata{
  146. Verb: types.APIVerbList,
  147. Method: types.HTTPVerbGet,
  148. Path: &types.Path{
  149. Parent: basePath,
  150. RelativePath: "/projects",
  151. },
  152. Scopes: []types.PermissionScope{types.UserScope},
  153. },
  154. )
  155. listHandler := project.NewProjectListHandler(
  156. config,
  157. factory.GetResultWriter(),
  158. )
  159. routes = append(routes, &Route{
  160. Endpoint: listEndpoint,
  161. Handler: listHandler,
  162. Router: r,
  163. })
  164. // GET /email/verify/initiate -> user.VerifyEmailInitiateHandler
  165. emailVerifyInitiateEndpoint := factory.NewAPIEndpoint(
  166. &types.APIRequestMetadata{
  167. Verb: types.APIVerbUpdate,
  168. Method: types.HTTPVerbPost,
  169. Path: &types.Path{
  170. Parent: basePath,
  171. RelativePath: "/email/verify/initiate",
  172. },
  173. Scopes: []types.PermissionScope{types.UserScope},
  174. },
  175. )
  176. emailVerifyInitiateHandler := user.NewVerifyEmailInitiateHandler(config)
  177. routes = append(routes, &Route{
  178. Endpoint: emailVerifyInitiateEndpoint,
  179. Handler: emailVerifyInitiateHandler,
  180. Router: r,
  181. })
  182. // GET /email/verify/finalize -> user.VerifyEmailInitiateHandler
  183. emailVerifyFinalizeEndpoint := factory.NewAPIEndpoint(
  184. &types.APIRequestMetadata{
  185. Verb: types.APIVerbGet,
  186. Method: types.HTTPVerbGet,
  187. Path: &types.Path{
  188. Parent: basePath,
  189. RelativePath: "/email/verify/finalize",
  190. },
  191. Scopes: []types.PermissionScope{types.UserScope},
  192. ShouldRedirect: true,
  193. },
  194. )
  195. emailVerifyFinalizeHandler := user.NewVerifyEmailInitiateHandler(config)
  196. routes = append(routes, &Route{
  197. Endpoint: emailVerifyFinalizeEndpoint,
  198. Handler: emailVerifyFinalizeHandler,
  199. Router: r,
  200. })
  201. return routes
  202. }