diff --git a/src/app/api/bots/route.ts b/src/app/api/bots/route.ts index b6d6e62..8e01f91 100644 --- a/src/app/api/bots/route.ts +++ b/src/app/api/bots/route.ts @@ -17,7 +17,7 @@ import { BotHandleTakenError, BotValidationError, } from '@/lib/bots/botManager'; -import { generateAndUploadAvatarToUserStorage } from '@/lib/storage/s3'; +import { generateAndUploadAvatarToUserStorage, decryptS3Credentials } from '@/lib/storage/s3'; // Schema for creating a bot const createBotSchema = z.object({ @@ -68,15 +68,21 @@ export async function POST(request: Request) { const nodeDomain = process.env.NEXT_PUBLIC_NODE_DOMAIN || 'localhost:3000'; const botHandle = `${data.handle.toLowerCase()}@${nodeDomain}`; - botAvatarUrl = await generateAndUploadAvatarToUserStorage( - botHandle, - user.storageEndpoint ?? undefined, - user.storageRegion || 'auto', - user.storageBucket, + // Decrypt the storage credentials + const { accessKeyId, secretAccessKey } = decryptS3Credentials( user.storageAccessKeyEncrypted, user.storageSecretKeyEncrypted, data.ownerPassword ); + + botAvatarUrl = await generateAndUploadAvatarToUserStorage( + botHandle, + user.storageEndpoint, + user.storageRegion || 'auto', + user.storageBucket, + accessKeyId, + secretAccessKey + ); } catch (err) { console.error('[Bot API] Failed to generate bot avatar:', err); // Continue without avatar - user can set it later diff --git a/src/lib/storage/s3.ts b/src/lib/storage/s3.ts index 2c6b95b..3dff601 100644 --- a/src/lib/storage/s3.ts +++ b/src/lib/storage/s3.ts @@ -25,7 +25,7 @@ interface StorageUploadResult { /** * Decrypt S3 credentials from encrypted storage */ -function decryptS3Credentials( +export function decryptS3Credentials( encryptedAccessKey: string, encryptedSecretKey: string, password: string