PluginProbe ʕ •ᴥ•ʔ
FAPI Member / 2.2.30
FAPI Member v2.2.30
2.2.33 2.2.32 trunk 1.9.47 2.1.18 2.2.24 2.2.25 2.2.26 2.2.28 2.2.29 2.2.30 2.2.31
fapi-member / src / Api / V2 / Endpoints / StatisticsController.php
fapi-member / src / Api / V2 / Endpoints Last commit date
ApiConnectionsController.php 3 months ago EmailsController.php 3 months ago MembershipsController.php 3 months ago PagesController.php 3 months ago SectionsController.php 3 months ago StatisticsController.php 3 months ago UsersController.php 3 months ago
StatisticsController.php
181 lines
1 <?php
2
3 namespace FapiMember\Api\V2\Endpoints;
4
5 use FapiMember\Api\V2\ApiController;
6 use FapiMember\Container\Container;
7 use FapiMember\Library\SmartEmailing\Types\BoolType;
8 use FapiMember\Library\SmartEmailing\Types\IntType;
9 use FapiMember\Library\SmartEmailing\Types\StringType;
10 use FapiMember\Model\Enums\Format;
11 use FapiMember\Model\Enums\Types\RequestMethodType;
12 use FapiMember\Repository\MemberActivityRepository;
13 use FapiMember\Repository\MembershipChangeRepository;
14 use FapiMember\Service\ApiService;
15 use FapiMember\Service\StatisticsService;
16 use FapiMember\Utils\DateTimeHelper;
17 use WP_REST_Request;
18
19 class StatisticsController
20 {
21 private MembershipChangeRepository $membershipChangeRepository;
22 private MemberActivityRepository $memberActivityRepository;
23 private StatisticsService $statisticsService;
24 private ApiController $apiController;
25
26 public function __construct()
27 {
28 $this->membershipChangeRepository = Container::get(MembershipChangeRepository::class);
29 $this->memberActivityRepository = Container::get(MemberActivityRepository::class);
30 $this->statisticsService = Container::get(StatisticsService::class);
31 $this->apiService = Container::get(ApiService::class);
32 $this->apiController = Container::get(ApiController::class);
33 }
34
35 public function getMembershipChangesForUser(WP_REST_Request $request): array
36 {
37 $this->apiController->checkRequestMethod($request, RequestMethodType::POST);
38 $body = json_decode($request->get_body(), true);
39
40 $userId = $this->apiController->extractParam($body, 'user_id', IntType::class);
41
42 $changes = $this->membershipChangeRepository->getForUser($userId);
43 $changeData = [];
44
45 foreach ($changes as $change) {
46 if ($change->isValid()) {
47 $changeData[] = $change->toJson();
48 }
49 }
50
51 return $changeData;
52 }
53
54 public function getMemberCountsForPeriod(WP_REST_Request $request): array
55 {
56 $this->apiController->checkRequestMethod($request, RequestMethodType::POST);
57 $body = json_decode($request->get_body(), true);
58
59 $dateFrom = $this->apiController->extractParam($body, 'date_from', StringType::class);
60 $dateTo = $this->apiController->extractParam($body, 'date_to', StringType::class);
61 $groupLevels = $this->apiController->extractParam($body, 'group_levels', BoolType::class);
62 $levelIds = [];
63
64 foreach ($body['level_ids'] as $levelId) {
65 $levelIds[] = (int) $levelId;
66 }
67
68 $dateFrom = DateTimeHelper::createOrNull($dateFrom, Format::DATE);
69 $dateTo = DateTimeHelper::createOrNull($dateTo, Format::DATE);
70
71 return $this->statisticsService->getMemberCountsForPeriod($dateFrom, $dateTo, $levelIds, $groupLevels);
72 }
73
74 public function getMemberCountChangesForPeriod(WP_REST_Request $request): array
75 {
76 $this->apiController->checkRequestMethod($request, RequestMethodType::POST);
77 $body = json_decode($request->get_body(), true);
78
79 $dateFrom = $this->apiController->extractParam($body, 'date_from', StringType::class);
80 $dateTo = $this->apiController->extractParam($body, 'date_to', StringType::class);
81 $groupLevels = $this->apiController->extractParam($body, 'group_levels', BoolType::class);
82 $levelIds = [];
83
84 foreach ($body['level_ids'] as $levelId) {
85 $levelIds[] = (int) $levelId;
86 }
87
88 $dateFrom = DateTimeHelper::createOrNull($dateFrom, Format::DATE);
89 $dateTo = DateTimeHelper::createOrNull($dateTo, Format::DATE);
90
91 return $this->statisticsService->getMemberCountChangesForPeriod($dateFrom, $dateTo, $levelIds, $groupLevels);
92 }
93
94 public function getChurnRate(WP_REST_Request $request): array
95 {
96 $this->apiController->checkRequestMethod($request, RequestMethodType::POST);
97 $body = json_decode($request->get_body(), true);
98
99 $dateFrom = $this->apiController->extractParam($body, 'date_from', StringType::class);
100 $dateTo = $this->apiController->extractParam($body, 'date_to', StringType::class);
101 $groupLevels = $this->apiController->extractParam($body, 'group_levels', BoolType::class);
102 $levelIds = [];
103
104 foreach ($body['level_ids'] as $levelId) {
105 $levelIds[] = (int) $levelId;
106 }
107
108 $dateFrom = DateTimeHelper::createOrNull($dateFrom, Format::DATE);
109 $dateTo = DateTimeHelper::createOrNull($dateTo, Format::DATE);
110
111 return $this->statisticsService->getAcquisitionOrChurnRate($dateFrom, $dateTo, $levelIds, $groupLevels, true);
112 }
113
114 public function getAcquisitionRate(WP_REST_Request $request): array
115 {
116 $this->apiController->checkRequestMethod($request, RequestMethodType::POST);
117 $body = json_decode($request->get_body(), true);
118
119 $dateFrom = $this->apiController->extractParam($body, 'date_from', StringType::class);
120 $dateTo = $this->apiController->extractParam($body, 'date_to', StringType::class);
121 $groupLevels = $this->apiController->extractParam($body, 'group_levels', BoolType::class);
122 $levelIds = [];
123
124 foreach ($body['level_ids'] as $levelId) {
125 $levelIds[] = (int) $levelId;
126 }
127
128 $dateFrom = DateTimeHelper::createOrNull($dateFrom, Format::DATE);
129 $dateTo = DateTimeHelper::createOrNull($dateTo, Format::DATE);
130
131 return $this->statisticsService->getAcquisitionOrChurnRate($dateFrom, $dateTo, $levelIds, $groupLevels, false);
132 }
133
134 public function getActiveCountsForPeriod(WP_REST_Request $request): array
135 {
136 $this->apiController->checkRequestMethod($request, RequestMethodType::POST);
137 $body = json_decode($request->get_body(), true);
138
139 $dateFrom = $this->apiController->extractParam($body, 'date_from', StringType::class);
140 $dateTo = $this->apiController->extractParam($body, 'date_to', StringType::class);
141 $groupLevels = $this->apiController->extractParam($body, 'group_levels', BoolType::class);
142 $levelIds = [];
143
144 foreach ($body['level_ids'] as $levelId) {
145 $levelIds[] = (int) $levelId;
146 }
147
148 $dateFrom = DateTimeHelper::createOrNull($dateFrom, Format::DATE);
149 $dateTo = DateTimeHelper::createOrNull($dateTo, Format::DATE);
150
151 return $this->statisticsService->getActiveCountsForPeriod($dateFrom, $dateTo);
152 }
153
154 public function getLastActivityForUser(WP_REST_Request $request): string|null
155 {
156 $this->apiController->checkRequestMethod($request, RequestMethodType::POST);
157 $body = json_decode($request->get_body(), true);
158
159 $userId = $this->apiController->extractParam($body, 'user_id', IntType::class);
160
161
162 return $this->memberActivityRepository->findLastActivity($userId)
163 ?->format(Format::DATE_TIME);
164 }
165
166 public function getAverageChurnRatePeriods(WP_REST_Request $request): array
167 {
168 $this->apiController->checkRequestMethod($request, RequestMethodType::POST);
169 $body = json_decode($request->get_body(), true);
170 $groupLevels = $this->apiController->extractParam($body, 'group_levels', BoolType::class);
171
172 $levelIds = [];
173
174 foreach ($body['level_ids'] as $levelId) {
175 $levelIds[] = (int) $levelId;
176 }
177
178 return $this->statisticsService->getAverageChurnRatePeriodsForLevels($groupLevels, $levelIds);
179 }
180 }
181