package models import ( "database/sql" "fmt" "time" "udemy_httpserver/db" ) type Event struct { ID int Name string `binding:"required"` Description string `binding:"required"` Location string `binding:"required"` DateTime time.Time `binding:"required"` UserID int } func (e *Event) Save() error { insertQuery := `INSERT INTO events(name, description ,location, dateTime, user_id) VALUES ($1, $2, $3, $4, $5)` statement, err := db.Conn.Prepare(insertQuery) if err != nil { fmt.Println("Something went wrong trying to prepare statement", err) return err } defer statement.Close() result, err := statement.Exec(e.Name, e.Description, e.Location, e.DateTime, e.UserID) if err != nil { fmt.Println("Something went wrong trying to execute statement", err) return err } eventId, err := result.LastInsertId() // Even if we don't return the event, we save the id // as we are operating on a pointer to an Event e.ID = int(eventId) if err != nil { fmt.Println("Something went wrong trying to get last inserted id", err) } return err } func (e *Event) Update() error { query := ` UPDATE events SET name = $1, description = $2, location = $3, dateTime = $4, user_id = $5 WHERE id = $6 ` statement, err := db.Conn.Prepare(query) if err != nil { fmt.Println("Something went wrong trying to prepare statement", err) return err } defer func(statement *sql.Stmt) { err := statement.Close() if err != nil { fmt.Println("Something went wrong trying to close statement", err) return } }(statement) _, err = statement.Exec(e.Name, e.Description, e.Location, e.DateTime, e.UserID, e.ID) return err } func GetAllEvents() ([]Event, error) { // TODO: implement paging selectQuery := `SELECT * FROM events` statement, err := db.Conn.Prepare(selectQuery) if err != nil { fmt.Println("Something went wrong trying to prepare statement", err) return nil, err } result, err := statement.Query() if err != nil { fmt.Println("Something went wrong trying to execute statement", err) return nil, err } defer result.Close() var events []Event for result.Next() { var event Event err := result.Scan(&event.ID, &event.Name, &event.Description, &event.Location, &event.DateTime, &event.UserID) if err != nil { fmt.Println("Unexpected value in the database result", err) return nil, err } events = append(events, event) } return events, nil } func FindEventById(id int) (*Event, error) { selectQuery := `SELECT * FROM events WHERE id = $1` result, err := db.Conn.Query(selectQuery, id) if err != nil { fmt.Println("Something went wrong trying to execute statement", err) return nil, err } if result.Next() { var event Event err = result.Scan(&event.ID, &event.Name, &event.Description, &event.Location, &event.DateTime, &event.UserID) if err != nil { fmt.Println("Something went wrong parsing the database", err) return nil, err } return &event, nil } return nil, nil }