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}