You've already forked joplin
mirror of
https://github.com/laurent22/joplin.git
synced 2025-07-16 00:14:34 +02:00
Make sure synchronizer returns list of modified fields
This commit is contained in:
@ -30,6 +30,7 @@ class Change extends BaseModel {
|
|||||||
if ($hasMore) array_pop($changes);
|
if ($hasMore) array_pop($changes);
|
||||||
|
|
||||||
$itemIdToChange = array();
|
$itemIdToChange = array();
|
||||||
|
$itemIdToChangedFields = array();
|
||||||
$createdItems = array();
|
$createdItems = array();
|
||||||
$deletedItems = array();
|
$deletedItems = array();
|
||||||
foreach ($changes as $change) {
|
foreach ($changes as $change) {
|
||||||
@ -37,6 +38,9 @@ class Change extends BaseModel {
|
|||||||
$createdItems[] = $change->item_id;
|
$createdItems[] = $change->item_id;
|
||||||
} else if ($change->type == Change::enumId('type', 'delete')) {
|
} else if ($change->type == Change::enumId('type', 'delete')) {
|
||||||
$deletedItems[] = $change->item_id;
|
$deletedItems[] = $change->item_id;
|
||||||
|
} else { // Update
|
||||||
|
if (!isset($itemIdToChangedFields[$change->item_id])) $itemIdToChangedFields[$change->item_id] = array();
|
||||||
|
$itemIdToChangedFields[$change->item_id][] = $change->item_field;
|
||||||
}
|
}
|
||||||
|
|
||||||
$itemIdToChange[$change->item_id] = $change;
|
$itemIdToChange[$change->item_id] = $change;
|
||||||
@ -49,15 +53,19 @@ class Change extends BaseModel {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$syncItem = $change->toSyncItem();
|
||||||
|
|
||||||
if (in_array($itemId, $deletedItems)) {
|
if (in_array($itemId, $deletedItems)) {
|
||||||
// Item was deleted at some point - just return one 'delete' event
|
// Item was deleted at some point - just return one 'delete' event
|
||||||
$change->type = Change::enumId('type', 'delete');
|
$change->type = Change::enumId('type', 'delete');
|
||||||
} else if (in_array($itemId, $createdItems)) {
|
} else if (in_array($itemId, $createdItems)) {
|
||||||
// Item was created then updated - just return one 'create' event with the latest changes
|
// Item was created then updated - just return one 'create' event with the latest changes
|
||||||
$change->type = Change::enumId('type', 'create');
|
$change->type = Change::enumId('type', 'create');
|
||||||
|
} else {
|
||||||
|
$syncItem['item_fields'] = $itemIdToChangedFields[$change->item_id];
|
||||||
}
|
}
|
||||||
|
|
||||||
$output[] = $change->toSyncItem();
|
$output[] = $syncItem;
|
||||||
}
|
}
|
||||||
|
|
||||||
// This is important so that the client knows that the last item in the list
|
// This is important so that the client knows that the last item in the list
|
||||||
@ -73,13 +81,13 @@ class Change extends BaseModel {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function toSyncItem() {
|
private function toSyncItem() {
|
||||||
return array(
|
return array(
|
||||||
'id' => (string)$this->id,
|
'id' => (string)$this->id,
|
||||||
'type' => self::enumName('type', $this->type),
|
'type' => self::enumName('type', $this->type),
|
||||||
'item_id' => self::hex($this->item_id),
|
'item_id' => self::hex($this->item_id),
|
||||||
'item_type' => FolderItem::enumName('type', $this->item_type),
|
'item_type' => FolderItem::enumName('type', $this->item_type),
|
||||||
'item_field' => $this->item_field,
|
'item_fields' => array(), // This is populated by changesDoneAfterId()
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -230,4 +230,26 @@ class ChangeTest extends BaseTestCase {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function testChangedFields() {
|
||||||
|
$n1 = new Note();
|
||||||
|
$n1->fromPublicArray(array('body' => 'test'));
|
||||||
|
$n1->owner_id = $this->userId();
|
||||||
|
$n1->save();
|
||||||
|
|
||||||
|
$r = Change::changesDoneAfterId($this->userId(), $this->clientId(2), 0);
|
||||||
|
$lastId = $r['items'][0]['id'];
|
||||||
|
|
||||||
|
$n1->latitude = 1;
|
||||||
|
$n1->save();
|
||||||
|
|
||||||
|
$n1->longitude = 1;
|
||||||
|
$n1->save();
|
||||||
|
|
||||||
|
$r = Change::changesDoneAfterId($this->userId(), $this->clientId(2), $lastId);
|
||||||
|
$change = $r['items'][0];
|
||||||
|
$this->assertEquals(2, count($change['item_fields']));
|
||||||
|
$this->assertContains('latitude', $change['item_fields']);
|
||||||
|
$this->assertContains('longitude', $change['item_fields']);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
Reference in New Issue
Block a user