Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
63 changes: 63 additions & 0 deletions src/api/extensions/prismaExtensionPgpathToMysql.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
import { Prisma } from '@prisma/client'
import { Logger } from '@config/logger.config';

const logger = new Logger('PGPATH2MYSQL');

function convertPgPathToMysql (path) {
if (!Array.isArray(path)) {
return path
}
let result = '$'
for (const item of path) {
if (/^\d+$/.test(item)) {
result += `[${item}]`
} else {
result += `.${item}`
}
}
return result
}

function processWhere (obj) {
if (obj && typeof obj === 'object') {
for (const key in obj) {
if (Object.prototype.hasOwnProperty.call(obj, key)) {
if (key === 'path') {
obj[key] = convertPgPathToMysql(obj[key]);
} else {
processWhere(obj[key]);
}
}
}
}
}

// https://www.prisma.io/docs/orm/prisma-client/client-extensions/query#modify-all-operations-in-all-models-of-your-schema
// https://www.prisma.io/docs/orm/prisma-client/client-extensions/query#modify-a-specific-operation-in-a-specific-model

const overriddenOperation = async ({ model, operation, args, query }) => {
if (args?.where) {
processWhere(args.where)
}
const result = await query(args)
logger.debug({ model, operation, args: JSON.stringify(args), result })
return result
}

export default Prisma.defineExtension({
name: 'prisma-extension-pgpath-to-mysql',
query: {
$allModels: {
findFirst: overriddenOperation,
findMany: overriddenOperation,
updateMany: overriddenOperation,
count: overriddenOperation,
deleteMany: overriddenOperation,

delete: overriddenOperation,
findUnique: overriddenOperation,
update: overriddenOperation,
upsert: overriddenOperation,
}
}
})
Original file line number Diff line number Diff line change
Expand Up @@ -1509,7 +1509,7 @@ export class BaileysStartupService extends ChannelStartupService {
remoteJid: key.remoteJid,
fromMe: key.fromMe,
participant: key?.remoteJid,
status: status[update.status],
status: status[update.status] ?? findMessage.status,
pollUpdates,
instanceId: this.instanceId,
};
Expand Down
11 changes: 9 additions & 2 deletions src/api/server.module.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
import { CacheEngine } from '@cache/cacheengine';
import { Chatwoot, configService, ProviderSession } from '@config/env.config';
import { Chatwoot, configService, Database, ProviderSession } from '@config/env.config';
import { eventEmitter } from '@config/event.config';
import { Logger } from '@config/logger.config';
import { extendsWithProxy } from '@utils/extendsWithProxy';

import { CallController } from './controllers/call.controller';
import { ChatController } from './controllers/chat.controller';
Expand All @@ -12,6 +13,7 @@ import { ProxyController } from './controllers/proxy.controller';
import { SendMessageController } from './controllers/sendMessage.controller';
import { SettingsController } from './controllers/settings.controller';
import { TemplateController } from './controllers/template.controller';
import pgPathToMysql from './extensions/prismaExtensionPgpathToMysql';
import { ChannelController } from './integrations/channel/channel.controller';
import { EvolutionController } from './integrations/channel/evolution/evolution.controller';
import { MetaController } from './integrations/channel/meta/meta.controller';
Expand Down Expand Up @@ -55,7 +57,12 @@ if (configService.get<ProviderSession>('PROVIDER').ENABLED) {
providerFiles = new ProviderFiles(configService);
}

export const prismaRepository = new PrismaRepository(configService);
const provider = configService.get<Database>('DATABASE').PROVIDER;
let extendablePrismaRepository: PrismaRepository = new PrismaRepository(configService);
if (typeof provider === 'string' && provider?.toLowerCase() === 'mysql') {
extendablePrismaRepository = extendsWithProxy(extendablePrismaRepository, pgPathToMysql);
}
export const prismaRepository = extendablePrismaRepository;

export const waMonitor = new WAMonitoringService(
eventEmitter,
Expand Down
26 changes: 26 additions & 0 deletions src/utils/extendsWithProxy.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
import { PrismaClient } from '@prisma/client';

type ExtensionArgs = Parameters<PrismaClient['$extends']>[0];

export function extendsWithProxy<T extends PrismaClient>(instanciaBase: T, extensao: ExtensionArgs): T {
const instanciaEstendida = instanciaBase.$extends(extensao);

const proxy = new Proxy(instanciaBase as unknown as object, {
get(target, prop, receiver) {
if (prop === 'toString') {
return () => '[Proxy toString]';
}
if (prop === Symbol.toStringTag) {
return undefined;
}
return prop in instanciaEstendida
? Reflect.get(instanciaEstendida as any, prop, receiver)
: Reflect.get(target, prop, receiver);
},
has(target, prop) {
return prop in target || prop in (instanciaEstendida as any);
},
});

return proxy as unknown as T;
}
1 change: 1 addition & 0 deletions tsconfig.json
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
"strictNullChecks": false,
"incremental": true,
"noImplicitAny": false,
"allowJs": true,
"baseUrl": ".",
"paths": {
"@api/*": ["./src/api/*"],
Expand Down