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

LeTraceurSnorkLibrary / MessSaga / 24340325874

13 Apr 2026 11:12AM UTC coverage: 27.903% (-2.6%) from 30.539%
24340325874

Pull #18

github

web-flow
Merge 7a189b893 into 572b42cbd
Pull Request #18: feat: admin panel

0 of 144 new or added lines in 8 files covered. (0.0%)

1 existing line in 1 file now uncovered.

459 of 1645 relevant lines covered (27.9%)

0.65 hits per line

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

0.0
/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
    {
NEW
28
        return [
×
NEW
29
            TelegramMessage::class,
×
NEW
30
            WhatsAppMessage::class,
×
NEW
31
            ViberMessage::class,
×
NEW
32
        ];
×
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
    {
NEW
44
        $usersQuery->select('users.*');
×
45

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

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

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

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

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

NEW
78
        return $usersQuery->selectRaw('(' . implode(' + ', $sumParts) . ') AS messages_count');
×
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