release.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	"sync"
10)
11
12// UpsertRelease adds or updates a release for a project with a given ID in the
13// database.
14func UpsertRelease(db *sql.DB, mu *sync.Mutex, id, projectID, url, tag, content, date string) error {
15	mu.Lock()
16	defer mu.Unlock()
17
18	_, err := db.Exec(`INSERT INTO releases (id, project_id, url, tag, content, date)
19		VALUES (?, ?, ?, ?, ?, ?)
20		ON CONFLICT(id) DO 
21			UPDATE SET
22				url = excluded.url,
23				content = excluded.content,
24				tag = excluded.tag,
25				content = excluded.content,
26				date = excluded.date;`, id, projectID, url, tag, content, date)
27
28	return err
29}
30
31// GetReleases returns all releases for a project with a given id from the database.
32func GetReleases(db *sql.DB, projectID string) ([]map[string]string, error) {
33	rows, err := db.Query(`SELECT id, url, tag, content, date FROM releases WHERE project_id = ?`, projectID)
34	if err != nil {
35		return nil, err
36	}
37	defer rows.Close()
38
39	releases := make([]map[string]string, 0)
40	for rows.Next() {
41		var (
42			id      string
43			url     string
44			tag     string
45			content string
46			date    string
47		)
48
49		err := rows.Scan(&id, &url, &tag, &content, &date)
50		if err != nil {
51			return nil, err
52		}
53
54		releases = append(releases, map[string]string{
55			"id":         id,
56			"project_id": projectID,
57			"url":        url,
58			"tag":        tag,
59			"content":    content,
60			"date":       date,
61		})
62	}
63
64	return releases, nil
65}