···58}
5960type HandlerStore interface {
61- CreateURL(id, url, did string, createdAt int64) error
62 DeleteURL(id, did string) error
63}
64···94 return nil
95 }
9697- // TODO: if origin isn't this instance, ignore
98-99- err := h.store.CreateURL(event.Commit.RKey, record.URL, event.Did, record.CreatedAt.UnixMilli())
100 if err != nil {
101 // TODO: proper error handling in case this fails, we want to try again
102 slog.Error("failed to store short URL", "error", err)
···58}
5960type HandlerStore interface {
61+ CreateURL(id, url, did, originHost string, createdAt int64) error
62 DeleteURL(id, did string) error
63}
64···94 return nil
95 }
9697+ err := h.store.CreateURL(event.Commit.RKey, record.URL, event.Did, record.Origin, record.CreatedAt.UnixMilli())
0098 if err != nil {
99 // TODO: proper error handling in case this fails, we want to try again
100 slog.Error("failed to store short URL", "error", err)
+8-7
database/urls.go
···13 "id" TEXT NOT NULL PRIMARY KEY,
14 "url" TEXT NOT NULL,
15 "did" TEXT NOT NULL,
016 "createdAt" integer
17 );`
18···30 return nil
31}
3233-func (d *DB) CreateURL(id, url, did string, createdAt int64) error {
34- sql := `INSERT INTO urls (id, url, did, createdAt) VALUES (?, ?, ?, ?) ON CONFLICT(id) DO NOTHING;`
35- _, err := d.db.Exec(sql, id, url, did, createdAt)
36 if err != nil {
37 // TODO: catch already exists
38 return fmt.Errorf("exec insert url: %w", err)
···42}
4344func (d *DB) GetURLs(did string) ([]atshorter.ShortURL, error) {
45- sql := "SELECT id, url, did FROM urls WHERE did = ?;"
46 rows, err := d.db.Query(sql, did)
47 if err != nil {
48 return nil, fmt.Errorf("run query to get URLS': %w", err)
···52 var results []atshorter.ShortURL
53 for rows.Next() {
54 var shortURL atshorter.ShortURL
55- if err := rows.Scan(&shortURL.ID, &shortURL.URL, &shortURL.Did); err != nil {
56 return nil, fmt.Errorf("scan row: %w", err)
57 }
58···62}
6364func (d *DB) GetURLByID(id string) (atshorter.ShortURL, error) {
65- sql := "SELECT id, url, did FROM urls WHERE id = ?;"
66 rows, err := d.db.Query(sql, id)
67 if err != nil {
68 return atshorter.ShortURL{}, fmt.Errorf("run query to get URL by id': %w", err)
···7172 var result atshorter.ShortURL
73 for rows.Next() {
74- if err := rows.Scan(&result.ID, &result.URL, &result.Did); err != nil {
75 return atshorter.ShortURL{}, fmt.Errorf("scan row: %w", err)
76 }
77 return result, nil
···13 "id" TEXT NOT NULL PRIMARY KEY,
14 "url" TEXT NOT NULL,
15 "did" TEXT NOT NULL,
16+ "originHost" TEXT NOT NULL,
17 "createdAt" integer
18 );`
19···31 return nil
32}
3334+func (d *DB) CreateURL(id, url, did, originHost string, createdAt int64) error {
35+ sql := `INSERT INTO urls (id, url, did, originHost, createdAt) VALUES (?, ?, ?, ?, ?) ON CONFLICT(id) DO NOTHING;`
36+ _, err := d.db.Exec(sql, id, url, did, originHost, createdAt)
37 if err != nil {
38 // TODO: catch already exists
39 return fmt.Errorf("exec insert url: %w", err)
···43}
4445func (d *DB) GetURLs(did string) ([]atshorter.ShortURL, error) {
46+ sql := "SELECT id, url, did, originHost FROM urls WHERE did = ?;"
47 rows, err := d.db.Query(sql, did)
48 if err != nil {
49 return nil, fmt.Errorf("run query to get URLS': %w", err)
···53 var results []atshorter.ShortURL
54 for rows.Next() {
55 var shortURL atshorter.ShortURL
56+ if err := rows.Scan(&shortURL.ID, &shortURL.URL, &shortURL.Did, &shortURL.OriginHost); err != nil {
57 return nil, fmt.Errorf("scan row: %w", err)
58 }
59···63}
6465func (d *DB) GetURLByID(id string) (atshorter.ShortURL, error) {
66+ sql := "SELECT id, url, did, originHost FROM urls WHERE id = ?;"
67 rows, err := d.db.Query(sql, id)
68 if err != nil {
69 return atshorter.ShortURL{}, fmt.Errorf("run query to get URL by id': %w", err)
···7273 var result atshorter.ShortURL
74 for rows.Next() {
75+ if err := rows.Scan(&result.ID, &result.URL, &result.Did, &result.OriginHost); err != nil {
76 return atshorter.ShortURL{}, fmt.Errorf("scan row: %w", err)
77 }
78 return result, nil