Files
server/src/Api/Models/Request/Organizations/OrganizationCreateRequestModel.cs

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

104 lines
4.1 KiB
C#
Raw Normal View History

2021-12-14 15:05:07 +00:00
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using Bit.Core.Entities;
using Bit.Core.Enums;
using Bit.Core.Models.Business;
2017-08-30 21:25:46 -04:00
using Bit.Core.Utilities;
2021-12-14 15:05:07 +00:00
namespace Bit.Api.Models.Request.Organizations
{
2017-04-04 12:57:50 -04:00
public class OrganizationCreateRequestModel : IValidatableObject
{
2017-04-04 12:57:50 -04:00
[Required]
[StringLength(50)]
public string Name { get; set; }
2017-04-04 12:57:50 -04:00
[StringLength(50)]
public string BusinessName { get; set; }
[Required]
[StringLength(256)]
2017-05-03 11:05:15 -04:00
[EmailAddress]
2017-04-04 12:57:50 -04:00
public string BillingEmail { get; set; }
public PlanType PlanType { get; set; }
2017-04-04 12:57:50 -04:00
[Required]
public string Key { get; set; }
public OrganizationKeysRequestModel Keys { get; set; }
public PaymentMethodType? PaymentMethodType { get; set; }
2017-04-08 16:41:40 -04:00
public string PaymentToken { get; set; }
Support large organization sync (#1311) * Increase organization max seat size from 30k to 2b (#1274) * Increase organization max seat size from 30k to 2b * PR review. Do not modify unless state matches expected * Organization sync simultaneous event reporting (#1275) * Split up azure messages according to max size * Allow simultaneous login of organization user events * Early resolve small event lists * Clarify logic Co-authored-by: Chad Scharf <3904944+cscharf@users.noreply.github.com> * Improve readability This comes at the cost of multiple serializations, but the improvement in wire-time should more than make up for this on message where serialization time matters Co-authored-by: Chad Scharf <3904944+cscharf@users.noreply.github.com> * Queue emails (#1286) * Extract common Azure queue methods * Do not use internal entity framework namespace * Prefer IEnumerable to IList unless needed All of these implementations were just using `Count == 1`, which is easily replicated. This will be used when abstracting Azure queues * Add model for azure queue message * Abstract Azure queue for reuse * Creat service to enqueue mail messages for later processing Azure queue mail service uses Azure queues. Blocking just blocks until all the work is done -- This is how emailing works today * Provide mail queue service to DI * Queue organization invite emails for later processing All emails can later be added to this queue * Create Admin hosted service to process enqueued mail messages * Prefer constructors to static generators * Mass delete organization users (#1287) * Add delete many to Organization Users * Correct formatting * Remove erroneous migration * Clarify parameter name * Formatting fixes * Simplify bump account revision sproc * Formatting fixes * Match file names to objects * Indicate if large import is expected * Early pull all existing users we were planning on inviting (#1290) * Early pull all existing users we were planning on inviting * Improve sproc name * Batch upsert org users (#1289) * Add UpsertMany sprocs to OrganizationUser * Add method to create TVPs from any object. Uses DbOrder attribute to generate. Sproc will fail unless TVP column order matches that of the db type * Combine migrations * Correct formatting * Include sql objects in sql project * Keep consisten parameter names * Batch deletes for performance * Correct formatting * consolidate migrations * Use batch methods in OrganizationImport * Declare @BatchSize * Transaction names limited to 32 chars Drop sproc before creating it if it exists * Update import tests * Allow for more users in org upgrades * Fix formatting * Improve class hierarchy structure * Use name tuple types * Fix formatting * Front load all reflection * Format constructor * Simplify ToTvp as class-specific extension Co-authored-by: Chad Scharf <3904944+cscharf@users.noreply.github.com>
2021-05-17 09:43:02 -05:00
[Range(0, int.MaxValue)]
public int AdditionalSeats { get; set; }
2017-07-11 10:25:00 -04:00
[Range(0, 99)]
public short? AdditionalStorageGb { get; set; }
public bool PremiumAccessAddon { get; set; }
2017-08-30 21:25:46 -04:00
[EncryptedString]
2018-08-02 08:57:32 -04:00
[EncryptedStringLength(1000)]
2017-08-30 21:25:46 -04:00
public string CollectionName { get; set; }
2020-06-08 17:40:18 -04:00
public string TaxIdNumber { get; set; }
public string BillingAddressLine1 { get; set; }
public string BillingAddressLine2 { get; set; }
public string BillingAddressCity { get; set; }
public string BillingAddressState { get; set; }
public string BillingAddressPostalCode { get; set; }
[StringLength(2)]
public string BillingAddressCountry { get; set; }
public int? MaxAutoscaleSeats { get; set; }
public virtual OrganizationSignup ToOrganizationSignup(User user)
{
var orgSignup = new OrganizationSignup
{
Owner = user,
OwnerKey = Key,
Name = Name,
2017-04-04 10:13:16 -04:00
Plan = PlanType,
PaymentMethodType = PaymentMethodType,
2017-04-08 16:41:40 -04:00
PaymentToken = PaymentToken,
AdditionalSeats = AdditionalSeats,
MaxAutoscaleSeats = MaxAutoscaleSeats,
2017-07-11 10:25:00 -04:00
AdditionalStorageGb = AdditionalStorageGb.GetValueOrDefault(0),
PremiumAccessAddon = PremiumAccessAddon,
2017-04-04 12:57:50 -04:00
BillingEmail = BillingEmail,
2017-08-30 21:25:46 -04:00
BusinessName = BusinessName,
2020-06-08 17:40:18 -04:00
CollectionName = CollectionName,
TaxInfo = new TaxInfo
{
TaxIdNumber = TaxIdNumber,
BillingAddressLine1 = BillingAddressLine1,
BillingAddressLine2 = BillingAddressLine2,
BillingAddressCity = BillingAddressCity,
BillingAddressState = BillingAddressState,
BillingAddressPostalCode = BillingAddressPostalCode,
BillingAddressCountry = BillingAddressCountry,
},
};
Keys?.ToOrganizationSignup(orgSignup);
return orgSignup;
}
2017-04-04 12:57:50 -04:00
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
if (PlanType != PlanType.Free && string.IsNullOrWhiteSpace(PaymentToken))
2017-04-04 12:57:50 -04:00
{
2017-04-08 16:41:40 -04:00
yield return new ValidationResult("Payment required.", new string[] { nameof(PaymentToken) });
2017-04-04 12:57:50 -04:00
}
if (PlanType != PlanType.Free && !PaymentMethodType.HasValue)
2019-02-26 12:45:34 -05:00
{
yield return new ValidationResult("Payment method type required.",
new string[] { nameof(PaymentMethodType) });
}
2020-06-08 17:40:18 -04:00
if (PlanType != PlanType.Free && string.IsNullOrWhiteSpace(BillingAddressCountry))
{
yield return new ValidationResult("Country required.",
new string[] { nameof(BillingAddressCountry) });
}
if (PlanType != PlanType.Free && BillingAddressCountry == "US" &&
string.IsNullOrWhiteSpace(BillingAddressPostalCode))
{
yield return new ValidationResult("Zip / postal code is required.",
new string[] { nameof(BillingAddressPostalCode) });
}
2017-04-04 12:57:50 -04:00
}
}
}