diff --git a/dbi/user.go b/dbi/user.go index 78a226d..867722e 100644 --- a/dbi/user.go +++ b/dbi/user.go @@ -21,7 +21,8 @@ func CreateUser(conn *sql.Conn, user *User) error { user.APIKey = GenUUID() } if user.Password != "" { - user.Password := md5.Sum([]byte(user.Password)) + hash := md5.Sum([]byte(user.Password)) + user.Password = fmt.Sprintf("%x", hash) } _, err := conn.ExecContext(context.Background(), `INSERT INTO users (APIKey, FirstName, LastName, Password, Status, Username) diff --git a/main.go b/main.go index ab9e674..c379128 100644 --- a/main.go +++ b/main.go @@ -64,7 +64,7 @@ func handleLoginPost(w http.ResponseWriter, r *http.Request) { func main() { mux := http.NewServeMux() - mux.HandleFunc("GET /activity/login", handleLoginGet) - mux.HandleFunc("POST /activity/login", handleLoginPost) + mux.HandleFunc("GET /faculty/activity/login", handleLoginGet) + mux.HandleFunc("POST /faculty/activity/login", handleLoginPost) cgi.Serve(mux) } diff --git a/tools/seed_database.go b/tools/seed_database.go new file mode 100644 index 0000000..ef751bc --- /dev/null +++ b/tools/seed_database.go @@ -0,0 +1,160 @@ +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"], + 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 +}