/ db / project.go
project.go
 1  // SPDX-FileCopyrightText: Amolith <amolith@secluded.site>
 2  //
 3  // SPDX-License-Identifier: Apache-2.0
 4  
 5  package db
 6  
 7  import (
 8  	"database/sql"
 9  	"sync"
10  )
11  
12  // DeleteProject deletes a project from the database
13  func 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
25  func GetProject(db *sql.DB, id string) (map[string]string, error) {
26  	var name, forge, url, version string
27  	err := db.QueryRow("SELECT name, forge, url, version FROM projects WHERE id = ?", id).Scan(&name, &forge, &url, &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
42  func 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
56  func 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  }