mirror of
https://github.com/warmbly/warmbly.git
synced 2026-08-19 16:01:16 +00:00
118 lines
5.3 KiB
Go
118 lines
5.3 KiB
Go
package models
|
|
|
|
// API Permissions: bitmask of scopes granted to a given API key.
|
|
// Distinct from OrganizationPermission (which gates UI users) and
|
|
// AdminPermission (which gates platform admins). uint64 leaves room
|
|
// for ~50 more scopes before we have to widen the column.
|
|
const (
|
|
// Read permissions
|
|
APIPermReadEmails uint64 = 1 << iota // Read email accounts
|
|
APIPermReadCampaigns // Read campaigns + sequences
|
|
APIPermReadContacts // Read contacts, notes, activities
|
|
APIPermReadUnibox // Read unified inbox
|
|
APIPermReadAnalytics // Read analytics + statistics
|
|
|
|
// Write permissions
|
|
APIPermWriteEmails // Modify email accounts
|
|
APIPermWriteCampaigns // Create/modify campaigns + sequences
|
|
APIPermWriteContacts // Create/modify contacts, notes, activities
|
|
APIPermWriteUnibox // Mark as seen, reply, etc.
|
|
|
|
// Bulk operations (separate so a key can read+write without bulk power)
|
|
APIPermBulkContacts // Bulk contact import/export/delete
|
|
APIPermBulkCampaigns // Bulk campaign operations
|
|
|
|
// Realtime + integrations
|
|
APIPermRealtimeSubscribe // Subscribe to realtime events
|
|
APIPermWebhooks // Manage webhook endpoints (reserved)
|
|
|
|
// Self-service
|
|
APIPermAPIKeys // Create / list / revoke API keys via the API
|
|
|
|
// Campaign lifecycle (separated from WriteCampaigns since starting
|
|
// a campaign actually sends mail and is materially different from
|
|
// editing its draft).
|
|
APIPermSendCampaigns
|
|
|
|
// Templates + CRM are first-class scopes — they're useful to expose
|
|
// without granting full campaign write.
|
|
APIPermReadTemplates
|
|
APIPermWriteTemplates
|
|
APIPermReadCRM
|
|
APIPermWriteCRM
|
|
|
|
// Audit trail
|
|
APIPermReadAuditLogs
|
|
)
|
|
|
|
// AllAPIPermissionsMask is the OR of every defined permission bit.
|
|
// Used to reject CreateAPIKey requests that include unknown bits, so
|
|
// a future bit can't be granted accidentally by a stale client.
|
|
const AllAPIPermissionsMask uint64 = APIPermReadEmails | APIPermReadCampaigns |
|
|
APIPermReadContacts | APIPermReadUnibox | APIPermReadAnalytics |
|
|
APIPermWriteEmails | APIPermWriteCampaigns | APIPermWriteContacts |
|
|
APIPermWriteUnibox |
|
|
APIPermBulkContacts | APIPermBulkCampaigns |
|
|
APIPermRealtimeSubscribe | APIPermWebhooks |
|
|
APIPermAPIKeys |
|
|
APIPermSendCampaigns |
|
|
APIPermReadTemplates | APIPermWriteTemplates |
|
|
APIPermReadCRM | APIPermWriteCRM |
|
|
APIPermReadAuditLogs
|
|
|
|
// Preset permission sets surfaced via GET /api-keys/permissions so a
|
|
// caller can grant a sane default without picking bits by hand.
|
|
var (
|
|
APIPermReadOnly uint64 = APIPermReadEmails | APIPermReadCampaigns |
|
|
APIPermReadContacts | APIPermReadUnibox | APIPermReadAnalytics |
|
|
APIPermReadTemplates | APIPermReadCRM | APIPermReadAuditLogs
|
|
|
|
APIPermFullAccess uint64 = APIPermReadOnly |
|
|
APIPermWriteEmails | APIPermWriteCampaigns | APIPermWriteContacts |
|
|
APIPermWriteUnibox |
|
|
APIPermBulkContacts | APIPermBulkCampaigns |
|
|
APIPermSendCampaigns |
|
|
APIPermWriteTemplates | APIPermWriteCRM |
|
|
APIPermRealtimeSubscribe | APIPermWebhooks | APIPermAPIKeys
|
|
)
|
|
|
|
type APIPermission struct {
|
|
Name string `json:"name"`
|
|
Value uint64 `json:"value"`
|
|
Description string `json:"description"`
|
|
Category string `json:"category"` // read, write, bulk, special
|
|
}
|
|
|
|
var AllAPIPermissions = []APIPermission{
|
|
{"READ_EMAILS", APIPermReadEmails, "View email accounts and settings", "read"},
|
|
{"READ_CAMPAIGNS", APIPermReadCampaigns, "View campaigns and sequences", "read"},
|
|
{"READ_CONTACTS", APIPermReadContacts, "View contact lists, notes, and activities", "read"},
|
|
{"READ_UNIBOX", APIPermReadUnibox, "Access unified inbox", "read"},
|
|
{"READ_ANALYTICS", APIPermReadAnalytics, "View analytics and statistics", "read"},
|
|
{"READ_TEMPLATES", APIPermReadTemplates, "View reply templates", "read"},
|
|
{"READ_CRM", APIPermReadCRM, "View pipelines, deals, and CRM tasks", "read"},
|
|
{"READ_AUDIT_LOGS", APIPermReadAuditLogs, "View organization audit logs", "read"},
|
|
{"WRITE_EMAILS", APIPermWriteEmails, "Modify email account settings", "write"},
|
|
{"WRITE_CAMPAIGNS", APIPermWriteCampaigns, "Create and modify campaigns and sequences", "write"},
|
|
{"WRITE_CONTACTS", APIPermWriteContacts, "Create and modify contacts, notes, and activities", "write"},
|
|
{"WRITE_UNIBOX", APIPermWriteUnibox, "Mark emails as read/unread and send replies", "write"},
|
|
{"WRITE_TEMPLATES", APIPermWriteTemplates, "Create and modify reply templates", "write"},
|
|
{"WRITE_CRM", APIPermWriteCRM, "Create and modify pipelines, deals, and CRM tasks", "write"},
|
|
{"SEND_CAMPAIGNS", APIPermSendCampaigns, "Start and stop campaigns (sends real mail)", "write"},
|
|
{"BULK_CONTACTS", APIPermBulkContacts, "Bulk import/export/delete contacts", "bulk"},
|
|
{"BULK_CAMPAIGNS", APIPermBulkCampaigns, "Bulk campaign operations", "bulk"},
|
|
{"REALTIME_SUBSCRIBE", APIPermRealtimeSubscribe, "Subscribe to realtime events", "special"},
|
|
{"WEBHOOKS", APIPermWebhooks, "Manage webhook endpoints", "special"},
|
|
{"API_KEYS", APIPermAPIKeys, "Create and manage API keys", "special"},
|
|
}
|
|
|
|
// HasAPIPermission reports whether the bitmask grants every bit in `required`.
|
|
func HasAPIPermission(permissions uint64, required uint64) bool {
|
|
return permissions&required == required
|
|
}
|
|
|
|
// HasAnyAPIPermission reports whether the bitmask grants at least one bit in `required`.
|
|
func HasAnyAPIPermission(permissions uint64, required uint64) bool {
|
|
return permissions&required != 0
|
|
}
|