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}