almeira-web/dripzone-app/scripts/setup-appwrite.js

132 lines
4.1 KiB
JavaScript

/**
* Script de inicialización de la Base de Datos Independiente en Appwrite
* Ejecutar con: node scripts/setup-appwrite.js
*/
const { Client, Databases, Storage, Permission, Role } = require('node-appwrite');
const fs = require('fs');
const path = require('path');
// Leer variables de .env.local manualmente si dotenv no está disponible en este script
const envPath = path.resolve(__dirname, '../.env.local');
if (fs.existsSync(envPath)) {
const envContent = fs.readFileSync(envPath, 'utf8');
envContent.split('\n').forEach((line) => {
const trimmed = line.trim();
if (trimmed && !trimmed.startsWith('#')) {
const [k, ...v] = trimmed.split('=');
if (k && v) process.env[k.trim()] = v.join('=').trim();
}
});
}
const endpoint = process.env.NEXT_PUBLIC_APPWRITE_ENDPOINT || 'https://appwrite.almeira.com.co/v1';
const projectId = process.env.NEXT_PUBLIC_APPWRITE_PROJECT_ID || '69b84df5003bd8957c5c';
const apiKey = process.env.APPWRITE_API_KEY;
const databaseId = process.env.NEXT_PUBLIC_APPWRITE_DATABASE_ID || 'sneakers_multistore_db';
const bucketId = process.env.NEXT_PUBLIC_APPWRITE_MEDIA_BUCKET_ID || 'sneakers_media_bucket';
if (!apiKey) {
console.error('❌ Falta APPWRITE_API_KEY en .env.local');
process.exit(1);
}
const client = new Client()
.setEndpoint(endpoint)
.setProject(projectId)
.setKey(apiKey);
const databases = new Databases(client);
const storage = new Storage(client);
async function setup() {
console.log('🚀 Iniciando configuración de la Base de Datos Independiente para la Tienda...');
console.log(`Endpoint: ${endpoint}`);
console.log(`Database ID: ${databaseId}`);
console.log(`Bucket ID: ${bucketId}`);
// 1. Crear Base de Datos Independiente si no existe
try {
await databases.get(databaseId);
console.log(`✅ Base de datos independiente "${databaseId}" ya existe.`);
} catch (e) {
console.log(`Creando base de datos independiente "${databaseId}"...`);
await databases.create(databaseId, 'Sneakers Multi-Store DB');
console.log(`✅ Base de datos "${databaseId}" creada con éxito.`);
}
// 2. Crear Storage Bucket Independiente si no existe
try {
await storage.getBucket(bucketId);
console.log(`✅ Storage Bucket "${bucketId}" ya existe.`);
} catch (e) {
console.log(`Creando Storage Bucket "${bucketId}"...`);
try {
await storage.createBucket(
bucketId,
'Sneakers Media Assets',
[Permission.read(Role.any()), Permission.create(Role.any())],
false, // fileSecurity
true, // enabled
50000000, // 50MB max file size
['jpg', 'png', 'webp', 'jpeg']
);
console.log(`✅ Storage Bucket "${bucketId}" creado con éxito.`);
} catch (bErr) {
console.warn('Nota sobre creación de bucket:', bErr.message);
}
}
// 3. Crear Colecciones Independientes
const collections = [
{
id: 'products',
name: 'Productos y Zapatillas',
},
{
id: 'cities',
name: 'Ciudades y Envíos',
},
{
id: 'payment_methods',
name: 'Métodos de Pago',
},
{
id: 'orders',
name: 'Pedidos de Clientes',
},
{
id: 'supplier_posts',
name: 'Feed de Mensajes WhatsApp',
},
];
for (const col of collections) {
try {
await databases.getCollection(databaseId, col.id);
console.log(`✅ Colección "${col.name}" (${col.id}) ya existe.`);
} catch (e) {
console.log(`Creando colección "${col.name}" (${col.id})...`);
try {
await databases.createCollection(
databaseId,
col.id,
col.name,
[
Permission.read(Role.any()),
Permission.create(Role.any()),
Permission.update(Role.any()),
Permission.delete(Role.any()),
]
);
console.log(`✅ Colección creada: ${col.id}`);
} catch (cErr) {
console.warn(`Error creando colección ${col.id}:`, cErr.message);
}
}
}
console.log('🎉 ¡Base de datos y colecciones independientes configuradas al 100%!');
}
setup().catch((err) => console.error('Error configurando Appwrite:', err));