91 lines
2.7 KiB
Go
91 lines
2.7 KiB
Go
package postgres
|
|
|
|
import (
|
|
"time"
|
|
|
|
"github.com/jmoiron/sqlx"
|
|
"github.com/ajaxray/geek-life/model"
|
|
)
|
|
|
|
// UserRepository implements the user repository interface for PostgreSQL
|
|
type UserRepository struct {
|
|
db *sqlx.DB
|
|
}
|
|
|
|
// NewUserRepository creates a new user repository
|
|
func NewUserRepository(db *sqlx.DB) *UserRepository {
|
|
return &UserRepository{db: db}
|
|
}
|
|
|
|
// GetByID retrieves a user by ID
|
|
func (r *UserRepository) GetByID(id int64) (*model.User, error) {
|
|
var user model.User
|
|
query := `SELECT id, tenant_id, username, email, password_hash, created_at, updated_at
|
|
FROM users WHERE id = $1`
|
|
err := r.db.Get(&user, query, id)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return &user, nil
|
|
}
|
|
|
|
// GetByUsername retrieves a user by username within a tenant
|
|
func (r *UserRepository) GetByUsername(tenantID int64, username string) (*model.User, error) {
|
|
var user model.User
|
|
query := `SELECT id, tenant_id, username, email, password_hash, created_at, updated_at
|
|
FROM users WHERE tenant_id = $1 AND username = $2`
|
|
err := r.db.Get(&user, query, tenantID, username)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return &user, nil
|
|
}
|
|
|
|
// GetByEmail retrieves a user by email within a tenant
|
|
func (r *UserRepository) GetByEmail(tenantID int64, email string) (*model.User, error) {
|
|
var user model.User
|
|
query := `SELECT id, tenant_id, username, email, password_hash, created_at, updated_at
|
|
FROM users WHERE tenant_id = $1 AND email = $2`
|
|
err := r.db.Get(&user, query, tenantID, email)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return &user, nil
|
|
}
|
|
|
|
// Create creates a new user
|
|
func (r *UserRepository) Create(tenantID int64, username, email, passwordHash string) (*model.User, error) {
|
|
user := &model.User{
|
|
TenantID: tenantID,
|
|
Username: username,
|
|
Email: email,
|
|
PasswordHash: passwordHash,
|
|
CreatedAt: time.Now(),
|
|
UpdatedAt: time.Now(),
|
|
}
|
|
|
|
query := `INSERT INTO users (tenant_id, username, email, password_hash, created_at, updated_at)
|
|
VALUES ($1, $2, $3, $4, $5, $6) RETURNING id`
|
|
err := r.db.QueryRow(query, user.TenantID, user.Username, user.Email, user.PasswordHash, user.CreatedAt, user.UpdatedAt).Scan(&user.ID)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return user, nil
|
|
}
|
|
|
|
// Update updates an existing user
|
|
func (r *UserRepository) Update(user *model.User) error {
|
|
user.UpdatedAt = time.Now()
|
|
query := `UPDATE users SET username = $1, email = $2, password_hash = $3, updated_at = $4
|
|
WHERE id = $5`
|
|
_, err := r.db.Exec(query, user.Username, user.Email, user.PasswordHash, user.UpdatedAt, user.ID)
|
|
return err
|
|
}
|
|
|
|
// Delete deletes a user
|
|
func (r *UserRepository) Delete(user *model.User) error {
|
|
query := `DELETE FROM users WHERE id = $1`
|
|
_, err := r.db.Exec(query, user.ID)
|
|
return err
|
|
} |