diff --git a/src/Api/Controllers/CiphersController.cs b/src/Api/Controllers/CiphersController.cs index 0ee7490426..f7d3b57d05 100644 --- a/src/Api/Controllers/CiphersController.cs +++ b/src/Api/Controllers/CiphersController.cs @@ -15,15 +15,18 @@ namespace Bit.Api.Controllers public class CiphersController : Controller { private readonly ICipherRepository _cipherRepository; + private readonly ISubvaultCipherRepository _subvaultCipherRepository; private readonly ICipherService _cipherService; private readonly IUserService _userService; public CiphersController( ICipherRepository cipherRepository, + ISubvaultCipherRepository subvaultCipherRepository, ICipherService cipherService, IUserService userService) { _cipherRepository = cipherRepository; + _subvaultCipherRepository = subvaultCipherRepository; _cipherService = cipherService; _userService = userService; } @@ -50,6 +53,16 @@ namespace Bit.Api.Controllers return new ListResponseModel(responses); } + [HttpGet("subvaults")] + public async Task> GetSubvaults() + { + var userId = _userService.GetProperUserId(User).Value; + var ciphers = await _cipherRepository.GetManyByUserIdHasSubvaultsAsync(userId); + var subvaultCiphers = await _subvaultCipherRepository.GetManyByUserIdAsync(userId); + var responses = ciphers.Select(c => new CipherDetailsResponseModel(c, subvaultCiphers)); + return new ListResponseModel(responses); + } + //[Obsolete] //[HttpGet("history")] //public async Task Get(DateTime since) diff --git a/src/Core/Repositories/ICipherRepository.cs b/src/Core/Repositories/ICipherRepository.cs index 5f7e9b776c..cca07a1071 100644 --- a/src/Core/Repositories/ICipherRepository.cs +++ b/src/Core/Repositories/ICipherRepository.cs @@ -10,6 +10,7 @@ namespace Bit.Core.Repositories { Task GetByIdAsync(Guid id, Guid userId); Task> GetManyByUserIdAsync(Guid userId); + Task> GetManyByUserIdHasSubvaultsAsync(Guid userId); Task> GetManyByTypeAndUserIdAsync(Enums.CipherType type, Guid userId); Task, ICollection>> GetManySinceRevisionDateAndUserIdWithDeleteHistoryAsync( DateTime sinceRevisionDate, Guid userId); diff --git a/src/Core/Repositories/ISubvaultCipherRepository.cs b/src/Core/Repositories/ISubvaultCipherRepository.cs new file mode 100644 index 0000000000..ef44859f21 --- /dev/null +++ b/src/Core/Repositories/ISubvaultCipherRepository.cs @@ -0,0 +1,12 @@ +using System; +using System.Threading.Tasks; +using Bit.Core.Models.Table; +using System.Collections.Generic; + +namespace Bit.Core.Repositories +{ + public interface ISubvaultCipherRepository + { + Task> GetManyByUserIdAsync(Guid userId); + } +} diff --git a/src/Core/Repositories/SqlServer/CipherRepository.cs b/src/Core/Repositories/SqlServer/CipherRepository.cs index f43bbce570..687d52a6b6 100644 --- a/src/Core/Repositories/SqlServer/CipherRepository.cs +++ b/src/Core/Repositories/SqlServer/CipherRepository.cs @@ -49,6 +49,19 @@ namespace Bit.Core.Repositories.SqlServer } } + public async Task> GetManyByUserIdHasSubvaultsAsync(Guid userId) + { + using(var connection = new SqlConnection(ConnectionString)) + { + var results = await connection.QueryAsync( + $"[{Schema}].[CipherDetails_ReadByUserIdHasSubvault]", + new { UserId = userId }, + commandType: CommandType.StoredProcedure); + + return results.ToList(); + } + } + public async Task> GetManyByTypeAndUserIdAsync(Enums.CipherType type, Guid userId) { using(var connection = new SqlConnection(ConnectionString)) diff --git a/src/Core/Repositories/SqlServer/SubvaultCipherRepository.cs b/src/Core/Repositories/SqlServer/SubvaultCipherRepository.cs new file mode 100644 index 0000000000..b7ae455d44 --- /dev/null +++ b/src/Core/Repositories/SqlServer/SubvaultCipherRepository.cs @@ -0,0 +1,35 @@ +using System; +using Bit.Core.Models.Table; +using System.Collections.Generic; +using System.Threading.Tasks; +using System.Data.SqlClient; +using System.Data; +using Dapper; +using System.Linq; + +namespace Bit.Core.Repositories.SqlServer +{ + public class SubvaultCipherRepository : BaseRepository, ISubvaultCipherRepository + { + public SubvaultCipherRepository(GlobalSettings globalSettings) + : this(globalSettings.SqlServer.ConnectionString) + { } + + public SubvaultCipherRepository(string connectionString) + : base(connectionString) + { } + + public async Task> GetManyByUserIdAsync(Guid userId) + { + using(var connection = new SqlConnection(ConnectionString)) + { + var results = await connection.QueryAsync( + $"[dbo].[SubvaultCipher_ReadByUserId]", + new { UserId = userId }, + commandType: CommandType.StoredProcedure); + + return results.ToList(); + } + } + } +}