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	_, err := db.Exec("DELETE FROM projects WHERE id = ?", id)
17	if err != nil {
18		return err
19	}
20	_, err = db.Exec("DELETE FROM releases WHERE project_id = ?", id)
21	return err
22}
23
24// GetProject returns a project from the database
25func GetProject(db *sql.DB, url string) (map[string]string, error) {
26	var id, name, forge, version string
27	err := db.QueryRow("SELECT id, name, forge, version FROM projects WHERE url = ?", url).Scan(&id, &name, &forge, &version)
28	if err != nil {
29		return nil, err
30	}
31	project := map[string]string{
32		"id":      id,
33		"name":    name,
34		"url":     url,
35		"forge":   forge,
36		"version": version,
37	}
38	return project, nil
39}
40
41// UpsertProject adds or updates a project in the database
42func UpsertProject(db *sql.DB, mu *sync.Mutex, id, url, name, forge, running string) error {
43	mu.Lock()
44	defer mu.Unlock()
45	_, err := db.Exec(`INSERT INTO projects (id, url, name, forge, version)
46		VALUES (?, ?, ?, ?, ?)
47		ON CONFLICT(id) DO 
48			UPDATE SET
49				name = excluded.name,
50				forge = excluded.forge,
51				version = excluded.version;`, id, url, name, forge, running)
52	return err
53}
54
55// GetProjects returns a list of all projects in the database
56func GetProjects(db *sql.DB) ([]map[string]string, error) {
57	rows, err := db.Query("SELECT id, name, url, forge, version FROM projects")
58	if err != nil {
59		return nil, err
60	}
61	defer rows.Close()
62
63	var projects []map[string]string
64	for rows.Next() {
65		var id, name, url, forge, version string
66		err = rows.Scan(&id, &name, &url, &forge, &version)
67		if err != nil {
68			return nil, err
69		}
70		project := map[string]string{
71			"id":      id,
72			"name":    name,
73			"url":     url,
74			"forge":   forge,
75			"version": version,
76		}
77		projects = append(projects, project)
78	}
79	return projects, nil
80}