Passed
Branch develop (ee4227)
by Бабичев
23:48
created

Store::fresh()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 2
CRAP Score 1

Importance

Changes 0
Metric Value
cc 1
eloc 1
c 0
b 0
f 0
nc 1
nop 0
dl 0
loc 3
ccs 2
cts 2
cp 1
crap 1
rs 10
1
<?php
2
3
namespace Bavix\WalletVacuum;
4
5
use Bavix\Wallet\Interfaces\Mathable;
6
use Bavix\Wallet\Interfaces\Storable;
7
use Bavix\Wallet\Simple\Store as SimpleStore;
8
use Bavix\WalletVacuum\Services\StoreService;
9
use Illuminate\Cache\TaggedCache;
10
use Illuminate\Support\Facades\Cache;
11
12
class Store implements Storable
13
{
14
    /**
15
     * @var array
16
     */
17
    protected $tags;
18
19
    /**
20
     * @var int
21
     */
22
    protected $ttl;
23
24
    /**
25
     * Store constructor.
26
     */
27 3
    public function __construct()
28
    {
29 3
        $this->tags = config('wallet-vacuum.tags', ['wallets', 'vacuum']);
30 3
        $this->ttl = config('wallet-vacuum.ttl', 600);
31 3
    }
32
33
    /**
34
     * Get the balance from the cache.
35
     *
36
     * {@inheritdoc}
37
     */
38 3
    public function getBalance($object)
39
    {
40 3
        $key = app(StoreService::class)
41 3
            ->getCacheKey($object);
42
43 3
        $balance = $this->taggedCache()
44 3
            ->get($key);
45
46 3
        if ($balance === null) {
47 3
            $balance = (new SimpleStore())
48 3
                ->getBalance($object);
49
        }
50
51 3
        return $balance;
52
    }
53
54
    /**
55
     * Increases the wallet balance in the cache array.
56
     *
57
     * {@inheritdoc}
58
     */
59 3
    public function incBalance($object, $amount)
60
    {
61 3
        $key = app(StoreService::class)
62 3
            ->getCacheKey($object);
63
64 3
        if (! $this->taggedCache()->has($key)) {
65 3
            $this->setBalance($object, $this->getBalance($object));
66
        }
67
68 3
        $this->taggedCache()->increment($key, $amount);
69
70
        /**
71
         * When your project grows to high loads and situations arise with a race condition,
72
         * you understand that an extra request to
73
         * the cache will save you from many problems when
74
         * checking the balance.
75
         */
76 3
        return $this->getBalance($object);
77
    }
78
79
    /**
80
     * sets the cache value directly.
81
     *
82
     * {@inheritdoc}
83
     */
84 3
    public function setBalance($object, $amount): bool
85
    {
86 3
        return $this->taggedCache()->put(
87 3
            app(StoreService::class)->getCacheKey($object),
88 3
            app(Mathable::class)->round($amount),
89 3
            $this->ttl
90
        );
91
    }
92
93
    /**
94
     * @return bool
95
     */
96 3
    public function fresh(): bool
97
    {
98 3
        return $this->taggedCache()->flush();
99
    }
100
101
    /**
102
     * @return TaggedCache
103
     */
104 3
    public function taggedCache(): TaggedCache
105
    {
106 3
        return Cache::tags($this->tags);
107
    }
108
}
109