package database import ( "database/sql" "errors" "git.noroutes.net/NoRoutes/vibetunes/internal/idgen" ) type RadioStation struct { ID string Name string StreamURL string HomepageURL string } func CreateRadioStation(db *sql.DB, name, streamURL, homepageURL string) (*RadioStation, error) { id := idgen.New("rs") _, err := db.Exec(`INSERT INTO internet_radio_stations (id, name, stream_url, homepage_url) VALUES (?, ?, ?, ?)`, id, name, streamURL, homepageURL) if err != nil { return nil, err } return GetRadioStation(db, id) } func GetRadioStation(db *sql.DB, id string) (*RadioStation, error) { var r RadioStation err := db.QueryRow(`SELECT id, name, stream_url, homepage_url FROM internet_radio_stations WHERE id = ?`, id). Scan(&r.ID, &r.Name, &r.StreamURL, &r.HomepageURL) if errors.Is(err, sql.ErrNoRows) { return nil, ErrNotFound } if err != nil { return nil, err } return &r, nil } func ListRadioStations(db *sql.DB) ([]*RadioStation, error) { rows, err := db.Query(`SELECT id, name, stream_url, homepage_url FROM internet_radio_stations ORDER BY name COLLATE NOCASE`) if err != nil { return nil, err } defer rows.Close() var out []*RadioStation for rows.Next() { var r RadioStation if err := rows.Scan(&r.ID, &r.Name, &r.StreamURL, &r.HomepageURL); err != nil { return nil, err } out = append(out, &r) } return out, rows.Err() } func UpdateRadioStation(db *sql.DB, id, name, streamURL, homepageURL string) error { _, err := db.Exec(`UPDATE internet_radio_stations SET name = ?, stream_url = ?, homepage_url = ? WHERE id = ?`, name, streamURL, homepageURL, id) return err } func DeleteRadioStation(db *sql.DB, id string) error { _, err := db.Exec(`DELETE FROM internet_radio_stations WHERE id = ?`, id) return err }