internal/store/pagedomains.go
57 lines · 1464 bytes
1package store
2
3import (
4 "database/sql"
5 "errors"
6)
7
8// AddPageDomain claims a domain for a repo's pages site. The primary key
9// makes claims exclusive instance-wide.
10func (s *Store) AddPageDomain(domain string, repoID int64) error {
11 _, err := s.DB.Exec("INSERT INTO page_domains (domain, repo_id) VALUES (?, ?)", domain, repoID)
12 if err != nil && isUniqueErr(err) {
13 return ErrExists
14 }
15 return err
16}
17
18func (s *Store) RemovePageDomain(domain string, repoID int64) error {
19 res, err := s.DB.Exec("DELETE FROM page_domains WHERE domain = ? AND repo_id = ?", domain, repoID)
20 if err != nil {
21 return err
22 }
23 if n, _ := res.RowsAffected(); n == 0 {
24 return ErrNotFound
25 }
26 return nil
27}
28
29func (s *Store) ListPageDomains(repoID int64) ([]string, error) {
30 rows, err := s.DB.Query("SELECT domain FROM page_domains WHERE repo_id = ? ORDER BY domain", repoID)
31 if err != nil {
32 return nil, err
33 }
34 defer rows.Close()
35 var out []string
36 for rows.Next() {
37 var d string
38 if err := rows.Scan(&d); err != nil {
39 return nil, err
40 }
41 out = append(out, d)
42 }
43 return out, rows.Err()
44}
45
46// PageDomainRepo resolves a request host to the repo serving it.
47func (s *Store) PageDomainRepo(domain string) (Repo, error) {
48 var repoID int64
49 err := s.DB.QueryRow("SELECT repo_id FROM page_domains WHERE domain = ?", domain).Scan(&repoID)
50 if errors.Is(err, sql.ErrNoRows) {
51 return Repo{}, ErrNotFound
52 }
53 if err != nil {
54 return Repo{}, err
55 }
56 return s.RepoByID(repoID)
57}