gin_http/models/event.go

113 lines
2.9 KiB
Go

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
}