1
0
mirror of https://github.com/bitwarden/server.git synced 2025-07-04 01:22:50 -05:00

Org admin cleanup

- Added sproc to check if org admin for free org create
- Removed old proeprties not in user from org and subvault
- Added more cascade deletes
This commit is contained in:
Kyle Spearrin
2017-04-07 14:52:31 -04:00
parent 52ccef85c6
commit 7497d5ca6f
29 changed files with 47 additions and 98 deletions

View File

@ -44,14 +44,12 @@ namespace Bit.Core.Models.Api
{
[Required]
public string SubvaultId { get; set; }
public bool Admin { get; set; }
public bool ReadOnly { get; set; }
public SubvaultUser ToSubvaultUser()
{
var subvault = new SubvaultUser
{
Admin = Admin,
ReadOnly = ReadOnly,
SubvaultId = new Guid(SubvaultId)
};

View File

@ -1,9 +1,5 @@
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;
@ -20,7 +16,6 @@ namespace Bit.Core.Models.Api
{
OrganizationUserId = new Guid(UserId),
SubvaultId = new Guid(s.SubvaultId),
Admin = s.Admin,
ReadOnly = s.ReadOnly
});
}
@ -28,7 +23,6 @@ namespace Bit.Core.Models.Api
public class Subvault
{
public string SubvaultId { get; set; }
public bool Admin { get; set; }
public bool ReadOnly { get; set; }
}
}
@ -36,7 +30,6 @@ namespace Bit.Core.Models.Api
public class SubvaultUserUserRequestModel
{
public string UserId { get; set; }
public bool Admin { get; set; }
public bool ReadOnly { get; set; }
}
}

View File

@ -23,7 +23,6 @@ namespace Bit.Core.Models.Api
BillingEmail = organization.BillingEmail;
Plan = organization.Plan;
PlanType = organization.PlanType;
PlanTrial = organization.PlanTrial;
MaxUsers = organization.MaxUsers;
}
@ -33,7 +32,6 @@ namespace Bit.Core.Models.Api
public string BillingEmail { get; set; }
public string Plan { get; set; }
public Enums.PlanType PlanType { get; set; }
public bool PlanTrial { get; set; }
public short MaxUsers { get; set; }
}

View File

@ -18,13 +18,11 @@ namespace Bit.Core.Models.Api
Name = details.Name;
SubvaultId = details.SubvaultId.ToString();
ReadOnly = details.ReadOnly;
Admin = details.Admin;
}
public string Id { get; set; }
public string Name { get; set; }
public string SubvaultId { get; set; }
public bool ReadOnly { get; set; }
public bool Admin { get; set; }
}
}

View File

@ -23,7 +23,6 @@ namespace Bit.Core.Models.Api
Type = subvaultUser.Type;
Status = subvaultUser.Status;
ReadOnly = subvaultUser.ReadOnly;
Admin = subvaultUser.Admin;
}
public string Id { get; set; }
@ -34,6 +33,5 @@ namespace Bit.Core.Models.Api
public OrganizationUserType Type { get; set; }
public OrganizationUserStatusType Status { get; set; }
public bool ReadOnly { get; set; }
public bool Admin { get; set; }
}
}

View File

@ -6,6 +6,5 @@ namespace Bit.Core.Models.Data
{
public Guid SubvaultId { get; set; }
public bool ReadOnly { get; set; }
public bool Admin { get; set; }
}
}

View File

@ -9,6 +9,5 @@ namespace Bit.Core.Models.Data
public string Name { get; set; }
public Guid SubvaultId { get; set; }
public bool ReadOnly { get; set; }
public bool Admin { get; set; }
}
}

View File

@ -12,6 +12,5 @@ namespace Bit.Core.Models.Data
public Enums.OrganizationUserStatusType Status { get; set; }
public Enums.OrganizationUserType Type { get; set; }
public bool ReadOnly { get; set; }
public bool Admin { get; set; }
}
}

View File

@ -13,12 +13,6 @@ namespace Bit.Core.Models.Table
public string BillingEmail { get; set; }
public string Plan { get; set; }
public PlanType PlanType { get; set; }
public decimal PlanBasePrice { get; set; }
public decimal PlanUserPrice { get; set; }
public DateTime? PlanRenewalDate { get; set; }
public bool PlanTrial { get; set; }
public short BaseUsers { get; set; }
public short AdditionalUsers { get; set; }
public short MaxUsers { get; set; }
public string StripeCustomerId { get; set; }
public string StripeSubscriptionId { get; set; }

View File

@ -8,7 +8,6 @@ namespace Bit.Core.Models.Table
public Guid Id { get; set; }
public Guid SubvaultId { 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;
public DateTime RevisionDate { get; internal set; } = DateTime.UtcNow;

View File

@ -9,6 +9,7 @@ namespace Bit.Core.Repositories
{
public interface IOrganizationUserRepository : IRepository<OrganizationUser, Guid>
{
Task<int> GetCountByFreeOrganizationAdminUserAsync(Guid userId);
Task<ICollection<OrganizationUser>> GetManyByUserAsync(Guid userId);
Task<ICollection<OrganizationUser>> GetManyByOrganizationAsync(Guid organizationId, OrganizationUserType? type);
Task<OrganizationUser> GetByOrganizationAsync(Guid organizationId, string email);

View File

@ -21,6 +21,19 @@ namespace Bit.Core.Repositories.SqlServer
: base(connectionString)
{ }
public async Task<int> GetCountByFreeOrganizationAdminUserAsync(Guid userId)
{
using(var connection = new SqlConnection(ConnectionString))
{
var results = await connection.ExecuteScalarAsync<int>(
"[dbo].[OrganizationUser_ReadCountByFreeOrganizationAdminUser]",
new { UserId = userId },
commandType: CommandType.StoredProcedure);
return results;
}
}
public async Task<OrganizationUser> GetByOrganizationAsync(Guid organizationId, string email)
{
using(var connection = new SqlConnection(ConnectionString))

View File

@ -89,9 +89,9 @@ namespace Bit.Core.Services
if(plan.Type == Enums.PlanType.Free)
{
var ownerExistingOrgs = await _organizationUserRepository.GetManyByUserAsync(signup.Owner.Id);
if(ownerExistingOrgs.Any(ou => ou.Type == Enums.OrganizationUserType.Owner ||
ou.Type == Enums.OrganizationUserType.Admin))
var ownerExistingOrgCount =
await _organizationUserRepository.GetCountByFreeOrganizationAdminUserAsync(signup.Owner.Id);
if(ownerExistingOrgCount > 0)
{
throw new BadRequestException("You can only be an admin of one free organization.");
}
@ -136,13 +136,7 @@ namespace Bit.Core.Services
BusinessName = signup.BusinessName,
UserId = signup.Owner.Id,
PlanType = plan.Type,
BaseUsers = plan.BaseUsers,
AdditionalUsers = (short)(plan.CanBuyAdditionalUsers ? signup.AdditionalUsers : 0),
MaxUsers = (short)(plan.BaseUsers + (plan.CanBuyAdditionalUsers ? signup.AdditionalUsers : 0)),
PlanTrial = plan.Trial.HasValue,
PlanBasePrice = plan.CanMonthly && signup.Monthly ? plan.BaseMonthlyPrice : plan.BaseAnnualPrice,
PlanUserPrice = plan.CanMonthly && signup.Monthly ? plan.UserMonthlyPrice : plan.UserAnnualPrice,
PlanRenewalDate = subscription?.CurrentPeriodEnd,
Plan = plan.ToString(),
StripeCustomerId = customer?.Id,
StripeSubscriptionId = subscription?.Id,
@ -254,8 +248,8 @@ namespace Bit.Core.Services
throw new BadRequestException("Already accepted.");
}
var existingOrgs = await _organizationUserRepository.GetManyByUserAsync(user.Id);
if(existingOrgs.Any(ou => ou.Type == Enums.OrganizationUserType.Owner || ou.Type == Enums.OrganizationUserType.Admin))
var ownerExistingOrgCount = await _organizationUserRepository.GetCountByFreeOrganizationAdminUserAsync(user.Id);
if(ownerExistingOrgCount > 0)
{
throw new BadRequestException("You can only be an admin of one free organization.");
}