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 FROM siteentries WHERE id = ?` row := m.DB.QueryRow(stmt, id) s := &SiteEntry{} var timeStr string err := row.Scan(&s.Id, &s.Name, &s.Url, &s.Webmaster, &timeStr) if err != nil { if errors.Is(err, sql.ErrNoRows) { return nil, ErrNoRecord } else { return nil, err } } // time is stored as a string in sqlite, so we need to parse it // probably should be something taken care of in the driver dateAdded, err := time.Parse(time.DateTime, timeStr) if err != nil { return nil, err } s.DateAdded = dateAdded return s, nil } // Retrieve a SiteEntry from the database by url func (m *SiteEntryModel) GetByUrl(url string) (*SiteEntry, error) { return nil, 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 }