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 }