getBody(); $json = \Safe\json_decode($body->getContents()); $messages = []; foreach ($json->mailboxes as $mailbox_id) { $messages = array_merge($messages, $repository->fetchByMailbox($mailbox_id) ?? []); } $messages = array_map(function(\ProVM\Emails\Model\Message $message) { return $message->toArray(); }, $messages); return $this->withJson($response, ['messages' => $messages, 'total' => count($messages)]); } public function valid(ServerRequestInterface $request, ResponseInterface $response, Message $repository): ResponseInterface { $body = $request->getBody(); $json = \Safe\json_decode($body->getContents()); $messages = []; foreach ($json->mailboxes as $mailbox_id) { try { $messages = array_merge($messages, $repository->fetchByMailbox($mailbox_id) ?? []); } catch (BlankResult $e) { } } $messages = array_values(array_map(function(\ProVM\Emails\Model\Message $message) { return $message->toArray(); }, array_filter($messages, function(\ProVM\Emails\Model\Message $message) { return $message->hasValidAttachments(); }))); return $this->withJson($response, ['messages' => $messages, 'total' => count($messages)]); } public function grab(ServerRequestInterface $request, ResponseInterface $response, Model $factory, Service $service): ResponseInterface { $body = $request->getBody(); $json = \Safe\json_decode($body->getContents()); $message_count = 0; foreach ($json->mailboxes as $mailbox_name) { $message_count += $this->grabFromMailbox($factory, $service, $mailbox_name); } return $this->withJson($response, compact('message_count')); } protected function grabFromMailbox(Model $factory, Service $service, string $mailbox_name): int { $mailbox = $factory->find(\ProVM\Emails\Model\Mailbox::class)->fetchByName($mailbox_name); $stored = array_reduce($mailbox->getStates(), function($count, Mailbox $state) { return $count + $state->getCount(); }) ?? 0; $remote_mailbox = $service->get($mailbox->getName()); $total = $remote_mailbox->count(); if ($stored >= $total) { return 0; } $added = 0; $uids = []; $amount = $total - $stored; $messages = $service->getMessages($remote_mailbox, $stored, $amount); foreach ($messages as $j => $m) { if ($this->addMessage($factory->find(\ProVM\Emails\Model\Message::class), $service, $mailbox, $m, $j + 1)) { $uids []= $m->getId(); $added ++; } } if ($added > 0 ) { $data = [ 'mailbox_id' => $mailbox->getId(), 'date_time' => (new DateTimeImmutable('now'))->format('Y-m-d H:i:s'), 'count' => $added, 'uids' => serialize($uids) ]; $state = $factory->find(\ProVM\Emails\Model\State\Mailbox::class)->create($data); $factory->find(\ProVM\Emails\Model\State\Mailbox::class)->save($state); } return $added; } protected function addMessage(Message $repository, Service $service, \ProVM\Emails\Model\Mailbox $mailbox, MessageInterface $remote_message, int $position): bool { $data = [ 'mailbox_id' => $mailbox->getId(), 'position' => $position, 'uid' => $remote_message->getId(), 'subject' => $remote_message->getSubject() ?? '', 'from' => $remote_message->getFrom()->getFullAddress(), 'date_time' => $remote_message->getDate()->format('Y-m-d H:i:s') ]; $message = $repository->create($data); if ($message->getId() === 0) { if ($remote_message->hasAttachments()) { $message->doesHaveAttachments(); } if ($service->validAttachments($remote_message)) { $message->doesHaveValidAttachments(); } $repository->save($message); return true; } return false; } }