Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 33
0.00% covered (danger)
0.00%
0 / 1
CRAP
0.00% covered (danger)
0.00%
0 / 1
ExportMembersEndpoint
0.00% covered (danger)
0.00%
0 / 33
0.00% covered (danger)
0.00%
0 / 1
72
0.00% covered (danger)
0.00%
0 / 1
 handle
0.00% covered (danger)
0.00%
0 / 33
0.00% covered (danger)
0.00%
0 / 1
72
1<?php
2
3namespace Olz\Apps\Members\Endpoints;
4
5use Olz\Api\OlzTypedEndpoint;
6use Olz\Entity\Members\Member;
7use PhpTypeScriptApi\HttpError;
8
9/**
10 * @extends OlzTypedEndpoint<
11 *   array{},
12 *   array{status: 'OK'|'ERROR', csvFileId?: ?non-empty-string}
13 * >
14 */
15class ExportMembersEndpoint extends OlzTypedEndpoint {
16    protected function handle(mixed $input): mixed {
17        if (!$this->authUtils()->hasPermission('vorstand')) {
18            throw new HttpError(403, "Kein Zugriff!");
19        }
20        $data_path = $this->envUtils()->getDataPath();
21        $member_repo = $this->entityManager()->getRepository(Member::class);
22
23        $user = $this->authUtils()->getCurrentUser();
24        $this->log()->info("Members export by {$user?->getUsername()}.");
25
26        $updates = [];
27        foreach ($member_repo->findAll() as $member) {
28            $user = $member->getUser();
29            if (!$user) {
30                continue;
31            }
32            $update = json_decode($member->getUpdates() ?? 'null', true);
33            if (!$update) {
34                continue;
35            }
36            $data = json_decode($member->getData(), true);
37            $updates[] = [...$data, ...$update];
38        }
39
40        if (!$updates) {
41            return ['status' => 'OK', 'csvFileId' => null];
42        }
43
44        $csv_file_id = $this->uploadUtils()->getRandomUploadId('.csv');
45        $file_path = "{$data_path}temp/{$csv_file_id}";
46        $fp = fopen($file_path, 'w');
47        $this->generalUtils()->checkNotFalse($fp, "Could not open file {$file_path}");
48        $fields = array_keys($updates[0]);
49        fputcsv($fp, $fields, $separator = ",", $enclosure = "\"", $escape = "\\", $eol = "\n");
50        foreach ($updates as $update) {
51            $data = [];
52            foreach ($fields as $field) {
53                $value = $update[$field] ?? null;
54                $this->generalUtils()->checkNotNull($value, "Update is missing field: {$field}");
55                $data[] = $value;
56            }
57            fputcsv($fp, $data, $separator = ",", $enclosure = "\"", $escape = "\\", $eol = "\n");
58        }
59        fclose($fp);
60        return ['status' => 'OK', 'csvFileId' => $csv_file_id];
61    }
62}