diff --git a/satellite/console/consoleweb/server.go b/satellite/console/consoleweb/server.go index d3c9c2fab..195687f16 100644 --- a/satellite/console/consoleweb/server.go +++ b/satellite/console/consoleweb/server.go @@ -22,8 +22,9 @@ import ( "github.com/zeebo/errs" "go.uber.org/zap" "golang.org/x/sync/errgroup" - "gopkg.in/spacemonkeygo/monkit.v2" + monkit "gopkg.in/spacemonkeygo/monkit.v2" + "storj.io/storj/internal/post" "storj.io/storj/pkg/auth" "storj.io/storj/satellite/console" "storj.io/storj/satellite/console/consoleweb/consoleapi" @@ -123,6 +124,7 @@ func NewServer(logger *zap.Logger, config Config, service *console.Service, mail router.Handle("/api/v0/graphql", http.HandlerFunc(server.grapqlHandler)) router.Handle("/api/v0/token", http.HandlerFunc(server.tokenHandler)) + router.Handle("/api/v0/register", http.HandlerFunc(server.registerHandler)) router.Handle("/registrationToken/", http.HandlerFunc(server.createRegistrationTokenHandler)) router.Handle("/robots.txt", http.HandlerFunc(server.seoHandler)) @@ -233,6 +235,60 @@ func (server *Server) tokenHandler(w http.ResponseWriter, r *http.Request) { } } +// registerHandler registers new User. +func (server *Server) registerHandler(w http.ResponseWriter, r *http.Request) { + ctx := r.Context() + var err error + defer mon.Task()(&ctx)(&err) + + var request struct { + UserInfo console.CreateUser `json:"userInfo"` + SecretInput string `json:"secret"` + ReferrerUserID string `json:"referrerUserID"` + } + + err = json.NewDecoder(r.Body).Decode(&request) + if err != nil { + server.serveJSONError(w, http.StatusBadRequest, err) + return + } + + secret, err := console.RegistrationSecretFromBase64(request.SecretInput) + if err != nil { + server.serveJSONError(w, http.StatusBadRequest, err) + return + } + + user, err := server.service.CreateUser(ctx, request.UserInfo, secret, request.ReferrerUserID) + if err != nil { + server.serveJSONError(w, http.StatusInternalServerError, err) + return + } + + token, err := server.service.GenerateActivationToken(ctx, user.ID, user.Email) + if err != nil { + server.serveJSONError(w, http.StatusInternalServerError, err) + return + } + + link := server.config.ExternalAddress + consoleql.ActivationPath + token + + server.mailService.SendRenderedAsync( + ctx, + []post.Address{{Address: user.Email, Name: user.FullName}}, + &consoleql.AccountActivationEmail{ + ActivationLink: link, + Origin: server.config.ExternalAddress, + }, + ) + + err = json.NewEncoder(w).Encode(&user.ID) + if err != nil { + server.log.Error("registration handler could not encode error", zap.Error(err)) + return + } +} + // bucketUsageReportHandler generate bucket usage report page for project func (server *Server) bucketUsageReportHandler(w http.ResponseWriter, r *http.Request) { ctx := r.Context()