91 lines
2.9 KiB
Go
91 lines
2.9 KiB
Go
package public
|
|
|
|
import (
|
|
"time"
|
|
|
|
"git.sendico.io/tech/sxchnge/product/auth/config"
|
|
"git.sendico.io/tech/sxchnge/product/auth/flow"
|
|
re "git.sendico.io/tech/sxchnge/product/auth/http/v1/endpoint"
|
|
"git.sendico.io/tech/sxchnge/product/auth/http/v1/response"
|
|
"git.sendico.io/tech/sxchnge/product/customers/store"
|
|
"git.sendico.io/tech/sxchnge/product/sessions/store"
|
|
"git.sendico.io/tech/sxchnge/product/twofactor"
|
|
api "git.sendico.io/tech/sxchnge/shared/http"
|
|
"git.sendico.io/tech/sxchnge/shared/logging"
|
|
"git.sendico.io/tech/sxchnge/shared/ratelimit/store"
|
|
"git.sendico.io/tech/sxchnge/shared/service"
|
|
"github.com/go-chi/chi/v5"
|
|
)
|
|
|
|
type Flows struct {
|
|
Onboarding *flow.Service
|
|
Factors twofactor.API
|
|
}
|
|
|
|
type PublicRouter struct {
|
|
factors twofactor.API
|
|
flow *flow.Service
|
|
logger mlogger.Logger
|
|
db account.DB
|
|
imp *re.HttpEndpointRouter
|
|
rtdb refreshtokens.DB
|
|
config middleware.TokenConfig
|
|
signature middleware.Signature
|
|
service mservice.Type
|
|
attempts ratelimits.Store
|
|
limits middleware.LoginRateLimits
|
|
now func() time.Time
|
|
}
|
|
|
|
func (pr *PublicRouter) InstallHandler(service mservice.Type, endpoint string, method api.HTTPMethod, handler sresponse.HandlerFunc) {
|
|
pr.imp.InstallHandler(service, endpoint, method, handler)
|
|
}
|
|
|
|
func Install(
|
|
logger mlogger.Logger,
|
|
apiEndpoint string,
|
|
db account.DB,
|
|
rtdb refreshtokens.DB,
|
|
attempts ratelimits.Store,
|
|
router chi.Router,
|
|
config *middleware.TokenConfig,
|
|
signature *middleware.Signature,
|
|
limits middleware.LoginRateLimits,
|
|
flows ...Flows,
|
|
) *PublicRouter {
|
|
l := logger.Named("public")
|
|
hr := PublicRouter{
|
|
logger: l,
|
|
db: db,
|
|
rtdb: rtdb,
|
|
config: *config,
|
|
signature: *signature,
|
|
imp: re.NewHttpEndpointRouter(l, apiEndpoint, router, config, signature),
|
|
service: mservice.Accounts,
|
|
attempts: attempts,
|
|
limits: limits,
|
|
now: time.Now,
|
|
}
|
|
|
|
if len(flows) > 0 {
|
|
hr.flow = flows[0].Onboarding
|
|
hr.factors = flows[0].Factors
|
|
}
|
|
if hr.flow != nil {
|
|
hr.InstallHandler(hr.service, "/signup", api.Post, measured("signup", hr.signup))
|
|
hr.InstallHandler(hr.service, "/verification/send", api.Post, measured("activation_send", hr.resendActivation))
|
|
hr.InstallHandler(hr.service, "/verification/confirm", api.Post, measured("activation", hr.activate))
|
|
}
|
|
if hr.factors != nil {
|
|
hr.InstallHandler(hr.service, "/login/resend", api.Post, measured("login_send", hr.resendLogin))
|
|
hr.InstallHandler(hr.service, "/login/verify", api.Post, measured("login_verify", hr.verifyLogin))
|
|
}
|
|
hr.InstallHandler(hr.service, "/login", api.Post, measured("login", hr.login))
|
|
hr.InstallHandler(hr.service, "/login/api", api.Post, hr.apiLogin)
|
|
hr.InstallHandler(hr.service, "/rotate", api.Post, hr.rotateRefreshToken)
|
|
hr.InstallHandler(hr.service, "/refresh", api.Post, hr.refreshAccessToken)
|
|
hr.InstallHandler(hr.service, "/logout", api.Post, hr.logout)
|
|
|
|
return &hr
|
|
}
|