@ductape/sdk 0.0.4-v59 → 0.0.4-v60
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agents/agents.service.d.ts +8 -2
- package/dist/agents/agents.service.js +5 -0
- package/dist/agents/agents.service.js.map +1 -1
- package/dist/agents/types/agents.types.d.ts +2 -0
- package/dist/agents/types/agents.types.js.map +1 -1
- package/dist/agents/vector-store-adapter.js +5 -5
- package/dist/agents/vector-store-adapter.js.map +1 -1
- package/dist/api/services/appApi.service.d.ts +3 -3
- package/dist/api/services/appApi.service.js.map +1 -1
- package/dist/api/services/productsApi.service.d.ts +1 -1
- package/dist/api/services/productsApi.service.js +20 -13
- package/dist/api/services/productsApi.service.js.map +1 -1
- package/dist/api/services/secretsApi.service.d.ts +12 -0
- package/dist/api/services/secretsApi.service.js +30 -2
- package/dist/api/services/secretsApi.service.js.map +1 -1
- package/dist/api/services/workspaceApi.service.d.ts +8 -0
- package/dist/api/services/workspaceApi.service.js +20 -0
- package/dist/api/services/workspaceApi.service.js.map +1 -1
- package/dist/api/urls.d.ts +2 -0
- package/dist/api/urls.js +10 -15
- package/dist/api/urls.js.map +1 -1
- package/dist/api/utils/auth.utils.d.ts +1 -3
- package/dist/api/utils/auth.utils.js.map +1 -1
- package/dist/apps/utils/oauth-manager.js +27 -3
- package/dist/apps/utils/oauth-manager.js.map +1 -1
- package/dist/brokers/brokers.service.d.ts +8 -0
- package/dist/brokers/brokers.service.js +50 -4
- package/dist/brokers/brokers.service.js.map +1 -1
- package/dist/brokers/types/index.d.ts +26 -0
- package/dist/brokers/utils/providers/kafka.service.d.ts +7 -0
- package/dist/brokers/utils/providers/kafka.service.js +102 -23
- package/dist/brokers/utils/providers/kafka.service.js.map +1 -1
- package/dist/brokers/utils/providers/rabbitmq.service.d.ts +2 -1
- package/dist/brokers/utils/providers/rabbitmq.service.js +99 -15
- package/dist/brokers/utils/providers/rabbitmq.service.js.map +1 -1
- package/dist/database/adapters/cassandra.adapter.d.ts +1 -0
- package/dist/database/adapters/cassandra.adapter.js +100 -44
- package/dist/database/adapters/cassandra.adapter.js.map +1 -1
- package/dist/database/adapters/dynamodb.adapter.d.ts +1 -0
- package/dist/database/adapters/dynamodb.adapter.js +89 -20
- package/dist/database/adapters/dynamodb.adapter.js.map +1 -1
- package/dist/database/adapters/mongodb.adapter.d.ts +1 -0
- package/dist/database/adapters/mongodb.adapter.js +123 -45
- package/dist/database/adapters/mongodb.adapter.js.map +1 -1
- package/dist/database/adapters/mysql.adapter.d.ts +1 -0
- package/dist/database/adapters/mysql.adapter.js +125 -48
- package/dist/database/adapters/mysql.adapter.js.map +1 -1
- package/dist/database/adapters/postgresql.adapter.d.ts +5 -0
- package/dist/database/adapters/postgresql.adapter.js +151 -50
- package/dist/database/adapters/postgresql.adapter.js.map +1 -1
- package/dist/database/databases.service.d.ts +15 -1
- package/dist/database/databases.service.js +143 -2
- package/dist/database/databases.service.js.map +1 -1
- package/dist/database/operators/aggregation-builder.d.ts +11 -8
- package/dist/database/operators/aggregation-builder.js +184 -89
- package/dist/database/operators/aggregation-builder.js.map +1 -1
- package/dist/database/operators/query-builder.d.ts +23 -19
- package/dist/database/operators/query-builder.js +77 -45
- package/dist/database/operators/query-builder.js.map +1 -1
- package/dist/database/types/aggregation.interface.d.ts +21 -15
- package/dist/database/types/query.interface.d.ts +27 -21
- package/dist/database/types/write.interface.d.ts +20 -12
- package/dist/graph/adapters/arangodb.adapter.js +61 -22
- package/dist/graph/adapters/arangodb.adapter.js.map +1 -1
- package/dist/graph/adapters/memgraph.adapter.js +22 -16
- package/dist/graph/adapters/memgraph.adapter.js.map +1 -1
- package/dist/graph/adapters/neo4j.adapter.js +51 -21
- package/dist/graph/adapters/neo4j.adapter.js.map +1 -1
- package/dist/graph/adapters/neptune.adapter.js +32 -16
- package/dist/graph/adapters/neptune.adapter.js.map +1 -1
- package/dist/graph/graphs.service.d.ts +24 -2
- package/dist/graph/graphs.service.js +238 -28
- package/dist/graph/graphs.service.js.map +1 -1
- package/dist/graph/types/connection.interface.d.ts +8 -0
- package/dist/graph/types/query.interface.d.ts +21 -14
- package/dist/index.d.ts +367 -20
- package/dist/index.js +510 -48
- package/dist/index.js.map +1 -1
- package/dist/inputs/inputs.service.d.ts +1 -1
- package/dist/notifications/notifications.service.d.ts +7 -2
- package/dist/notifications/notifications.service.js +2 -0
- package/dist/notifications/notifications.service.js.map +1 -1
- package/dist/processor/services/processor.service.d.ts +5 -1
- package/dist/processor/services/processor.service.js +35 -2
- package/dist/processor/services/processor.service.js.map +1 -1
- package/dist/products/services/products.service.d.ts +76 -2
- package/dist/products/services/products.service.js +984 -27
- package/dist/products/services/products.service.js.map +1 -1
- package/dist/products/validators/joi-validators/create.productAgent.validator.js +52 -4
- package/dist/products/validators/joi-validators/create.productAgent.validator.js.map +1 -1
- package/dist/products/validators/joi-validators/create.productGraph.validator.js +2 -0
- package/dist/products/validators/joi-validators/create.productGraph.validator.js.map +1 -1
- package/dist/products/validators/joi-validators/create.productMessageBrokers.validator.js +1 -7
- package/dist/products/validators/joi-validators/create.productMessageBrokers.validator.js.map +1 -1
- package/dist/products/validators/joi-validators/create.productVector.validator.js +4 -4
- package/dist/products/validators/joi-validators/create.productVector.validator.js.map +1 -1
- package/dist/products/validators/joi-validators/update.productGraph.validator.js +2 -0
- package/dist/products/validators/joi-validators/update.productGraph.validator.js.map +1 -1
- package/dist/resilience/fallback.service.d.ts +4 -1
- package/dist/resilience/fallback.service.js +8 -10
- package/dist/resilience/fallback.service.js.map +1 -1
- package/dist/resilience/healthcheck.service.d.ts +6 -1
- package/dist/resilience/healthcheck.service.js +9 -0
- package/dist/resilience/healthcheck.service.js.map +1 -1
- package/dist/resilience/quota.service.d.ts +4 -1
- package/dist/resilience/quota.service.js +2 -0
- package/dist/resilience/quota.service.js.map +1 -1
- package/dist/resilience/resilience.service.d.ts +4 -1
- package/dist/resilience/resilience.service.js.map +1 -1
- package/dist/secrets/secrets.service.d.ts +11 -1
- package/dist/secrets/secrets.service.js +109 -10
- package/dist/secrets/secrets.service.js.map +1 -1
- package/dist/storage/storage.service.d.ts +4 -1
- package/dist/storage/storage.service.js +6 -1
- package/dist/storage/storage.service.js.map +1 -1
- package/dist/test/index.js +1 -3
- package/dist/test/index.js.map +1 -1
- package/dist/test/test.broker.kafka.d.ts +1 -0
- package/dist/test/test.broker.kafka.js +172 -0
- package/dist/test/test.broker.kafka.js.map +1 -0
- package/dist/test/test.broker.nats.d.ts +1 -0
- package/dist/test/test.broker.nats.js +193 -0
- package/dist/test/test.broker.nats.js.map +1 -0
- package/dist/test/test.broker.pubsub.d.ts +1 -0
- package/dist/test/test.broker.pubsub.js +171 -0
- package/dist/test/test.broker.pubsub.js.map +1 -0
- package/dist/test/test.broker.rabbitmq.d.ts +1 -0
- package/dist/test/test.broker.rabbitmq.js +164 -0
- package/dist/test/test.broker.rabbitmq.js.map +1 -0
- package/dist/test/test.broker.redis.d.ts +1 -0
- package/dist/test/test.broker.redis.js +168 -0
- package/dist/test/test.broker.redis.js.map +1 -0
- package/dist/test/test.broker.sqs.d.ts +1 -0
- package/dist/test/test.broker.sqs.js +158 -0
- package/dist/test/test.broker.sqs.js.map +1 -0
- package/dist/test/test.caches.d.ts +1 -0
- package/dist/test/test.caches.js +231 -0
- package/dist/test/test.caches.js.map +1 -0
- package/dist/test/test.database.dynamo.d.ts +1 -0
- package/dist/test/test.database.dynamo.js +265 -0
- package/dist/test/test.database.dynamo.js.map +1 -0
- package/dist/test/test.database.js +2 -2
- package/dist/test/test.database.js.map +1 -1
- package/dist/test/test.database.mongo.d.ts +1 -0
- package/dist/test/test.database.mongo.js +371 -0
- package/dist/test/test.database.mongo.js.map +1 -0
- package/dist/test/test.database.mysql.d.ts +1 -0
- package/dist/test/test.database.mysql.js +415 -0
- package/dist/test/test.database.mysql.js.map +1 -0
- package/dist/test/test.database.postgres.d.ts +1 -0
- package/dist/test/test.database.postgres.js +412 -0
- package/dist/test/test.database.postgres.js.map +1 -0
- package/dist/test/test.email.brevo.d.ts +1 -0
- package/dist/test/test.email.brevo.js +326 -0
- package/dist/test/test.email.brevo.js.map +1 -0
- package/dist/test/test.email.mailgun.d.ts +1 -0
- package/dist/test/test.email.mailgun.js +352 -0
- package/dist/test/test.email.mailgun.js.map +1 -0
- package/dist/test/test.email.postmark.d.ts +1 -0
- package/dist/test/test.email.postmark.js +316 -0
- package/dist/test/test.email.postmark.js.map +1 -0
- package/dist/test/test.email.sendgrid.d.ts +1 -0
- package/dist/test/test.email.sendgrid.js +365 -0
- package/dist/test/test.email.sendgrid.js.map +1 -0
- package/dist/test/test.email.smtp.d.ts +1 -0
- package/dist/test/test.email.smtp.js +323 -0
- package/dist/test/test.email.smtp.js.map +1 -0
- package/dist/test/test.graph.arangodb.d.ts +1 -0
- package/dist/test/test.graph.arangodb.js +358 -0
- package/dist/test/test.graph.arangodb.js.map +1 -0
- package/dist/test/test.graph.memgraph.d.ts +1 -0
- package/dist/test/test.graph.memgraph.js +320 -0
- package/dist/test/test.graph.memgraph.js.map +1 -0
- package/dist/test/test.graph.neo4j.d.ts +1 -0
- package/dist/test/test.graph.neo4j.js +218 -0
- package/dist/test/test.graph.neo4j.js.map +1 -0
- package/dist/test/test.graph.neptune.d.ts +1 -0
- package/dist/test/test.graph.neptune.js +331 -0
- package/dist/test/test.graph.neptune.js.map +1 -0
- package/dist/test/test.notifications.d.ts +1 -0
- package/dist/test/test.notifications.js +198 -0
- package/dist/test/test.notifications.js.map +1 -0
- package/dist/test/test.push.expo.d.ts +1 -0
- package/dist/test/test.push.expo.js +442 -0
- package/dist/test/test.push.expo.js.map +1 -0
- package/dist/test/test.push.firebase.d.ts +1 -0
- package/dist/test/test.push.firebase.js +409 -0
- package/dist/test/test.push.firebase.js.map +1 -0
- package/dist/test/test.session.d.ts +1 -0
- package/dist/test/test.session.js +299 -0
- package/dist/test/test.session.js.map +1 -0
- package/dist/test/test.sms.nexmo.d.ts +1 -0
- package/dist/test/test.sms.nexmo.js +278 -0
- package/dist/test/test.sms.nexmo.js.map +1 -0
- package/dist/test/test.sms.twilio.d.ts +1 -0
- package/dist/test/test.sms.twilio.js +275 -0
- package/dist/test/test.sms.twilio.js.map +1 -0
- package/dist/test/test.storage.js +169 -299
- package/dist/test/test.storage.js.map +1 -1
- package/dist/test/test.vector.pinecone.d.ts +1 -0
- package/dist/test/test.vector.pinecone.js +238 -0
- package/dist/test/test.vector.pinecone.js.map +1 -0
- package/dist/test/test.vector.qdrant.d.ts +1 -0
- package/dist/test/test.vector.qdrant.js +307 -0
- package/dist/test/test.vector.qdrant.js.map +1 -0
- package/dist/test/test.vector.weaviate.d.ts +1 -0
- package/dist/test/test.vector.weaviate.js +325 -0
- package/dist/test/test.vector.weaviate.js.map +1 -0
- package/dist/types/appBuilder.types.d.ts +6 -2
- package/dist/types/enums.d.ts +2 -0
- package/dist/types/enums.js +2 -0
- package/dist/types/enums.js.map +1 -1
- package/dist/types/index.types.d.ts +2 -4
- package/dist/types/index.types.js +0 -1
- package/dist/types/index.types.js.map +1 -1
- package/dist/types/processor.types.d.ts +18 -0
- package/dist/types/productsBuilder.types.d.ts +19 -15
- package/dist/types/productsBuilder.types.js.map +1 -1
- package/dist/types/requests.types.d.ts +2 -0
- package/dist/utils/index.js +23 -4
- package/dist/utils/index.js.map +1 -1
- package/dist/vector/adapters/base.adapter.d.ts +1 -1
- package/dist/vector/adapters/memory.adapter.d.ts +1 -1
- package/dist/vector/adapters/memory.adapter.js +1 -1
- package/dist/vector/adapters/memory.adapter.js.map +1 -1
- package/dist/vector/adapters/pinecone.adapter.d.ts +1 -1
- package/dist/vector/adapters/pinecone.adapter.js +1 -1
- package/dist/vector/adapters/pinecone.adapter.js.map +1 -1
- package/dist/vector/adapters/qdrant.adapter.d.ts +1 -1
- package/dist/vector/adapters/qdrant.adapter.js +1 -1
- package/dist/vector/adapters/qdrant.adapter.js.map +1 -1
- package/dist/vector/adapters/weaviate.adapter.d.ts +1 -1
- package/dist/vector/adapters/weaviate.adapter.js +1 -1
- package/dist/vector/adapters/weaviate.adapter.js.map +1 -1
- package/dist/vector/index.d.ts +2 -2
- package/dist/vector/index.js +2 -2
- package/dist/vector/utils/vector-error.js +0 -1
- package/dist/vector/utils/vector-error.js.map +1 -1
- package/dist/vector/vector-database.service.d.ts +9 -6
- package/dist/vector/vector-database.service.js +7 -6
- package/dist/vector/vector-database.service.js.map +1 -1
- package/dist/vector/vector.service.d.ts +3 -3
- package/dist/vector/vector.service.js +12 -9
- package/dist/vector/vector.service.js.map +1 -1
- package/dist/workflows/workflow-executor.d.ts +4 -1
- package/dist/workflows/workflow-executor.js +10 -2
- package/dist/workflows/workflow-executor.js.map +1 -1
- package/dist/workflows/workflows.service.d.ts +8 -2
- package/dist/workflows/workflows.service.js +66 -41
- package/dist/workflows/workflows.service.js.map +1 -1
- package/package.json +29 -4
|
@@ -5,46 +5,125 @@ const kafkajs_1 = require("kafkajs");
|
|
|
5
5
|
class KafkaService {
|
|
6
6
|
constructor(config) {
|
|
7
7
|
this.config = config;
|
|
8
|
-
this.
|
|
8
|
+
this.logPrefix = '[Kafka]';
|
|
9
|
+
console.log(`${this.logPrefix} Service initializing...`);
|
|
10
|
+
console.log(`${this.logPrefix} Client ID: ${this.config.clientId}`);
|
|
11
|
+
console.log(`${this.logPrefix} Brokers: ${this.config.brokers.join(', ')}`);
|
|
12
|
+
console.log(`${this.logPrefix} Group ID: ${this.config.groupId || 'default-group'}`);
|
|
13
|
+
console.log(`${this.logPrefix} SSL: ${this.config.ssl ? 'enabled' : 'disabled'}`);
|
|
14
|
+
console.log(`${this.logPrefix} SASL: ${this.config.sasl ? `enabled (${this.config.sasl.mechanism})` : 'disabled'}`);
|
|
15
|
+
const kafkaConfig = {
|
|
9
16
|
clientId: this.config.clientId,
|
|
10
17
|
brokers: this.config.brokers,
|
|
11
|
-
}
|
|
18
|
+
};
|
|
19
|
+
// Enable SSL if configured
|
|
20
|
+
if (this.config.ssl) {
|
|
21
|
+
kafkaConfig.ssl = true;
|
|
22
|
+
console.log(`${this.logPrefix} SSL configuration applied`);
|
|
23
|
+
}
|
|
24
|
+
// Configure SASL authentication if provided
|
|
25
|
+
if (this.config.sasl) {
|
|
26
|
+
kafkaConfig.sasl = {
|
|
27
|
+
mechanism: this.config.sasl.mechanism,
|
|
28
|
+
username: this.config.sasl.username,
|
|
29
|
+
password: this.config.sasl.password,
|
|
30
|
+
};
|
|
31
|
+
console.log(`${this.logPrefix} SASL configuration applied (user: ${this.config.sasl.username})`);
|
|
32
|
+
}
|
|
33
|
+
this.kafka = new kafkajs_1.Kafka(kafkaConfig);
|
|
34
|
+
console.log(`${this.logPrefix} Service initialized successfully`);
|
|
12
35
|
}
|
|
13
36
|
async connect() {
|
|
14
|
-
this.
|
|
15
|
-
|
|
16
|
-
|
|
37
|
+
console.log(`${this.logPrefix} Establishing connection...`);
|
|
38
|
+
const startTime = Date.now();
|
|
39
|
+
try {
|
|
40
|
+
this.producer = this.kafka.producer();
|
|
41
|
+
this.consumer = this.kafka.consumer({ groupId: this.config.groupId || 'default-group' });
|
|
42
|
+
console.log(`${this.logPrefix} Connecting producer...`);
|
|
43
|
+
await this.producer.connect();
|
|
44
|
+
console.log(`${this.logPrefix} Producer connected successfully (${Date.now() - startTime}ms)`);
|
|
45
|
+
}
|
|
46
|
+
catch (error) {
|
|
47
|
+
console.error(`${this.logPrefix} Connection failed:`, error);
|
|
48
|
+
throw error;
|
|
49
|
+
}
|
|
17
50
|
}
|
|
18
51
|
async publish(topic, message) {
|
|
52
|
+
console.log(`${this.logPrefix} Publishing message to topic: ${topic}`);
|
|
53
|
+
const startTime = Date.now();
|
|
19
54
|
if (!this.producer) {
|
|
55
|
+
console.log(`${this.logPrefix} No producer available, connecting...`);
|
|
20
56
|
await this.connect();
|
|
21
57
|
}
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
58
|
+
try {
|
|
59
|
+
const messageValue = JSON.stringify(message);
|
|
60
|
+
console.log(`${this.logPrefix} Sending message (${messageValue.length} bytes) to topic: ${topic}`);
|
|
61
|
+
await this.producer.send({
|
|
62
|
+
topic,
|
|
63
|
+
messages: [{ value: messageValue }],
|
|
64
|
+
});
|
|
65
|
+
console.log(`${this.logPrefix} Message published successfully to ${topic} (${Date.now() - startTime}ms)`);
|
|
66
|
+
}
|
|
67
|
+
catch (error) {
|
|
68
|
+
console.error(`${this.logPrefix} Failed to publish message to ${topic}:`, error);
|
|
69
|
+
throw error;
|
|
70
|
+
}
|
|
26
71
|
}
|
|
27
72
|
async subscribe(topic, callback) {
|
|
73
|
+
console.log(`${this.logPrefix} Subscribing to topic: ${topic}`);
|
|
74
|
+
const startTime = Date.now();
|
|
28
75
|
if (!this.consumer) {
|
|
76
|
+
console.log(`${this.logPrefix} No consumer available, connecting...`);
|
|
29
77
|
await this.connect();
|
|
30
78
|
}
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
|
|
79
|
+
try {
|
|
80
|
+
console.log(`${this.logPrefix} Connecting consumer...`);
|
|
81
|
+
await this.consumer.connect();
|
|
82
|
+
console.log(`${this.logPrefix} Consumer connected, subscribing to topic: ${topic}`);
|
|
83
|
+
await this.consumer.subscribe({ topic, fromBeginning: true });
|
|
84
|
+
console.log(`${this.logPrefix} Subscribed to topic: ${topic}, starting consumer...`);
|
|
85
|
+
await this.consumer.run({
|
|
86
|
+
eachMessage: async ({ message, partition, topic: msgTopic }) => {
|
|
87
|
+
if (message.value) {
|
|
88
|
+
const messageStartTime = Date.now();
|
|
89
|
+
console.log(`${this.logPrefix} Received message from ${msgTopic}:${partition} (${message.value.length} bytes)`);
|
|
90
|
+
try {
|
|
91
|
+
const content = JSON.parse(message.value.toString());
|
|
92
|
+
console.log(`${this.logPrefix} Processing message from ${msgTopic}...`);
|
|
93
|
+
await callback(content);
|
|
94
|
+
console.log(`${this.logPrefix} Message processed successfully (${Date.now() - messageStartTime}ms)`);
|
|
95
|
+
}
|
|
96
|
+
catch (error) {
|
|
97
|
+
console.error(`${this.logPrefix} Error processing message from ${msgTopic}:`, error);
|
|
98
|
+
throw error;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
},
|
|
102
|
+
});
|
|
103
|
+
console.log(`${this.logPrefix} Successfully subscribed to ${topic} (${Date.now() - startTime}ms)`);
|
|
104
|
+
}
|
|
105
|
+
catch (error) {
|
|
106
|
+
console.error(`${this.logPrefix} Failed to subscribe to ${topic}:`, error);
|
|
107
|
+
throw error;
|
|
108
|
+
}
|
|
41
109
|
}
|
|
42
110
|
async disconnect() {
|
|
43
|
-
|
|
44
|
-
|
|
111
|
+
console.log(`${this.logPrefix} Disconnecting...`);
|
|
112
|
+
const startTime = Date.now();
|
|
113
|
+
try {
|
|
114
|
+
if (this.producer) {
|
|
115
|
+
console.log(`${this.logPrefix} Disconnecting producer...`);
|
|
116
|
+
await this.producer.disconnect();
|
|
117
|
+
}
|
|
118
|
+
if (this.consumer) {
|
|
119
|
+
console.log(`${this.logPrefix} Disconnecting consumer...`);
|
|
120
|
+
await this.consumer.disconnect();
|
|
121
|
+
}
|
|
122
|
+
console.log(`${this.logPrefix} Disconnected successfully (${Date.now() - startTime}ms)`);
|
|
45
123
|
}
|
|
46
|
-
|
|
47
|
-
|
|
124
|
+
catch (error) {
|
|
125
|
+
console.error(`${this.logPrefix} Error during disconnect:`, error);
|
|
126
|
+
throw error;
|
|
48
127
|
}
|
|
49
128
|
}
|
|
50
129
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"kafka.service.js","sourceRoot":"","sources":["../../../../src/brokers/utils/providers/kafka.service.ts"],"names":[],"mappings":";;;AAAA,
|
|
1
|
+
{"version":3,"file":"kafka.service.js","sourceRoot":"","sources":["../../../../src/brokers/utils/providers/kafka.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,10 +3,11 @@ export declare class RabbitMQService implements IMessageBrokerService {
|
|
|
3
3
|
private config;
|
|
4
4
|
private connection;
|
|
5
5
|
private channel;
|
|
6
|
+
private readonly logPrefix;
|
|
6
7
|
constructor(config: {
|
|
7
8
|
url: string;
|
|
8
|
-
queue: string;
|
|
9
9
|
});
|
|
10
|
+
private maskUrl;
|
|
10
11
|
connect(): Promise<void>;
|
|
11
12
|
publish(topic: string, message: object): Promise<void>;
|
|
12
13
|
subscribe(topic: string, callback: (message: object) => Promise<void>): Promise<void>;
|
|
@@ -38,29 +38,113 @@ const amqp = __importStar(require("amqplib"));
|
|
|
38
38
|
class RabbitMQService {
|
|
39
39
|
constructor(config) {
|
|
40
40
|
this.config = config;
|
|
41
|
+
this.logPrefix = '[RabbitMQ]';
|
|
42
|
+
console.log(`${this.logPrefix} Service initialized with URL: ${this.maskUrl(config.url)}`);
|
|
43
|
+
}
|
|
44
|
+
maskUrl(url) {
|
|
45
|
+
try {
|
|
46
|
+
const parsed = new URL(url);
|
|
47
|
+
if (parsed.password) {
|
|
48
|
+
parsed.password = '***';
|
|
49
|
+
}
|
|
50
|
+
return parsed.toString();
|
|
51
|
+
}
|
|
52
|
+
catch (_a) {
|
|
53
|
+
return '***masked***';
|
|
54
|
+
}
|
|
41
55
|
}
|
|
42
56
|
async connect() {
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
57
|
+
if (!this.connection) {
|
|
58
|
+
console.log(`${this.logPrefix} Establishing connection...`);
|
|
59
|
+
const startTime = Date.now();
|
|
60
|
+
try {
|
|
61
|
+
this.connection = await amqp.connect(this.config.url);
|
|
62
|
+
this.channel = await this.connection.createChannel();
|
|
63
|
+
console.log(`${this.logPrefix} Connection established successfully (${Date.now() - startTime}ms)`);
|
|
64
|
+
}
|
|
65
|
+
catch (error) {
|
|
66
|
+
console.error(`${this.logPrefix} Connection failed:`, error);
|
|
67
|
+
throw error;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
console.log(`${this.logPrefix} Reusing existing connection`);
|
|
72
|
+
}
|
|
46
73
|
}
|
|
47
74
|
async publish(topic, message) {
|
|
48
|
-
|
|
49
|
-
|
|
75
|
+
console.log(`${this.logPrefix} Publishing message to queue: ${topic}`);
|
|
76
|
+
const startTime = Date.now();
|
|
77
|
+
if (!this.channel) {
|
|
78
|
+
console.log(`${this.logPrefix} No channel available, connecting...`);
|
|
79
|
+
await this.connect();
|
|
80
|
+
}
|
|
81
|
+
try {
|
|
82
|
+
console.log(`${this.logPrefix} Asserting queue: ${topic} (durable: true)`);
|
|
83
|
+
await this.channel.assertQueue(topic, { durable: true });
|
|
84
|
+
const messageBuffer = Buffer.from(JSON.stringify(message));
|
|
85
|
+
console.log(`${this.logPrefix} Sending message (${messageBuffer.length} bytes) to queue: ${topic}`);
|
|
86
|
+
this.channel.sendToQueue(topic, messageBuffer, { persistent: true });
|
|
87
|
+
console.log(`${this.logPrefix} Message published successfully to ${topic} (${Date.now() - startTime}ms)`);
|
|
88
|
+
}
|
|
89
|
+
catch (error) {
|
|
90
|
+
console.error(`${this.logPrefix} Failed to publish message to ${topic}:`, error);
|
|
91
|
+
throw error;
|
|
92
|
+
}
|
|
50
93
|
}
|
|
51
94
|
async subscribe(topic, callback) {
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
95
|
+
console.log(`${this.logPrefix} Subscribing to queue: ${topic}`);
|
|
96
|
+
const startTime = Date.now();
|
|
97
|
+
if (!this.channel) {
|
|
98
|
+
console.log(`${this.logPrefix} No channel available, connecting...`);
|
|
99
|
+
await this.connect();
|
|
100
|
+
}
|
|
101
|
+
try {
|
|
102
|
+
console.log(`${this.logPrefix} Asserting queue: ${topic} (durable: true)`);
|
|
103
|
+
await this.channel.assertQueue(topic, { durable: true });
|
|
104
|
+
console.log(`${this.logPrefix} Starting consumer for queue: ${topic}`);
|
|
105
|
+
this.channel.consume(topic, async (msg) => {
|
|
106
|
+
if (msg) {
|
|
107
|
+
const messageStartTime = Date.now();
|
|
108
|
+
console.log(`${this.logPrefix} Received message from ${topic} (${msg.content.length} bytes)`);
|
|
109
|
+
try {
|
|
110
|
+
const content = JSON.parse(msg.content.toString());
|
|
111
|
+
console.log(`${this.logPrefix} Processing message from ${topic}...`);
|
|
112
|
+
await callback(content);
|
|
113
|
+
this.channel.ack(msg);
|
|
114
|
+
console.log(`${this.logPrefix} Message processed and acknowledged (${Date.now() - messageStartTime}ms)`);
|
|
115
|
+
}
|
|
116
|
+
catch (error) {
|
|
117
|
+
console.error(`${this.logPrefix} Error processing message from ${topic}:`, error);
|
|
118
|
+
// Note: Message will not be acked, allowing redelivery
|
|
119
|
+
throw error;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
});
|
|
123
|
+
console.log(`${this.logPrefix} Successfully subscribed to ${topic} (${Date.now() - startTime}ms)`);
|
|
124
|
+
}
|
|
125
|
+
catch (error) {
|
|
126
|
+
console.error(`${this.logPrefix} Failed to subscribe to ${topic}:`, error);
|
|
127
|
+
throw error;
|
|
128
|
+
}
|
|
60
129
|
}
|
|
61
130
|
async disconnect() {
|
|
62
|
-
|
|
63
|
-
|
|
131
|
+
console.log(`${this.logPrefix} Disconnecting...`);
|
|
132
|
+
const startTime = Date.now();
|
|
133
|
+
try {
|
|
134
|
+
if (this.channel) {
|
|
135
|
+
console.log(`${this.logPrefix} Closing channel...`);
|
|
136
|
+
await this.channel.close();
|
|
137
|
+
}
|
|
138
|
+
if (this.connection) {
|
|
139
|
+
console.log(`${this.logPrefix} Closing connection...`);
|
|
140
|
+
await this.connection.close();
|
|
141
|
+
}
|
|
142
|
+
console.log(`${this.logPrefix} Disconnected successfully (${Date.now() - startTime}ms)`);
|
|
143
|
+
}
|
|
144
|
+
catch (error) {
|
|
145
|
+
console.error(`${this.logPrefix} Error during disconnect:`, error);
|
|
146
|
+
throw error;
|
|
147
|
+
}
|
|
64
148
|
}
|
|
65
149
|
}
|
|
66
150
|
exports.RabbitMQService = RabbitMQService;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rabbitmq.service.js","sourceRoot":"","sources":["../../../../src/brokers/utils/providers/rabbitmq.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,8CAAgC;AAGhC,MAAa,eAAe;
|
|
1
|
+
{"version":3,"file":"rabbitmq.service.js","sourceRoot":"","sources":["../../../../src/brokers/utils/providers/rabbitmq.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -65,6 +65,7 @@ export declare class CassandraAdapter extends BaseAdapter {
|
|
|
65
65
|
escapeValue(value: any): string;
|
|
66
66
|
/**
|
|
67
67
|
* Check if value is an update operator object
|
|
68
|
+
* Supports both lowercase (new) and uppercase (legacy) operators
|
|
68
69
|
*/
|
|
69
70
|
private isUpdateOperator;
|
|
70
71
|
getParameterPlaceholder(index: number): string;
|
|
@@ -64,15 +64,28 @@ class CassandraAdapter extends base_adapter_1.BaseAdapter {
|
|
|
64
64
|
}
|
|
65
65
|
// ==================== CONNECTION METHODS ====================
|
|
66
66
|
async connect(options) {
|
|
67
|
+
console.log(`[CassandraAdapter] connect() called`);
|
|
68
|
+
console.log(`[CassandraAdapter] Options:`, JSON.stringify(Object.assign(Object.assign({}, options), { connectionUrl: '***REDACTED***' }), null, 2));
|
|
67
69
|
try {
|
|
70
|
+
console.log(`[CassandraAdapter] Importing 'cassandra-driver' library...`);
|
|
68
71
|
// Dynamic import of cassandra-driver
|
|
69
72
|
const cassandra = await Promise.resolve().then(() => __importStar(require('cassandra-driver')));
|
|
73
|
+
console.log(`[CassandraAdapter] 'cassandra-driver' library imported successfully`);
|
|
70
74
|
this.connectionUrl = options.connectionUrl;
|
|
75
|
+
console.log(`[CassandraAdapter] Connection URL stored`);
|
|
71
76
|
// Parse connection URL: cassandra://host1,host2:port/keyspace
|
|
77
|
+
console.log(`[CassandraAdapter] Parsing connection URL...`);
|
|
72
78
|
const url = new URL(options.connectionUrl);
|
|
73
79
|
const hosts = url.hostname.split(',');
|
|
74
80
|
const port = parseInt(url.port) || 9042;
|
|
75
81
|
this.keyspace = url.pathname.slice(1) || 'system';
|
|
82
|
+
console.log(`[CassandraAdapter] Connection config:`, {
|
|
83
|
+
hosts,
|
|
84
|
+
port,
|
|
85
|
+
keyspace: this.keyspace,
|
|
86
|
+
hasUsername: !!url.username,
|
|
87
|
+
hasPassword: !!url.password,
|
|
88
|
+
});
|
|
76
89
|
const clientOptions = {
|
|
77
90
|
contactPoints: hosts,
|
|
78
91
|
localDataCenter: 'datacenter1', // Default, can be overridden
|
|
@@ -85,25 +98,38 @@ class CassandraAdapter extends base_adapter_1.BaseAdapter {
|
|
|
85
98
|
username: url.username,
|
|
86
99
|
password: url.password,
|
|
87
100
|
};
|
|
101
|
+
console.log(`[CassandraAdapter] Using authentication`);
|
|
88
102
|
}
|
|
89
103
|
// Parse query parameters for additional options
|
|
90
104
|
const params = new URLSearchParams(url.search);
|
|
91
105
|
if (params.get('datacenter')) {
|
|
92
106
|
clientOptions.localDataCenter = params.get('datacenter');
|
|
107
|
+
console.log(`[CassandraAdapter] Using datacenter: ${clientOptions.localDataCenter}`);
|
|
93
108
|
}
|
|
109
|
+
console.log(`[CassandraAdapter] Creating Cassandra client...`);
|
|
94
110
|
this.cassandraClient = new cassandra.Client(clientOptions);
|
|
111
|
+
console.log(`[CassandraAdapter] Client created, connecting...`);
|
|
95
112
|
await this.cassandraClient.connect();
|
|
113
|
+
console.log(`[CassandraAdapter] Connected successfully`);
|
|
96
114
|
// Get cluster information
|
|
115
|
+
console.log(`[CassandraAdapter] Getting cluster information...`);
|
|
97
116
|
const metadata = this.cassandraClient.metadata;
|
|
98
117
|
const version = await this.getClusterVersion();
|
|
118
|
+
console.log(`[CassandraAdapter] Cluster version: ${version}`);
|
|
99
119
|
this.client = this.cassandraClient;
|
|
100
120
|
this.connected = true;
|
|
121
|
+
console.log(`[CassandraAdapter] Connection marked as connected`);
|
|
101
122
|
return {
|
|
102
123
|
connected: true,
|
|
103
124
|
version: `Cassandra ${version}`,
|
|
104
125
|
};
|
|
105
126
|
}
|
|
106
127
|
catch (error) {
|
|
128
|
+
console.error(`[CassandraAdapter] Connection failed with error:`, error);
|
|
129
|
+
console.error(`[CassandraAdapter] Error type:`, error.constructor.name);
|
|
130
|
+
console.error(`[CassandraAdapter] Error message:`, error.message);
|
|
131
|
+
console.error(`[CassandraAdapter] Error code:`, error.code);
|
|
132
|
+
console.error(`[CassandraAdapter] Full error:`, JSON.stringify(error, null, 2));
|
|
107
133
|
throw database_error_1.DatabaseError.connectionError(`Failed to connect to Cassandra: ${error.message}`, error);
|
|
108
134
|
}
|
|
109
135
|
}
|
|
@@ -224,6 +250,7 @@ class CassandraAdapter extends base_adapter_1.BaseAdapter {
|
|
|
224
250
|
}
|
|
225
251
|
}
|
|
226
252
|
async update(options) {
|
|
253
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;
|
|
227
254
|
this.ensureConnected();
|
|
228
255
|
try {
|
|
229
256
|
const setClauses = [];
|
|
@@ -231,51 +258,54 @@ class CassandraAdapter extends base_adapter_1.BaseAdapter {
|
|
|
231
258
|
// Build SET clause
|
|
232
259
|
for (const [key, value] of Object.entries(options.data)) {
|
|
233
260
|
if (value && typeof value === 'object' && this.isUpdateOperator(value)) {
|
|
234
|
-
// Handle update operators
|
|
235
|
-
if ('$INC' in value) {
|
|
261
|
+
// Handle update operators - support both lowercase (new) and uppercase (legacy)
|
|
262
|
+
if ('$inc' in value || '$INC' in value) {
|
|
236
263
|
// Cassandra supports counter increment
|
|
237
264
|
setClauses.push(`${key} = ${key} + ?`);
|
|
238
|
-
values.push(value.$INC);
|
|
265
|
+
values.push((_a = value.$inc) !== null && _a !== void 0 ? _a : value.$INC);
|
|
239
266
|
}
|
|
240
|
-
else if ('$DEC' in value) {
|
|
267
|
+
else if ('$dec' in value || '$DEC' in value) {
|
|
241
268
|
// Cassandra supports counter decrement
|
|
242
269
|
setClauses.push(`${key} = ${key} - ?`);
|
|
243
|
-
values.push(value.$DEC);
|
|
270
|
+
values.push((_b = value.$dec) !== null && _b !== void 0 ? _b : value.$DEC);
|
|
244
271
|
}
|
|
245
|
-
else if ('$SET' in value) {
|
|
272
|
+
else if ('$set' in value || '$SET' in value) {
|
|
246
273
|
setClauses.push(`${key} = ?`);
|
|
247
|
-
values.push(value.$SET);
|
|
274
|
+
values.push((_c = value.$set) !== null && _c !== void 0 ? _c : value.$SET);
|
|
248
275
|
}
|
|
249
|
-
else if ('$UNSET' in value && value.$UNSET) {
|
|
276
|
+
else if (('$unset' in value && value.$unset) || ('$UNSET' in value && value.$UNSET)) {
|
|
250
277
|
// Cassandra uses DELETE for removing columns, or set to null
|
|
251
278
|
setClauses.push(`${key} = null`);
|
|
252
279
|
}
|
|
253
|
-
else if ('$PUSH' in value) {
|
|
280
|
+
else if ('$push' in value || '$PUSH' in value) {
|
|
254
281
|
// Cassandra list append
|
|
255
282
|
setClauses.push(`${key} = ${key} + ?`);
|
|
256
|
-
values.push([value.$PUSH]);
|
|
283
|
+
values.push([(_d = value.$push) !== null && _d !== void 0 ? _d : value.$PUSH]);
|
|
257
284
|
}
|
|
258
|
-
else if ('$PULL' in value) {
|
|
285
|
+
else if ('$pull' in value || '$PULL' in value) {
|
|
259
286
|
// Cassandra list remove
|
|
260
287
|
setClauses.push(`${key} = ${key} - ?`);
|
|
261
|
-
values.push([value.$PULL]);
|
|
288
|
+
values.push([(_e = value.$pull) !== null && _e !== void 0 ? _e : value.$PULL]);
|
|
262
289
|
}
|
|
263
|
-
else if ('$ADDTOSET' in value) {
|
|
290
|
+
else if ('$addToSet' in value || '$ADDTOSET' in value) {
|
|
264
291
|
// Cassandra set add
|
|
265
292
|
setClauses.push(`${key} = ${key} + ?`);
|
|
266
|
-
values.push(new Set([value.$ADDTOSET]));
|
|
293
|
+
values.push(new Set([(_f = value.$addToSet) !== null && _f !== void 0 ? _f : value.$ADDTOSET]));
|
|
267
294
|
}
|
|
268
|
-
else if ('$MUL' in value) {
|
|
295
|
+
else if ('$mul' in value || '$MUL' in value) {
|
|
269
296
|
// Cassandra doesn't support multiply natively - log warning
|
|
270
|
-
console.warn(`Cassandra does not support $
|
|
297
|
+
console.warn(`Cassandra does not support $mul operator natively for column ${key}`);
|
|
271
298
|
setClauses.push(`${key} = ?`);
|
|
272
|
-
values.push(value.$MUL); // Just set the multiplier value as fallback
|
|
299
|
+
values.push((_g = value.$mul) !== null && _g !== void 0 ? _g : value.$MUL); // Just set the multiplier value as fallback
|
|
273
300
|
}
|
|
274
|
-
else if ('$MIN' in value || '$MAX' in value) {
|
|
301
|
+
else if ('$min' in value || '$MIN' in value || '$max' in value || '$MAX' in value) {
|
|
275
302
|
// Cassandra doesn't support min/max natively - log warning
|
|
276
|
-
console.warn(`Cassandra does not support $
|
|
303
|
+
console.warn(`Cassandra does not support $min/$max operator natively for column ${key}`);
|
|
277
304
|
setClauses.push(`${key} = ?`);
|
|
278
|
-
values.push(value.$MIN
|
|
305
|
+
values.push((_k = (_j = (_h = value.$min) !== null && _h !== void 0 ? _h : value.$MIN) !== null && _j !== void 0 ? _j : value.$max) !== null && _k !== void 0 ? _k : value.$MAX); // Just set the value as fallback
|
|
306
|
+
}
|
|
307
|
+
else if ('$currentDate' in value || '$CURRENTDATE' in value) {
|
|
308
|
+
setClauses.push(`${key} = toTimestamp(now())`);
|
|
279
309
|
}
|
|
280
310
|
}
|
|
281
311
|
else {
|
|
@@ -825,11 +855,17 @@ class CassandraAdapter extends base_adapter_1.BaseAdapter {
|
|
|
825
855
|
}
|
|
826
856
|
/**
|
|
827
857
|
* Check if value is an update operator object
|
|
858
|
+
* Supports both lowercase (new) and uppercase (legacy) operators
|
|
828
859
|
*/
|
|
829
860
|
isUpdateOperator(value) {
|
|
830
861
|
if (!value || typeof value !== 'object')
|
|
831
862
|
return false;
|
|
832
|
-
|
|
863
|
+
// Support both lowercase (Mongoose style) and uppercase (legacy) operators
|
|
864
|
+
const operators = [
|
|
865
|
+
'$inc', '$INC', '$dec', '$DEC', '$mul', '$MUL', '$min', '$MIN', '$max', '$MAX',
|
|
866
|
+
'$set', '$SET', '$unset', '$UNSET', '$push', '$PUSH', '$pull', '$PULL',
|
|
867
|
+
'$addToSet', '$ADDTOSET', '$currentDate', '$CURRENTDATE'
|
|
868
|
+
];
|
|
833
869
|
return operators.some(op => op in value);
|
|
834
870
|
}
|
|
835
871
|
getParameterPlaceholder(index) {
|
|
@@ -917,17 +953,25 @@ class CassandraAdapter extends base_adapter_1.BaseAdapter {
|
|
|
917
953
|
const clauses = [];
|
|
918
954
|
const params = [];
|
|
919
955
|
for (const [key, value] of Object.entries(where)) {
|
|
920
|
-
|
|
921
|
-
|
|
922
|
-
|
|
923
|
-
|
|
956
|
+
// Normalize key to lowercase for logical operators (support both cases for backwards compatibility)
|
|
957
|
+
const normalizedKey = key.toLowerCase();
|
|
958
|
+
if (normalizedKey === '$and') {
|
|
959
|
+
const conditions = Array.isArray(value) ? value : [value];
|
|
960
|
+
const andClauses = [];
|
|
961
|
+
for (const cond of conditions) {
|
|
962
|
+
const andResult = this.buildWhereClause(cond);
|
|
963
|
+
andClauses.push(andResult.whereClause);
|
|
964
|
+
params.push(...andResult.whereParams);
|
|
965
|
+
}
|
|
966
|
+
clauses.push(`(${andClauses.join(' AND ')})`);
|
|
924
967
|
}
|
|
925
|
-
else if (
|
|
968
|
+
else if (normalizedKey === '$or') {
|
|
926
969
|
// Note: Cassandra has limited OR support - only within the same partition key
|
|
927
970
|
// This will generate the OR clause but may fail at runtime if not on partition key
|
|
971
|
+
const conditions = Array.isArray(value) ? value : Object.entries(value).map(([k, v]) => ({ [k]: v }));
|
|
928
972
|
const orClauses = [];
|
|
929
|
-
for (const
|
|
930
|
-
const orResult = this.buildWhereClause(
|
|
973
|
+
for (const cond of conditions) {
|
|
974
|
+
const orResult = this.buildWhereClause(cond);
|
|
931
975
|
orClauses.push(orResult.whereClause);
|
|
932
976
|
params.push(...orResult.whereParams);
|
|
933
977
|
}
|
|
@@ -936,68 +980,80 @@ class CassandraAdapter extends base_adapter_1.BaseAdapter {
|
|
|
936
980
|
else if (value !== null && typeof value === 'object' && !Array.isArray(value) && !(value instanceof Date)) {
|
|
937
981
|
for (const [op, opValue] of Object.entries(value)) {
|
|
938
982
|
const escapedKey = this.escapeIdentifier(key);
|
|
939
|
-
|
|
940
|
-
|
|
983
|
+
// Normalize operator to lowercase (support both cases for backwards compatibility)
|
|
984
|
+
const normalizedOp = op.toLowerCase();
|
|
985
|
+
switch (normalizedOp) {
|
|
986
|
+
case '$eq':
|
|
941
987
|
clauses.push(`${escapedKey} = ?`);
|
|
942
988
|
params.push(opValue);
|
|
943
989
|
break;
|
|
944
|
-
case '$
|
|
945
|
-
case '$NOT':
|
|
990
|
+
case '$ne':
|
|
946
991
|
clauses.push(`${escapedKey} != ?`);
|
|
947
992
|
params.push(opValue);
|
|
948
993
|
break;
|
|
949
|
-
case '$
|
|
994
|
+
case '$gt':
|
|
950
995
|
clauses.push(`${escapedKey} > ?`);
|
|
951
996
|
params.push(opValue);
|
|
952
997
|
break;
|
|
953
|
-
case '$
|
|
998
|
+
case '$gte':
|
|
954
999
|
clauses.push(`${escapedKey} >= ?`);
|
|
955
1000
|
params.push(opValue);
|
|
956
1001
|
break;
|
|
957
|
-
case '$
|
|
1002
|
+
case '$lt':
|
|
958
1003
|
clauses.push(`${escapedKey} < ?`);
|
|
959
1004
|
params.push(opValue);
|
|
960
1005
|
break;
|
|
961
|
-
case '$
|
|
1006
|
+
case '$lte':
|
|
962
1007
|
clauses.push(`${escapedKey} <= ?`);
|
|
963
1008
|
params.push(opValue);
|
|
964
1009
|
break;
|
|
965
|
-
case '$
|
|
1010
|
+
case '$in':
|
|
966
1011
|
clauses.push(`${escapedKey} IN ?`);
|
|
967
1012
|
params.push(opValue);
|
|
968
1013
|
break;
|
|
969
|
-
case '$
|
|
1014
|
+
case '$nin':
|
|
1015
|
+
case '$not_in':
|
|
970
1016
|
// Cassandra doesn't support NOT IN or multiple != conditions in WHERE clause
|
|
971
1017
|
// Throw an explicit error to prevent silent failures
|
|
972
|
-
throw new database_error_1.DatabaseError(`$
|
|
1018
|
+
throw new database_error_1.DatabaseError(`$nin operator is not supported in Cassandra. ` +
|
|
973
1019
|
`Cassandra does not allow multiple inequality conditions on the same column. ` +
|
|
974
1020
|
`Consider filtering results client-side or restructuring your query.`, enums_1.DatabaseErrorType.QUERY_ERROR);
|
|
975
|
-
case '$
|
|
1021
|
+
case '$like':
|
|
976
1022
|
// Cassandra uses LIKE with SASI indexes or CONTAINS for collections
|
|
977
1023
|
clauses.push(`${escapedKey} LIKE ?`);
|
|
978
1024
|
params.push(opValue);
|
|
979
1025
|
break;
|
|
980
|
-
case '$
|
|
1026
|
+
case '$isnull':
|
|
1027
|
+
case '$is_null':
|
|
981
1028
|
// Cassandra doesn't have IS NULL syntax, use = null
|
|
982
1029
|
if (opValue) {
|
|
983
1030
|
clauses.push(`${escapedKey} = null`);
|
|
984
1031
|
}
|
|
985
1032
|
break;
|
|
986
|
-
case '$
|
|
1033
|
+
case '$isnotnull':
|
|
1034
|
+
case '$is_not_null':
|
|
987
1035
|
// Cassandra doesn't have IS NOT NULL, use != null
|
|
988
1036
|
if (opValue) {
|
|
989
1037
|
clauses.push(`${escapedKey} != null`);
|
|
990
1038
|
}
|
|
991
1039
|
break;
|
|
992
|
-
case '$
|
|
1040
|
+
case '$contains':
|
|
993
1041
|
clauses.push(`${escapedKey} CONTAINS ?`);
|
|
994
1042
|
params.push(opValue);
|
|
995
1043
|
break;
|
|
996
|
-
case '$
|
|
1044
|
+
case '$contains_key':
|
|
997
1045
|
// For map types in Cassandra
|
|
998
1046
|
clauses.push(`${escapedKey} CONTAINS KEY ?`);
|
|
999
1047
|
params.push(opValue);
|
|
1000
1048
|
break;
|
|
1049
|
+
case '$exists':
|
|
1050
|
+
if (opValue) {
|
|
1051
|
+
clauses.push(`${escapedKey} != null`);
|
|
1052
|
+
}
|
|
1053
|
+
else {
|
|
1054
|
+
clauses.push(`${escapedKey} = null`);
|
|
1055
|
+
}
|
|
1056
|
+
break;
|
|
1001
1057
|
}
|
|
1002
1058
|
}
|
|
1003
1059
|
}
|