feat: implement multistreaming module with Appwrite backend and UI setup

This commit is contained in:
Carlos (Almeira) 2026-07-07 13:22:51 -05:00
parent e8536d8367
commit 67d88f5d8c

View File

@ -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();