From 67d88f5d8c5a88eb28e7b5c98e6e271cce8532d7 Mon Sep 17 00:00:00 2001 From: "Carlos (Almeira)" Date: Tue, 7 Jul 2026 13:22:51 -0500 Subject: [PATCH] feat: implement multistreaming module with Appwrite backend and UI setup --- setup_multistream_appwrite.js | 75 +++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 setup_multistream_appwrite.js diff --git a/setup_multistream_appwrite.js b/setup_multistream_appwrite.js new file mode 100644 index 0000000..fe42126 --- /dev/null +++ b/setup_multistream_appwrite.js @@ -0,0 +1,75 @@ +const sdk = require('node-appwrite'); +require('dotenv').config({ path: '.env.local' }); + +// Script para inicializar la colección "SocialAccounts" en Appwrite para la Gestión Multistreaming +async function setupMultistreamAppwrite() { + console.log("Iniciando setup de Multistreaming en Appwrite..."); + + const client = new sdk.Client() + .setEndpoint(process.env.APPWRITE_ENDPOINT || 'https://appwrite.almeira.com.co/v1') + .setProject(process.env.APPWRITE_PROJECT_ID || '69b84df5003bd8957c5c') + .setKey(process.env.APPWRITE_API_KEY); + + const databases = new sdk.Databases(client); + const DATABASE_ID = process.env.APPWRITE_DATABASE_ID || 'almeira_db'; + const COLLECTION_ID = 'social_accounts'; + const COLLECTION_NAME = 'Social Accounts (Multistreaming)'; + + try { + // 1. Crear Colección + try { + await databases.createCollection(DATABASE_ID, COLLECTION_ID, COLLECTION_NAME, [ + sdk.Permission.read(sdk.Role.users()), + sdk.Permission.write(sdk.Role.users()), // Solo el propio usuario mediante validación de API + ]); + console.log(`Colección '${COLLECTION_NAME}' creada exitosamente.`); + } catch (e) { + if (e.code === 409) { + console.log(`La colección '${COLLECTION_NAME}' ya existe. Procediendo a verificar atributos...`); + } else { + throw e; + } + } + + // 2. Crear Atributos (Columnas) + console.log("Creando atributos para Social Accounts..."); + + // Identificador del Usuario dueño de la cuenta + await databases.createStringAttribute(DATABASE_ID, COLLECTION_ID, 'userId', 255, true); + + // Plataforma (YOUTUBE, FACEBOOK, TWITCH, TIKTOK, INSTAGRAM, CUSTOM) + await databases.createStringAttribute(DATABASE_ID, COLLECTION_ID, 'provider', 50, true); + + // Tokens de OAuth (Deberían cifrarse antes de guardarse) + await databases.createStringAttribute(DATABASE_ID, COLLECTION_ID, 'accessToken', 2048, false); + await databases.createStringAttribute(DATABASE_ID, COLLECTION_ID, 'refreshToken', 2048, false); + await databases.createDatetimeAttribute(DATABASE_ID, COLLECTION_ID, 'tokenExpiresAt', false); + + // Perfil en la Plataforma + await databases.createStringAttribute(DATABASE_ID, COLLECTION_ID, 'providerAccountId', 255, false); + await databases.createStringAttribute(DATABASE_ID, COLLECTION_ID, 'providerAccountName', 255, false); + await databases.createStringAttribute(DATABASE_ID, COLLECTION_ID, 'providerAvatarUrl', 1024, false); + + // Conexión RTMP Directa (Para configuraciones manuales o fallback) + await databases.createStringAttribute(DATABASE_ID, COLLECTION_ID, 'rtmpServerUrl', 1024, false); + await databases.createStringAttribute(DATABASE_ID, COLLECTION_ID, 'streamKey', 1024, false); + + // Estado y Metadata + await databases.createBooleanAttribute(DATABASE_ID, COLLECTION_ID, 'isActive', false, true, false); + + console.log("Esperando inicialización de atributos..."); + await new Promise(resolve => setTimeout(resolve, 3000)); + + // 3. Crear Índices + console.log("Creando índices..."); + + // Índice de búsqueda por usuario para obtener sus plataformas rápidamente + await databases.createIndex(DATABASE_ID, COLLECTION_ID, 'idx_user_provider', sdk.IndexType.Unique, ['userId', 'provider', 'providerAccountId'], ['ASC', 'ASC', 'ASC']); + + console.log("¡Setup de Multistreaming finalizado con éxito!"); + } catch (error) { + console.error("Error durante el setup:", error); + } +} + +setupMultistreamAppwrite();