package models import ( "database/sql" "time" "errors" "github.com/google/uuid" ) type SiteId string type SiteEntry struct { Id SiteId Name string Webmaster WebmasterId Url string DateAdded time.Time Next SiteId Prev SiteId } type SiteEntryModel struct { DB *sql.DB } // Commit a SiteEntry to the database func (m *SiteEntryModel) Insert(name string, url string, webmaster *Webmaster) (SiteId, error) { stmt := `INSERT INTO siteentries (id, name, url, webmaster, dateAdded) VALUES(?,?,?,?,datetime("now"))` id := uuid.NewString() _, err := m.DB.Exec(stmt, id, name, url, webmaster.Id) if err != nil { return "", nil } return SiteId(id), nil } // Retrieve a SiteEntry from the database by id func (m *SiteEntryModel) Get(id SiteId) (*SiteEntry, error) { stmt := `SELECT id, name, url, webmaster, dateAdded, next, prev FROM siteentries WHERE id = ?` row := m.DB.QueryRow(stmt, id) s := &SiteEntry{} err := row.Scan(&s.Id, &s.Name, &s.Url, &s.Webmaster, &s.DateAdded, &s.Next, &s.Prev) if err != nil { if errors.Is(err, sql.ErrNoRows) { return nil, ErrNoRecord } else { return nil, err } } return s, nil } // Retrieve a SiteEntry from the database by url func (m *SiteEntryModel) GetByUrl(url string) (*SiteEntry, error) { stmt := `SELECT id, name, url, webmaster, dateAdded, next, prev FROM siteentries WHERE url = ?` row := m.DB.QueryRow(stmt, url) s := &SiteEntry{} err := row.Scan(&s.Id, &s.Name, &s.Url, &s.Webmaster, &s.DateAdded, &s.Next, &s.Prev) if err != nil { if errors.Is(err, sql.ErrNoRows) { return nil, ErrNoRecord } else { return nil, err } } return s, nil } // Update existing SiteEntry with the values of passed entry func (m *SiteEntryModel) Update(entry *SiteEntry) error { return nil } // Delete SiteEntry from database func (m *SiteEntryModel) Delete(entry *SiteEntry) error { return nil } // Get latest func (m *SiteEntryModel) Latest() ([]*SiteEntry, error) { stmt := `SELECT id, name, url, webmaster, dateAdded FROM siteentries ORDER BY dateAdded DESC LIMIT 10` rows, err := m.DB.Query(stmt) if err != nil { return nil, err } defer rows.Close() entries := []*SiteEntry{} // var timeStr string for rows.Next() { s := &SiteEntry{} err = rows.Scan(&s.Id, &s.Name, &s.Url, &s.Webmaster, &s.DateAdded) if err != nil { return nil, err } if err != nil { return nil, err } entries = append(entries, s) } if err = rows.Err(); err != nil { return nil, err } return entries, nil }