From 4a9206b9922a1c7682c36be1498bfe93e690f644 Mon Sep 17 00:00:00 2001 From: Kyle Spearrin Date: Sat, 11 Mar 2017 15:34:57 -0500 Subject: [PATCH] get subvaults for organization user --- .../Controllers/OrganizationUsersController.cs | 7 +++++-- .../Api/Response/OrganizationUserResponseModel.cs | 15 +++++++++++++++ .../Repositories/IOrganizationUserRepository.cs | 2 +- .../SqlServer/OrganizationUserRepository.cs | 8 +++++--- .../OrganizationUserUserDetails_ReadById.sql | 9 +++++++++ 5 files changed, 35 insertions(+), 6 deletions(-) diff --git a/src/Api/Controllers/OrganizationUsersController.cs b/src/Api/Controllers/OrganizationUsersController.cs index 2ceed82734..07218e4e3a 100644 --- a/src/Api/Controllers/OrganizationUsersController.cs +++ b/src/Api/Controllers/OrganizationUsersController.cs @@ -17,22 +17,25 @@ namespace Bit.Api.Controllers private readonly IOrganizationRepository _organizationRepository; private readonly IOrganizationUserRepository _organizationUserRepository; private readonly IOrganizationService _organizationService; + private readonly ISubvaultRepository _subvaultRepository; private readonly IUserService _userService; public OrganizationUsersController( IOrganizationRepository organizationRepository, IOrganizationUserRepository organizationUserRepository, IOrganizationService organizationService, + ISubvaultRepository subvaultRepository, IUserService userService) { _organizationRepository = organizationRepository; _organizationUserRepository = organizationUserRepository; _organizationService = organizationService; + _subvaultRepository = subvaultRepository; _userService = userService; } [HttpGet("{id}")] - public async Task Get(string orgId, string id) + public async Task Get(string orgId, string id) { var organizationUser = await _organizationUserRepository.GetDetailsByIdAsync(new Guid(id)); if(organizationUser == null) @@ -40,7 +43,7 @@ namespace Bit.Api.Controllers throw new NotFoundException(); } - return new OrganizationUserResponseModel(organizationUser); + return new OrganizationUserDetailsResponseModel(organizationUser.Item1, organizationUser.Item2); } [HttpGet("")] diff --git a/src/Core/Models/Api/Response/OrganizationUserResponseModel.cs b/src/Core/Models/Api/Response/OrganizationUserResponseModel.cs index ceb4a0a97a..c3dc942822 100644 --- a/src/Core/Models/Api/Response/OrganizationUserResponseModel.cs +++ b/src/Core/Models/Api/Response/OrganizationUserResponseModel.cs @@ -1,6 +1,9 @@ using System; using Bit.Core.Enums; using Bit.Core.Models.Data; +using System.Collections.Generic; +using Bit.Core.Models.Table; +using System.Linq; namespace Bit.Core.Models.Api { @@ -29,4 +32,16 @@ namespace Bit.Core.Models.Api public OrganizationUserType Type { get; set; } public OrganizationUserStatusType Status { get; set; } } + + public class OrganizationUserDetailsResponseModel : OrganizationUserResponseModel + { + public OrganizationUserDetailsResponseModel(OrganizationUserUserDetails organizationUser, + IEnumerable subvaults) + : base(organizationUser, "organizationUserDetails") + { + Subvaults = new ListResponseModel(subvaults.Select(s => new SubvaultResponseModel(s))); + } + + public ListResponseModel Subvaults { get; set; } + } } diff --git a/src/Core/Repositories/IOrganizationUserRepository.cs b/src/Core/Repositories/IOrganizationUserRepository.cs index 24c1cec91d..dd3516ba97 100644 --- a/src/Core/Repositories/IOrganizationUserRepository.cs +++ b/src/Core/Repositories/IOrganizationUserRepository.cs @@ -9,7 +9,7 @@ namespace Bit.Core.Repositories public interface IOrganizationUserRepository : IRepository { Task GetByOrganizationAsync(Guid organizationId, Guid userId); - Task GetDetailsByIdAsync(Guid id); + Task>> GetDetailsByIdAsync(Guid id); Task> GetManyDetailsByOrganizationAsync(Guid organizationId); Task> GetManyDetailsByUserAsync(Guid userId); } diff --git a/src/Core/Repositories/SqlServer/OrganizationUserRepository.cs b/src/Core/Repositories/SqlServer/OrganizationUserRepository.cs index 503ca1c3d7..e7c969526a 100644 --- a/src/Core/Repositories/SqlServer/OrganizationUserRepository.cs +++ b/src/Core/Repositories/SqlServer/OrganizationUserRepository.cs @@ -33,16 +33,18 @@ namespace Bit.Core.Repositories.SqlServer } } - public async Task GetDetailsByIdAsync(Guid id) + public async Task>> GetDetailsByIdAsync(Guid id) { using(var connection = new SqlConnection(ConnectionString)) { - var results = await connection.QueryAsync( + var results = await connection.QueryMultipleAsync( "[dbo].[OrganizationUserUserDetails_ReadById]", new { Id = id }, commandType: CommandType.StoredProcedure); - return results.SingleOrDefault(); + var user = (await results.ReadAsync()).SingleOrDefault(); + var subvaults = (await results.ReadAsync()).ToList(); + return new Tuple>(user, subvaults); } } diff --git a/src/Sql/dbo/Stored Procedures/OrganizationUserUserDetails_ReadById.sql b/src/Sql/dbo/Stored Procedures/OrganizationUserUserDetails_ReadById.sql index 97116d56a4..cd8d878daa 100644 --- a/src/Sql/dbo/Stored Procedures/OrganizationUserUserDetails_ReadById.sql +++ b/src/Sql/dbo/Stored Procedures/OrganizationUserUserDetails_ReadById.sql @@ -10,4 +10,13 @@ BEGIN [dbo].[OrganizationUserUserDetailsView] WHERE [Id] = @Id + + SELECT + S.* + FROM + [dbo].[SubvaultView] S + INNER JOIN + [dbo].[SubvaultUser] SU ON SU.[SubvaultId] = S.[Id] + WHERE + SU.[OrganizationUserId] = @Id END \ No newline at end of file