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