diff --git a/controllers/create.ctrl.go b/controllers/create.ctrl.go index 27f0950..2afddc3 100644 --- a/controllers/create.ctrl.go +++ b/controllers/create.ctrl.go @@ -1,21 +1,12 @@ package controllers import ( - "context" - "database/sql" - "math/rand" "net/http" - "github.com/getAlby/lndhub.go/db/models" "github.com/getAlby/lndhub.go/lib" - "github.com/getAlby/lndhub.go/lib/security" "github.com/labstack/echo/v4" - "github.com/labstack/gommon/random" - "github.com/uptrace/bun" ) -const alphaNumBytes = random.Alphanumeric - // CreateUserController : Create user controller struct type CreateUserController struct { svc *lib.LndhubService @@ -37,34 +28,8 @@ func (controller *CreateUserController) CreateUser(c echo.Context) error { if err := c.Bind(&body); err != nil { return err } - - user := models.User{} - - // generate user login/password (TODO: allow the user to choose a login/password?) - user.Login = randStringBytes(8) - password := randStringBytes(15) - // we only store the hashed password but return the initial plain text password in the HTTP response - hashedPassword := security.HashPassword(password) - user.Password = hashedPassword - - // Create user and the user's accounts - // We use double-entry bookkeeping so we use 4 accounts: incoming, current, outgoing and fees - // Wrapping this in a transaction in case something fails - err := controller.svc.DB.RunInTx(context.TODO(), &sql.TxOptions{}, func(ctx context.Context, tx bun.Tx) error { - if _, err := tx.NewInsert().Model(&user).Exec(ctx); err != nil { - return err - } - accountTypes := []string{"incoming", "current", "outgoing", "fees"} - for _, accountType := range accountTypes { - account := models.Account{UserID: user.ID, Type: accountType} - if _, err := controller.svc.DB.NewInsert().Model(&account).Exec(ctx); err != nil { - return err - } - } - return nil - }) - - // Was the DB transaction successful? + user, err := controller.svc.Create() + //todo json response if err != nil { return err } @@ -74,15 +39,7 @@ func (controller *CreateUserController) CreateUser(c echo.Context) error { Password string `json:"password"` } ResponseBody.Login = user.Login - ResponseBody.Password = password + ResponseBody.Password = user.Password return c.JSON(http.StatusOK, &ResponseBody) } - -func randStringBytes(n int) string { - b := make([]byte, n) - for i := range b { - b[i] = alphaNumBytes[rand.Intn(len(alphaNumBytes))] - } - return string(b) -} diff --git a/lib/service.go b/lib/service.go index 7f8ed43..39f13a4 100644 --- a/lib/service.go +++ b/lib/service.go @@ -2,15 +2,21 @@ package lib import ( "context" + "database/sql" "fmt" + "math/rand" "github.com/getAlby/lndhub.go/db/models" + "github.com/getAlby/lndhub.go/lib/security" "github.com/getAlby/lndhub.go/lib/tokens" + "github.com/labstack/gommon/random" "github.com/lightningnetwork/lnd/lnrpc" "github.com/uptrace/bun" "golang.org/x/crypto/bcrypt" ) +const alphaNumBytes = random.Alphanumeric + type LndhubService struct { Config *Config DB *bun.DB @@ -124,3 +130,41 @@ func (svc *LndhubService) Payinvoice(userId int64, invoice string) error { return err } + +func (svc *LndhubService) Create() (user *models.User, err error) { + + user = &models.User{} + + // generate user login/password (TODO: allow the user to choose a login/password?) + user.Login = randStringBytes(8) + password := randStringBytes(15) + // we only store the hashed password but return the initial plain text password in the HTTP response + hashedPassword := security.HashPassword(password) + user.Password = hashedPassword + + // Create user and the user's accounts + // We use double-entry bookkeeping so we use 4 accounts: incoming, current, outgoing and fees + // Wrapping this in a transaction in case something fails + err = svc.DB.RunInTx(context.TODO(), &sql.TxOptions{}, func(ctx context.Context, tx bun.Tx) error { + if _, err := tx.NewInsert().Model(&user).Exec(ctx); err != nil { + return err + } + accountTypes := []string{"incoming", "current", "outgoing", "fees"} + for _, accountType := range accountTypes { + account := models.Account{UserID: user.ID, Type: accountType} + if _, err := svc.DB.NewInsert().Model(&account).Exec(ctx); err != nil { + return err + } + } + return nil + }) + return user, err +} + +func randStringBytes(n int) string { + b := make([]byte, n) + for i := range b { + b[i] = alphaNumBytes[rand.Intn(len(alphaNumBytes))] + } + return string(b) +}