59 lines
2.1 KiB
Go
59 lines
2.1 KiB
Go
package database
|
|
|
|
import (
|
|
"billit/internal/models"
|
|
"database/sql"
|
|
"fmt"
|
|
"time"
|
|
)
|
|
|
|
// CreateUser creates a new user with hashed password
|
|
func (s *service) CreateUser(email, passwordHash string) (*models.User, error) {
|
|
id := fmt.Sprintf("%d", time.Now().UnixNano())
|
|
_, err := s.db.Exec(`INSERT INTO users (id, email, password) VALUES (?, ?, ?)`, id, email, passwordHash)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return s.GetUserByID(id)
|
|
}
|
|
|
|
// GetUserByEmail retrieves a user by email
|
|
func (s *service) GetUserByEmail(email string) (*models.User, error) {
|
|
var u models.User
|
|
err := s.db.QueryRow(`SELECT id, email, password, COALESCE(company_details, ''), COALESCE(bank_details, ''), COALESCE(invoice_prefix, 'INV'), COALESCE(invoice_counter, 0), created_at FROM users WHERE email = ?`, email).
|
|
Scan(&u.ID, &u.Email, &u.Password, &u.CompanyDetails, &u.BankDetails, &u.InvoicePrefix, &u.InvoiceCounter, &u.CreatedAt)
|
|
if err == sql.ErrNoRows {
|
|
return nil, nil
|
|
}
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return &u, nil
|
|
}
|
|
|
|
// GetUserByID retrieves a user by ID
|
|
func (s *service) GetUserByID(id string) (*models.User, error) {
|
|
var u models.User
|
|
err := s.db.QueryRow(`SELECT id, email, password, COALESCE(company_details, ''), COALESCE(bank_details, ''), COALESCE(invoice_prefix, 'INV'), COALESCE(invoice_counter, 0), created_at FROM users WHERE id = ?`, id).
|
|
Scan(&u.ID, &u.Email, &u.Password, &u.CompanyDetails, &u.BankDetails, &u.InvoicePrefix, &u.InvoiceCounter, &u.CreatedAt)
|
|
if err == sql.ErrNoRows {
|
|
return nil, nil
|
|
}
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return &u, nil
|
|
}
|
|
|
|
// UpdateUserPassword updates a user's password hash
|
|
func (s *service) UpdateUserPassword(id string, passwordHash string) error {
|
|
_, err := s.db.Exec(`UPDATE users SET password = ? WHERE id = ?`, passwordHash, id)
|
|
return err
|
|
}
|
|
|
|
// UpdateUserDetails updates a user's company and bank details
|
|
func (s *service) UpdateUserDetails(id string, companyDetails string, bankDetails string, invoicePrefix string) error {
|
|
_, err := s.db.Exec(`UPDATE users SET company_details = ?, bank_details = ?, invoice_prefix = ? WHERE id = ?`, companyDetails, bankDetails, invoicePrefix, id)
|
|
return err
|
|
}
|