Test Failed
Pull Request — master (#3)
by Бабичев
22:44
created

Store   A

Complexity

Total Complexity 8

Size/Duplication

Total Lines 96
Duplicated Lines 0 %

Test Coverage

Coverage 0%

Importance

Changes 4
Bugs 2 Features 1
Metric Value
eloc 25
c 4
b 2
f 1
dl 0
loc 96
ccs 0
cts 29
cp 0
rs 10
wmc 8

6 Methods

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