func inTransaction2(callback dbTransactionFunc2) error { var err error sess := session{Session: x.NewSession()} defer sess.Close() if err = sess.Begin(); err != nil { return err } err = callback(&sess) if err != nil { sess.Rollback() return err } else if err = sess.Commit(); err != nil { return err } if len(sess.events) > 0 { for _, e := range sess.events { if err = bus.Publish(e); err != nil { log.Error(3, "Failed to publish event after commit", err) } } } return nil }
// POST /api/user/signup func SignUp(c *middleware.Context, form dtos.SignUpForm) Response { if !setting.AllowUserSignUp { return ApiError(401, "User signup is disabled", nil) } existing := m.GetUserByLoginQuery{LoginOrEmail: form.Email} if err := bus.Dispatch(&existing); err == nil { return ApiError(422, "User with same email address already exists", nil) } cmd := m.CreateTempUserCommand{} cmd.OrgId = -1 cmd.Email = form.Email cmd.Status = m.TmpUserSignUpStarted cmd.InvitedByUserId = c.UserId cmd.Code = util.GetRandomString(20) cmd.RemoteAddr = c.Req.RemoteAddr if err := bus.Dispatch(&cmd); err != nil { return ApiError(500, "Failed to create signup", err) } bus.Publish(&events.SignUpStarted{ Email: form.Email, Code: cmd.Code, }) metrics.M_Api_User_SignUpStarted.Inc(1) return Json(200, util.DynMap{"status": "SignUpCreated"}) }
func CompleteInvite(c *middleware.Context, completeInvite dtos.CompleteInviteForm) Response { query := m.GetTempUserByCodeQuery{Code: completeInvite.InviteCode} if err := bus.Dispatch(&query); err != nil { if err == m.ErrTempUserNotFound { return ApiError(404, "Invite not found", nil) } return ApiError(500, "Failed to get invite", err) } invite := query.Result if invite.Status != m.TmpUserInvitePending { return ApiError(412, fmt.Sprintf("Invite cannot be used in status %s", invite.Status), nil) } cmd := m.CreateUserCommand{ Email: completeInvite.Email, Name: completeInvite.Name, Login: completeInvite.Username, Password: completeInvite.Password, SkipOrgSetup: true, } if err := bus.Dispatch(&cmd); err != nil { return ApiError(500, "failed to create user", err) } user := &cmd.Result system_user := m.UpdateUserSystemCommond{} system_user.InviteCode = completeInvite.InviteCode system_user.UserId = user.Id if err := bus.Dispatch(&system_user); err != nil { return ApiError(500, "failed to update system user ", err) } bus.Publish(&events.SignUpCompleted{ Name: user.NameOrFallback(), Email: user.Email, }) if ok, rsp := applyUserInvite(user, invite, true); !ok { return rsp } loginUserWithUser(user, c) metrics.M_Api_User_SignUpCompleted.Inc(1) metrics.M_Api_User_SignUpInvite.Inc(1) return ApiSuccess("User created and logged in") }
func SignUpStep2(c *middleware.Context, form dtos.SignUpStep2Form) Response { if !setting.AllowUserSignUp { return ApiError(401, "User signup is disabled", nil) } createUserCmd := m.CreateUserCommand{ Email: form.Email, Login: form.Username, Name: form.Name, Password: form.Password, OrgName: form.OrgName, } // verify email if setting.VerifyEmailEnabled { if ok, rsp := verifyUserSignUpEmail(form.Email, form.Code); !ok { return rsp } createUserCmd.EmailVerified = true } // check if user exists existing_user := m.GetUserByLoginQuery{LoginOrEmail: form.Email} if err := bus.Dispatch(&existing_user); err == nil { return ApiError(401, "User with same email address already exists", nil) } // check if org exists existing_org := m.GetOrgByNameQuery{Name: form.OrgName} if err := bus.Dispatch(&existing_org); err == nil { return ApiError(500, "Organization with same name already exists", nil) } // Note that: the new org is also created together with this signup user (auto_assign_org = false) // dispatch create command if err := bus.Dispatch(&createUserCmd); err != nil { return ApiError(500, "Failed to create user", err) } // publish signup event user := &createUserCmd.Result bus.Publish(&events.SignUpCompleted{ Email: user.Email, Name: user.NameOrFallback(), }) // mark temp user as completed if ok, rsp := updateTempUserStatus(form.Code, m.TmpUserCompleted); !ok { return rsp } // check for pending invites invitesQuery := m.GetTempUsersQuery{Email: form.Email, Status: m.TmpUserInvitePending} if err := bus.Dispatch(&invitesQuery); err != nil { return ApiError(500, "Failed to query database for invites", err) } apiResponse := util.DynMap{"message": "User sign up completed succesfully", "code": "redirect-to-landing-page"} for _, invite := range invitesQuery.Result { if ok, rsp := applyUserInvite(user, invite, false); !ok { return rsp } apiResponse["code"] = "redirect-to-select-org" } loginUserWithUser(user, c) metrics.M_Api_User_SignUpCompleted.Inc(1) // We need to add the data source defined in config for this org to data_source table if err := sqlstore.AddDatasourceForOrg(user.OrgId); err != nil { return ApiError(500, fmt.Sprintf("Failed to add data source for organization %v", user.OrgId), err) } return Json(200, apiResponse) }