Files
san-reymoros/ext/phpbbstudio/ass/helper/log.php
2020-04-04 18:27:27 +02:00

214 lines
5.9 KiB
PHP

<?php
/**
*
* phpBB Studio - Advanced Shop System. An extension for the phpBB Forum Software package.
*
* @copyright (c) 2019, phpBB Studio, https://www.phpbbstudio.com
* @license GNU General Public License, version 2 (GPL-2.0)
*
*/
namespace phpbbstudio\ass\helper;
use phpbbstudio\ass\entity\item;
/**
* phpBB Studio - Advanced Shop System: Log helper
*/
class log
{
/** @var \phpbb\db\driver\driver_interface */
protected $db;
/** @var \phpbb\user */
protected $user;
/** @var string Categories table */
protected $categories_table;
/** @var string Items table */
protected $items_table;
/** @var string Logs table */
protected $logs_table;
/** @var string Users table */
protected $users_table;
/**
* Constructor.
*
* @param \phpbb\db\driver\driver_interface $db Database object
* @param \phpbb\user $user User object
* @param string $categories_table Categories table
* @param string $items_table Items table
* @param string $logs_table Logs table
* @param string $users_table Users table
* @return void
* @access public
*/
public function __construct(
\phpbb\db\driver\driver_interface $db,
\phpbb\user $user,
$categories_table,
$items_table,
$logs_table,
$users_table
)
{
$this->db = $db;
$this->user = $user;
$this->categories_table = $categories_table;
$this->items_table = $items_table;
$this->logs_table = $logs_table;
$this->users_table = $users_table;
}
/**
* Add a log entry to the shop logs table.
*
* @param item $item The shop item
* @param bool $purchase Whether it is a purchase/gift or an activation
* @param double $points_sum The points sum (cost of the purchase/gift)
* @param int $recipient_id The recipient identifier
* @param double $points_old The user's old points total
* @param double $points_new The user's new points total
* @param int $time The log time
* @return bool Whether or not the log was successfully added
* @access public
*/
public function add(item $item, $purchase, $points_sum = 0.00, $recipient_id = 0, $points_old = 0.00, $points_new = 0.00, $time = 0)
{
$time = $time ? $time : time();
if ($purchase && $points_sum)
{
$points_old = $points_old ? $points_old : $this->user->data['user_points'];
$points_new = $points_new ? $points_new : $points_old - $points_sum;
}
$data = [
'log_ip' => (string) $this->user->ip,
'log_time' => (int) $time,
'points_old' => (double) $points_old,
'points_sum' => (double) $points_sum,
'points_new' => (double) $points_new,
'item_purchase' => (bool) $purchase,
'item_id' => (int) $item->get_id(),
'category_id' => (int) $item->get_category(),
'user_id' => (int) $this->user->data['user_id'],
'recipient_id' => (int) $recipient_id,
];
$sql = 'INSERT INTO ' . $this->logs_table . ' ' . $this->db->sql_build_array('INSERT', $data);
$this->db->sql_query($sql);
return (bool) $this->db->sql_affectedrows();
}
/**
* Get the shop log entries for a specific user.
*
* @param string $sql_where The SQL WHERE statement
* @param string $sql_order The SQL ORDER BY statement
* @param string $sql_dir The SQL ORDER BY direction
* @param int $limit The amount of entries to return
* @param int $start The offset from where to return entries
* @param int $user_id The user identifier
* @return array The shop log entries
* @access public
*/
public function get_user_logs($sql_where, $sql_order, $sql_dir, $limit, $start, $user_id = 0)
{
if ($user_id)
{
$user_where = '(l.user_id = ' . (int) $user_id . ' OR l.recipient_id = ' . (int) $user_id . ')';
$sql_where = $sql_where ? $user_where . ' AND ' . $sql_where : $user_where;
}
$sql_array = [
'SELECT' => 'l.*, i.item_title, c.category_title,
u.username, u.user_colour,
r.username as recipient_name, r.user_colour as recipient_colour',
'FROM' => [$this->logs_table => 'l'],
'LEFT_JOIN' => [
[
'FROM' => [$this->categories_table => 'c'],
'ON' => 'l.category_id = c.category_id',
],
[
'FROM' => [$this->items_table => 'i'],
'ON' => 'l.item_id = i.item_id',
],
[
'FROM' => [$this->users_table => 'r'],
'ON' => 'l.recipient_id = r.user_id',
],
[
'FROM' => [$this->users_table => 'u'],
'ON' => 'l.user_id = u.user_id',
],
],
'WHERE' => $sql_where,
'ORDER_BY' => "{$sql_order} {$sql_dir}",
];
$sql = $this->db->sql_build_query('SELECT', $sql_array);
$result = $this->db->sql_query_limit($sql, $limit, $start);
$rowset = $this->db->sql_fetchrowset($result);
$this->db->sql_freeresult($result);
return (array) $rowset;
}
/**
* Get the shop log entries count for a specific user.
*
* @param string $sql_where The SQL WHERE statement
* @param int $user_id The user identifier
* @return int The shop log entries count
* @access public
*/
public function get_user_logs_count($sql_where, $user_id = 0)
{
if ($user_id)
{
$user_where = 'l.user_id = ' . (int) $user_id;
$sql_where = $sql_where ? $user_where . ' AND ' . $sql_where : $user_where;
}
$sql_array = [
'SELECT' => 'COUNT(l.log_id) as count',
'FROM' => [$this->logs_table => 'l'],
'WHERE' => $sql_where,
];
$sql = $this->db->sql_build_query('SELECT', $sql_array);
$result = $this->db->sql_query($sql);
$count = $this->db->sql_fetchfield('count');
$this->db->sql_freeresult($result);
return (int) $count;
}
/**
* Delete shop log entries.
*
* @param bool $all Delete all log entries
* @param array $ids The log entry identifiers
* @return bool Whether or not any entries were deleted
* @access public
*/
public function delete($all, array $ids)
{
$sql = 'DELETE FROM ' . $this->logs_table
. (!$all ? ' WHERE ' . $this->db->sql_in_set('log_id', $ids) : '');
$this->db->sql_query($sql);
return (bool) $this->db->sql_affectedrows();
}
}