sync: remove legacy sync api

This commit is contained in:
Abdullah Atta
2024-06-07 10:56:17 +05:00
parent 0c0ade0c64
commit 9d2c54ad33

View File

@@ -47,12 +47,9 @@ namespace Notesnook.API.Hubs
}
public interface ISyncHubClient
{
Task SyncItem(SyncTransferItem transferItem);
Task PushItems(SyncTransferItemV2 transferItem);
Task<bool> SendItems(SyncTransferItemV2 transferItem);
Task RemoteSyncCompleted(long lastSynced);
Task PushCompleted(long lastSynced);
Task SyncCompleted();
}
public class GlobalSync
@@ -184,85 +181,6 @@ namespace Notesnook.API.Hubs
}
}
public async Task<int> SyncItem(BatchedSyncTransferItem transferItem)
{
var userId = Context.User.FindFirstValue("sub");
if (string.IsNullOrEmpty(userId)) return 0;
UserSettings userSettings = await this.Repositories.UsersSettings.FindOneAsync((u) => u.UserId == userId);
long dateSynced = Math.Max(transferItem.LastSynced, userSettings.LastSynced);
GlobalSync.StartPush(userId, Context.ConnectionId, transferItem.Total);
try
{
var others = Clients.OthersInGroup(userId);
for (int i = 0; i < transferItem.Items.Length; ++i)
{
var data = transferItem.Items[i];
var type = transferItem.Types[i];
// We intentionally don't await here to speed up the sync. Fire and forget
// suits here because we don't really care if the item reaches the other
// devices.
others.SyncItem(
new SyncTransferItem
{
Item = data,
ItemType = type,
LastSynced = dateSynced,
Total = transferItem.Total,
Current = transferItem.Current + i
});
switch (type)
{
case "content":
Repositories.Contents.Upsert(JsonSerializer.Deserialize<Content>(data), userId, dateSynced);
break;
case "attachment":
Repositories.Attachments.Upsert(JsonSerializer.Deserialize<Attachment>(data), userId, dateSynced);
break;
case "note":
Repositories.Notes.Upsert(JsonSerializer.Deserialize<Note>(data), userId, dateSynced);
break;
case "notebook":
Repositories.Notebooks.Upsert(JsonSerializer.Deserialize<Notebook>(data), userId, dateSynced);
break;
case "shortcut":
Repositories.Shortcuts.Upsert(JsonSerializer.Deserialize<Shortcut>(data), userId, dateSynced);
break;
case "reminder":
Repositories.Reminders.Upsert(JsonSerializer.Deserialize<Reminder>(data), userId, dateSynced);
break;
case "relation":
Repositories.Relations.Upsert(JsonSerializer.Deserialize<Relation>(data), userId, dateSynced);
break;
case "settings":
var settings = JsonSerializer.Deserialize<Setting>(data);
settings.Id = MongoDB.Bson.ObjectId.Parse(userId);
settings.ItemId = userId;
Repositories.LegacySettings.Upsert(settings, userId, dateSynced);
break;
case "vaultKey":
userSettings.VaultKey = JsonSerializer.Deserialize<EncryptedData>(data);
Repositories.UsersSettings.Upsert(userSettings, (u) => u.UserId == userId);
break;
default:
throw new HubException("Invalid item type.");
}
}
return await unit.Commit() ? 1 : 0;
}
catch (Exception ex)
{
GlobalSync.ClearPushOperations(userId, Context.ConnectionId);
throw ex;
}
}
private Action<SyncItem, string, long> MapTypeToUpsertAction(string type)
{
return type switch
@@ -358,7 +276,6 @@ namespace Notesnook.API.Hubs
await this.Repositories.UsersSettings.UpsertAsync(userSettings, (u) => u.UserId == userId);
await Clients.OthersInGroup(userId).RemoteSyncCompleted(lastSynced);
await Clients.OthersInGroup(userId).PushCompleted(lastSynced);
return true;
@@ -478,99 +395,6 @@ namespace Notesnook.API.Hubs
LastSynced = userSettings.LastSynced,
};
}
public async IAsyncEnumerable<SyncTransferItem> FetchItems(long lastSyncedTimestamp, [EnumeratorCancellation]
CancellationToken cancellationToken)
{
var userId = Context.User.FindFirstValue("sub");
if (GlobalSync.IsUserPushing(userId))
{
throw new HubException("Cannot fetch data while another sync is in progress. Please try again later.");
}
var userSettings = await Repositories.UsersSettings.FindOneAsync((u) => u.UserId == userId);
if (userSettings.LastSynced > 0 && lastSyncedTimestamp > userSettings.LastSynced)
{
throw new HubException($"Provided timestamp value is too large. Server timestamp: {userSettings.LastSynced} Sent timestamp: {lastSyncedTimestamp}. Please run a Force Sync to fix this issue.");
}
if (lastSyncedTimestamp > 0 && userSettings.LastSynced == lastSyncedTimestamp)
{
yield return new SyncTransferItem
{
Synced = true,
LastSynced = userSettings.LastSynced
};
yield break;
}
var total = (await Task.WhenAll(
Repositories.Attachments.CountItemsSyncedAfterAsync(userId, lastSyncedTimestamp),
Repositories.Notes.CountItemsSyncedAfterAsync(userId, lastSyncedTimestamp),
Repositories.Notebooks.CountItemsSyncedAfterAsync(userId, lastSyncedTimestamp),
Repositories.Contents.CountItemsSyncedAfterAsync(userId, lastSyncedTimestamp),
Repositories.LegacySettings.CountItemsSyncedAfterAsync(userId, lastSyncedTimestamp),
Repositories.Shortcuts.CountItemsSyncedAfterAsync(userId, lastSyncedTimestamp),
Repositories.Reminders.CountItemsSyncedAfterAsync(userId, lastSyncedTimestamp),
Repositories.Relations.CountItemsSyncedAfterAsync(userId, lastSyncedTimestamp)
)).Sum((a) => a);
if (total == 0)
{
yield return new SyncTransferItem
{
Synced = true,
LastSynced = userSettings.LastSynced
};
yield break;
}
var collections = new[] {
Repositories.LegacySettings.FindItemsSyncedAfter,
Repositories.Attachments.FindItemsSyncedAfter,
Repositories.Notes.FindItemsSyncedAfter,
Repositories.Notebooks.FindItemsSyncedAfter,
Repositories.Contents.FindItemsSyncedAfter,
Repositories.Shortcuts.FindItemsSyncedAfter,
Repositories.Reminders.FindItemsSyncedAfter,
Repositories.Relations.FindItemsSyncedAfter,
};
for (var i = 0; i < collections.Length; ++i)
{
var key = CollectionKeys[i];
using var cursor = await collections[i](userId, lastSyncedTimestamp, 1000);
while (await cursor.MoveNextAsync(cancellationToken))
{
foreach (var item in cursor.Current)
{
yield return new SyncTransferItem
{
LastSynced = userSettings.LastSynced,
Synced = false,
Item = JsonSerializer.Serialize(item),
ItemType = key,
Total = (int)total,
};
}
}
}
if (userSettings.VaultKey != null)
{
yield return new SyncTransferItem
{
LastSynced = userSettings.LastSynced,
Synced = false,
Item = JsonSerializer.Serialize(userSettings.VaultKey),
ItemType = "vaultKey",
Total = (int)total,
};
}
}
}
[MessagePack.MessagePackObject]