Completed
Pull Request — master (#74)
by
unknown
01:33
created

Mailbox   A

Complexity

Total Complexity 21

Size/Duplication

Total Lines 107
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 6

Importance

Changes 0
Metric Value
wmc 21
lcom 1
cbo 6
dl 0
loc 107
rs 10
c 0
b 0
f 0

14 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 6 2
A from() 0 4 1
A to() 0 4 1
A cc() 0 4 1
A bcc() 0 4 1
A subject() 0 4 1
A fallback() 0 4 1
A addRoute() 0 8 1
A createRoute() 0 5 1
A callMailboxes() 0 19 6
A shouldStoreInboundEmails() 0 4 1
A shouldStoreAllInboundEmails() 0 4 2
A storeEmail() 0 4 1
A __call() 0 6 1
1
<?php
2
3
namespace BeyondCode\Mailbox\Routing;
4
5
use BeyondCode\Mailbox\InboundEmail;
6
use BeyondCode\Mailbox\MailboxManager;
7
use Illuminate\Container\Container;
8
use Illuminate\Support\Collection;
9
use Illuminate\Support\Traits\ForwardsCalls;
10
11
class Mailbox
12
{
13
    use ForwardsCalls;
14
15
    /** @var RouteCollection */
16
    protected $routes;
17
18
    /** @var Route */
19
    protected $fallbackRoute;
20
21
    /** @var Container */
22
    protected $container;
23
24
    public function __construct(Container $container = null)
25
    {
26
        $this->container = $container ?: new Container;
27
28
        $this->routes = new RouteCollection;
29
    }
30
31
    public function from(string $pattern, $action): Route
32
    {
33
        return $this->addRoute(Route::FROM, $pattern, $action);
34
    }
35
36
    public function to(string $pattern, $action): Route
37
    {
38
        return $this->addRoute(Route::TO, $pattern, $action);
39
    }
40
41
    public function cc(string $pattern, $action): Route
42
    {
43
        return $this->addRoute(Route::CC, $pattern, $action);
44
    }
45
46
    public function bcc(string $pattern, $action): Route
47
    {
48
        return $this->addRoute(Route::BCC, $pattern, $action);
49
    }
50
51
    public function subject(string $pattern, $action): Route
52
    {
53
        return $this->addRoute(Route::SUBJECT, $pattern, $action);
54
    }
55
56
    public function fallback($action)
57
    {
58
        $this->fallbackRoute = $this->createRoute(Route::FALLBACK, '', $action);
59
    }
60
61
    protected function addRoute(string $matchBy, string $pattern, $action): Route
62
    {
63
        $route = $this->createRoute($matchBy, $pattern, $action);
64
65
        $this->routes->add($route);
66
67
        return $route;
68
    }
69
70
    protected function createRoute(string $subject, string $pattern, $action): Route
71
    {
72
        return (new Route($subject, $pattern, $action))
73
            ->setContainer($this->container);
74
    }
75
76
    public function callMailboxes(InboundEmail $email)
77
    {
78
        if (! $email->isValid()) {
79
            return;
80
        }
81
82
        $matchedRoutes = $this->routes->match($email)->map(function (Route $route) use ($email) {
83
            $route->run($email);
84
        });
85
86
        if ($matchedRoutes->isEmpty() && $this->fallbackRoute) {
87
            $matchedRoutes[] = $this->fallbackRoute;
88
            $this->fallbackRoute->run($email);
89
        }
90
91
        if ($this->shouldStoreInboundEmails() && $this->shouldStoreAllInboundEmails($matchedRoutes)) {
92
            $this->storeEmail($email);
93
        }
94
    }
95
96
    protected function shouldStoreInboundEmails(): bool
97
    {
98
        return config('mailbox.store_incoming_emails_for_days') > 0;
99
    }
100
101
    protected function shouldStoreAllInboundEmails(Collection $matchedRoutes): bool
102
    {
103
        return $matchedRoutes->isNotEmpty() ? true : ! config('mailbox.only_store_matching_emails');
104
    }
105
106
    protected function storeEmail(InboundEmail $email)
107
    {
108
        $email->save();
109
    }
110
111
    public function __call($method, $parameters)
112
    {
113
        return $this->forwardCallTo(
114
            $this->container->make(MailboxManager::class), $method, $parameters
115
        );
116
    }
117
}
118