use origin_domain::{ConnectorId, ProductPermission};
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[cfg_attr(feature = "ts", derive(ts_rs::TS))]
#[serde(rename_all = "snake_case")]
pub enum AuthKind {
OAuth2,
PersonalAccessToken,
None,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[cfg_attr(feature = "ts", derive(ts_rs::TS))]
pub struct ConnectorDescriptor {
pub id: ConnectorId,
pub display_name: String,
pub auth: AuthKind,
pub required_permissions: Vec<ProductPermission>,
pub supports_multiple_accounts: bool,
}
impl ConnectorDescriptor {
pub fn new(id: ConnectorId, display_name: impl Into<String>, auth: AuthKind) -> Self {
Self {
id,
display_name: display_name.into(),
auth,
required_permissions: Vec::new(),
supports_multiple_accounts: true,
}
}
pub fn with_permissions(
mut self,
permissions: impl IntoIterator<Item = ProductPermission>,
) -> Self {
self.required_permissions = permissions.into_iter().collect();
self
}
pub fn single_account(mut self) -> Self {
self.supports_multiple_accounts = false;
self
}
pub fn requests_write_access(&self) -> bool {
self.required_permissions
.iter()
.any(ProductPermission::is_write)
}
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[cfg_attr(feature = "ts", derive(ts_rs::TS))]
pub struct AccountIdentity {
pub external_id: String,
pub display_name: String,
pub granted_scopes: Vec<String>,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn a_read_only_connector_declares_no_write_permissions() {
let descriptor =
ConnectorDescriptor::new(ConnectorId::new("analytics"), "Analytics", AuthKind::OAuth2)
.with_permissions([ProductPermission::read("analytics.reports")]);
assert!(!descriptor.requests_write_access());
}
#[test]
fn write_access_is_visible_in_the_descriptor() {
let descriptor =
ConnectorDescriptor::new(ConnectorId::new("github"), "GitHub", AuthKind::OAuth2)
.with_permissions([
ProductPermission::read("notifications"),
ProductPermission::write("projects"),
]);
assert!(descriptor.requests_write_access());
}
}