BanRepository.php 2.74 KB
<?php

namespace FootyRoom\Repositories;

use Illuminate\Database\Connection;

class BanRepository
{
    /**
     * @var \Illuminate\Database\Connection
     */
    protected $mysql;

    /**
     * Constructor.
     *
     * @param \Illuminate\Database\Connection $mysql
     */
    public function __construct(Connection $mysql)
    {
        $this->mysql = $mysql;
    }

    /**
     * Finds active ban by specified parameters.
     *
     * @param  string $entityType
     * @param  string|int $entityId
     * @param  string $type
     *
     * @return object
     */
    public function findActive($entityType, $entityId, $type)
    {
        $data = $this->mysql

        ->table('bans')
        ->select('*')
        ->where('entity_type', '=', $entityType)
        ->where('entity_id', '=', $entityId)
        ->where('type', '=', $type)
        ->whereRaw('DATE_ADD(created_at, INTERVAL `duration` SECOND) > NOW()')
        ->orderBy('id', 'desc')
        ->first();

        if (!$data) {
            return null;
        }

        $ban = new \StdClass();

        $ban->id            = $data->id;
        $ban->entityType    = $data->entity_type;
        $ban->entityId      = $data->entity_id;
        $ban->type          = $data->type;
        $ban->duration      = $data->duration;
        $ban->createdAt     = $data->created_at;
        $ban->createdBy     = $data->created_by;

        return $ban;
    }

    /**
     * Creates new ban.
     *
     * @param  string $entityType Something like 'user_id' or 'cookieId'
     * @param  string|int $entityId
     * @param  string $type
     * @param  int $duration
     * @param  int $createdBy
     *
     * @return bool
     */
    public function create($entityType, $entityId, $type, $duration, $createdBy)
    {
        return $this->mysql

        ->table('bans')
        ->insert([
            'entity_type' => $entityType,
            'entity_id' => $entityId,
            'type' => $type,
            'duration' => $duration,
            'created_at' => $this->mysql->raw('NOW()'),
            'created_by' => $createdBy,
        ]);
    }

    /**
     * Resets ban duration to new value starting from now.
     *
     * @param  int $id
     * @param  int $duration
     *
     * @return bool
     */
    public function resetDuration($id, $duration)
    {
        return $this->mysql

        ->table('bans')
        ->where('id', '=', $id)
        ->update([
            'duration' => $duration,
            'created_at' => $this->mysql->raw('NOW()'),
        ]);
    }

    /**
     * Deletes ban by id.
     *
     * @param  int $id
     *
     * @return bool
     */
    public static function delete($id)
    {
        return $this->mysql

        ->table('bans')
        ->where('id', '=', $id)
        ->delete();
    }
}