almeira-web/src/lib/appwrite.ts

100 lines
3.7 KiB
TypeScript

import { Client, Databases, Storage, Query, Account } from 'appwrite';
if (typeof console !== 'undefined' && !(console.warn as any).__agyPatched) {
const baseWarn = console.warn.bind(console);
const patchedWarn = (...warnArgs: any[]) => {
if (warnArgs[0] && typeof warnArgs[0] === 'string' && warnArgs[0].includes('built for Appwrite')) return;
baseWarn(...warnArgs);
};
(patchedWarn as any).__agyPatched = true;
console.warn = patchedWarn;
}
// Robust instance-level patch for Appwrite Client (supports both Appwrite 1.x Databases and 2.x TablesDB)
function patchClientInstance(clientInstance: any) {
if (clientInstance._isPatched || ((Client.prototype as any)._isPatched && clientInstance !== Client.prototype)) return clientInstance;
const originalCall = clientInstance.call;
clientInstance.call = async function (method: string, url: any, headers: any = {}, params: any = {}, responseType: string = 'json') {
let urlStr = url instanceof URL ? url.toString() : String(url);
if (/\/databases\/([^/]+)\/collections/.test(urlStr)) {
urlStr = urlStr
.replace(/\/databases\/([^/]+)\/collections\/([^/]+)\/documents/g, '/tablesdb/$1/tables/$2/rows')
.replace(/\/databases\/([^/]+)\/collections/g, '/tablesdb/$1/tables');
url = url instanceof URL ? new URL(urlStr) : urlStr;
if (params && typeof params === 'object') {
params = { ...params };
if ('documentId' in params) {
params.rowId = params.documentId;
delete params.documentId;
}
if ('collectionId' in params) {
params.tableId = params.collectionId;
delete params.collectionId;
}
if ('documentSecurity' in params) {
params.rowSecurity = params.documentSecurity;
delete params.documentSecurity;
}
}
}
const res = await originalCall.call(this, method, url, headers, params, responseType);
if (res && typeof res === 'object') {
const plain = JSON.parse(JSON.stringify(res));
if (Array.isArray(plain.rows) && !plain.documents) plain.documents = plain.rows;
if (Array.isArray(plain.tables) && !plain.collections) plain.collections = plain.tables;
if (Array.isArray(plain.columns) && !plain.attributes) plain.attributes = plain.columns;
return plain;
}
return res;
};
clientInstance._isPatched = true;
return clientInstance;
}
patchClientInstance(Client.prototype);
const client = new Client();
export const endpoint = process.env.NEXT_PUBLIC_APPWRITE_ENDPOINT || 'https://nyc.cloud.appwrite.io/v1';
export const projectId = process.env.NEXT_PUBLIC_APPWRITE_PROJECT_ID || '6aef63d9002c07371b40';
export const databaseId = process.env.APPWRITE_DATABASE_ID || 'almeira';
client
.setEndpoint(endpoint)
.setProject(projectId);
patchClientInstance(client);
export const databases = new Databases(client);
export const storage = new Storage(client);
export const account = new Account(client);
export { Query };
export const APPWRITE_ALMEIRA_CONFIG = {
endpoint,
projectId,
databaseId,
mediaBucketId: process.env.NEXT_PUBLIC_APPWRITE_MEDIA_BUCKET_ID || 'media_bucket',
collections: {
// Existentes
posts: 'posts',
clients: 'clients',
metrics: 'metrics',
settings: 'settings',
// Nuevas
publicationTypes: 'publication_types',
categories: 'categories',
postsCategories: 'posts_categories',
clientTypes: 'client_types',
countries: 'countries',
departments: 'departments',
cities: 'cities',
paymentMethods: 'payment_methods',
contracts: 'contracts',
contractDetails: 'contract_details',
whatsappMessages: 'whatsapp_messages',
}
};
export default client;