SubscriptionRepository.php 2.89 KB
<?php

namespace FootyRoom\Repositories;

use FootyRoom\Support\AutoMapper;
use Illuminate\Database\Connection;
use FootyRoom\Core\Subscription\Subscription;

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

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

    /**
     * Find subscription by id.
     *
     * @param int $id
     *
     * @return \FootyRoom\Core\Subscription\Subscription|null
     */
    public function findById($id)
    {
        $subDto = $this->mysql

        ->table('subscriptions')
        ->select([
            'id',
            'user_id as userId',
            'subject_id as subjectId',
            'subject_type as subjectType',
            'status',
        ])
        ->where('id', '=', $id)
        ->first();

        if (!$subDto) {
            return null;
        }

        return AutoMapper::map($subDto, Subscription::class);
    }

    /**
     * Find one subscription by specified criteria.
     *
     * @param int $subjectId
     * @param string $subjectType
     * @param int $userId
     *
     * @return \FootyRoom\Core\Subscription\Subscription|null
     */
    public function findOneBy($subjectId, $subjectType, $userId)
    {
        $subDto = $this->mysql

        ->table('subscriptions')
        ->select([
            'id',
            'user_id as userId',
            'subject_id as subjectId',
            'subject_type as subjectType',
            'status',
        ])
        ->where('subject_id', '=', $subjectId)
        ->where('subject_type', '=', $subjectType)
        ->where('user_id', '=', $userId)
        ->first();

        if (!$subDto) {
            return null;
        }

        return AutoMapper::map($subDto, Subscription::class);
    }

    /**
     * Add new subscription to repository.
     *
     * @param \FootyRoom\Core\Subscription\Subscription $sub (description)
     */
    public function create(Subscription $sub)
    {
        $id = $this->mysql

        ->table('subscriptions')
        ->insertGetId([
            'user_id' => $sub->getUserId(),
            'subject_id' => $sub->getSubjectId(),
            'subject_type' => $sub->getSubjectType(),
            'status' => $sub->getStatus(),
        ]);

        AutoMapper::setValue($sub, 'id', $id);
    }

    /**
     * Update existing subscription.
     *
     * @param \FootyRoom\Core\Subscription\Subscription $sub
     */
    public function update(Subscription $sub)
    {
        $this->mysql

        ->table('subscriptions')
        ->where('id', '=', $sub->getId())
        ->update([
            'user_id' => $sub->getUserId(),
            'subject_id' => $sub->getSubjectId(),
            'subject_type' => $sub->getSubjectType(),
            'status' => $sub->getStatus(),
        ]);
    }
}