package main import ( "context" "database/sql" "encoding/csv" "fmt" "log" "os" "faculty_media_report/dbi" ) func main() { db, err := dbi.GetDbConn() if err != nil { log.Fatalf("GetDbConn: %v", err) } defer db.Close() conn, err := db.Conn(context.Background()) if err != nil { log.Fatalf("db.Conn: %v", err) } defer conn.Close() if err := seedUsers(conn); err != nil { log.Fatalf("seed users: %v", err) } if err := seedAppearances(conn); err != nil { log.Fatalf("seed appearances: %v", err) } if err := seedActivities(conn); err != nil { log.Fatalf("seed activities: %v", err) } if err := seedScholarship(conn); err != nil { log.Fatalf("seed scholarship: %v", err) } } // readCSV reads filename and returns rows as header-keyed maps. // Returns nil, nil if the file does not exist. func readCSV(filename string) ([]map[string]string, error) { f, err := os.Open(filename) if os.IsNotExist(err) { return nil, nil } if err != nil { return nil, err } defer f.Close() records, err := csv.NewReader(f).ReadAll() if err != nil { return nil, fmt.Errorf("parse %s: %w", filename, err) } if len(records) < 2 { return nil, nil } headers := records[0] rows := make([]map[string]string, 0, len(records)-1) for _, rec := range records[1:] { row := make(map[string]string, len(headers)) for i, h := range headers { if i < len(rec) { row[h] = rec[i] } } rows = append(rows, row) } return rows, nil } func seedUsers(conn *sql.Conn) error { rows, err := readCSV("users.csv") if err != nil { return err } for _, row := range rows { u := dbi.User{ APIKey: row["APIKey"], FirstName: row["FirstName"], LastName: row["LastName"], Password: row["Password"], Status: row["Status"], Username: row["Username"], } if err := dbi.CreateUser(conn, &u); err != nil { return fmt.Errorf("CreateUser %q: %w", u.Username, err) } log.Printf("created user %q", u.Username) } return nil } func seedAppearances(conn *sql.Conn) error { rows, err := readCSV("appearances.csv") if err != nil { return err } for _, row := range rows { a := dbi.Appearance{ UID: row["UID"], Title: row["Title"], Description: row["Description"], Hyperlink: row["Hyperlink"], Status: row["Status"], Username: row["Username"], } if err := dbi.CreateAppearance(conn, &a); err != nil { return fmt.Errorf("CreateAppearance %q: %w", a.Title, err) } log.Printf("created appearance %q", a.Title) } return nil } func seedActivities(conn *sql.Conn) error { rows, err := readCSV("activities.csv") if err != nil { return err } for _, row := range rows { a := dbi.Activity{ UID: row["UID"], Title: row["Title"], Description: row["Description"], Hyperlink: row["Hyperlink"], Status: row["Status"], Username: row["Username"], } if err := dbi.CreateActivity(conn, &a); err != nil { return fmt.Errorf("CreateActivity %q: %w", a.Title, err) } log.Printf("created activity %q", a.Title) } return nil } func seedScholarship(conn *sql.Conn) error { rows, err := readCSV("scholarship.csv") if err != nil { return err } for _, row := range rows { s := dbi.Scholarship{ UID: row["UID"], Citation: row["Citation"], Hyperlink: row["Hyperlink"], DocumentLink: row["DocumentLink"], Status: row["Status"], Username: row["Username"], } if err := dbi.CreateScholarship(conn, &s); err != nil { return fmt.Errorf("CreateScholarship %q: %w", s.Citation, err) } log.Printf("created scholarship %q", s.Citation) } return nil }