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.

152 lines
3.1 KiB
Lua

local Model = require("lapis.db.model").Model
local Bans = Model:extend("bans", {
relations = {
{ "board", belongs_to="Boards" },
}
})
Bans.valid_record = {
{ "board_id", is_integer=true },
{ "ip", max_length=255, exists=true },
{ "time", exists=true }
}
--- Create a ban
-- @tparam table params Ban parameters
-- @treturn boolean success
-- @treturn string err
function Bans:new(params)
local ban = self:create(params)
return ban and ban or nil, { "err_create_ban", { params.ip } }
end
--- Modify a ban
-- @tparam table params Board parameters
-- @treturn boolean success
-- @treturn string error
function Bans:modify(params)
local ban = self:get(params.id)
if not ban then
return nil, { "err_create_board", { params.name, params.title } } -- FIXME: wrong error message
end
local success, err = ban:update(params)
return success and ban or nil, "FIXME: " .. tostring(err)
end
--- Delete a ban
-- @tparam number id Ban's ID
-- @treturn boolean success
-- @treturn string err
function Bans:delete(id)
local ban = self:get(id)
if not ban then
return nil, "FIXME"
end
local success = ban:delete()
return success and ban or nil, "FIXME"
end
--- Get all bans
-- @treturn table users List of bans
function Bans:get_all()
local bans = self:select("order by board_id asc, time + duration desc, ip asc")
for i=#bans, 1, -1 do
local ban = bans[i]
if not self:validate(ban) then
table.remove(bans, i)
end
end
return bans
end
--- Get board bans
-- @treturn table users List of bans
function Bans:get_board(board_id)
local bans = self:select("where board_id=? order by board_id asc, time + duration desc, ip asc", board_id)
for i=#bans, 1, -1 do
local ban = bans[i]
if not self:validate(ban) then
table.remove(bans, i)
end
end
return bans
end
--- Get ban data
-- @tparam number id Ban's ID
-- @treturn table ban
function Bans:get(id)
local ban = self:find(id)
if not ban then
return nil, "FIXME: ALART!"
end
local valid, err = self:validate(ban)
if not valid then
return nil, err
end
return ban
end
--- Get bans for specific ip
-- @tparam string ip IP address
-- @treturn table ban
function Bans:get_ip(ip)
local bans = self:select("where ip=?", ip)
for i=#bans, 1, -1 do
local ban = bans[i]
if not self:validate(ban) then
table.remove(bans, i)
end
end
return bans
end
--- Validate ban
-- @tparam table ban Ban data
-- @treturn boolean valid
function Bans:validate(ban)
local time = os.time()
local finish = ban.time + ban.duration
if time >= finish then
self:delete(ban)
return nil, "FIXME: ban has exired"
end
return true
end
--- Format ban paramaters for DB insertion
-- @tparam table params Ban parameters
function Bans.format_to_db(_, params)
-- Convert duration from days to seconds
params.duration = (tonumber(params.duration) or 0) * 86400
if not params.board_id then
params.board_id = 0
end
end
--- Format ban parameters for User consumption
-- @tparam table params Ban parameters
function Bans.format_from_db(_, params)
-- Convert duration from seconds to days
params.duration = tonumber(params.duration) / 86400
if params.board_id == 0 then
params.board_id = nil
end
end
return Bans