• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

LeTraceurSnorkLibrary / MessSaga / 24343386752

13 Apr 2026 12:29PM UTC coverage: 36.253% (+5.7%) from 30.539%
24343386752

Pull #18

github

web-flow
Merge 354cc3813 into 572b42cbd
Pull Request #18: feat: admin panel

130 of 143 new or added lines in 8 files covered. (90.91%)

596 of 1644 relevant lines covered (36.25%)

0.77 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

96.55
/app/Support/Admin/Statistics/UserMessageCountAggregates.php
1
<?php
2

3
declare(strict_types=1);
4

5
namespace App\Support\Admin\Statistics;
6

7
use App\Models\TelegramMessage;
8
use App\Models\User;
9
use App\Models\ViberMessage;
10
use App\Models\WhatsAppMessage;
11
use Illuminate\Database\Eloquent\Builder;
12
use Illuminate\Database\Eloquent\Model;
13

14
/**
15
 * Считает число импортированных сообщений на пользователя по всем каналам.
16
 *
17
 * Новый мессенджер: добавьте модель сообщения в {@see messageModelClasses()}.
18
 */
19
final class UserMessageCountAggregates
20
{
21
    /**
22
     * Список моделей,
23
     *
24
     * @return list<class-string<Model>>
25
     */
26
    public static function messageModelClasses(): array
27
    {
28
        return [
3✔
29
            TelegramMessage::class,
3✔
30
            WhatsAppMessage::class,
3✔
31
            ViberMessage::class,
3✔
32
        ];
3✔
33
    }
34

35
    /**
36
     * Добавляет к запросу по `users` подзапросы по каждому каналу и поле `messages_count`.
37
     *
38
     * @param Builder<User> $usersQuery
39
     *
40
     * @return Builder<User>
41
     */
42
    public static function withTotalMessagesCount(Builder $usersQuery): Builder
43
    {
44
        $usersQuery->select('users.*');
2✔
45

46
        $sumParts = [];
2✔
47
        foreach (array_values(self::messageModelClasses()) as $index => $modelClass) {
2✔
48
            /**
49
             * @var Model $model
50
             */
51
            $model     = new $modelClass();
2✔
52
            $table     = $model->getTable();
2✔
53
            $joinAlias = 'imported_msg_' . $index;
2✔
54

55
            $sub = $modelClass::query()
2✔
56
                ->selectRaw('messenger_accounts.user_id AS user_id')
2✔
57
                ->selectRaw('COUNT(*) AS cnt')
2✔
58
                ->join('conversations', 'conversations.id', '=', $table . '.conversation_id')
2✔
59
                ->join(
2✔
60
                    'messenger_accounts',
2✔
61
                    'messenger_accounts.id',
2✔
62
                    '=',
2✔
63
                    'conversations.messenger_account_id'
2✔
64
                )
2✔
65
                ->groupBy('messenger_accounts.user_id');
2✔
66

67
            $usersQuery->leftJoinSub($sub, $joinAlias, function ($join) use ($joinAlias): void {
2✔
68
                $join->on($joinAlias . '.user_id', '=', 'users.id');
2✔
69
            });
2✔
70

71
            $sumParts[] = 'COALESCE(' . $joinAlias . '.cnt, 0)';
2✔
72
        }
73

74
        if ($sumParts === []) {
2✔
NEW
75
            return $usersQuery->selectRaw('0 AS messages_count');
×
76
        }
77

78
        return $usersQuery->selectRaw('(' . implode(' + ', $sumParts) . ') AS messages_count');
2✔
79
    }
80
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc