...

Source file src/codeberg.org/tslocum/sriracha/internal/database/database_report.go

Documentation: codeberg.org/tslocum/sriracha/internal/database

     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)) // Type may be int16 or int32.
    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