project.go

 1// SPDX-FileCopyrightText: Amolith <amolith@secluded.site>
 2//
 3// SPDX-License-Identifier: Apache-2.0
 4
 5package db
 6
 7import (
 8	"database/sql"
 9	"sync"
10)
11
12// DeleteProject deletes a project from the database.
13func DeleteProject(db *sql.DB, mu *sync.Mutex, id string) error {
14	mu.Lock()
15	defer mu.Unlock()
16
17	_, err := db.Exec("DELETE FROM projects WHERE id = ?", id)
18	if err != nil {
19		return err
20	}
21
22	_, err = db.Exec("DELETE FROM releases WHERE project_id = ?", id)
23
24	return err
25}
26
27// GetProject returns a project from the database.
28func GetProject(db *sql.DB, id string) (map[string]string, error) {
29	var name, forge, url, version string
30
31	err := db.QueryRow("SELECT name, forge, url, version FROM projects WHERE id = ?", id).Scan(&name, &forge, &url, &version)
32	if err != nil {
33		return nil, err
34	}
35
36	project := map[string]string{
37		"id":      id,
38		"name":    name,
39		"url":     url,
40		"forge":   forge,
41		"version": version,
42	}
43
44	return project, nil
45}
46
47// UpsertProject adds or updates a project in the database.
48func UpsertProject(db *sql.DB, mu *sync.Mutex, id, url, name, forge, running string) error {
49	mu.Lock()
50	defer mu.Unlock()
51
52	_, err := db.Exec(`INSERT INTO projects (id, url, name, forge, version)
53		VALUES (?, ?, ?, ?, ?)
54		ON CONFLICT(id) DO 
55			UPDATE SET
56				name = excluded.name,
57				forge = excluded.forge,
58				version = excluded.version;`, id, url, name, forge, running)
59
60	return err
61}
62
63// GetProjects returns a list of all projects in the database.
64func GetProjects(db *sql.DB) ([]map[string]string, error) {
65	rows, err := db.Query("SELECT id, name, url, forge, version FROM projects")
66	if err != nil {
67		return nil, err
68	}
69	defer rows.Close()
70
71	var projects []map[string]string
72	for rows.Next() {
73		var id, name, url, forge, version string
74
75		err = rows.Scan(&id, &name, &url, &forge, &version)
76		if err != nil {
77			return nil, err
78		}
79
80		project := map[string]string{
81			"id":      id,
82			"name":    name,
83			"url":     url,
84			"forge":   forge,
85			"version": version,
86		}
87		projects = append(projects, project)
88	}
89
90	return projects, nil
91}