You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
299 lines
6.3 KiB
Lua
299 lines
6.3 KiB
Lua
local Bans = require "models.bans"
|
|
local Threads = require "models.threads"
|
|
local Posts = require "models.posts"
|
|
local Reports = require "models.reports"
|
|
local process = {}
|
|
|
|
function process.create_thread(params, session, board)
|
|
|
|
-- Prepare data for entry
|
|
local _, err = Posts:prepare_post(params, session, board)
|
|
if err then
|
|
return false, err
|
|
end
|
|
|
|
-- Archive old threads
|
|
local max_threads = board.threads_per_page * board.pages
|
|
Threads:archive_threads(board.id, max_threads)
|
|
|
|
-- Delete old archived threads
|
|
local time = os.time()
|
|
local threads = Threads:get_archived_threads(board.id)
|
|
|
|
for _, t in ipairs(threads) do
|
|
if time - t.last_active > board.archive_time and not t.save then
|
|
local posts = Posts:get_thread_posts(t.id)
|
|
Threads:delete_thread("override", t, posts[1])
|
|
|
|
-- Delete all associated posts
|
|
for _, post in ipairs(posts) do
|
|
Posts:delete_post("override", board, post)
|
|
|
|
-- Delete associated report
|
|
local report = Reports:get_report(post.id)
|
|
if report then
|
|
Reports:delete_report(report)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
-- Insert post data into database
|
|
local post, err = Posts:create_post(
|
|
params,
|
|
session,
|
|
board,
|
|
thread,
|
|
true
|
|
)
|
|
if err then
|
|
return false, err
|
|
end
|
|
|
|
return post
|
|
end
|
|
|
|
function process.create_post(params, session, board, thread)
|
|
local posts = Posts:count_posts(thread.id)
|
|
local files = Posts:count_files(thread.id)
|
|
|
|
-- Prepare data for entry
|
|
local _, err = Posts:prepare_post(
|
|
params, session, board, thread, files
|
|
)
|
|
if err then
|
|
return false, err
|
|
end
|
|
|
|
-- Insert post data into database
|
|
local post, err = Posts:create_post(
|
|
params,
|
|
session,
|
|
board,
|
|
thread,
|
|
false
|
|
)
|
|
if err then
|
|
return false, err
|
|
end
|
|
|
|
posts = posts + 1
|
|
|
|
-- Check for [auto]sage
|
|
if params.options ~= "sage" and
|
|
posts <= board.post_limit then
|
|
-- Update thread
|
|
thread.last_active = os.time()
|
|
thread:update("last_active")
|
|
end
|
|
|
|
return post
|
|
end
|
|
|
|
function process.delete_thread(params, session, board)
|
|
-- Validate post
|
|
local post = Posts:get_post(board.id, params.thread_id)
|
|
if not post then
|
|
return false, { "err_invalid_post", { params.thread_id } }
|
|
end
|
|
|
|
-- Validate thread
|
|
local thread = Threads:get_thread(post.thread_id)
|
|
if not thread then
|
|
return false, { "err_invalid_thread" }
|
|
end
|
|
|
|
local posts = Posts:get_posts_by_thread(thread.id)
|
|
|
|
-- Delete thread
|
|
local _, err = Threads:delete_thread(session, thread, posts[1])
|
|
if err then
|
|
return false, err
|
|
end
|
|
|
|
-- Delete all associated posts
|
|
for _, post in ipairs(posts) do
|
|
Posts:delete_post("override", board, post)
|
|
|
|
-- Delete associated report
|
|
local report = Reports:get_report(board.id, post.id)
|
|
if report then
|
|
Reports:delete_report(report)
|
|
end
|
|
end
|
|
|
|
return true
|
|
end
|
|
|
|
function process.delete_post(params, session, board)
|
|
-- Validate post
|
|
local post = Posts:get_post(board.id, params.post_id)
|
|
if not post then
|
|
return false, { "err_invalid_post", { params.post_id } }
|
|
end
|
|
|
|
-- Validate thread
|
|
local thread = Threads:get_thread(post.thread_id)
|
|
if not thread then
|
|
return false, { "err_invalid_thread" }
|
|
end
|
|
|
|
-- Delete post
|
|
local _, err = Posts:delete_post(session, board, post)
|
|
if err then
|
|
return false, err
|
|
end
|
|
|
|
-- Update thread
|
|
local posts = Posts:get_posts_by_thread(thread.id)
|
|
thread.last_active = posts[#posts].timestamp
|
|
thread:update("last_active")
|
|
|
|
return true
|
|
end
|
|
|
|
function process.report_post(params, board)
|
|
-- Validate post
|
|
local post = Posts:get_post(board.id, params.post_id)
|
|
if not post then
|
|
return false, { "err_invalid_post", { params.thread } }
|
|
end
|
|
|
|
local report = Reports:get_report(board.id, post.post_id)
|
|
|
|
-- If report exists, update it
|
|
if report then
|
|
report.num_reports = report.num_reports + 1 -- FIXME: race condition
|
|
local _, err = Reports:modify_report(report)
|
|
if err then
|
|
return false, err
|
|
end
|
|
-- If report is new, create it
|
|
else
|
|
local _, err = Reports:create_report {
|
|
board_id = board.id,
|
|
thread_id = post.thread_id,
|
|
post_id = post.post_id,
|
|
timestamp = os.time(),
|
|
num_reports = 1
|
|
}
|
|
if err then
|
|
return false, err
|
|
end
|
|
end
|
|
|
|
return post
|
|
end
|
|
|
|
-- Sticky thread
|
|
function process.sticky_thread(params, board)
|
|
-- Validate post
|
|
local post = Posts:get_post(board.id, params.post_id)
|
|
if not post then
|
|
return false, { "err_invalid_post", { params.post_id } }
|
|
end
|
|
|
|
-- Validate thread
|
|
local thread = Threads:get_thread(post.thread_id)
|
|
if not thread then
|
|
return false, { "err_invalid_thread" }
|
|
end
|
|
|
|
thread.sticky = not thread.sticky
|
|
thread:update("sticky")
|
|
|
|
return true
|
|
end
|
|
|
|
-- Lock thread
|
|
function process.lock_thread(params, board)
|
|
-- Validate post
|
|
local post = Posts:get_post(board.id, params.post_id)
|
|
if not post then
|
|
return false, { "err_invalid_post", { params.post_id } }
|
|
end
|
|
|
|
-- Validate thread
|
|
local thread = Threads:get_thread(post.thread_id)
|
|
if not thread then
|
|
return false, { "err_invalid_thread" }
|
|
end
|
|
|
|
thread.lock = not thread.lock
|
|
thread:update("lock")
|
|
|
|
return true
|
|
end
|
|
|
|
-- Save thread
|
|
function process.save_thread(params, board)
|
|
-- Validate post
|
|
local post = Posts:get_post(board.id, params.post_id)
|
|
if not post then
|
|
return false, { "err_invalid_post", { params.post_id } }
|
|
end
|
|
|
|
-- Validate thread
|
|
local thread = Threads:get_thread(post.thread_id)
|
|
if not thread then
|
|
return false, { "err_invalid_thread" }
|
|
end
|
|
|
|
thread.save = not thread.save
|
|
thread:update("save")
|
|
|
|
return true
|
|
end
|
|
|
|
-- Override thread
|
|
function process.override_thread(params, board)
|
|
-- Validate post
|
|
local post = Posts:get_post(board.id, params.post_id)
|
|
if not post then
|
|
return false, { "err_invalid_post", { params.post_id } }
|
|
end
|
|
|
|
-- Validate thread
|
|
local thread = Threads:get_thread(post.thread_id)
|
|
if not thread then
|
|
return false, { "err_invalid_thread" }
|
|
end
|
|
|
|
thread.size_override = not thread.size_override
|
|
thread:update("size_override")
|
|
|
|
return true
|
|
end
|
|
|
|
-- Ban user
|
|
function process.ban_user(params, board)
|
|
-- Validate post
|
|
local post = Posts:get_post(board.id, params.post_id)
|
|
if not post then
|
|
return false, { "err_invalid_post", { params.post_id } }
|
|
end
|
|
|
|
params.ip = post.ip
|
|
|
|
-- Convert board name to id if checkbox is set
|
|
if params.board_id then
|
|
params.board_id = board.id
|
|
end
|
|
|
|
-- Ban user
|
|
local _, err = Bans:create_ban(params)
|
|
if err then
|
|
return false, err
|
|
end
|
|
|
|
-- Flag post
|
|
if params.banned then
|
|
post.banned = true
|
|
post:update("banned")
|
|
end
|
|
|
|
return true
|
|
end
|
|
|
|
return process
|