From a956b826cd5a2b7708cde1378f4ce03f16a08e48 Mon Sep 17 00:00:00 2001 From: Kyle Spearrin Date: Wed, 22 Nov 2017 09:53:14 -0500 Subject: [PATCH] include collections in sync --- src/Api/Controllers/SyncController.cs | 23 ++++++++++++++++++- .../Api/Response/CipherResponseModel.cs | 6 ++--- .../Models/Api/Response/SyncResponseModel.cs | 10 +++++--- 3 files changed, 32 insertions(+), 7 deletions(-) diff --git a/src/Api/Controllers/SyncController.cs b/src/Api/Controllers/SyncController.cs index 3a5dc2f8f5..286d778c7b 100644 --- a/src/Api/Controllers/SyncController.cs +++ b/src/Api/Controllers/SyncController.cs @@ -8,6 +8,9 @@ using Bit.Core.Repositories; using Bit.Core; using Bit.Core.Enums; using Bit.Core.Exceptions; +using System.Linq; +using Bit.Core.Models.Table; +using System.Collections.Generic; namespace Bit.Api.Controllers { @@ -18,6 +21,8 @@ namespace Bit.Api.Controllers private readonly IUserService _userService; private readonly IFolderRepository _folderRepository; private readonly ICipherRepository _cipherRepository; + private readonly ICollectionRepository _collectionRepository; + private readonly ICollectionCipherRepository _collectionCipherRepository; private readonly IOrganizationUserRepository _organizationUserRepository; private readonly GlobalSettings _globalSettings; @@ -25,12 +30,16 @@ namespace Bit.Api.Controllers IUserService userService, IFolderRepository folderRepository, ICipherRepository cipherRepository, + ICollectionRepository collectionRepository, + ICollectionCipherRepository collectionCipherRepository, IOrganizationUserRepository organizationUserRepository, GlobalSettings globalSettings) { _userService = userService; _folderRepository = folderRepository; _cipherRepository = cipherRepository; + _collectionRepository = collectionRepository; + _collectionCipherRepository = collectionCipherRepository; _organizationUserRepository = organizationUserRepository; _globalSettings = globalSettings; } @@ -48,7 +57,19 @@ namespace Bit.Api.Controllers OrganizationUserStatusType.Confirmed); var folders = await _folderRepository.GetManyByUserIdAsync(user.Id); var ciphers = await _cipherRepository.GetManyByUserIdAsync(user.Id); - var response = new SyncResponseModel(_globalSettings, user, organizationUserDetails, folders, ciphers); + + IEnumerable collections = new List(); + IDictionary> collectionCiphersGroupDict = + new Dictionary>(); + if(organizationUserDetails.Any(o => o.Enabled)) + { + collections = await _collectionRepository.GetManyByUserIdAsync(user.Id, false); + var collectionCiphers = await _collectionCipherRepository.GetManyByUserIdAsync(user.Id); + collectionCiphersGroupDict = collectionCiphers.GroupBy(c => c.CipherId).ToDictionary(s => s.Key); + } + + var response = new SyncResponseModel(_globalSettings, user, organizationUserDetails, folders, + collections, ciphers, collectionCiphersGroupDict); return response; } } diff --git a/src/Core/Models/Api/Response/CipherResponseModel.cs b/src/Core/Models/Api/Response/CipherResponseModel.cs index c1e81b98f7..4850c5dec3 100644 --- a/src/Core/Models/Api/Response/CipherResponseModel.cs +++ b/src/Core/Models/Api/Response/CipherResponseModel.cs @@ -72,7 +72,7 @@ namespace Bit.Core.Models.Api IDictionary> collectionCiphers, string obj = "cipherDetails") : base(cipher, globalSettings, obj) { - if(collectionCiphers.ContainsKey(cipher.Id)) + if(collectionCiphers?.ContainsKey(cipher.Id) ?? false) { CollectionIds = collectionCiphers[cipher.Id].Select(c => c.CollectionId); } @@ -86,7 +86,7 @@ namespace Bit.Core.Models.Api IEnumerable collectionCiphers, string obj = "cipherDetails") : base(cipher, globalSettings, obj) { - CollectionIds = collectionCiphers.Select(c => c.CollectionId); + CollectionIds = collectionCiphers?.Select(c => c.CollectionId) ?? new List(); } public IEnumerable CollectionIds { get; set; } @@ -98,7 +98,7 @@ namespace Bit.Core.Models.Api IDictionary> collectionCiphers, string obj = "cipherMiniDetails") : base(cipher, globalSettings, false, obj) { - if(collectionCiphers.ContainsKey(cipher.Id)) + if(collectionCiphers?.ContainsKey(cipher.Id) ?? false) { CollectionIds = collectionCiphers[cipher.Id].Select(c => c.CollectionId); } diff --git a/src/Core/Models/Api/Response/SyncResponseModel.cs b/src/Core/Models/Api/Response/SyncResponseModel.cs index 61886606ac..da7e2645cd 100644 --- a/src/Core/Models/Api/Response/SyncResponseModel.cs +++ b/src/Core/Models/Api/Response/SyncResponseModel.cs @@ -14,18 +14,22 @@ namespace Bit.Core.Models.Api User user, IEnumerable organizationUserDetails, IEnumerable folders, - IEnumerable ciphers) + IEnumerable collections, + IEnumerable ciphers, + IDictionary> collectionCiphersDict) : base("sync") { Profile = new ProfileResponseModel(user, organizationUserDetails); Folders = folders.Select(f => new FolderResponseModel(f)); - Ciphers = ciphers.Select(c => new CipherResponseModel(c, globalSettings)); + Ciphers = ciphers.Select(c => new CipherDetailsResponseModel(c, globalSettings, collectionCiphersDict)); + Collections = collections.Select(c => new CollectionResponseModel(c)); Domains = new DomainsResponseModel(user, false); } public ProfileResponseModel Profile { get; set; } public IEnumerable Folders { get; set; } - public IEnumerable Ciphers { get; set; } + public IEnumerable Collections { get; set; } + public IEnumerable Ciphers { get; set; } public DomainsResponseModel Domains { get; set; } } }