@friggframework/core 2.0.0-next.41 → 2.0.0-next.43
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/CLAUDE.md +693 -0
- package/README.md +931 -50
- package/application/commands/README.md +421 -0
- package/application/commands/credential-commands.js +224 -0
- package/application/commands/entity-commands.js +315 -0
- package/application/commands/integration-commands.js +160 -0
- package/application/commands/integration-commands.test.js +123 -0
- package/application/commands/user-commands.js +213 -0
- package/application/index.js +69 -0
- package/core/CLAUDE.md +690 -0
- package/core/create-handler.js +0 -6
- package/credential/repositories/credential-repository-factory.js +47 -0
- package/credential/repositories/credential-repository-interface.js +98 -0
- package/credential/repositories/credential-repository-mongo.js +301 -0
- package/credential/repositories/credential-repository-postgres.js +307 -0
- package/credential/repositories/credential-repository.js +307 -0
- package/credential/use-cases/get-credential-for-user.js +21 -0
- package/credential/use-cases/update-authentication-status.js +15 -0
- package/database/config.js +117 -0
- package/database/encryption/README.md +683 -0
- package/database/encryption/encryption-integration.test.js +553 -0
- package/database/encryption/encryption-schema-registry.js +141 -0
- package/database/encryption/encryption-schema-registry.test.js +392 -0
- package/database/encryption/field-encryption-service.js +226 -0
- package/database/encryption/field-encryption-service.test.js +525 -0
- package/database/encryption/logger.js +79 -0
- package/database/encryption/mongo-decryption-fix-verification.test.js +348 -0
- package/database/encryption/postgres-decryption-fix-verification.test.js +371 -0
- package/database/encryption/postgres-relation-decryption.test.js +245 -0
- package/database/encryption/prisma-encryption-extension.js +222 -0
- package/database/encryption/prisma-encryption-extension.test.js +439 -0
- package/database/index.js +25 -12
- package/database/models/readme.md +1 -0
- package/database/prisma.js +162 -0
- package/database/repositories/health-check-repository-factory.js +38 -0
- package/database/repositories/health-check-repository-interface.js +86 -0
- package/database/repositories/health-check-repository-mongodb.js +72 -0
- package/database/repositories/health-check-repository-postgres.js +75 -0
- package/database/repositories/health-check-repository.js +108 -0
- package/database/use-cases/check-database-health-use-case.js +34 -0
- package/database/use-cases/check-encryption-health-use-case.js +82 -0
- package/database/use-cases/test-encryption-use-case.js +252 -0
- package/encrypt/Cryptor.js +20 -152
- package/encrypt/index.js +1 -2
- package/encrypt/test-encrypt.js +0 -2
- package/handlers/app-definition-loader.js +38 -0
- package/handlers/app-handler-helpers.js +0 -3
- package/handlers/auth-flow.integration.test.js +147 -0
- package/handlers/backend-utils.js +25 -45
- package/handlers/integration-event-dispatcher.js +54 -0
- package/handlers/integration-event-dispatcher.test.js +141 -0
- package/handlers/routers/HEALTHCHECK.md +103 -1
- package/handlers/routers/auth.js +3 -14
- package/handlers/routers/health.js +63 -424
- package/handlers/routers/health.test.js +7 -0
- package/handlers/routers/integration-defined-routers.js +8 -5
- package/handlers/routers/user.js +27 -5
- package/handlers/routers/websocket.js +5 -3
- package/handlers/use-cases/check-external-apis-health-use-case.js +81 -0
- package/handlers/use-cases/check-integrations-health-use-case.js +32 -0
- package/handlers/workers/integration-defined-workers.js +6 -3
- package/index.js +45 -22
- package/integrations/index.js +12 -10
- package/integrations/integration-base.js +224 -53
- package/integrations/integration-router.js +386 -178
- package/integrations/options.js +1 -1
- package/integrations/repositories/integration-mapping-repository-factory.js +50 -0
- package/integrations/repositories/integration-mapping-repository-interface.js +106 -0
- package/integrations/repositories/integration-mapping-repository-mongo.js +161 -0
- package/integrations/repositories/integration-mapping-repository-postgres.js +227 -0
- package/integrations/repositories/integration-mapping-repository.js +156 -0
- package/integrations/repositories/integration-repository-factory.js +44 -0
- package/integrations/repositories/integration-repository-interface.js +115 -0
- package/integrations/repositories/integration-repository-mongo.js +271 -0
- package/integrations/repositories/integration-repository-postgres.js +319 -0
- package/integrations/tests/doubles/dummy-integration-class.js +90 -0
- package/integrations/tests/doubles/test-integration-repository.js +99 -0
- package/integrations/tests/use-cases/create-integration.test.js +131 -0
- package/integrations/tests/use-cases/delete-integration-for-user.test.js +150 -0
- package/integrations/tests/use-cases/find-integration-context-by-external-entity-id.test.js +92 -0
- package/integrations/tests/use-cases/get-integration-for-user.test.js +150 -0
- package/integrations/tests/use-cases/get-integration-instance.test.js +176 -0
- package/integrations/tests/use-cases/get-integrations-for-user.test.js +176 -0
- package/integrations/tests/use-cases/get-possible-integrations.test.js +188 -0
- package/integrations/tests/use-cases/update-integration-messages.test.js +142 -0
- package/integrations/tests/use-cases/update-integration-status.test.js +103 -0
- package/integrations/tests/use-cases/update-integration.test.js +141 -0
- package/integrations/use-cases/create-integration.js +83 -0
- package/integrations/use-cases/delete-integration-for-user.js +73 -0
- package/integrations/use-cases/find-integration-context-by-external-entity-id.js +72 -0
- package/integrations/use-cases/get-integration-for-user.js +78 -0
- package/integrations/use-cases/get-integration-instance-by-definition.js +67 -0
- package/integrations/use-cases/get-integration-instance.js +83 -0
- package/integrations/use-cases/get-integrations-for-user.js +87 -0
- package/integrations/use-cases/get-possible-integrations.js +27 -0
- package/integrations/use-cases/index.js +11 -0
- package/integrations/use-cases/load-integration-context-full.test.js +329 -0
- package/integrations/use-cases/load-integration-context.js +71 -0
- package/integrations/use-cases/load-integration-context.test.js +114 -0
- package/integrations/use-cases/update-integration-messages.js +44 -0
- package/integrations/use-cases/update-integration-status.js +32 -0
- package/integrations/use-cases/update-integration.js +93 -0
- package/integrations/utils/map-integration-dto.js +36 -0
- package/jest-global-setup-noop.js +3 -0
- package/jest-global-teardown-noop.js +3 -0
- package/{module-plugin → modules}/entity.js +1 -0
- package/{module-plugin → modules}/index.js +0 -8
- package/modules/module-factory.js +56 -0
- package/modules/module-hydration.test.js +205 -0
- package/modules/module.js +221 -0
- package/modules/repositories/module-repository-factory.js +33 -0
- package/modules/repositories/module-repository-interface.js +129 -0
- package/modules/repositories/module-repository-mongo.js +386 -0
- package/modules/repositories/module-repository-postgres.js +437 -0
- package/modules/repositories/module-repository.js +327 -0
- package/{module-plugin → modules}/test/mock-api/api.js +8 -3
- package/{module-plugin → modules}/test/mock-api/definition.js +12 -8
- package/modules/tests/doubles/test-module-factory.js +16 -0
- package/modules/tests/doubles/test-module-repository.js +39 -0
- package/modules/use-cases/get-entities-for-user.js +32 -0
- package/modules/use-cases/get-entity-options-by-id.js +59 -0
- package/modules/use-cases/get-entity-options-by-type.js +34 -0
- package/modules/use-cases/get-module-instance-from-type.js +31 -0
- package/modules/use-cases/get-module.js +56 -0
- package/modules/use-cases/process-authorization-callback.js +122 -0
- package/modules/use-cases/refresh-entity-options.js +59 -0
- package/modules/use-cases/test-module-auth.js +55 -0
- package/modules/utils/map-module-dto.js +18 -0
- package/package.json +14 -6
- package/prisma-mongodb/schema.prisma +318 -0
- package/prisma-postgresql/migrations/20250930193005_init/migration.sql +315 -0
- package/prisma-postgresql/migrations/20251006135218_init/migration.sql +9 -0
- package/prisma-postgresql/migrations/20251010000000_remove_unused_entity_reference_map/migration.sql +3 -0
- package/prisma-postgresql/migrations/migration_lock.toml +3 -0
- package/prisma-postgresql/schema.prisma +300 -0
- package/syncs/manager.js +468 -443
- package/syncs/repositories/sync-repository-factory.js +38 -0
- package/syncs/repositories/sync-repository-interface.js +109 -0
- package/syncs/repositories/sync-repository-mongo.js +239 -0
- package/syncs/repositories/sync-repository-postgres.js +319 -0
- package/syncs/sync.js +0 -1
- package/token/repositories/token-repository-factory.js +33 -0
- package/token/repositories/token-repository-interface.js +131 -0
- package/token/repositories/token-repository-mongo.js +212 -0
- package/token/repositories/token-repository-postgres.js +257 -0
- package/token/repositories/token-repository.js +219 -0
- package/types/integrations/index.d.ts +2 -6
- package/types/module-plugin/index.d.ts +5 -57
- package/types/syncs/index.d.ts +0 -2
- package/user/repositories/user-repository-factory.js +46 -0
- package/user/repositories/user-repository-interface.js +198 -0
- package/user/repositories/user-repository-mongo.js +250 -0
- package/user/repositories/user-repository-postgres.js +311 -0
- package/user/tests/doubles/test-user-repository.js +72 -0
- package/user/tests/use-cases/create-individual-user.test.js +24 -0
- package/user/tests/use-cases/create-organization-user.test.js +28 -0
- package/user/tests/use-cases/create-token-for-user-id.test.js +19 -0
- package/user/tests/use-cases/get-user-from-bearer-token.test.js +64 -0
- package/user/tests/use-cases/login-user.test.js +140 -0
- package/user/use-cases/create-individual-user.js +61 -0
- package/user/use-cases/create-organization-user.js +47 -0
- package/user/use-cases/create-token-for-user-id.js +30 -0
- package/user/use-cases/get-user-from-bearer-token.js +77 -0
- package/user/use-cases/login-user.js +122 -0
- package/user/user.js +77 -0
- package/websocket/repositories/websocket-connection-repository-factory.js +37 -0
- package/websocket/repositories/websocket-connection-repository-interface.js +106 -0
- package/websocket/repositories/websocket-connection-repository-mongo.js +155 -0
- package/websocket/repositories/websocket-connection-repository-postgres.js +195 -0
- package/websocket/repositories/websocket-connection-repository.js +160 -0
- package/database/models/State.js +0 -9
- package/database/models/Token.js +0 -70
- package/database/mongo.js +0 -171
- package/encrypt/Cryptor.test.js +0 -32
- package/encrypt/encrypt.js +0 -104
- package/encrypt/encrypt.test.js +0 -1069
- package/handlers/routers/middleware/loadUser.js +0 -15
- package/handlers/routers/middleware/requireLoggedInUser.js +0 -12
- package/integrations/create-frigg-backend.js +0 -31
- package/integrations/integration-factory.js +0 -251
- package/integrations/integration-mapping.js +0 -43
- package/integrations/integration-model.js +0 -46
- package/integrations/integration-user.js +0 -144
- package/integrations/test/integration-base.test.js +0 -144
- package/module-plugin/auther.js +0 -393
- package/module-plugin/credential.js +0 -22
- package/module-plugin/entity-manager.js +0 -70
- package/module-plugin/manager.js +0 -169
- package/module-plugin/module-factory.js +0 -61
- package/module-plugin/test/auther.test.js +0 -97
- /package/{module-plugin → modules}/ModuleConstants.js +0 -0
- /package/{module-plugin → modules}/requester/api-key.js +0 -0
- /package/{module-plugin → modules}/requester/basic.js +0 -0
- /package/{module-plugin → modules}/requester/oauth-2.js +0 -0
- /package/{module-plugin → modules}/requester/requester.js +0 -0
- /package/{module-plugin → modules}/requester/requester.test.js +0 -0
- /package/{module-plugin → modules}/test/mock-api/mocks/hubspot.js +0 -0
package/database/mongo.js
DELETED
|
@@ -1,171 +0,0 @@
|
|
|
1
|
-
// Best Practices Connecting from AWS Lambda:
|
|
2
|
-
// https://dev.to/adnanrahic/building-a-serverless-rest-api-with-nodejs-and-mongodb-43db
|
|
3
|
-
// https://mongoosejs.com/docs/lambda.html
|
|
4
|
-
// https://www.mongodb.com/blog/post/optimizing-aws-lambda-performance-with-mongodb-atlas-and-nodejs
|
|
5
|
-
const { Encrypt } = require('../encrypt');
|
|
6
|
-
const { mongoose } = require('./mongoose');
|
|
7
|
-
const { debug, flushDebugLog } = require('../logs');
|
|
8
|
-
const { findNearestBackendPackageJson } = require('../utils');
|
|
9
|
-
const path = require('path');
|
|
10
|
-
const fs = require('fs');
|
|
11
|
-
|
|
12
|
-
mongoose.plugin(Encrypt);
|
|
13
|
-
mongoose.set('applyPluginsToDiscriminators', true); // Needed for LHEncrypt
|
|
14
|
-
|
|
15
|
-
// Load app definition to check for DocumentDB configuration
|
|
16
|
-
let appDefinition = {};
|
|
17
|
-
let mongoConfig = {
|
|
18
|
-
useNewUrlParser: true,
|
|
19
|
-
bufferCommands: false, // Disable mongoose buffering
|
|
20
|
-
autoCreate: false, // Disable because auto creation does not work without buffering
|
|
21
|
-
useUnifiedTopology: true,
|
|
22
|
-
serverSelectionTimeoutMS: 5000,
|
|
23
|
-
};
|
|
24
|
-
|
|
25
|
-
const checkIsConnected = () => mongoose.connection?.readyState > 0;
|
|
26
|
-
|
|
27
|
-
const connectToDatabase = async () => {
|
|
28
|
-
if (checkIsConnected()) {
|
|
29
|
-
debug('=> using existing database connection');
|
|
30
|
-
return;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
console.log('🔗 Connecting to database...');
|
|
34
|
-
|
|
35
|
-
// Load appDefinition inside the function
|
|
36
|
-
try {
|
|
37
|
-
console.log(
|
|
38
|
-
'🔍 Loading app definition for DocumentDB configuration...'
|
|
39
|
-
);
|
|
40
|
-
|
|
41
|
-
const backendPath = findNearestBackendPackageJson();
|
|
42
|
-
if (!backendPath) {
|
|
43
|
-
throw new Error('Could not find backend package.json');
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
const backendDir = path.dirname(backendPath);
|
|
47
|
-
const backendFilePath = path.join(backendDir, 'index.js');
|
|
48
|
-
if (!fs.existsSync(backendFilePath)) {
|
|
49
|
-
throw new Error('Could not find index.js');
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
const backend = require(backendFilePath);
|
|
53
|
-
appDefinition = backend.Definition;
|
|
54
|
-
|
|
55
|
-
console.log('📁 AppDefinition content:', JSON.stringify(appDefinition));
|
|
56
|
-
|
|
57
|
-
// Add DocumentDB TLS configuration if enabled
|
|
58
|
-
if (appDefinition.database?.documentDB?.enable === true) {
|
|
59
|
-
console.log('📄 DocumentDB configuration detected, enabling TLS');
|
|
60
|
-
console.log('📁 Current working directory:', process.cwd());
|
|
61
|
-
console.log(
|
|
62
|
-
'📋 App definition database config:',
|
|
63
|
-
JSON.stringify(appDefinition.database, null, 2)
|
|
64
|
-
);
|
|
65
|
-
|
|
66
|
-
mongoConfig.tls = true;
|
|
67
|
-
|
|
68
|
-
// Set TLS CA file path if specified
|
|
69
|
-
if (appDefinition.database.documentDB.tlsCAFile) {
|
|
70
|
-
const tlsCAFile = appDefinition.database.documentDB.tlsCAFile;
|
|
71
|
-
|
|
72
|
-
// Basic safety: reject obviously dangerous paths
|
|
73
|
-
if (tlsCAFile.includes('..') || path.isAbsolute(tlsCAFile)) {
|
|
74
|
-
console.warn(
|
|
75
|
-
'⚠️ Rejecting potentially unsafe tlsCAFile path:',
|
|
76
|
-
tlsCAFile
|
|
77
|
-
);
|
|
78
|
-
} else {
|
|
79
|
-
const tlsCAFilePath = path.resolve(
|
|
80
|
-
process.cwd(),
|
|
81
|
-
tlsCAFile
|
|
82
|
-
);
|
|
83
|
-
|
|
84
|
-
console.log('📄 DocumentDB TLS CA file configured:');
|
|
85
|
-
console.log(' 📎 Original path:', tlsCAFile);
|
|
86
|
-
console.log(' 📎 Resolved path:', tlsCAFilePath);
|
|
87
|
-
console.log(
|
|
88
|
-
' 📄 File exists:',
|
|
89
|
-
fs.existsSync(tlsCAFilePath)
|
|
90
|
-
);
|
|
91
|
-
|
|
92
|
-
// Only set tlsCAFile if the file actually exists
|
|
93
|
-
if (fs.existsSync(tlsCAFilePath)) {
|
|
94
|
-
mongoConfig.tlsCAFile = tlsCAFilePath;
|
|
95
|
-
console.log('✅ TLS CA file configured successfully');
|
|
96
|
-
} else {
|
|
97
|
-
throw new Error(
|
|
98
|
-
`TLS CA file not found at ${tlsCAFilePath}`
|
|
99
|
-
);
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
// Debug directory listing (only in development)
|
|
103
|
-
if (process.env.NODE_ENV !== 'production') {
|
|
104
|
-
try {
|
|
105
|
-
console.log('📁 Current directory contents:');
|
|
106
|
-
fs.readdirSync(process.cwd()).forEach((item) => {
|
|
107
|
-
const stats = fs.statSync(
|
|
108
|
-
path.join(process.cwd(), item)
|
|
109
|
-
);
|
|
110
|
-
console.log(
|
|
111
|
-
` ${
|
|
112
|
-
stats.isDirectory() ? '📁' : '📄'
|
|
113
|
-
} ${item}`
|
|
114
|
-
);
|
|
115
|
-
});
|
|
116
|
-
|
|
117
|
-
const securityDir = path.join(
|
|
118
|
-
process.cwd(),
|
|
119
|
-
'security'
|
|
120
|
-
);
|
|
121
|
-
if (fs.existsSync(securityDir)) {
|
|
122
|
-
console.log('📁 Security directory contents:');
|
|
123
|
-
fs.readdirSync(securityDir).forEach((item) => {
|
|
124
|
-
console.log(` 📄 ${item}`);
|
|
125
|
-
});
|
|
126
|
-
} else {
|
|
127
|
-
console.log(
|
|
128
|
-
'❌ Security directory does not exist at:',
|
|
129
|
-
securityDir
|
|
130
|
-
);
|
|
131
|
-
}
|
|
132
|
-
} catch (error) {
|
|
133
|
-
console.log(
|
|
134
|
-
'❌ Error listing directory contents:',
|
|
135
|
-
error.message
|
|
136
|
-
);
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
} else {
|
|
142
|
-
console.log(
|
|
143
|
-
'📄 DocumentDB not enabled, using standard MongoDB configuration'
|
|
144
|
-
);
|
|
145
|
-
}
|
|
146
|
-
} catch (error) {
|
|
147
|
-
console.error('❌ Error loading app definition:', error.message);
|
|
148
|
-
debug(
|
|
149
|
-
'Could not load app definition for DocumentDB configuration:',
|
|
150
|
-
error.message
|
|
151
|
-
);
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
console.log('🔗 MongoDB URI:', process.env.MONGO_URI ? 'SET' : 'NOT SET');
|
|
155
|
-
console.log('🔧 Final mongoConfig:', JSON.stringify(mongoConfig, null, 2));
|
|
156
|
-
|
|
157
|
-
debug('=> using new database connection');
|
|
158
|
-
await mongoose.connect(process.env.MONGO_URI, mongoConfig);
|
|
159
|
-
debug('Connection state:', mongoose.STATES[mongoose.connection.readyState]);
|
|
160
|
-
mongoose.connection.on('error', (error) => flushDebugLog(error));
|
|
161
|
-
};
|
|
162
|
-
|
|
163
|
-
const disconnectFromDatabase = async () => mongoose.disconnect();
|
|
164
|
-
|
|
165
|
-
const createObjectId = () => new mongoose.Types.ObjectId();
|
|
166
|
-
|
|
167
|
-
module.exports = {
|
|
168
|
-
connectToDatabase,
|
|
169
|
-
disconnectFromDatabase,
|
|
170
|
-
createObjectId,
|
|
171
|
-
};
|
package/encrypt/Cryptor.test.js
DELETED
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
const { Cryptor } = require('./Cryptor');
|
|
2
|
-
|
|
3
|
-
describe('Cryptor', () => {
|
|
4
|
-
describe('Permutations', () => {
|
|
5
|
-
it('calculates permutations correctly', async () => {
|
|
6
|
-
// Given a nested field, we want all possible paths that could access it.
|
|
7
|
-
const cryptor = new Cryptor({ fields: ['a.b.c.d', 'e'] });
|
|
8
|
-
expect(cryptor.permutationsByField).toEqual({
|
|
9
|
-
'a.b.c.d': [
|
|
10
|
-
['a', 'b', 'c', 'd'],
|
|
11
|
-
['a', 'b', 'c.d'],
|
|
12
|
-
['a', 'b.c', 'd'],
|
|
13
|
-
['a', 'b.c.d'],
|
|
14
|
-
['a.b', 'c', 'd'],
|
|
15
|
-
['a.b', 'c.d'],
|
|
16
|
-
['a.b.c', 'd'],
|
|
17
|
-
['a.b.c.d'],
|
|
18
|
-
],
|
|
19
|
-
e: [['e']],
|
|
20
|
-
});
|
|
21
|
-
});
|
|
22
|
-
});
|
|
23
|
-
|
|
24
|
-
describe('Keys', () => {
|
|
25
|
-
it('raises error on missing environment', () => {
|
|
26
|
-
const cryptor = new Cryptor({ fields: ['a.b.c.d', 'e'] });
|
|
27
|
-
expect(cryptor.getKeyFromEnvironment).toThrow(
|
|
28
|
-
'No encryption key found with ID "undefined"'
|
|
29
|
-
);
|
|
30
|
-
});
|
|
31
|
-
});
|
|
32
|
-
});
|
package/encrypt/encrypt.js
DELETED
|
@@ -1,104 +0,0 @@
|
|
|
1
|
-
const { Cryptor } = require('./Cryptor');
|
|
2
|
-
|
|
3
|
-
const updateOneEvents = [
|
|
4
|
-
'updateOne',
|
|
5
|
-
'replaceOne',
|
|
6
|
-
'findOneAndUpdate',
|
|
7
|
-
'findOneAndReplace',
|
|
8
|
-
];
|
|
9
|
-
const findOneEvents = [
|
|
10
|
-
'findOne',
|
|
11
|
-
'findOneAndDelete',
|
|
12
|
-
'findOneAndRemove',
|
|
13
|
-
'findOneAndUpdate',
|
|
14
|
-
'findOneAndReplace',
|
|
15
|
-
];
|
|
16
|
-
|
|
17
|
-
const shouldBypassEncryption = (STAGE) => {
|
|
18
|
-
const defaultBypassStages = ['dev', 'test', 'local'];
|
|
19
|
-
return defaultBypassStages.includes(STAGE);
|
|
20
|
-
};
|
|
21
|
-
|
|
22
|
-
function Encrypt(schema) {
|
|
23
|
-
const { STAGE, KMS_KEY_ARN, AES_KEY_ID } = process.env;
|
|
24
|
-
|
|
25
|
-
if (shouldBypassEncryption(STAGE)) {
|
|
26
|
-
return;
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
const hasAES = AES_KEY_ID && AES_KEY_ID.trim() !== '';
|
|
30
|
-
const hasKMS = KMS_KEY_ARN && KMS_KEY_ARN.trim() !== '' && !hasAES;
|
|
31
|
-
|
|
32
|
-
const fields = Object.values(schema.paths)
|
|
33
|
-
.map(({ path, options }) => (options.lhEncrypt === true ? path : ''))
|
|
34
|
-
.filter(Boolean);
|
|
35
|
-
|
|
36
|
-
if (!fields.length) {
|
|
37
|
-
return;
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
const cryptor = new Cryptor({
|
|
41
|
-
shouldUseAws: hasKMS,
|
|
42
|
-
fields: fields,
|
|
43
|
-
});
|
|
44
|
-
|
|
45
|
-
schema.pre('save', async function encryptionPreSave() {
|
|
46
|
-
await cryptor.encryptFieldsInDocuments([this]);
|
|
47
|
-
});
|
|
48
|
-
|
|
49
|
-
schema.pre(
|
|
50
|
-
'insertMany',
|
|
51
|
-
async function encryptionPreInsertMany(_, docs, options) {
|
|
52
|
-
if (options?.rawResult) {
|
|
53
|
-
throw new Error(
|
|
54
|
-
'Raw result not supported for insertMany with Encrypt plugin'
|
|
55
|
-
);
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
await cryptor.encryptFieldsInDocuments(docs);
|
|
59
|
-
}
|
|
60
|
-
);
|
|
61
|
-
|
|
62
|
-
schema.pre(updateOneEvents, async function encryptionPreUpdateOne() {
|
|
63
|
-
await cryptor.encryptFieldsInQuery(this);
|
|
64
|
-
});
|
|
65
|
-
|
|
66
|
-
schema.pre('updateMany', async function encryptionPreUpdateMany() {
|
|
67
|
-
cryptor.expectNotToUpdateManyEncrypted(this.getUpdate());
|
|
68
|
-
});
|
|
69
|
-
|
|
70
|
-
schema.pre('update', async function encryptionPreUpdate() {
|
|
71
|
-
const { multiple } = this.getOptions();
|
|
72
|
-
|
|
73
|
-
if (multiple) {
|
|
74
|
-
cryptor.expectNotToUpdateManyEncrypted(this.getUpdate());
|
|
75
|
-
return;
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
await cryptor.encryptFieldsInQuery(this);
|
|
79
|
-
});
|
|
80
|
-
|
|
81
|
-
schema.post('save', async function encryptionPreSave() {
|
|
82
|
-
await cryptor.decryptFieldsInDocuments([this]);
|
|
83
|
-
});
|
|
84
|
-
|
|
85
|
-
schema.post(findOneEvents, async function encryptionPostFindOne(doc) {
|
|
86
|
-
const { rawResult } = this.getOptions();
|
|
87
|
-
|
|
88
|
-
if (rawResult) {
|
|
89
|
-
return;
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
await cryptor.decryptFieldsInDocuments([doc]);
|
|
93
|
-
});
|
|
94
|
-
|
|
95
|
-
schema.post('find', async function encryptionPostFind(docs) {
|
|
96
|
-
await cryptor.decryptFieldsInDocuments(docs);
|
|
97
|
-
});
|
|
98
|
-
|
|
99
|
-
schema.post('insertMany', async function encryptionPostInsertMany(docs) {
|
|
100
|
-
await cryptor.decryptFieldsInDocuments(docs);
|
|
101
|
-
});
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
module.exports = { Encrypt };
|