Avoid auto deleting pinned threads

This commit is contained in:
Dominic Ferrando
2025-04-26 13:58:23 -04:00
parent 9a759f09ff
commit bae900981d
2 changed files with 35 additions and 29 deletions
+33 -27
View File
@@ -99,62 +99,68 @@ func GetThread(db *sql.DB, threadId int) (Thread, error) {
return t, row.Err() return t, row.Err()
} }
func PutThread(db *sql.DB, boardSlug string, subject string, body string, mediaPath string, thumbPath string, ip_hash string) (int, error) { func PutThread(db *sql.DB, boardSlug, subject, body, mediaPath, thumbPath, ipHash string) (int, error) {
tx, err := db.Begin() tx, err := db.Begin()
if err != nil { if err != nil {
return -1, err return -1, err
} }
defer tx.Rollback() defer func() {
_ = tx.Rollback()
res, err := tx.Exec(` }()
INSERT INTO threads (board_slug, subject)
VALUES (?, ?) RETURNING id`, boardSlug, subject)
res, err := tx.Exec(
"INSERT INTO threads (board_slug, subject) VALUES (?, ?)",
boardSlug, subject,
)
if err != nil { if err != nil {
return -1, err return -1, err
} }
threadId64, err := res.LastInsertId()
threadIdStr, err := res.LastInsertId()
if err != nil { if err != nil {
return -1, err return -1, err
} }
threadId := int(threadId64)
if err := PutPost(tx, boardSlug, int(threadIdStr), body, mediaPath, thumbPath, ip_hash); err != nil { if err := PutPost(tx, boardSlug, threadId, body, mediaPath, thumbPath, ipHash); err != nil {
return -1, err return -1, err
} }
row := tx.QueryRow("SELECT COUNT(*) FROM threads WHERE board_slug = ?", boardSlug) var count int
if err := tx.QueryRow(`SELECT COUNT(*) FROM threads WHERE board_slug = ? AND pinned = 0`, boardSlug).
var threadCount int Scan(&count); err != nil {
if err = row.Scan(&threadCount); err != nil {
return -1, err return -1, err
} }
if threadCount > util.MAX_THREAD_COUNT { for count >= util.MAX_THREAD_COUNT {
row := tx.QueryRow(` var pruneID int
SELECT id FROM threads err := tx.QueryRow(`
WHERE id = ( SELECT id
SELECT id FROM threads FROM threads
WHERE board_slug = ? WHERE board_slug = ? AND pinned = 0
ORDER BY bumped_at ASC ORDER BY bumped_at ASC
LIMIT 1)`, boardSlug) LIMIT 1
`, boardSlug).Scan(&pruneID)
var pruneThreadId int if errors.Is(err, sql.ErrNoRows) {
err := row.Scan(&pruneThreadId) break
}
if err != nil { if err != nil {
return -1, err return -1, err
} }
if err := DeleteThread(tx, pruneID); err != nil {
if err := DeleteThread(tx, pruneThreadId); err != nil { return -1, err
}
if err := tx.QueryRow(
`SELECT COUNT(*) FROM threads WHERE board_slug = ? AND pinned = 0`,
boardSlug).Scan(&count); err != nil {
return -1, err return -1, err
} }
} }
if err = tx.Commit(); err != nil { if err := tx.Commit(); err != nil {
return -1, err return -1, err
} }
return threadId, nil
return int(threadIdStr), nil
} }
func DeleteThread(db Queryer, threadId int) error { func DeleteThread(db Queryer, threadId int) error {
+1 -1
View File
@@ -28,7 +28,7 @@ var (
POST_MEDIA_THUMB_PATH = "media/posts/thumb" POST_MEDIA_THUMB_PATH = "media/posts/thumb"
) )
const MAX_THREAD_COUNT = 50 const MAX_THREAD_COUNT = 3
const MAX_BODY_LEN = 3000 const MAX_BODY_LEN = 3000
const MAX_SUBJECT_LEN = 50 const MAX_SUBJECT_LEN = 50