package repository import ( "context" "database/sql" "fmt" "erp-mvp/core-service/internal/models" "github.com/google/uuid" ) type UserRepository interface { Create(ctx context.Context, user *models.User, password string) error GetByEmail(ctx context.Context, email string) (*models.User, error) GetByID(ctx context.Context, id uuid.UUID) (*models.User, error) } type userRepository struct { db *sql.DB } func NewUserRepository(db *sql.DB) UserRepository { return &userRepository{db: db} } func (r *userRepository) Create(ctx context.Context, user *models.User, password string) error { query := ` INSERT INTO users (id, organization_id, email, password_hash, role, created_at) VALUES ($1, $2, $3, $4, $5, $6) ` _, err := r.db.ExecContext(ctx, query, user.ID, user.OrganizationID, user.Email, password, user.Role, user.CreatedAt, ) if err != nil { return fmt.Errorf("failed to create user: %w", err) } return nil } func (r *userRepository) GetByEmail(ctx context.Context, email string) (*models.User, error) { query := ` SELECT id, organization_id, email, password_hash, role, created_at FROM users WHERE email = $1 ` user := &models.User{} err := r.db.QueryRowContext(ctx, query, email).Scan( &user.ID, &user.OrganizationID, &user.Email, &user.PasswordHash, &user.Role, &user.CreatedAt, ) if err != nil { if err == sql.ErrNoRows { return nil, fmt.Errorf("user not found") } return nil, fmt.Errorf("failed to get user: %w", err) } return user, nil } func (r *userRepository) GetByID(ctx context.Context, id uuid.UUID) (*models.User, error) { query := ` SELECT id, organization_id, email, password_hash, role, created_at FROM users WHERE id = $1 ` user := &models.User{} err := r.db.QueryRowContext(ctx, query, id).Scan( &user.ID, &user.OrganizationID, &user.Email, &user.PasswordHash, &user.Role, &user.CreatedAt, ) if err != nil { if err == sql.ErrNoRows { return nil, fmt.Errorf("user not found") } return nil, fmt.Errorf("failed to get user: %w", err) } return user, nil }