diff --git a/api/database/mysql.go b/api/database/mysql.go index e9139bce..1ceb452a 100644 --- a/api/database/mysql.go +++ b/api/database/mysql.go @@ -40,6 +40,8 @@ func SetupDatabase() *sql.DB { log.Fatalf("Could not connect to database: %s\n", err.Error()) } + db.SetMaxOpenConns(24) + return db } diff --git a/api/graphql/models/user.go b/api/graphql/models/user.go index 68ca6781..3094fd22 100644 --- a/api/graphql/models/user.go +++ b/api/graphql/models/user.go @@ -77,7 +77,7 @@ func AuthorizeUser(database *sql.DB, username string, password string) (*User, e return user, nil } -func RegisterUser(database *sql.DB, username string, password string, rootPath string) (*User, error) { +func RegisterUser(database *sql.Tx, username string, password string, rootPath string) (*User, error) { hashedPassBytes, err := bcrypt.GenerateFromPassword([]byte(password), 12) if err != nil { return nil, err @@ -101,7 +101,7 @@ func RegisterUser(database *sql.DB, username string, password string, rootPath s return user, nil } -func (user *User) GenerateAccessToken(database *sql.DB) (*AccessToken, error) { +func (user *User) GenerateAccessToken(database *sql.Tx) (*AccessToken, error) { bytes := make([]byte, 24) if _, err := rand.Read(bytes); err != nil { return nil, errors.New(fmt.Sprintf("Could not generate token: %s\n", err.Error())) diff --git a/api/graphql/resolvers/photo.go b/api/graphql/resolvers/photo.go index 397b7d5d..44441672 100644 --- a/api/graphql/resolvers/photo.go +++ b/api/graphql/resolvers/photo.go @@ -92,6 +92,7 @@ func (r *photoResolver) HighRes(ctx context.Context, obj *models.Photo) (*models url, err := models.NewPhotoURLFromRow(row) if err != nil { + log.Printf("Error: Could not query highres: %s\n", err) return nil, err } @@ -103,6 +104,7 @@ func (r *photoResolver) Thumbnail(ctx context.Context, obj *models.Photo) (*mode url, err := models.NewPhotoURLFromRow(row) if err != nil { + log.Printf("Error: Could not query thumbnail: %s\n", err) return nil, err } diff --git a/api/graphql/resolvers/user.go b/api/graphql/resolvers/user.go index 0f6afc46..5d7e5153 100644 --- a/api/graphql/resolvers/user.go +++ b/api/graphql/resolvers/user.go @@ -54,13 +54,21 @@ func (r *mutationResolver) AuthorizeUser(ctx context.Context, username string, p }, nil } - var token *models.AccessToken - - token, err = user.GenerateAccessToken(r.Database) + tx, err := r.Database.Begin() if err != nil { return nil, err } + var token *models.AccessToken + + token, err = user.GenerateAccessToken(tx) + if err != nil { + tx.Rollback() + return nil, err + } + + tx.Commit() + return &models.AuthorizeResult{ Success: true, Status: "ok", @@ -68,16 +76,27 @@ func (r *mutationResolver) AuthorizeUser(ctx context.Context, username string, p }, nil } func (r *mutationResolver) RegisterUser(ctx context.Context, username string, password string, rootPath string) (*models.AuthorizeResult, error) { - user, err := models.RegisterUser(r.Database, username, password, rootPath) + tx, err := r.Database.Begin() if err != nil { + return nil, err + } + + user, err := models.RegisterUser(tx, username, password, rootPath) + if err != nil { + tx.Rollback() return &models.AuthorizeResult{ Success: false, Status: err.Error(), }, nil } - token, err := user.GenerateAccessToken(r.Database) + token, err := user.GenerateAccessToken(tx) if err != nil { + tx.Rollback() + return nil, err + } + + if err := tx.Commit(); err != nil { return nil, err } @@ -94,13 +113,47 @@ func (r *mutationResolver) InitialSetupWizard(ctx context.Context, username stri return nil, err } - if _, err := r.Database.Exec("UPDATE site_info SET initial_setup = false"); err != nil { - return nil, err - } - if !siteInfo.InitialSetup { return nil, errors.New("not initial setup") } - return r.RegisterUser(ctx, username, password, rootPath) + tx, err := r.Database.Begin() + if err != nil { + return nil, err + } + + if _, err := tx.Exec("UPDATE site_info SET initial_setup = false"); err != nil { + tx.Rollback() + return nil, err + } + + user, err := models.RegisterUser(tx, username, password, rootPath) + if err != nil { + tx.Rollback() + return &models.AuthorizeResult{ + Success: false, + Status: err.Error(), + }, nil + } + + if _, err := tx.Exec("UPDATE user SET admin = true WHERE user_id = ?", user.UserID); err != nil { + tx.Rollback() + return nil, err + } + + token, err := user.GenerateAccessToken(tx) + if err != nil { + tx.Rollback() + return nil, err + } + + if err := tx.Commit(); err != nil { + return nil, err + } + + return &models.AuthorizeResult{ + Success: true, + Status: "ok", + Token: &token.Value, + }, nil }