...
1 package database
2
3 import (
4 "context"
5 "fmt"
6 "log"
7
8 . "codeberg.org/tslocum/sriracha/model"
9 . "codeberg.org/tslocum/sriracha/util"
10 "github.com/jackc/pgx/v5"
11 )
12
13 func (db *DB) AddReport(r *Report) {
14 if r.Board == nil || r.Post == nil {
15 return
16 }
17 _, err := db.conn.Exec(context.Background(), "INSERT INTO report VALUES (DEFAULT, $1, $2, $3, $4) ON CONFLICT DO NOTHING",
18 r.Board.ID,
19 r.Post.ID,
20 r.Timestamp,
21 r.IP,
22 )
23 if err != nil {
24 log.Fatalf("failed to insert report: %s", err)
25 }
26 }
27
28 func (db *DB) AllReports() []*Report {
29 rows, err := db.conn.Query(context.Background(), "SELECT DISTINCT(board, post) FROM report")
30 if err != nil {
31 log.Fatalf("failed to select all reports: %s", err)
32 }
33 var distinctIDs [][2]int
34 for rows.Next() {
35 colValues, err := rows.Values()
36 if err != nil {
37 log.Fatal(err)
38 }
39 var ids [2]int
40 for _, colValue := range colValues {
41 for i, v := range colValue.([]interface{}) {
42 ids[i] = ParseInt(fmt.Sprintf("%d", v))
43 }
44 }
45 distinctIDs = append(distinctIDs, ids)
46 }
47
48 reports := make([]*Report, len(distinctIDs))
49 for i, ids := range distinctIDs {
50 boardID := ids[0]
51 postID := ids[1]
52
53 r := &Report{}
54 r.Board = db.BoardByID(boardID)
55 r.Post = db.PostByID(postID)
56 r.Count = db.NumReports(r.Post)
57 reports[i] = r
58 }
59 return reports
60 }
61
62 func (db *DB) NumReports(p *Post) int {
63 var count int
64 err := db.conn.QueryRow(context.Background(), "SELECT COUNT(*) FROM report WHERE board = $1 AND post = $2", p.Board.ID, p.ID).Scan(&count)
65 if err == pgx.ErrNoRows {
66 return 0
67 } else if err != nil {
68 log.Fatalf("failed to select report count: %s", err)
69 }
70 return count
71 }
72
73 func (db *DB) DeleteReports(p *Post) {
74 if p.ID == 0 || p.Board == nil {
75 return
76 }
77 _, err := db.conn.Exec(context.Background(), "DELETE FROM report WHERE board = $1 AND post = $2", p.Board.ID, p.ID)
78 if err != nil {
79 log.Fatalf("failed to delete reports: %s", err)
80 }
81 }
82
View as plain text