From 4bcfab589d0afcd099cca858cdb66ec804c83092 Mon Sep 17 00:00:00 2001 From: Kyle Spearrin Date: Thu, 9 Mar 2017 23:58:43 -0500 Subject: [PATCH] SubvaultUser APIs and services --- .../OrganizationUsersController.cs | 17 +++++- src/Api/Controllers/SubvaultsController.cs | 14 +++++ .../OrganizationUserCreateRequestModels.cs | 19 ------- .../OrganizationUserRequestModels.cs | 52 +++++++++++++++++++ .../Api/Request/SubvaultUserRequestModel.cs | 42 +++++++++++++++ src/Core/Models/Table/SubvaultUser.cs | 2 +- src/Core/Repositories/ISubvaultRepository.cs | 1 + .../Repositories/ISubvaultUserRepository.cs | 3 +- .../SqlServer/SubvaultRepository.cs | 13 +++++ .../SqlServer/SubvaultUserRepository.cs | 19 +++++++ src/Core/Services/IOrganizationService.cs | 2 + .../Implementations/OrganizationService.cs | 39 ++++++++++++++ src/Sql/Sql.sqlproj | 16 ++++-- .../Stored Procedures/SubvaultUser_Create.sql | 6 +-- .../SubvaultUser_ReadByOrganizationUserId.sql | 13 +++++ .../Stored Procedures/SubvaultUser_Update.sql | 4 +- .../Subvault_ReadByOrganizationId.sql | 13 +++++ .../Subvault_ReadByUserId.sql | 4 +- src/Sql/dbo/Tables/Group.sql | 10 ++++ src/Sql/dbo/Tables/GroupUser.sql | 8 +++ src/Sql/dbo/Tables/SubvaultGroup.sql | 8 +++ src/Sql/dbo/Tables/SubvaultUser.sql | 18 +++---- src/Sql/dbo/Views/SubvaultUserView.sql | 6 +++ src/Sql/dbo/Views/SubvaultView.sql | 2 +- 24 files changed, 287 insertions(+), 44 deletions(-) delete mode 100644 src/Core/Models/Api/Request/Organizations/OrganizationUserCreateRequestModels.cs create mode 100644 src/Core/Models/Api/Request/Organizations/OrganizationUserRequestModels.cs create mode 100644 src/Core/Models/Api/Request/SubvaultUserRequestModel.cs create mode 100644 src/Sql/dbo/Stored Procedures/SubvaultUser_ReadByOrganizationUserId.sql create mode 100644 src/Sql/dbo/Stored Procedures/Subvault_ReadByOrganizationId.sql create mode 100644 src/Sql/dbo/Tables/Group.sql create mode 100644 src/Sql/dbo/Tables/GroupUser.sql create mode 100644 src/Sql/dbo/Tables/SubvaultGroup.sql create mode 100644 src/Sql/dbo/Views/SubvaultUserView.sql diff --git a/src/Api/Controllers/OrganizationUsersController.cs b/src/Api/Controllers/OrganizationUsersController.cs index 8ca6b8096..2ceed8273 100644 --- a/src/Api/Controllers/OrganizationUsersController.cs +++ b/src/Api/Controllers/OrganizationUsersController.cs @@ -58,7 +58,7 @@ namespace Bit.Api.Controllers var result = await _organizationService.InviteUserAsync(new Guid(orgId), model.Email); } - [HttpPut("accept")] + [HttpPut("{id}/accept")] [HttpPost("{id}/accept")] public async Task Accept(string orgId, string id, [FromBody]OrganizationUserAcceptRequestModel model) { @@ -66,13 +66,26 @@ namespace Bit.Api.Controllers var result = await _organizationService.AcceptUserAsync(new Guid(id), user, model.Token); } - [HttpPost("confirm")] + [HttpPut("{id}/confirm")] [HttpPost("{id}/confirm")] public async Task Confirm(string orgId, string id, [FromBody]OrganizationUserConfirmRequestModel model) { var result = await _organizationService.ConfirmUserAsync(new Guid(id), model.Key); } + [HttpPut("{id}")] + [HttpPost("{id}")] + public async Task Put(string id, [FromBody]OrganizationUserUpdateRequestModel model) + { + var organizationUser = await _organizationUserRepository.GetByIdAsync(new Guid(id)); + if(organizationUser == null) + { + throw new NotFoundException(); + } + + await _organizationService.SaveUserAsync(organizationUser, model.Subvaults.Select(s => s.ToSubvaultUser())); + } + [HttpDelete("{id}")] [HttpPost("{id}/delete")] public async Task Delete(string orgId, string id) diff --git a/src/Api/Controllers/SubvaultsController.cs b/src/Api/Controllers/SubvaultsController.cs index c1dc9e2f0..98d56c20a 100644 --- a/src/Api/Controllers/SubvaultsController.cs +++ b/src/Api/Controllers/SubvaultsController.cs @@ -79,6 +79,20 @@ namespace Bit.Api.Controllers return new SubvaultResponseModel(subvault); } + [HttpPut("user")] + [HttpPost("user")] + public async Task PutUserSubvaults(string orgId, [FromBody]OrganizationUserConfirmRequestModel model) + { + + } + + [HttpPut("{id}/users")] + [HttpPost("{id}/users")] + public async Task PutUsers(string orgId, string id, [FromBody]SubvaultRequestModel model) + { + + } + [HttpDelete("{id}")] [HttpPost("{id}/delete")] public async Task Delete(string orgId, string id) diff --git a/src/Core/Models/Api/Request/Organizations/OrganizationUserCreateRequestModels.cs b/src/Core/Models/Api/Request/Organizations/OrganizationUserCreateRequestModels.cs deleted file mode 100644 index 1352500a3..000000000 --- a/src/Core/Models/Api/Request/Organizations/OrganizationUserCreateRequestModels.cs +++ /dev/null @@ -1,19 +0,0 @@ -using Bit.Core.Models.Table; - -namespace Bit.Core.Models.Api -{ - public class OrganizationUserInviteRequestModel - { - public string Email { get; set; } - } - - public class OrganizationUserAcceptRequestModel - { - public string Token { get; set; } - } - - public class OrganizationUserConfirmRequestModel - { - public string Key { get; set; } - } -} diff --git a/src/Core/Models/Api/Request/Organizations/OrganizationUserRequestModels.cs b/src/Core/Models/Api/Request/Organizations/OrganizationUserRequestModels.cs new file mode 100644 index 000000000..24a4f3757 --- /dev/null +++ b/src/Core/Models/Api/Request/Organizations/OrganizationUserRequestModels.cs @@ -0,0 +1,52 @@ +using Bit.Core.Models.Table; +using System; +using System.Collections.Generic; + +namespace Bit.Core.Models.Api +{ + public class OrganizationUserInviteRequestModel + { + public string Email { get; set; } + } + + public class OrganizationUserAcceptRequestModel + { + public string Token { get; set; } + } + + public class OrganizationUserConfirmRequestModel + { + public string Key { get; set; } + } + + public class OrganizationUserUpdateRequestModel + { + public Enums.OrganizationUserType Type { get; set; } + public IEnumerable Subvaults { get; set; } + + public class Subvault + { + public string Id { get; set; } + public string SubvaultId { get; set; } + public bool Admin { get; set; } + public bool ReadOnly { get; set; } + + public SubvaultUser ToSubvaultUser() + { + var user = new SubvaultUser + { + SubvaultId = new Guid(SubvaultId), + Admin = Admin, + ReadOnly = ReadOnly + }; + + if(string.IsNullOrWhiteSpace(Id)) + { + user.Id = new Guid(Id); + } + + return user; + } + } + } +} diff --git a/src/Core/Models/Api/Request/SubvaultUserRequestModel.cs b/src/Core/Models/Api/Request/SubvaultUserRequestModel.cs new file mode 100644 index 000000000..9756b6ec0 --- /dev/null +++ b/src/Core/Models/Api/Request/SubvaultUserRequestModel.cs @@ -0,0 +1,42 @@ +using System; +using System.ComponentModel.DataAnnotations; +using Bit.Core.Utilities; +using Bit.Core.Models.Table; +using Newtonsoft.Json; +using System.Collections; +using System.Collections.Generic; +using System.Linq; + +namespace Bit.Core.Models.Api +{ + public class SubvaultUserSubvaultRequestModel + { + public string UserId { get; set; } + public IEnumerable Subvaults { get; set; } + + public IEnumerable ToSubvaultUsers() + { + return Subvaults.Select(s => new SubvaultUser + { + OrganizationUserId = new Guid(UserId), + SubvaultId = new Guid(s.SubvaultId), + Admin = s.Admin, + ReadOnly = s.ReadOnly + }); + } + + public class Subvault + { + public string SubvaultId { get; set; } + public bool Admin { get; set; } + public bool ReadOnly { get; set; } + } + } + + public class SubvaultUserUserRequestModel + { + public string UserId { get; set; } + public bool Admin { get; set; } + public bool ReadOnly { get; set; } + } +} diff --git a/src/Core/Models/Table/SubvaultUser.cs b/src/Core/Models/Table/SubvaultUser.cs index 7accfee08..fce505549 100644 --- a/src/Core/Models/Table/SubvaultUser.cs +++ b/src/Core/Models/Table/SubvaultUser.cs @@ -7,7 +7,7 @@ namespace Bit.Core.Models.Table { public Guid Id { get; set; } public Guid SubvaultId { get; set; } - public Guid UserId { get; set; } + public Guid OrganizationUserId { get; set; } public bool Admin { get; set; } public bool ReadOnly { get; set; } public DateTime CreationDate { get; internal set; } = DateTime.UtcNow; diff --git a/src/Core/Repositories/ISubvaultRepository.cs b/src/Core/Repositories/ISubvaultRepository.cs index c6091af5d..1b1232a69 100644 --- a/src/Core/Repositories/ISubvaultRepository.cs +++ b/src/Core/Repositories/ISubvaultRepository.cs @@ -9,6 +9,7 @@ namespace Bit.Core.Repositories { Task GetByIdAdminUserIdAsync(Guid id, Guid userId); Task> GetManyByOrganizationIdAdminUserIdAsync(Guid organizationId, Guid userId); + Task> GetManyByOrganizationIdAsync(Guid organizationId); Task> GetManyByUserIdAsync(Guid userId); } diff --git a/src/Core/Repositories/ISubvaultUserRepository.cs b/src/Core/Repositories/ISubvaultUserRepository.cs index b1296c1d6..ce682ff7e 100644 --- a/src/Core/Repositories/ISubvaultUserRepository.cs +++ b/src/Core/Repositories/ISubvaultUserRepository.cs @@ -1,11 +1,12 @@ using System; using System.Threading.Tasks; using Bit.Core.Models.Table; +using System.Collections.Generic; namespace Bit.Core.Repositories { public interface ISubvaultUserRepository : IRepository { - + Task> GetManyByOrganizationUserIdAsync(Guid orgUserId); } } diff --git a/src/Core/Repositories/SqlServer/SubvaultRepository.cs b/src/Core/Repositories/SqlServer/SubvaultRepository.cs index cddc9c46e..95b06c2ee 100644 --- a/src/Core/Repositories/SqlServer/SubvaultRepository.cs +++ b/src/Core/Repositories/SqlServer/SubvaultRepository.cs @@ -45,6 +45,19 @@ namespace Bit.Core.Repositories.SqlServer } } + 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> GetManyByUserIdAsync(Guid userId) { using(var connection = new SqlConnection(ConnectionString)) diff --git a/src/Core/Repositories/SqlServer/SubvaultUserRepository.cs b/src/Core/Repositories/SqlServer/SubvaultUserRepository.cs index 0396e268c..565d16f82 100644 --- a/src/Core/Repositories/SqlServer/SubvaultUserRepository.cs +++ b/src/Core/Repositories/SqlServer/SubvaultUserRepository.cs @@ -1,5 +1,11 @@ using System; using Bit.Core.Models.Table; +using System.Collections.Generic; +using System.Threading.Tasks; +using System.Data; +using System.Data.SqlClient; +using Dapper; +using System.Linq; namespace Bit.Core.Repositories.SqlServer { @@ -12,5 +18,18 @@ namespace Bit.Core.Repositories.SqlServer public SubvaultUserRepository(string connectionString) : base(connectionString) { } + + public async Task> GetManyByOrganizationUserIdAsync(Guid orgUserId) + { + using(var connection = new SqlConnection(ConnectionString)) + { + var results = await connection.QueryAsync( + $"[{Schema}].[{Table}_ReadByOrganizationUserId]", + new { OrganizationUserId = orgUserId }, + commandType: CommandType.StoredProcedure); + + return results.ToList(); + } + } } } diff --git a/src/Core/Services/IOrganizationService.cs b/src/Core/Services/IOrganizationService.cs index d069079cb..95f799781 100644 --- a/src/Core/Services/IOrganizationService.cs +++ b/src/Core/Services/IOrganizationService.cs @@ -2,6 +2,7 @@ using Bit.Core.Models.Business; using Bit.Core.Models.Table; using System; +using System.Collections.Generic; namespace Bit.Core.Services { @@ -11,5 +12,6 @@ namespace Bit.Core.Services Task InviteUserAsync(Guid organizationId, string email); Task AcceptUserAsync(Guid organizationUserId, User user, string token); Task ConfirmUserAsync(Guid organizationUserId, string key); + Task SaveUserAsync(OrganizationUser user, IEnumerable subvaults); } } diff --git a/src/Core/Services/Implementations/OrganizationService.cs b/src/Core/Services/Implementations/OrganizationService.cs index 55c471bdd..8a61bb0c9 100644 --- a/src/Core/Services/Implementations/OrganizationService.cs +++ b/src/Core/Services/Implementations/OrganizationService.cs @@ -6,6 +6,7 @@ using Bit.Core.Models.Business; using Bit.Core.Models.Table; using Bit.Core.Utilities; using Bit.Core.Exceptions; +using System.Collections.Generic; namespace Bit.Core.Services { @@ -13,15 +14,21 @@ namespace Bit.Core.Services { private readonly IOrganizationRepository _organizationRepository; private readonly IOrganizationUserRepository _organizationUserRepository; + private readonly ISubvaultRepository _subvaultRepository; + private readonly ISubvaultUserRepository _subvaultUserRepository; private readonly IUserRepository _userRepository; public OrganizationService( IOrganizationRepository organizationRepository, IOrganizationUserRepository organizationUserRepository, + ISubvaultRepository subvaultRepository, + ISubvaultUserRepository subvaultUserRepository, IUserRepository userRepository) { _organizationRepository = organizationRepository; _organizationUserRepository = organizationUserRepository; + _subvaultRepository = subvaultRepository; + _subvaultUserRepository = subvaultUserRepository; _userRepository = userRepository; } @@ -141,5 +148,37 @@ namespace Bit.Core.Services return orgUser; } + + public async Task SaveUserAsync(OrganizationUser user, IEnumerable subvaults) + { + if(user.Id.Equals(default(Guid))) + { + throw new BadRequestException("Invite the user first."); + } + + await _organizationUserRepository.ReplaceAsync(user); + + var orgSubvaults = await _subvaultRepository.GetManyByOrganizationIdAsync(user.OrganizationId); + var currentUserSubvaults = await _subvaultUserRepository.GetManyByOrganizationUserIdAsync(user.Id); + + // Let's make sure all these belong to this user and organization. + var filteredSubvaults = subvaults.Where(s => + orgSubvaults.Any(os => os.Id == s.SubvaultId) && + (s.Id == default(Guid) || currentUserSubvaults.Any(cs => cs.Id == s.Id))); + + var subvaultsToDelete = currentUserSubvaults.Where(cs => !subvaults.Any(s => s.Id == cs.Id)); + + foreach(var subvault in filteredSubvaults) + { + await _subvaultUserRepository.UpsertAsync(subvault); + } + + foreach(var subvault in subvaultsToDelete) + { + await _subvaultUserRepository.DeleteAsync(subvault); + } + + return user; + } } } diff --git a/src/Sql/Sql.sqlproj b/src/Sql/Sql.sqlproj index b34c09988..43f3f923e 100644 --- a/src/Sql/Sql.sqlproj +++ b/src/Sql/Sql.sqlproj @@ -78,6 +78,10 @@ + + + + @@ -85,6 +89,11 @@ + + + + + @@ -142,14 +151,11 @@ - - - - + + - diff --git a/src/Sql/dbo/Stored Procedures/SubvaultUser_Create.sql b/src/Sql/dbo/Stored Procedures/SubvaultUser_Create.sql index 13cbfcdd5..b2e5f206f 100644 --- a/src/Sql/dbo/Stored Procedures/SubvaultUser_Create.sql +++ b/src/Sql/dbo/Stored Procedures/SubvaultUser_Create.sql @@ -1,7 +1,7 @@ CREATE PROCEDURE [dbo].[SubvaultUser_Create] @Id UNIQUEIDENTIFIER, @SubvaultId UNIQUEIDENTIFIER, - @UserId UNIQUEIDENTIFIER, + @OrganizationUserId UNIQUEIDENTIFIER, @Admin BIT, @ReadOnly BIT, @CreationDate DATETIME2(7), @@ -14,7 +14,7 @@ BEGIN ( [Id], [SubvaultId], - [UserId], + [OrganizationUserId], [Admin], [ReadOnly], [CreationDate], @@ -24,7 +24,7 @@ BEGIN ( @Id, @SubvaultId, - @UserId, + @OrganizationUserId, @Admin, @ReadOnly, @CreationDate, diff --git a/src/Sql/dbo/Stored Procedures/SubvaultUser_ReadByOrganizationUserId.sql b/src/Sql/dbo/Stored Procedures/SubvaultUser_ReadByOrganizationUserId.sql new file mode 100644 index 000000000..149c5a714 --- /dev/null +++ b/src/Sql/dbo/Stored Procedures/SubvaultUser_ReadByOrganizationUserId.sql @@ -0,0 +1,13 @@ +CREATE PROCEDURE [dbo].[SubvaultUser_ReadByOrganizationUserId] + @OrganizationUserId UNIQUEIDENTIFIER +AS +BEGIN + SET NOCOUNT ON + + SELECT + * + FROM + [dbo].[SubvaultUserView] + WHERE + [OrganizationUserId] = @OrganizationUserId +END \ No newline at end of file diff --git a/src/Sql/dbo/Stored Procedures/SubvaultUser_Update.sql b/src/Sql/dbo/Stored Procedures/SubvaultUser_Update.sql index bb3639c59..5981f0a56 100644 --- a/src/Sql/dbo/Stored Procedures/SubvaultUser_Update.sql +++ b/src/Sql/dbo/Stored Procedures/SubvaultUser_Update.sql @@ -1,7 +1,7 @@ CREATE PROCEDURE [dbo].[SubvaultUser_Update] @Id UNIQUEIDENTIFIER, @SubvaultId UNIQUEIDENTIFIER, - @UserId UNIQUEIDENTIFIER, + @OrganizationUserId UNIQUEIDENTIFIER, @Key VARCHAR(MAX), @Admin BIT, @ReadOnly BIT, @@ -15,7 +15,7 @@ BEGIN [dbo].[SubvaultUser] SET [SubvaultId] = @SubvaultId, - [UserId] = @UserId, + [OrganizationUserId] = @OrganizationUserId, [Admin] = @Admin, [ReadOnly] = @ReadOnly, [CreationDate] = @CreationDate, diff --git a/src/Sql/dbo/Stored Procedures/Subvault_ReadByOrganizationId.sql b/src/Sql/dbo/Stored Procedures/Subvault_ReadByOrganizationId.sql new file mode 100644 index 000000000..0d827052c --- /dev/null +++ b/src/Sql/dbo/Stored Procedures/Subvault_ReadByOrganizationId.sql @@ -0,0 +1,13 @@ +CREATE PROCEDURE [dbo].[Subvault_ReadByOrganizationId] + @OrganizationId UNIQUEIDENTIFIER +AS +BEGIN + SET NOCOUNT ON + + SELECT + S.* + FROM + [dbo].[SubvaultView] S + WHERE + S.[OrganizationId] = @OrganizationId +END \ No newline at end of file diff --git a/src/Sql/dbo/Stored Procedures/Subvault_ReadByUserId.sql b/src/Sql/dbo/Stored Procedures/Subvault_ReadByUserId.sql index 2c9831241..9fa2e6db9 100644 --- a/src/Sql/dbo/Stored Procedures/Subvault_ReadByUserId.sql +++ b/src/Sql/dbo/Stored Procedures/Subvault_ReadByUserId.sql @@ -10,6 +10,8 @@ BEGIN [dbo].[SubvaultView] S INNER JOIN [SubvaultUser] SU ON SU.[SubvaultId] = S.[Id] + INNER JOIN + [OrganizationUser] OU ON SU.[OrganizationUserId] = OU.[Id] WHERE - SU.[UserId] = @UserId + OU.[UserId] = @UserId END \ No newline at end of file diff --git a/src/Sql/dbo/Tables/Group.sql b/src/Sql/dbo/Tables/Group.sql new file mode 100644 index 000000000..45111f54a --- /dev/null +++ b/src/Sql/dbo/Tables/Group.sql @@ -0,0 +1,10 @@ +CREATE TABLE [dbo].[Group] ( + [Id] UNIQUEIDENTIFIER NOT NULL, + [OrganizationId] UNIQUEIDENTIFIER NOT NULL, + [Name] NVARCHAR (50) NOT NULL, + [CreationDate] DATETIME NOT NULL, + [RevisionDate] DATETIME NOT NULL, + CONSTRAINT [PK_Group] PRIMARY KEY CLUSTERED ([Id] ASC), + CONSTRAINT [FK_Group_Organization] FOREIGN KEY ([OrganizationId]) REFERENCES [dbo].[Organization] ([Id]) +); + diff --git a/src/Sql/dbo/Tables/GroupUser.sql b/src/Sql/dbo/Tables/GroupUser.sql new file mode 100644 index 000000000..a6cedec99 --- /dev/null +++ b/src/Sql/dbo/Tables/GroupUser.sql @@ -0,0 +1,8 @@ +CREATE TABLE [dbo].[GroupUser] ( + [GroupId] UNIQUEIDENTIFIER NOT NULL, + [UserId] UNIQUEIDENTIFIER NOT NULL, + CONSTRAINT [PK_GroupUser] PRIMARY KEY CLUSTERED ([GroupId] ASC, [UserId] ASC), + CONSTRAINT [FK_GroupUser_Group] FOREIGN KEY ([GroupId]) REFERENCES [dbo].[Group] ([Id]), + CONSTRAINT [FK_GroupUser_User] FOREIGN KEY ([UserId]) REFERENCES [dbo].[User] ([Id]) +); + diff --git a/src/Sql/dbo/Tables/SubvaultGroup.sql b/src/Sql/dbo/Tables/SubvaultGroup.sql new file mode 100644 index 000000000..9443af67e --- /dev/null +++ b/src/Sql/dbo/Tables/SubvaultGroup.sql @@ -0,0 +1,8 @@ +CREATE TABLE [dbo].[SubvaultGroup] ( + [SubvaultId] UNIQUEIDENTIFIER NOT NULL, + [GroupId] UNIQUEIDENTIFIER NOT NULL, + CONSTRAINT [PK_SubvaultGroup] PRIMARY KEY CLUSTERED ([SubvaultId] ASC, [GroupId] ASC), + CONSTRAINT [FK_SubvaultGroup_Group] FOREIGN KEY ([GroupId]) REFERENCES [dbo].[Group] ([Id]), + CONSTRAINT [FK_SubvaultGroup_Subvault] FOREIGN KEY ([SubvaultId]) REFERENCES [dbo].[Subvault] ([Id]) +); + diff --git a/src/Sql/dbo/Tables/SubvaultUser.sql b/src/Sql/dbo/Tables/SubvaultUser.sql index 451bdc223..c32b5beb8 100644 --- a/src/Sql/dbo/Tables/SubvaultUser.sql +++ b/src/Sql/dbo/Tables/SubvaultUser.sql @@ -1,13 +1,13 @@ CREATE TABLE [dbo].[SubvaultUser] ( - [Id] UNIQUEIDENTIFIER NOT NULL, - [SubvaultId] UNIQUEIDENTIFIER NOT NULL, - [UserId] UNIQUEIDENTIFIER NOT NULL, - [Admin] BIT NOT NULL, - [ReadOnly] BIT NOT NULL, - [CreationDate] DATETIME2 (7) NOT NULL, - [RevisionDate] DATETIME2 (7) NOT NULL, + [Id] UNIQUEIDENTIFIER NOT NULL, + [SubvaultId] UNIQUEIDENTIFIER NOT NULL, + [OrganizationUserId] UNIQUEIDENTIFIER NOT NULL, + [Admin] BIT NOT NULL, + [ReadOnly] BIT NOT NULL, + [CreationDate] DATETIME2 (7) NOT NULL, + [RevisionDate] DATETIME2 (7) NOT NULL, CONSTRAINT [PK_SubvaultUser] PRIMARY KEY CLUSTERED ([Id] ASC), - CONSTRAINT [FK_SubvaultUser_Subvault] FOREIGN KEY ([SubvaultId]) REFERENCES [dbo].[Subvault] ([Id]), - CONSTRAINT [FK_SubvaultUser_User] FOREIGN KEY ([UserId]) REFERENCES [dbo].[User] ([Id]) + CONSTRAINT [FK_SubvaultUser_OrganizationUser] FOREIGN KEY ([OrganizationUserId]) REFERENCES [dbo].[OrganizationUser] ([Id]), + CONSTRAINT [FK_SubvaultUser_Subvault] FOREIGN KEY ([SubvaultId]) REFERENCES [dbo].[Subvault] ([Id]) ); diff --git a/src/Sql/dbo/Views/SubvaultUserView.sql b/src/Sql/dbo/Views/SubvaultUserView.sql new file mode 100644 index 000000000..d7a116fd9 --- /dev/null +++ b/src/Sql/dbo/Views/SubvaultUserView.sql @@ -0,0 +1,6 @@ +CREATE VIEW [dbo].[SubvaultUserView] +AS +SELECT + * +FROM + [dbo].[SubvaultUser] \ No newline at end of file diff --git a/src/Sql/dbo/Views/SubvaultView.sql b/src/Sql/dbo/Views/SubvaultView.sql index 429f2063f..130d77421 100644 --- a/src/Sql/dbo/Views/SubvaultView.sql +++ b/src/Sql/dbo/Views/SubvaultView.sql @@ -3,4 +3,4 @@ AS SELECT * FROM - [dbo].[Subvault] + [dbo].[Subvault] \ No newline at end of file