package repositories import ( "GoMembership/internal/models" "GoMembership/pkg/errors" "database/sql" ) type UserRepository interface { CreateUser(user *models.User) (int64, error) FindUserByID(id int) (*models.User, error) FindUserByEmail(email string) (*models.User, error) } type userRepository struct { db *sql.DB } func NewUserRepository(db *sql.DB) UserRepository { return &userRepository{db} } func (repo *userRepository) CreateUser(user *models.User) (int64, error) { query := "INSERT INTO users (first_name, last_name, email, password, salt, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?)" result, err := repo.db.Exec(query, user.FirstName, user.LastName, user.Email, user.Password, user.Salt, user.CreatedAt, user.UpdatedAt) if err != nil { return -1, err } lastInsertID, err := result.LastInsertId() if err != nil { return -1, err } return lastInsertID, err } func (repo *userRepository) FindUserByID(id int) (*models.User, error) { var user models.User query := "SELECT id, first_name, last_name, email FROM users WHERE id = ?" err := repo.db.QueryRow(query, id).Scan(&user.ID, &user.FirstName, &user.LastName, &user.Email) if err != nil { if err == sql.ErrNoRows { return nil, errors.ErrUserNotFound } return nil, err } return &user, nil } func (repo *userRepository) FindUserByEmail(email string) (*models.User, error) { var user models.User query := "SELECT id, first_name, last_name, email FROM users WHERE email = ?" err := repo.db.QueryRow(query, email).Scan(&user.ID, &user.FirstName, &user.LastName, &user.Email) if err != nil { if err == sql.ErrNoRows { return nil, errors.ErrUserNotFound } return nil, err } return &user, nil }