1
0
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:
Laurent Cozic
2017-01-09 11:18:46 +01:00
parent 8973668957
commit 35e2fb8c6e
2 changed files with 33 additions and 3 deletions

View File

@ -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()
); );
} }

View File

@ -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']);
}
} }