You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

162 lines
3.6 KiB
Go

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
}