Issues (214)

src/Service/Guild/MemberService.php (2 issues)

1
<?php
2
3
namespace Siak\Tontine\Service\Guild;
4
5
use Illuminate\Database\Eloquent\Builder;
6
use Illuminate\Database\Eloquent\Relations\Relation;
7
use Illuminate\Support\Collection;
8
use Siak\Tontine\Exception\MessageException;
9
use Siak\Tontine\Model\Guild;
10
use Siak\Tontine\Model\MemberDef;
11
use Siak\Tontine\Service\TenantService;
12
use Siak\Tontine\Validation\SearchSanitizer;
13
14
class MemberService
15
{
16
    /**
17
     * @param TenantService $tenantService
18
     * @param SearchSanitizer $searchSanitizer
19
     */
20
    public function __construct(private TenantService $tenantService,
21
        private SearchSanitizer $searchSanitizer)
22
    {}
23
24
    /**
25
     * @param Guild $guild
26
     * @param string $search
27
     * @param bool|null $filter
28
     *
29
     * @return Builder|Relation
30
     */
31
    private function getQuery(Guild $guild, string $search, ?bool $filter): Builder|Relation
32
    {
33
        return $guild->members()
34
            ->when($filter !== null, fn(Builder $query) => $query->active($filter))
35
            ->search($this->searchSanitizer->sanitize($search));
36
    }
37
38
    /**
39
     * Get a paginated list of members.
40
     *
41
     * @param Guild $guild
42
     * @param string $search
43
     * @param bool|null $filter
44
     * @param int $page
45
     *
46
     * @return Collection
47
     */
48
    public function getMembers(Guild $guild, string $search = '',
49
        ?bool $filter = null, int $page = 0): Collection
50
    {
51
        return $this->getQuery($guild, $search, $filter)
52
            ->page($page, $this->tenantService->getLimit())
53
            ->orderBy('name', 'asc')
54
            ->get();
55
    }
56
57
    /**
58
     * Get the number of members.
59
     *
60
     * @param Guild $guild
61
     * @param string $search
62
     * @param bool|null $filter
63
     *
64
     * @return int
65
     */
66
    public function getMemberCount(Guild $guild, string $search = '', ?bool $filter = null): int
67
    {
68
        return $this->getQuery($guild, $search, $filter)->count();
0 ignored issues
show
Bug Best Practice introduced by
The expression return $this->getQuery($...arch, $filter)->count() could return the type Illuminate\Database\Eloq...uent\Relations\Relation which is incompatible with the type-hinted return integer. Consider adding an additional type-check to rule them out.
Loading history...
69
    }
70
71
    /**
72
     * Get a single member.
73
     *
74
     * @param Guild $guild
75
     * @param int $memberId
76
     *
77
     * @return MemberDef|null
78
     */
79
    public function getMember(Guild $guild, int $memberId): ?MemberDef
80
    {
81
        return $this->getQuery($guild, '', null)->find($memberId);
82
    }
83
84
    /**
85
     * Add a new member.
86
     *
87
     * @param Guild $guild
88
     * @param array $values
89
     *
90
     * @return bool
91
     */
92
    public function createMember(Guild $guild, array $values): bool
93
    {
94
        $guild->members()->create($values);
95
        return true;
96
    }
97
98
    /**
99
     * Add new members.
100
     *
101
     * @param Guild $guild
102
     * @param array $values
103
     *
104
     * @return bool
105
     */
106
    public function createMembers(Guild $guild, array $values): bool
107
    {
108
        $guild->members()->createMany($values);
109
        return true;
110
    }
111
112
    /**
113
     * Update a member.
114
     *
115
     * @param MemberDef $member
116
     * @param array $values    The member data
117
     *
118
     * @return bool
119
     */
120
    public function updateMember(MemberDef $member, array $values): bool
121
    {
122
        return $member->update($values);
123
    }
124
125
    /**
126
     * Toggle a member.
127
     *
128
     * @param Guild $guild
129
     * @param MemberDef $member
130
     *
131
     * @return void
132
     */
133
    public function toggleMember(MemberDef $member)
134
    {
135
        $member->update(['active' => !$member->active]);
136
    }
137
138
    /**
139
     * Delete a member.
140
     *
141
     * @param MemberDef $member
142
     *
143
     * @return void
144
     */
145
    public function deleteMember(MemberDef $member)
146
    {
147
        try
148
        {
149
            $member->delete();
150
        }
151
        catch(Exception)
0 ignored issues
show
The type Siak\Tontine\Service\Guild\Exception was not found. Did you mean Exception? If so, make sure to prefix the type with \.
Loading history...
152
        {
153
            throw new MessageException(trans('tontine.member.errors.cannot_delete'));
154
        }
155
    }
156
157
    /**
158
     * @param Guild $guild
159
     * @param int $count
160
     *
161
     * @return Collection
162
     */
163
    public function getFakeMembers(Guild $guild, int $count): Collection
164
    {
165
        return MemberDef::factory()->count($count)->make([
166
            'guild_id' => $guild,
167
        ]);
168
    }
169
}
170