Avoid auto deleting pinned threads
This commit is contained in:
@@ -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 {
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user