internal/store/pagedomains.go

0d12684707ba92a7a5dcf9aee6077df1f8c17c9c
gitbay/internal/store/pagedomains.go history · blame · raw

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}