// // Created by vfs on 02.05.2024. // package main import "errors" import "time" import "golang.org/x/crypto/bcrypt" import "database/sql" import _ "github.com/lib/pq" import "fmt" import "github.com/stripe/stripe-go/v78" import "github.com/stripe/stripe-go/v78/customer" var ErrRoRecord = errors.New("no matching record found") var ErrInvalidCredentials = errors.New("invalid credentials") var ErrDuplicateEmail = errors.New("duplicate email") type Account struct { Id int32 Username string Password []byte Color int32 Firstname string Lastname string Email string Created time.Time StripeID string } type Usermodel struct { DB *sql.DB } func (m *Usermodel) Insert(username string, password string, firstname string, lastname string, email string) error { params := &stripe.CustomerParams{ Name: stripe.String(fmt.Sprintf("%s %s", firstname, lastname)), Email: stripe.String(email), } customer, err := customer.New(params) hashedpassword, err := bcrypt.GenerateFromPassword([]byte(password), 12) stmt := `INSERT INTO accounts (username, password, firstname, lastname, email, created, stripe_id) VALUES ($1, $2, $3, $4, $5, NOW(), $6);` _, err = m.DB.Exec(stmt, username, string(hashedpassword), firstname, lastname, email, customer.ID) if err != nil { fmt.Println(err) } return nil } func (m *Usermodel) Delete(id int32) error { account, err := users.Get_account(id) result, err := customer.Del(account.StripeID, nil) if err != nil { fmt.Println(err) } fmt.Println(result) stmt := `DELETE FROM accounts WHERE id = $1;` _, err = m.DB.Exec(stmt, id) if err != nil { fmt.Println(err) } return nil } func (m *Usermodel) Get_account(id int32) (Account, error) { if id == 0 { return Account{}, nil } stmt := `SELECT id, username, password, color, firstname, lastname, email, created, stripe_id FROM accounts WHERE id = $1;` row := m.DB.QueryRow(stmt, id) var account Account err := row.Scan(&account.Id, &account.Username, &account.Password, &account.Color, &account.Firstname, &account.Lastname, &account.Email, &account.Created, &account.StripeID) if err == sql.ErrNoRows { return Account{}, sql.ErrNoRows } else if err != nil { return Account{}, err } return account, nil } func (m *Usermodel) Authenticate(username string, password string) (int32, error) { var id int32 var hashedpassword []byte row := m.DB.QueryRow("SELECT id, password FROM accounts WHERE username = $1", username) err := row.Scan(&id, &hashedpassword) if err == sql.ErrNoRows { return 0, ErrInvalidCredentials } err = bcrypt.CompareHashAndPassword(hashedpassword, []byte(password)) if err == bcrypt.ErrMismatchedHashAndPassword { return 0, ErrInvalidCredentials } else if err != nil { return 0, err } return id, nil }