using System; using System.Collections.Generic; using System.Data; using System.Data.SqlClient; using System.Linq; using System.Threading.Tasks; using Bit.Core.Entities; using Bit.Core.Models.Data; using Bit.Core.Repositories; using Bit.Core.Settings; using Bit.Core.Utilities; using Dapper; using Newtonsoft.Json; namespace Bit.Infrastructure.Dapper.Repositories { public class CollectionRepository : Repository, ICollectionRepository { public CollectionRepository(GlobalSettings globalSettings) : this(globalSettings.SqlServer.ConnectionString, globalSettings.SqlServer.ReadOnlyConnectionString) { } public CollectionRepository(string connectionString, string readOnlyConnectionString) : base(connectionString, readOnlyConnectionString) { } public async Task GetCountByOrganizationIdAsync(Guid organizationId) { using (var connection = new SqlConnection(ConnectionString)) { var results = await connection.ExecuteScalarAsync( "[dbo].[Collection_ReadCountByOrganizationId]", new { OrganizationId = organizationId }, commandType: CommandType.StoredProcedure); return results; } } public async Task>> GetByIdWithGroupsAsync(Guid id) { using (var connection = new SqlConnection(ConnectionString)) { var results = await connection.QueryMultipleAsync( $"[{Schema}].[Collection_ReadWithGroupsById]", new { Id = id }, commandType: CommandType.StoredProcedure); var collection = await results.ReadFirstOrDefaultAsync(); var groups = (await results.ReadAsync()).ToList(); return new Tuple>(collection, groups); } } public async Task>> GetByIdWithGroupsAsync( Guid id, Guid userId) { using (var connection = new SqlConnection(ConnectionString)) { var results = await connection.QueryMultipleAsync( $"[{Schema}].[Collection_ReadWithGroupsByIdUserId]", new { Id = id, UserId = userId }, commandType: CommandType.StoredProcedure); var collection = await results.ReadFirstOrDefaultAsync(); var groups = (await results.ReadAsync()).ToList(); return new Tuple>(collection, groups); } } public async Task> GetManyByOrganizationIdAsync(Guid organizationId) { using (var connection = new SqlConnection(ConnectionString)) { var results = await connection.QueryAsync( $"[{Schema}].[{Table}_ReadByOrganizationId]", new { OrganizationId = organizationId }, commandType: CommandType.StoredProcedure); return results.ToList(); } } public async Task GetByIdAsync(Guid id, Guid userId) { using (var connection = new SqlConnection(ConnectionString)) { var results = await connection.QueryAsync( $"[{Schema}].[Collection_ReadByIdUserId]", new { Id = id, UserId = userId }, commandType: CommandType.StoredProcedure); return results.FirstOrDefault(); } } public async Task> GetManyByUserIdAsync(Guid userId) { using (var connection = new SqlConnection(ConnectionString)) { var results = await connection.QueryAsync( $"[{Schema}].[Collection_ReadByUserId]", new { UserId = userId }, commandType: CommandType.StoredProcedure); return results.ToList(); } } public async Task CreateAsync(Collection obj, IEnumerable groups) { obj.SetNewId(); var objWithGroups = JsonConvert.DeserializeObject(JsonConvert.SerializeObject(obj)); objWithGroups.Groups = groups.ToArrayTVP(); using (var connection = new SqlConnection(ConnectionString)) { var results = await connection.ExecuteAsync( $"[{Schema}].[Collection_CreateWithGroups]", objWithGroups, commandType: CommandType.StoredProcedure); } } public async Task ReplaceAsync(Collection obj, IEnumerable groups) { var objWithGroups = JsonConvert.DeserializeObject(JsonConvert.SerializeObject(obj)); objWithGroups.Groups = groups.ToArrayTVP(); using (var connection = new SqlConnection(ConnectionString)) { var results = await connection.ExecuteAsync( $"[{Schema}].[Collection_UpdateWithGroups]", objWithGroups, commandType: CommandType.StoredProcedure); } } public async Task CreateUserAsync(Guid collectionId, Guid organizationUserId) { using (var connection = new SqlConnection(ConnectionString)) { var results = await connection.ExecuteAsync( $"[{Schema}].[CollectionUser_Create]", new { CollectionId = collectionId, OrganizationUserId = organizationUserId }, commandType: CommandType.StoredProcedure); } } public async Task DeleteUserAsync(Guid collectionId, Guid organizationUserId) { using (var connection = new SqlConnection(ConnectionString)) { var results = await connection.ExecuteAsync( $"[{Schema}].[CollectionUser_Delete]", new { CollectionId = collectionId, OrganizationUserId = organizationUserId }, commandType: CommandType.StoredProcedure); } } public async Task UpdateUsersAsync(Guid id, IEnumerable users) { using (var connection = new SqlConnection(ConnectionString)) { var results = await connection.ExecuteAsync( $"[{Schema}].[CollectionUser_UpdateUsers]", new { CollectionId = id, Users = users.ToArrayTVP() }, commandType: CommandType.StoredProcedure); } } public async Task> GetManyUsersByIdAsync(Guid id) { using (var connection = new SqlConnection(ConnectionString)) { var results = await connection.QueryAsync( $"[{Schema}].[CollectionUser_ReadByCollectionId]", new { CollectionId = id }, commandType: CommandType.StoredProcedure); return results.ToList(); } } public class CollectionWithGroups : Collection { public DataTable Groups { get; set; } } } }