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	"fmt"
10	"sync"
11)
12
13// UpsertRelease adds or updates a release for a project with a given ID in the
14// database.
15func UpsertRelease(db *sql.DB, mu *sync.Mutex, relID, projID, url, tag, content, date string) error {
16	mu.Lock()
17	defer mu.Unlock()
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;`, relID, projID, url, tag, content, date)
27	return err
28}
29
30// GetReleases returns all releases for a project with a given id from the database.
31func GetReleases(db *sql.DB, projID string) ([]map[string]string, error) {
32	rows, err := db.Query(`SELECT id, url, tag, content, date FROM releases WHERE project_id = ?`, projID)
33	if err != nil {
34		return nil, err
35	}
36	defer rows.Close()
37
38	releases := make([]map[string]string, 0)
39	for rows.Next() {
40		var (
41			relID   string
42			url     string
43			tag     string
44			content string
45			date    string
46		)
47		err := rows.Scan(&relID, &url, &tag, &content, &date)
48		if err != nil {
49			return nil, err
50		}
51		releases = append(releases, map[string]string{
52			"id":         relID,
53			"project_id": projID,
54			"url":        url,
55			"tag":        tag,
56			"content":    content,
57			"date":       date,
58		})
59	}
60	if err := rows.Err(); err != nil {
61		return nil, fmt.Errorf("failed during row iteration for releases: %w", err)
62	}
63	return releases, nil
64}