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	"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}