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}