NewAPIWithVersion creates a new REST API using the specified version
(ctx context.Context, globalConfig *conf.GlobalConfiguration, db *storage.Connection, version string)
| 78 | |
| 79 | // NewAPIWithVersion creates a new REST API using the specified version |
| 80 | func NewAPIWithVersion(ctx context.Context, globalConfig *conf.GlobalConfiguration, db *storage.Connection, version string) *API { |
| 81 | api := &API{config: globalConfig, db: db, version: version} |
| 82 | |
| 83 | xffmw, _ := xff.Default() |
| 84 | logger := newStructuredLogger(logrus.StandardLogger()) |
| 85 | |
| 86 | r := newRouter() |
| 87 | r.UseBypass(xffmw.Handler) |
| 88 | r.Use(addRequestID(globalConfig)) |
| 89 | r.Use(recoverer) |
| 90 | r.UseBypass(tracer) |
| 91 | |
| 92 | r.Get("/health", api.HealthCheck) |
| 93 | |
| 94 | r.Route("/callback", func(r *router) { |
| 95 | r.UseBypass(logger) |
| 96 | r.Use(api.loadOAuthState) |
| 97 | |
| 98 | if globalConfig.MultiInstanceMode { |
| 99 | r.Use(api.loadInstanceConfig) |
| 100 | } |
| 101 | r.Get("/", api.ExternalProviderCallback) |
| 102 | }) |
| 103 | |
| 104 | r.Route("/", func(r *router) { |
| 105 | r.UseBypass(logger) |
| 106 | |
| 107 | if globalConfig.MultiInstanceMode { |
| 108 | r.Use(api.loadJWSSignatureHeader) |
| 109 | r.Use(api.loadInstanceConfig) |
| 110 | } |
| 111 | |
| 112 | r.Get("/settings", api.Settings) |
| 113 | |
| 114 | r.Get("/authorize", api.ExternalProviderRedirect) |
| 115 | |
| 116 | r.With(api.requireAdminCredentials).Post("/invite", api.Invite) |
| 117 | |
| 118 | r.With(api.requireEmailProvider).Post("/signup", api.Signup) |
| 119 | r.With(api.requireEmailProvider).Post("/recover", api.Recover) |
| 120 | r.With(api.requireEmailProvider).With(api.limitHandler( |
| 121 | // Allow requests at a rate of 30 per 5 minutes. |
| 122 | tollbooth.NewLimiter(30.0/(60*5), &limiter.ExpirableOptions{ |
| 123 | DefaultExpirationTTL: time.Hour, |
| 124 | }).SetBurst(30), |
| 125 | )).Post("/token", api.Token) |
| 126 | r.Post("/verify", api.Verify) |
| 127 | |
| 128 | r.With(api.requireAuthentication).Post("/logout", api.Logout) |
| 129 | |
| 130 | r.Route("/user", func(r *router) { |
| 131 | r.Use(api.requireAuthentication) |
| 132 | r.Get("/", api.UserGet) |
| 133 | r.Put("/", api.UserUpdate) |
| 134 | }) |
| 135 | |
| 136 | r.Route("/admin", func(r *router) { |
| 137 | r.Use(api.requireAdminCredentials) |
searching dependent graphs…