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