AIProvider converts a database row plus its API keys into the codersdk shape. The caller is responsible for ensuring the row and keys have been decrypted (i.e. fetched through the dbcrypt-wrapped store). Each api_key is masked via aibridge utils.MaskSecret and write-only fields on Settings are strip
(row database.AIProvider, keys []database.AIProviderKey)
| 50 | // write-only fields on Settings are stripped, so the result is safe |
| 51 | // to echo back in API responses. |
| 52 | func AIProvider(row database.AIProvider, keys []database.AIProviderKey) (codersdk.AIProvider, error) { |
| 53 | display := row.Name |
| 54 | if row.DisplayName.Valid && row.DisplayName.String != "" { |
| 55 | display = row.DisplayName.String |
| 56 | } |
| 57 | out := codersdk.AIProvider{ |
| 58 | ID: row.ID, |
| 59 | Type: codersdk.AIProviderType(row.Type), |
| 60 | Name: row.Name, |
| 61 | DisplayName: display, |
| 62 | Enabled: row.Enabled, |
| 63 | BaseURL: row.BaseUrl, |
| 64 | APIKeys: maskAIProviderKeys(keys), |
| 65 | CreatedAt: row.CreatedAt, |
| 66 | UpdatedAt: row.UpdatedAt, |
| 67 | } |
| 68 | s, err := AIProviderSettings(row.Settings) |
| 69 | if err != nil { |
| 70 | return codersdk.AIProvider{}, xerrors.Errorf("decode settings: %w", err) |
| 71 | } |
| 72 | out.Settings = redactAIProviderSettings(s) |
| 73 | return out, nil |
| 74 | } |
| 75 | |
| 76 | // AIProviderSettings parses the on-disk JSON form back into a codersdk |
| 77 | // settings value. SQL NULL and the empty string decode to the zero |
no test coverage detected