You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
233 lines
6.1 KiB
233 lines
6.1 KiB
package db
|
|
|
|
import (
|
|
"database/sql"
|
|
"fmt"
|
|
"time"
|
|
|
|
"track-gopher/models"
|
|
)
|
|
|
|
// Group operations
|
|
|
|
// CreateGroup creates a new group
|
|
func (db *DB) CreateGroup(name, description string) (int64, error) {
|
|
result, err := db.Exec(
|
|
"INSERT INTO groups (name, description) VALUES (?, ?)",
|
|
name, description,
|
|
)
|
|
if err != nil {
|
|
return 0, fmt.Errorf("failed to create group: %w", err)
|
|
}
|
|
|
|
id, err := result.LastInsertId()
|
|
if err != nil {
|
|
return 0, fmt.Errorf("failed to get last insert ID: %w", err)
|
|
}
|
|
|
|
return id, nil
|
|
}
|
|
|
|
// GetGroups returns all groups
|
|
func (db *DB) GetGroups() ([]models.Group, error) {
|
|
rows, err := db.Query("SELECT id, name, description, created_at FROM groups ORDER BY name")
|
|
if err != nil {
|
|
return nil, fmt.Errorf("failed to query groups: %w", err)
|
|
}
|
|
defer rows.Close()
|
|
|
|
var groups []models.Group
|
|
for rows.Next() {
|
|
var g models.Group
|
|
var createdAt string
|
|
if err := rows.Scan(&g.ID, &g.Name, &g.Description, &createdAt); err != nil {
|
|
return nil, fmt.Errorf("failed to scan group row: %w", err)
|
|
}
|
|
g.CreatedAt, _ = time.Parse("2006-01-02 15:04:05", createdAt)
|
|
groups = append(groups, g)
|
|
}
|
|
|
|
if err := rows.Err(); err != nil {
|
|
return nil, fmt.Errorf("error iterating group rows: %w", err)
|
|
}
|
|
|
|
return groups, nil
|
|
}
|
|
|
|
// GetGroup returns a group by ID
|
|
func (db *DB) GetGroup(id int64) (*models.Group, error) {
|
|
var g models.Group
|
|
var createdAt string
|
|
err := db.QueryRow(
|
|
"SELECT id, name, description, created_at FROM groups WHERE id = ?",
|
|
id,
|
|
).Scan(&g.ID, &g.Name, &g.Description, &createdAt)
|
|
if err != nil {
|
|
if err == sql.ErrNoRows {
|
|
return nil, nil
|
|
}
|
|
return nil, fmt.Errorf("failed to query group: %w", err)
|
|
}
|
|
|
|
g.CreatedAt, _ = time.Parse("2006-01-02 15:04:05", createdAt)
|
|
return &g, nil
|
|
}
|
|
|
|
// UpdateGroup updates a group
|
|
func (db *DB) UpdateGroup(id int64, name, description string) error {
|
|
_, err := db.Exec(
|
|
"UPDATE groups SET name = ?, description = ? WHERE id = ?",
|
|
name, description, id,
|
|
)
|
|
if err != nil {
|
|
return fmt.Errorf("failed to update group: %w", err)
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// DeleteGroup deletes a group
|
|
func (db *DB) DeleteGroup(id int64) error {
|
|
_, err := db.Exec("DELETE FROM groups WHERE id = ?", id)
|
|
if err != nil {
|
|
return fmt.Errorf("failed to delete group: %w", err)
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// Racer operations
|
|
|
|
// CreateRacer creates a new racer
|
|
func (db *DB) CreateRacer(firstName, lastName, carNumber string, carWeight float64, groupID int64) (int64, error) {
|
|
result, err := db.Exec(
|
|
"INSERT INTO racers (first_name, last_name, car_number, car_weight, group_id) VALUES (?, ?, ?, ?, ?)",
|
|
firstName, lastName, carNumber, carWeight, groupID,
|
|
)
|
|
if err != nil {
|
|
return 0, fmt.Errorf("failed to create racer: %w", err)
|
|
}
|
|
|
|
id, err := result.LastInsertId()
|
|
if err != nil {
|
|
return 0, fmt.Errorf("failed to get last insert ID: %w", err)
|
|
}
|
|
|
|
return id, nil
|
|
}
|
|
|
|
// GetRacers returns all racers
|
|
func (db *DB) GetRacers() ([]models.Racer, error) {
|
|
rows, err := db.Query(`
|
|
SELECT r.id, r.first_name, r.last_name, r.car_number, r.car_weight,
|
|
r.group_id, g.name as group_name, r.created_at
|
|
FROM racers r
|
|
JOIN groups g ON r.group_id = g.id
|
|
ORDER BY r.last_name, r.first_name
|
|
`)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("failed to query racers: %w", err)
|
|
}
|
|
defer rows.Close()
|
|
|
|
var racers []models.Racer
|
|
for rows.Next() {
|
|
var r models.Racer
|
|
var createdAt string
|
|
if err := rows.Scan(
|
|
&r.ID, &r.FirstName, &r.LastName, &r.CarNumber, &r.CarWeight,
|
|
&r.GroupID, &r.GroupName, &createdAt,
|
|
); err != nil {
|
|
return nil, fmt.Errorf("failed to scan racer row: %w", err)
|
|
}
|
|
r.CreatedAt, _ = time.Parse("2006-01-02 15:04:05", createdAt)
|
|
racers = append(racers, r)
|
|
}
|
|
|
|
if err := rows.Err(); err != nil {
|
|
return nil, fmt.Errorf("error iterating racer rows: %w", err)
|
|
}
|
|
|
|
return racers, nil
|
|
}
|
|
|
|
// GetRacersByGroup returns racers in a specific group
|
|
func (db *DB) GetRacersByGroup(groupID int64) ([]models.Racer, error) {
|
|
rows, err := db.Query(`
|
|
SELECT r.id, r.first_name, r.last_name, r.car_number, r.car_weight,
|
|
r.group_id, g.name as group_name, r.created_at
|
|
FROM racers r
|
|
JOIN groups g ON r.group_id = g.id
|
|
WHERE r.group_id = ?
|
|
ORDER BY r.last_name, r.first_name
|
|
`, groupID)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("failed to query racers by group: %w", err)
|
|
}
|
|
defer rows.Close()
|
|
|
|
var racers []models.Racer
|
|
for rows.Next() {
|
|
var r models.Racer
|
|
var createdAt string
|
|
if err := rows.Scan(
|
|
&r.ID, &r.FirstName, &r.LastName, &r.CarNumber, &r.CarWeight,
|
|
&r.GroupID, &r.GroupName, &createdAt,
|
|
); err != nil {
|
|
return nil, fmt.Errorf("failed to scan racer row: %w", err)
|
|
}
|
|
r.CreatedAt, _ = time.Parse("2006-01-02 15:04:05", createdAt)
|
|
racers = append(racers, r)
|
|
}
|
|
|
|
if err := rows.Err(); err != nil {
|
|
return nil, fmt.Errorf("error iterating racer rows: %w", err)
|
|
}
|
|
|
|
return racers, nil
|
|
}
|
|
|
|
// GetRacer returns a racer by ID
|
|
func (db *DB) GetRacer(id int64) (*models.Racer, error) {
|
|
var r models.Racer
|
|
var createdAt string
|
|
err := db.QueryRow(`
|
|
SELECT r.id, r.first_name, r.last_name, r.car_number, r.car_weight,
|
|
r.group_id, g.name as group_name, r.created_at
|
|
FROM racers r
|
|
JOIN groups g ON r.group_id = g.id
|
|
WHERE r.id = ?
|
|
`, id).Scan(
|
|
&r.ID, &r.FirstName, &r.LastName, &r.CarNumber, &r.CarWeight,
|
|
&r.GroupID, &r.GroupName, &createdAt,
|
|
)
|
|
if err != nil {
|
|
if err == sql.ErrNoRows {
|
|
return nil, nil
|
|
}
|
|
return nil, fmt.Errorf("failed to query racer: %w", err)
|
|
}
|
|
|
|
r.CreatedAt, _ = time.Parse("2006-01-02 15:04:05", createdAt)
|
|
return &r, nil
|
|
}
|
|
|
|
// UpdateRacer updates a racer
|
|
func (db *DB) UpdateRacer(id int64, firstName, lastName, carNumber string, carWeight float64, groupID int64) error {
|
|
_, err := db.Exec(
|
|
"UPDATE racers SET first_name = ?, last_name = ?, car_number = ?, car_weight = ?, group_id = ? WHERE id = ?",
|
|
firstName, lastName, carNumber, carWeight, groupID, id,
|
|
)
|
|
if err != nil {
|
|
return fmt.Errorf("failed to update racer: %w", err)
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// DeleteRacer deletes a racer
|
|
func (db *DB) DeleteRacer(id int64) error {
|
|
_, err := db.Exec("DELETE FROM racers WHERE id = ?", id)
|
|
if err != nil {
|
|
return fmt.Errorf("failed to delete racer: %w", err)
|
|
}
|
|
return nil
|
|
}
|