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}