Initial public release of Warp.

Repo-Sync-Origin: warpdotdev/warp-internal@12af1d983b
This commit is contained in:
David Stern
2026-04-28 08:43:33 -05:00
commit 0dbd3d567a
4982 changed files with 1431549 additions and 0 deletions
+164
View File
@@ -0,0 +1,164 @@
use crate::{auth::UserUid, server::ids::ServerId};
use serde::{Deserialize, Serialize};
use std::cmp::Ordering;
use super::workspace::{
BillingMetadata, EmailInvite, InviteLinkDomainRestriction, WorkspaceInviteCode,
WorkspaceSettings,
};
#[derive(Clone, Copy, Eq, PartialEq, Debug, Serialize, Deserialize)]
pub enum MembershipRole {
Owner,
Admin,
User,
}
impl MembershipRole {
pub fn is_admin_or_owner(&self) -> bool {
matches!(self, MembershipRole::Admin | MembershipRole::Owner)
}
pub fn is_owner(&self) -> bool {
matches!(self, MembershipRole::Owner)
}
}
#[derive(Clone, Eq, PartialEq, Debug, Serialize, Deserialize)]
pub struct TeamMember {
pub uid: UserUid,
pub email: String,
pub role: MembershipRole,
}
impl PartialOrd for TeamMember {
fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
Some(self.cmp(other))
}
}
impl Ord for TeamMember {
fn cmp(&self, other: &Self) -> Ordering {
self.email.cmp(&other.email)
}
}
#[derive(Clone, Debug)]
pub struct DiscoverableTeam {
pub team_uid: String,
pub num_members: i64,
pub name: String,
pub team_accepting_invites: bool,
}
#[derive(PartialEq, Eq, Clone)]
pub enum TeamDeleteDisabledReason {
ActivePaidSubscription,
RemainingBonusCredits,
OtherMembers,
}
impl TeamDeleteDisabledReason {
pub fn user_facing_message(&self) -> &str {
match self {
TeamDeleteDisabledReason::ActivePaidSubscription => {
"Your team cannot be deleted with an active subscription."
}
TeamDeleteDisabledReason::RemainingBonusCredits => {
"Your team cannot be deleted with unused add-on credits."
}
TeamDeleteDisabledReason::OtherMembers => {
"Your team cannot be deleted with other team members."
}
}
}
}
#[derive(Clone, Debug)]
pub struct Team {
pub uid: ServerId,
pub name: String,
pub invite_code: Option<WorkspaceInviteCode>,
pub members: Vec<TeamMember>,
pub pending_email_invites: Vec<EmailInvite>,
pub invite_link_domain_restrictions: Vec<InviteLinkDomainRestriction>,
pub billing_metadata: BillingMetadata,
pub stripe_customer_id: Option<String>,
pub organization_settings: WorkspaceSettings,
/// If the team is eligible for discovery, then show toggle for setting discoverability to the team's admin
pub is_eligible_for_discovery: bool,
pub has_billing_history: bool,
}
impl Team {
pub fn from_local_cache(
uid: ServerId,
name: String,
workspace_settings: Option<WorkspaceSettings>,
billing_metadata: Option<BillingMetadata>,
members: Option<Vec<TeamMember>>,
) -> Self {
Self {
uid,
name,
invite_code: Default::default(),
members: members.unwrap_or_default(),
pending_email_invites: Default::default(),
invite_link_domain_restrictions: Default::default(),
billing_metadata: billing_metadata.unwrap_or_default(),
stripe_customer_id: Default::default(),
organization_settings: workspace_settings.unwrap_or_default(),
is_eligible_for_discovery: false,
has_billing_history: false,
}
}
fn get_member_by_email(&self, email: &str) -> Option<&TeamMember> {
self.members.iter().find(|member| member.email == email)
}
pub fn has_owner_permissions(&self, user_email: &str) -> bool {
self.get_member_by_email(user_email)
.is_some_and(|member| member.role.is_owner())
}
pub fn is_multi_admin_enabled(&self) -> bool {
self.billing_metadata
.tier
.multi_admin_policy
.is_some_and(|policy| policy.enabled)
}
pub fn has_admin_permissions(&self, user_email: &str) -> bool {
self.get_member_by_email(user_email).is_some_and(|member| {
member.role.is_owner()
|| (member.role == MembershipRole::Admin && self.is_multi_admin_enabled())
})
}
pub fn get_delete_disabled_reason(
&self,
current_user_email: &str,
remaining_workspace_credits: i32,
) -> Option<TeamDeleteDisabledReason> {
if self.members.len() > 1
|| self
.members
.first()
.is_none_or(|m| m.email != current_user_email)
{
return Some(TeamDeleteDisabledReason::OtherMembers);
}
if self.billing_metadata.is_user_on_paid_plan() {
return Some(TeamDeleteDisabledReason::ActivePaidSubscription);
}
if remaining_workspace_credits > 0 {
return Some(TeamDeleteDisabledReason::RemainingBonusCredits);
}
None // No reason found, team can be deleted
}
pub fn is_custom_llm_enabled(&self) -> bool {
self.organization_settings.llm_settings.enabled
}
}