Get account local sqlite AddressBook working (but still inactive)

This commit is contained in:
the-djmaze 2023-02-09 12:54:36 +01:00
parent 8d6eb96c8f
commit e364b6286f
3 changed files with 44 additions and 26 deletions

View file

@ -133,13 +133,17 @@ class KolabAddressBook implements \RainLoop\Providers\AddressBook\AddressBookInt
$oParams->iLimit = 999; // Is the max $oParams->iLimit = 999; // Is the max
$oMessageList = $this->MailClient()->MessageList($oParams); $oMessageList = $this->MailClient()->MessageList($oParams);
foreach ($oMessageList as $oMessage) { foreach ($oMessageList as $oMessage) {
try {
if ($rCsv) { if ($rCsv) {
$oContact = $this->MessageAsContact($oMessage); $oContact = $this->MessageAsContact($oMessage);
\RainLoop\Providers\AddressBook\Utils::VCardToCsv($rCsv, $oContact, $bCsvHeader); \RainLoop\Providers\AddressBook\Utils::VCardToCsv($rCsv, $oContact->vCard, $bCsvHeader);
$bCsvHeader = false; $bCsvHeader = false;
} else if ($xCard = $this->fetchXCardFromMessage($oMessage)) { } else if ($xCard = $this->fetchXCardFromMessage($oMessage)) {
echo $xCard->serialize(); echo $xCard->serialize();
} }
} catch (\Throwable $oExc) {
$this->oLogger && $this->oLogger->WriteException($oExc);
}
} }
} }
catch (\Throwable $oException) catch (\Throwable $oException)

View file

@ -52,11 +52,17 @@ class PdoAddressBook
$sDsn = 'sqlite:' . APP_PRIVATE_DATA . 'AddressBook.sqlite'; $sDsn = 'sqlite:' . APP_PRIVATE_DATA . 'AddressBook.sqlite';
/* /*
// TODO: use local db? // TODO: use local db?
$oAccount = \RainLoop\Api::Actions()->getMainAccountFromToken(false);
if ($oAccount) {
$homedir = \RainLoop\Api::Actions()->StorageProvider()->GenerateFilePath( $homedir = \RainLoop\Api::Actions()->StorageProvider()->GenerateFilePath(
$oAccount, $oAccount,
\RainLoop\Providers\Storage\Enumerations\StorageType::ROOT \RainLoop\Providers\Storage\Enumerations\StorageType::ROOT
); );
$sDsn = 'sqlite:' . $homedir . '/AddressBook.sqlite'; if (!\is_file($homedir . 'AddressBook.sqlite') && \is_file(APP_PRIVATE_DATA . '/AddressBook.sqlite')) {
\copy(APP_PRIVATE_DATA . '/AddressBook.sqlite', $homedir . 'AddressBook.sqlite');
}
$sDsn = 'sqlite:' . $homedir . 'AddressBook.sqlite';
}
*/ */
} else { } else {
$sDsn = \trim($oConfig->Get('contacts', 'pdo_dsn', '')); $sDsn = \trim($oConfig->Get('contacts', 'pdo_dsn', ''));
@ -308,6 +314,7 @@ class PdoAddressBook
public function Export(string $sType = 'vcf') : bool public function Export(string $sType = 'vcf') : bool
{ {
if (1 > $this->iUserID) { if (1 > $this->iUserID) {
\SnappyMail\Log::warning('PdoAddressBook', 'Export() invalid $iUserID');
return false; return false;
} }
@ -317,17 +324,22 @@ class PdoAddressBook
$aDatabaseSyncData = $this->prepareDatabaseSyncData(); $aDatabaseSyncData = $this->prepareDatabaseSyncData();
if (\count($aDatabaseSyncData)) { if (\count($aDatabaseSyncData)) {
foreach ($aDatabaseSyncData as $mData) { foreach ($aDatabaseSyncData as $mData) {
if ($mData && isset($mData['id_contact'], $mData['deleted']) && !$mData['deleted']) { try {
// if ($mData && isset($mData['id_contact'], $mData['deleted']) && !$mData['deleted']) {
if ($mData && !empty($mData['id_contact'])) {
$oContact = $this->GetContactByID($mData['id_contact']); $oContact = $this->GetContactByID($mData['id_contact']);
if ($oContact) { if ($oContact) {
if ($rCsv) { if ($rCsv) {
Utils::VCardToCsv($rCsv, $oContact, $bCsvHeader); Utils::VCardToCsv($rCsv, $oContact->vCard, $bCsvHeader);
$bCsvHeader = false; $bCsvHeader = false;
} else { } else {
echo $oContact->vCard->serialize(); echo $oContact->vCard->serialize();
} }
} }
} }
} catch (\Throwable $oExc) {
$this->oLogger && $this->oLogger->WriteException($oExc);
}
} }
} }
@ -337,6 +349,7 @@ class PdoAddressBook
public function ContactSave(Contact $oContact) : bool public function ContactSave(Contact $oContact) : bool
{ {
if (1 > $this->iUserID) { if (1 > $this->iUserID) {
\SnappyMail\Log::warning('PdoAddressBook', 'ContactSave() invalid $iUserID');
return false; return false;
} }
@ -436,6 +449,7 @@ class PdoAddressBook
public function DeleteContacts(array $aContactIds) : bool public function DeleteContacts(array $aContactIds) : bool
{ {
if (1 > $this->iUserID) { if (1 > $this->iUserID) {
\SnappyMail\Log::warning('PdoAddressBook', 'DeleteContacts() invalid $iUserID');
return false; return false;
} }
@ -744,7 +758,7 @@ class PdoAddressBook
p.prop_value as jcard p.prop_value as jcard
FROM rainloop_ab_contacts AS c FROM rainloop_ab_contacts AS c
LEFT JOIN rainloop_ab_properties AS p ON (p.id_contact = c.id_contact AND p.prop_type = :prop_type) LEFT JOIN rainloop_ab_properties AS p ON (p.id_contact = c.id_contact AND p.prop_type = :prop_type)
WHERE c.deleted = 0 AND c.id_user = :id_user'; WHERE c.id_user = :id_user AND c.deleted = 0';
$aParams = array( $aParams = array(
':id_user' => array($this->iUserID, \PDO::PARAM_INT), ':id_user' => array($this->iUserID, \PDO::PARAM_INT),

View file

@ -2,6 +2,8 @@
namespace RainLoop\Providers\AddressBook; namespace RainLoop\Providers\AddressBook;
use Sabre\VObject\Component\VCard;
class Utils class Utils
{ {
private static $aMap = array( private static $aMap = array(
@ -98,7 +100,7 @@ class Utils
foreach ($aHeaders as $iIndex => $sItemName) { foreach ($aHeaders as $iIndex => $sItemName) {
$sItemName = \MailSo\Base\Utils::Utf8Clear($sItemName); $sItemName = \MailSo\Base\Utils::Utf8Clear($sItemName);
$sItemName = \strtoupper(\trim(\preg_replace('/[\s\-]+/', '', $sItemName))); $sItemName = \strtoupper(\trim(\preg_replace('/[\s\-]+/', '', $sItemName)));
if (!\array_key_exists($sItemName, \Sabre\VObject\Component\VCard::$propertyMap)) { if (!\array_key_exists($sItemName, VCard::$propertyMap)) {
$sItemName = \strtolower($sItemName); $sItemName = \strtolower($sItemName);
$sItemName = isset(static::$aMap[$sItemName]) ? static::$aMap[$sItemName] : null; $sItemName = isset(static::$aMap[$sItemName]) ? static::$aMap[$sItemName] : null;
} }
@ -108,7 +110,7 @@ class Utils
while (false !== ($mRow = \fgetcsv($rFile, 5000, $sDelimiter, '"'))) { while (false !== ($mRow = \fgetcsv($rFile, 5000, $sDelimiter, '"'))) {
\MailSo\Base\Utils::ResetTimeLimit(); \MailSo\Base\Utils::ResetTimeLimit();
$iCount = 0; $iCount = 0;
$oVCard = new \Sabre\VObject\Component\VCard; $oVCard = new VCard;
$aName = ['','','','','']; $aName = ['','','','',''];
foreach ($mRow as $iIndex => $sItemValue) { foreach ($mRow as $iIndex => $sItemValue) {
$sItemName = $aHeaders[$iIndex]; $sItemName = $aHeaders[$iIndex];
@ -138,7 +140,7 @@ class Utils
} }
} }
public static function VCardToCsv($stream, Classes\Contact $oContact, bool $bWithHeader = false)/* : int|false*/ public static function VCardToCsv($stream, VCard $oVCard, bool $bWithHeader = false)/* : int|false*/
{ {
$aData = array(); $aData = array();
if ($bWithHeader) { if ($bWithHeader) {
@ -153,8 +155,6 @@ class Utils
)); ));
} }
$oVCard = $oContact->vCard;
$aName = isset($oVCard->N) ? $oVCard->N->getParts() : ['','','','','']; $aName = isset($oVCard->N) ? $oVCard->N->getParts() : ['','','','',''];
$adrHome = $oVCard->getByType('ADR', 'HOME'); $adrHome = $oVCard->getByType('ADR', 'HOME');
@ -203,7 +203,7 @@ class Utils
$oVCardSplitter = new \Sabre\VObject\Splitter\VCard($rFile); $oVCardSplitter = new \Sabre\VObject\Splitter\VCard($rFile);
if ($oVCardSplitter) { if ($oVCardSplitter) {
while ($oVCard = $oVCardSplitter->getNext()) { while ($oVCard = $oVCardSplitter->getNext()) {
if ($oVCard instanceof \Sabre\VObject\Component\VCard) { if ($oVCard instanceof VCard) {
\MailSo\Base\Utils::ResetTimeLimit(); \MailSo\Base\Utils::ResetTimeLimit();
$oContact = new Classes\Contact(); $oContact = new Classes\Contact();
$oContact->setVCard($oVCard); $oContact->setVCard($oVCard);