credentials.ts 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. import { api } from './client'
  2. export type CredentialType = 'basic' | 'bearer' | 'api_key' | 'oauth2' | 'imap' | 'smtp' | 'mysql' | 'postgresql'
  3. export interface CredentialInfo {
  4. id: string
  5. name: string
  6. description?: string
  7. type: CredentialType
  8. createdBy: string
  9. createdAt: number
  10. // The named type this was created as, when a node registered one. The type
  11. // above is still what decides how it is stored and used.
  12. declaredType?: string
  13. updatedAt: number
  14. allowedWorkflows: string[]
  15. publicData?: Record<string, unknown> // Non-secret fields for editing
  16. }
  17. export interface BasicAuthData {
  18. username: string
  19. password: string
  20. }
  21. export interface BearerTokenData {
  22. token: string
  23. }
  24. export interface ApiKeyData {
  25. header_name: string
  26. key_value: string
  27. }
  28. export interface OAuth2Data {
  29. grant_type: 'client_credentials' | 'authorization_code'
  30. client_id: string
  31. client_secret: string
  32. token_url: string
  33. auth_url?: string
  34. scope?: string
  35. access_token?: string
  36. refresh_token?: string
  37. expires_at?: number
  38. }
  39. export interface ImapData {
  40. host: string
  41. port: number
  42. username: string
  43. password: string
  44. use_ssl: boolean
  45. }
  46. export interface MysqlData {
  47. host: string
  48. port: number
  49. username: string
  50. password: string
  51. database: string
  52. use_ssl: boolean
  53. }
  54. export interface PostgresqlData {
  55. host: string
  56. port: number
  57. username: string
  58. password: string
  59. database: string
  60. use_ssl: boolean
  61. }
  62. export interface CreateCredentialRequest {
  63. // A node-registered type such as "sdcpp". Optional: the built-in type below
  64. // is still what the store uses.
  65. declaredType?: string
  66. name: string
  67. description?: string
  68. type: CredentialType
  69. data: BasicAuthData | BearerTokenData | ApiKeyData | OAuth2Data | ImapData | MysqlData | PostgresqlData
  70. allowedWorkflows?: string[]
  71. }
  72. export interface UpdateCredentialRequest {
  73. name?: string
  74. description?: string
  75. data?: BasicAuthData | BearerTokenData | ApiKeyData | OAuth2Data | ImapData | MysqlData | PostgresqlData
  76. allowedWorkflows?: string[]
  77. }
  78. // Transform backend credential data to frontend format
  79. function transformCredential(data: any): CredentialInfo {
  80. return {
  81. id: data.id || data._id,
  82. name: data.name,
  83. description: data.description,
  84. type: data.type,
  85. createdBy: data.createdBy || data.ownerId,
  86. createdAt: data.createdAt || data._createdAt,
  87. declaredType: data.declaredType || undefined,
  88. updatedAt: data.updatedAt || data._updatedAt,
  89. allowedWorkflows: data.allowedWorkflows || [],
  90. publicData: data.publicData,
  91. }
  92. }
  93. export const credentialsApi = {
  94. list: async (): Promise<{ credentials: CredentialInfo[] }> => {
  95. const response = await api.get('/credentials')
  96. return {
  97. ...response.data,
  98. credentials: (response.data.credentials || []).map(transformCredential),
  99. }
  100. },
  101. get: async (id: string): Promise<CredentialInfo> => {
  102. const response = await api.get(`/credentials/${id}`)
  103. return transformCredential(response.data)
  104. },
  105. create: async (data: CreateCredentialRequest): Promise<CredentialInfo> => {
  106. const response = await api.post('/credentials', data)
  107. return transformCredential(response.data)
  108. },
  109. update: async (id: string, data: UpdateCredentialRequest): Promise<CredentialInfo> => {
  110. const response = await api.put(`/credentials/${id}`, data)
  111. return transformCredential(response.data)
  112. },
  113. delete: async (id: string): Promise<void> => {
  114. await api.delete(`/credentials/${id}`)
  115. },
  116. refreshOAuth2: async (id: string): Promise<{ success: boolean; expiresAt?: number }> => {
  117. const response = await api.post(`/credentials/${id}/refresh`)
  118. return response.data
  119. },
  120. }