Move email link/relation handling functions to libkolab for common use
This commit is contained in:
parent
ab12a5c867
commit
a807768c32
2 changed files with 99 additions and 73 deletions
|
@ -999,45 +999,8 @@ class kolab_notes extends rcube_plugin
|
||||||
private function save_links($uid, $links)
|
private function save_links($uid, $links)
|
||||||
{
|
{
|
||||||
$config = kolab_storage_config::get_instance();
|
$config = kolab_storage_config::get_instance();
|
||||||
$search = kolab_storage_config::build_member_url($uid);
|
$remove = array_diff($config->get_object_links($uid), $links);
|
||||||
$relations = $this->get_relations($uid);
|
return $config->save_object_links($uid, $links, $remove);
|
||||||
|
|
||||||
// @TODO: here we support only one-way relations, i.e.
|
|
||||||
// such relation can contain only note and mail members
|
|
||||||
// So, when we remove a note member the whole relation
|
|
||||||
// will be removed
|
|
||||||
|
|
||||||
foreach ($relations as $relation) {
|
|
||||||
if (empty($links)) {
|
|
||||||
$config->delete($relation['uid']);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
// make relation members up-to-date
|
|
||||||
kolab_storage_config::resolve_members($relation);
|
|
||||||
|
|
||||||
// assign all links to one relation, others will be removed
|
|
||||||
$members = array_merge($links, array($search));
|
|
||||||
$diff1 = array_diff($members, $relation['members']);
|
|
||||||
$diff1 = array_diff($relation['members'], $members);
|
|
||||||
|
|
||||||
if (count($diff1) || count($diff2)) {
|
|
||||||
$relation['members'] = $members;
|
|
||||||
$config->save($relation, 'relation');
|
|
||||||
}
|
|
||||||
|
|
||||||
$links = null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// create a new relation
|
|
||||||
if (!empty($links)) {
|
|
||||||
$relation = array(
|
|
||||||
'members' => array_merge($links, array($search)),
|
|
||||||
'category' => 'generic',
|
|
||||||
);
|
|
||||||
|
|
||||||
$config->save($relation, 'relation');
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1045,23 +1008,8 @@ class kolab_notes extends rcube_plugin
|
||||||
*/
|
*/
|
||||||
private function get_links($uid)
|
private function get_links($uid)
|
||||||
{
|
{
|
||||||
$result = array();
|
$config = kolab_storage_config::get_instance();
|
||||||
$search = kolab_storage_config::build_member_url($uid);
|
return $config->get_object_links($uid);
|
||||||
|
|
||||||
foreach ($this->get_relations($uid) as $relation) {
|
|
||||||
if (in_array($search, (array) $relation['members'])) {
|
|
||||||
// make relation members up-to-date
|
|
||||||
kolab_storage_config::resolve_members($relation);
|
|
||||||
|
|
||||||
foreach ($relation['members'] as $member) {
|
|
||||||
if ($member != $search) {
|
|
||||||
$result[] = $member;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return array_unique($result);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1091,22 +1039,6 @@ class kolab_notes extends rcube_plugin
|
||||||
return $result;
|
return $result;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Find relation objects referring to specified note
|
|
||||||
*/
|
|
||||||
private function get_relations($uid)
|
|
||||||
{
|
|
||||||
$config = kolab_storage_config::get_instance();
|
|
||||||
$default = true;
|
|
||||||
$filter = array(
|
|
||||||
array('type', '=', 'relation'),
|
|
||||||
array('category', '=', 'generic'),
|
|
||||||
array('member', '=', $uid),
|
|
||||||
);
|
|
||||||
|
|
||||||
return $config->get_objects($filter, $default, 100);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Resolve the email message reference from the given URI
|
* Resolve the email message reference from the given URI
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -653,6 +653,100 @@ class kolab_storage_config
|
||||||
return $result;
|
return $result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Find objects linked with the given groupware object through a relation
|
||||||
|
*
|
||||||
|
* @param string Object UUID
|
||||||
|
* @param array List of related URIs
|
||||||
|
*/
|
||||||
|
public function get_object_links($uid)
|
||||||
|
{
|
||||||
|
$links = array();
|
||||||
|
$object_uri = self::build_member_url($uid);
|
||||||
|
|
||||||
|
foreach ($this->get_relations_for_member($uid) as $relation) {
|
||||||
|
if (in_array($object_uri, (array) $relation['members'])) {
|
||||||
|
// make relation members up-to-date
|
||||||
|
kolab_storage_config::resolve_members($relation);
|
||||||
|
|
||||||
|
foreach ($relation['members'] as $member) {
|
||||||
|
if ($member != $object_uri) {
|
||||||
|
$links[] = $member;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return array_unique($links);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public function save_object_links($uid, $links, $remove = array())
|
||||||
|
{
|
||||||
|
$object_uri = self::build_member_url($uid);
|
||||||
|
$relations = $this->get_relations_for_member($uid);
|
||||||
|
$done = false;
|
||||||
|
|
||||||
|
foreach ($relations as $relation) {
|
||||||
|
// make relation members up-to-date
|
||||||
|
kolab_storage_config::resolve_members($relation);
|
||||||
|
|
||||||
|
// remove and add links
|
||||||
|
$members = array_diff($relation['members'], (array)$remove);
|
||||||
|
$members = array_unique(array_merge($members, $links));
|
||||||
|
|
||||||
|
// make sure the object_uri is still a member
|
||||||
|
if (!in_array($object_uri, $members)) {
|
||||||
|
$members[$obejct_uri];
|
||||||
|
}
|
||||||
|
|
||||||
|
// remove relation if no other members remain
|
||||||
|
if (count($members) <= 1) {
|
||||||
|
$done = $this->delete($relation['uid']);
|
||||||
|
}
|
||||||
|
// update relation object if members changed
|
||||||
|
else if (count(array_diff($members, $relation['members'])) || count(array_diff($relation['members'], $members))) {
|
||||||
|
$relation['members'] = $members;
|
||||||
|
$done = $this->save($relation, 'relation');
|
||||||
|
$links = array();
|
||||||
|
}
|
||||||
|
// no changes, we're happy
|
||||||
|
else {
|
||||||
|
$done = true;
|
||||||
|
$links = array();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// create a new relation
|
||||||
|
if (!$done) {
|
||||||
|
$relation = array(
|
||||||
|
'members' => array_merge($links, array($object_uri)),
|
||||||
|
'category' => 'generic',
|
||||||
|
);
|
||||||
|
|
||||||
|
$ret = $this->save($relation, 'relation');
|
||||||
|
}
|
||||||
|
|
||||||
|
return $ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Find relation objects referring to specified note
|
||||||
|
*/
|
||||||
|
public function get_relations_for_member($uid, $reltype = 'generic')
|
||||||
|
{
|
||||||
|
$default = true;
|
||||||
|
$filter = array(
|
||||||
|
array('type', '=', 'relation'),
|
||||||
|
array('category', '=', $reltype),
|
||||||
|
array('member', '=', $uid),
|
||||||
|
);
|
||||||
|
|
||||||
|
return $this->get_objects($filter, $default, 100);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Find kolab objects assigned to specified e-mail message
|
* Find kolab objects assigned to specified e-mail message
|
||||||
*
|
*
|
||||||
|
|
Loading…
Add table
Reference in a new issue