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.
zeus/website/backend/app/src/utils/request_processor.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