21
loading...
This website collects cookies to deliver better user experience
$user = (new User())->find($id);
$user->first_name = "Valerio";
$user->save();
namespace App\Repositories\Contracts;
use App\Models\Organization;
use Illuminate\Database\Eloquent\Collection;
interface OrganizationRepository
{
public function getActiveSince(\DateTimeInterface $date): Collection;
public function get($id): Organization;
public function create(array $attributes): Organization;
public function update($id, array $attributes): Organization;
public function updateCurrentBillingConsumption($id, $value = null): Organization;
public function addBonusTransactions($id, int $qty): Organization;
public function lock($id): Organization;
public function unlock($id): Organization;
public function delete($id);
}
namespace App\Repositories\Eloquent;
use App\Events\OrganizationLocked;
use App\Events\OrganizationUnlocked;
use App\Models\Organization;
use App\Repositories\Contracts\OrganizationRepository;
use Illuminate\Database\Eloquent\Collection;
class OrganizationEloquentRepository implements OrganizationRepository
{
public function getActiveSince(\DateTimeInterface $date): Collection
{
return Organization::withAndWhereHas('projects', function ($query) use ($date) {
$query->whereNotNull('last_usage_day')
->whereDate('last_usage_day', '>=', $date);
})->get();
}
public function get($id): Organization
{
return Organization::with('cluster', 'projects')->findOrFail($id);
}
public function create(array $attributes): Organization
{
return Organization::create($attributes);
}
public function update($id, array $attributes): Organization
{
$organization = $this->get($id);
if (!empty($attributes)) {
$organization->update($attributes);
}
return $organization;
}
public function updateCurrentBillingConsumption($id, $value = null): Organization
{
$organization = $this->get($id);
// Recalculate consumption on current billing period
return $organization;
}
public function addBonusTransactions($id, int $qty): Organization
{
$organization = $this->get($id);
// ...
return $organization;
}
public function lock($id): Organization
{
$organization = $this->get($id);
$organization->update(['locked_at' => now()]);
event(new OrganizationLocked($organization));
return $organization;
}
public function unlock($id): Organization
{
$organization = $this->get($id);
$organization->update(['locked_at' => null]);
event(new OrganizationUnlocked($organization));
return $organization;
}
public function delete($id)
{
return Organization::destroy($id);
}
}
namespace App\Repositories\Cache;
use App\Models\Organization;
use App\Repositories\Contracts\OrganizationRepository;
use App\Repositories\ModelCacheRepository;
use Illuminate\Contracts\Cache\Repository;
use Illuminate\Database\Eloquent\Collection;
use Illuminate\Database\Eloquent\Model;
class OrganizationCacheRepository extends ModelCacheRepository implements OrganizationRepository
{
/**
* @var OrganizationRepository
*/
protected $repository;
/**
* @var string
*/
protected $model = Organization::class;
/**
* General TTL for cached items.
*/
const CACHE_TTL = 86400; // 1 day
/**
* CacheOrganizationRepository constructor.
*
* @param Repository $cache
* @param OrganizationRepository $repository
*/
public function __construct(Repository $cache, OrganizationRepository $repository)
{
parent::__construct($cache);
$this->repository = $repository;
}
/**
* @inheritDoc
*/
public function updateCache(Model $organization): Model
{
$this->cache->put($organization->getKey(), $organization);
return $organization;
}
public function getActiveSince(\DateTimeInterface $date): Collection
{
return $this->cache->tags('active')->remember($date->format('Y-m-d'), self::CACHE_TTL, function () use ($date) {
return $this->repository->getActiveSince($date);
});
}
public function get($id): Organization
{
return $this->cache->remember($id, self::CACHE_TTL, function () use ($id) {
return $this->repository->get($id);
});
}
public function create(array $attributes): Organization
{
return $this->updateCache(
$this->repository->create($attributes)
);
}
// ... other methods ...
}
$this->app->singleton(OrganizationRepository::class, function () {
return new OrganizationCacheRepository(
$this->app->make(Repository::class),
new OrganizationEloquentRepository()
);
});
class OrganizationController extends Controller
{
/**
* @var OrganizationRepository
*/
protected $repository;
/**
* OrganizationController constructor.
*
* @param OrganizationRepository $repository
*/
public function __construct(OrganizationRepository $repository)
{
$this->repository = $repository;
}
/**
* Display a listing of the resource.
*
* @param Request $request
* @return OrganizationResource
*/
public function index(Request $request)
{
return new OrganizationResource(
$this->repository->get($request->user()->organization_id)
);
}
// ... other methods ...
}
21