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 }