appwrite-utils-cli 1.9.7 → 1.12.0
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/README.md +1004 -1004
- package/dist/adapters/index.d.ts +7 -8
- package/dist/adapters/index.js +7 -9
- package/dist/backups/operations/bucketBackup.js +2 -2
- package/dist/backups/operations/collectionBackup.d.ts +1 -1
- package/dist/backups/operations/collectionBackup.js +3 -3
- package/dist/backups/operations/comprehensiveBackup.d.ts +1 -1
- package/dist/backups/operations/comprehensiveBackup.js +2 -2
- package/dist/backups/tracking/centralizedTracking.d.ts +1 -1
- package/dist/backups/tracking/centralizedTracking.js +2 -2
- package/dist/cli/commands/configCommands.js +51 -7
- package/dist/cli/commands/databaseCommands.js +156 -104
- package/dist/cli/commands/functionCommands.js +3 -3
- package/dist/cli/commands/importFileCommands.d.ts +7 -0
- package/dist/cli/commands/importFileCommands.js +674 -0
- package/dist/cli/commands/schemaCommands.js +3 -3
- package/dist/cli/commands/storageCommands.js +2 -3
- package/dist/cli/commands/transferCommands.js +3 -5
- package/dist/collections/{attributes.d.ts → columns.d.ts} +1 -1
- package/dist/collections/{attributes.js → columns.js} +15 -9
- package/dist/collections/indexes.js +1 -3
- package/dist/collections/methods.d.ts +1 -1
- package/dist/collections/methods.js +38 -20
- package/dist/collections/tableOperations.d.ts +1 -0
- package/dist/collections/tableOperations.js +30 -11
- package/dist/collections/transferOperations.d.ts +1 -1
- package/dist/collections/transferOperations.js +3 -4
- package/dist/collections/wipeOperations.d.ts +4 -3
- package/dist/collections/wipeOperations.js +112 -39
- package/dist/databases/methods.js +2 -2
- package/dist/databases/setup.js +2 -2
- package/dist/examples/yamlTerminologyExample.js +2 -2
- package/dist/functions/deployments.d.ts +1 -1
- package/dist/functions/deployments.js +6 -6
- package/dist/functions/fnConfigDiscovery.js +2 -2
- package/dist/functions/methods.js +2 -2
- package/dist/functions/templates/count-docs-in-collection/README.md +53 -53
- package/dist/functions/templates/count-docs-in-collection/src/main.ts +159 -159
- package/dist/functions/templates/count-docs-in-collection/src/request.ts +8 -8
- package/dist/functions/templates/hono-typescript/README.md +285 -285
- package/dist/functions/templates/hono-typescript/src/adapters/request.ts +73 -73
- package/dist/functions/templates/hono-typescript/src/adapters/response.ts +105 -105
- package/dist/functions/templates/hono-typescript/src/app.ts +179 -179
- package/dist/functions/templates/hono-typescript/src/context.ts +102 -102
- package/{src/functions/templates/hono-typescript/src/index.ts → dist/functions/templates/hono-typescript/src/main.ts} +53 -53
- package/dist/functions/templates/hono-typescript/src/middleware/appwrite.ts +118 -118
- package/dist/functions/templates/typescript-node/README.md +31 -31
- package/dist/functions/templates/typescript-node/src/context.ts +102 -102
- package/dist/functions/templates/typescript-node/src/{index.ts → main.ts} +29 -29
- package/dist/functions/templates/uv/README.md +30 -30
- package/dist/functions/templates/uv/pyproject.toml +29 -29
- package/dist/functions/templates/uv/src/context.py +124 -124
- package/dist/functions/templates/uv/src/{index.py → main.py} +45 -45
- package/dist/init.js +1 -1
- package/dist/interactiveCLI.d.ts +6 -1
- package/dist/interactiveCLI.js +79 -25
- package/dist/main.js +125 -180
- package/dist/migrations/afterImportActions.js +2 -3
- package/dist/migrations/appwriteToX.d.ts +1 -1
- package/dist/migrations/appwriteToX.js +10 -8
- package/dist/migrations/comprehensiveTransfer.js +3 -5
- package/dist/migrations/dataLoader.d.ts +4 -2
- package/dist/migrations/dataLoader.js +42 -20
- package/dist/migrations/importController.d.ts +2 -0
- package/dist/migrations/importController.js +39 -24
- package/dist/migrations/importDataActions.js +3 -3
- package/dist/migrations/relationships.js +1 -2
- package/dist/migrations/services/DataTransformationService.js +2 -2
- package/dist/migrations/services/FileHandlerService.js +1 -1
- package/dist/migrations/services/ImportOrchestrator.d.ts +2 -0
- package/dist/migrations/services/ImportOrchestrator.js +15 -7
- package/dist/migrations/services/RateLimitManager.js +1 -1
- package/dist/migrations/services/RelationshipResolver.js +1 -1
- package/dist/migrations/services/UserMappingService.js +1 -1
- package/dist/migrations/services/ValidationService.js +1 -1
- package/dist/migrations/transfer.d.ts +8 -4
- package/dist/migrations/transfer.js +108 -55
- package/dist/migrations/yaml/YamlImportConfigLoader.js +52 -52
- package/dist/migrations/yaml/YamlImportIntegration.js +2 -2
- package/dist/migrations/yaml/generateImportSchemas.js +174 -174
- package/dist/setupCommands.d.ts +1 -1
- package/dist/setupCommands.js +5 -6
- package/dist/setupController.js +1 -1
- package/dist/shared/backupTracking.d.ts +1 -1
- package/dist/shared/backupTracking.js +2 -2
- package/dist/shared/confirmationDialogs.js +1 -1
- package/dist/shared/migrationHelpers.d.ts +1 -1
- package/dist/shared/migrationHelpers.js +4 -4
- package/dist/shared/operationQueue.d.ts +1 -1
- package/dist/shared/operationQueue.js +3 -4
- package/dist/shared/operationsTable.d.ts +1 -1
- package/dist/shared/operationsTable.js +35 -34
- package/dist/shared/operationsTableSchema.d.ts +3 -3
- package/dist/shared/operationsTableSchema.js +2 -2
- package/dist/shared/progressManager.js +1 -1
- package/dist/shared/selectionDialogs.d.ts +6 -0
- package/dist/shared/selectionDialogs.js +56 -12
- package/dist/storage/methods.d.ts +12 -0
- package/dist/storage/methods.js +92 -89
- package/dist/storage/schemas.d.ts +2 -2
- package/dist/tables/indexManager.d.ts +1 -1
- package/dist/tables/indexManager.js +2 -2
- package/dist/types.d.ts +2 -2
- package/dist/types.js +1 -1
- package/dist/users/methods.js +2 -3
- package/dist/utils/configMigration.js +1 -1
- package/dist/utils/index.d.ts +1 -1
- package/dist/utils/index.js +1 -1
- package/dist/utils/loadConfigs.d.ts +2 -2
- package/dist/utils/loadConfigs.js +6 -7
- package/dist/utils/setupFiles.js +139 -141
- package/dist/utilsController.d.ts +16 -9
- package/dist/utilsController.js +93 -68
- package/package.json +9 -3
- package/.appwrite/.yaml_schemas/appwrite-config.schema.json +0 -380
- package/.appwrite/.yaml_schemas/collection.schema.json +0 -255
- package/.appwrite/collections/Categories.yaml +0 -182
- package/.appwrite/collections/ExampleCollection.yaml +0 -36
- package/.appwrite/collections/Posts.yaml +0 -227
- package/.appwrite/collections/Users.yaml +0 -149
- package/.appwrite/config.yaml +0 -109
- package/.appwrite/import/README.md +0 -148
- package/.appwrite/import/categories-import.yaml +0 -129
- package/.appwrite/import/posts-import.yaml +0 -208
- package/.appwrite/import/users-import.yaml +0 -130
- package/.appwrite/importData/categories.json +0 -194
- package/.appwrite/importData/posts.json +0 -270
- package/.appwrite/importData/users.json +0 -220
- package/.appwrite/schemas/categories.json +0 -128
- package/.appwrite/schemas/exampleCollection.json +0 -52
- package/.appwrite/schemas/posts.json +0 -173
- package/.appwrite/schemas/users.json +0 -125
- package/CHANGELOG.md +0 -35
- package/CONFIG_TODO.md +0 -1189
- package/SELECTION_DIALOGS.md +0 -146
- package/SERVICE_IMPLEMENTATION_REPORT.md +0 -462
- package/dist/adapters/AdapterFactory.d.ts +0 -94
- package/dist/adapters/AdapterFactory.js +0 -420
- package/dist/adapters/DatabaseAdapter.d.ts +0 -243
- package/dist/adapters/DatabaseAdapter.js +0 -50
- package/dist/adapters/LegacyAdapter.d.ts +0 -50
- package/dist/adapters/LegacyAdapter.js +0 -615
- package/dist/adapters/TablesDBAdapter.d.ts +0 -45
- package/dist/adapters/TablesDBAdapter.js +0 -611
- package/dist/config/ConfigManager.d.ts +0 -450
- package/dist/config/ConfigManager.js +0 -650
- package/dist/config/configMigration.d.ts +0 -87
- package/dist/config/configMigration.js +0 -390
- package/dist/config/configValidation.d.ts +0 -66
- package/dist/config/configValidation.js +0 -358
- package/dist/config/index.d.ts +0 -8
- package/dist/config/index.js +0 -7
- package/dist/config/services/ConfigDiscoveryService.d.ts +0 -122
- package/dist/config/services/ConfigDiscoveryService.js +0 -322
- package/dist/config/services/ConfigLoaderService.d.ts +0 -129
- package/dist/config/services/ConfigLoaderService.js +0 -535
- package/dist/config/services/ConfigMergeService.d.ts +0 -208
- package/dist/config/services/ConfigMergeService.js +0 -308
- package/dist/config/services/ConfigValidationService.d.ts +0 -214
- package/dist/config/services/ConfigValidationService.js +0 -310
- package/dist/config/services/SessionAuthService.d.ts +0 -225
- package/dist/config/services/SessionAuthService.js +0 -456
- package/dist/config/services/__tests__/ConfigMergeService.test.d.ts +0 -1
- package/dist/config/services/__tests__/ConfigMergeService.test.js +0 -271
- package/dist/config/services/index.d.ts +0 -13
- package/dist/config/services/index.js +0 -10
- package/dist/config/yamlConfig.d.ts +0 -722
- package/dist/config/yamlConfig.js +0 -702
- package/dist/functions/pathResolution.d.ts +0 -37
- package/dist/functions/pathResolution.js +0 -185
- package/dist/functions/templates/count-docs-in-collection/package.json +0 -25
- package/dist/functions/templates/count-docs-in-collection/tsconfig.json +0 -28
- package/dist/functions/templates/hono-typescript/package.json +0 -26
- package/dist/functions/templates/hono-typescript/src/index.ts +0 -54
- package/dist/functions/templates/hono-typescript/tsconfig.json +0 -20
- package/dist/functions/templates/typescript-node/package.json +0 -25
- package/dist/functions/templates/typescript-node/tsconfig.json +0 -28
- package/dist/shared/attributeMapper.d.ts +0 -20
- package/dist/shared/attributeMapper.js +0 -203
- package/dist/shared/errorUtils.d.ts +0 -54
- package/dist/shared/errorUtils.js +0 -95
- package/dist/shared/functionManager.d.ts +0 -48
- package/dist/shared/functionManager.js +0 -348
- package/dist/shared/jsonSchemaGenerator.d.ts +0 -50
- package/dist/shared/jsonSchemaGenerator.js +0 -290
- package/dist/shared/logging.d.ts +0 -61
- package/dist/shared/logging.js +0 -116
- package/dist/shared/messageFormatter.d.ts +0 -39
- package/dist/shared/messageFormatter.js +0 -162
- package/dist/shared/pydanticModelGenerator.d.ts +0 -17
- package/dist/shared/pydanticModelGenerator.js +0 -615
- package/dist/shared/schemaGenerator.d.ts +0 -40
- package/dist/shared/schemaGenerator.js +0 -556
- package/dist/utils/ClientFactory.d.ts +0 -87
- package/dist/utils/ClientFactory.js +0 -212
- package/dist/utils/configDiscovery.d.ts +0 -78
- package/dist/utils/configDiscovery.js +0 -472
- package/dist/utils/constantsGenerator.d.ts +0 -31
- package/dist/utils/constantsGenerator.js +0 -321
- package/dist/utils/dataConverters.d.ts +0 -46
- package/dist/utils/dataConverters.js +0 -139
- package/dist/utils/directoryUtils.d.ts +0 -22
- package/dist/utils/directoryUtils.js +0 -59
- package/dist/utils/getClientFromConfig.d.ts +0 -39
- package/dist/utils/getClientFromConfig.js +0 -199
- package/dist/utils/helperFunctions.d.ts +0 -63
- package/dist/utils/helperFunctions.js +0 -156
- package/dist/utils/pathResolvers.d.ts +0 -53
- package/dist/utils/pathResolvers.js +0 -72
- package/dist/utils/projectConfig.d.ts +0 -122
- package/dist/utils/projectConfig.js +0 -206
- package/dist/utils/retryFailedPromises.d.ts +0 -2
- package/dist/utils/retryFailedPromises.js +0 -23
- package/dist/utils/sessionAuth.d.ts +0 -48
- package/dist/utils/sessionAuth.js +0 -164
- package/dist/utils/typeGuards.d.ts +0 -35
- package/dist/utils/typeGuards.js +0 -57
- package/dist/utils/validationRules.d.ts +0 -43
- package/dist/utils/validationRules.js +0 -42
- package/dist/utils/versionDetection.d.ts +0 -58
- package/dist/utils/versionDetection.js +0 -251
- package/dist/utils/yamlConverter.d.ts +0 -100
- package/dist/utils/yamlConverter.js +0 -428
- package/dist/utils/yamlLoader.d.ts +0 -70
- package/dist/utils/yamlLoader.js +0 -267
- package/scripts/copy-templates.ts +0 -23
- package/src/adapters/AdapterFactory.ts +0 -529
- package/src/adapters/DatabaseAdapter.ts +0 -319
- package/src/adapters/LegacyAdapter.ts +0 -844
- package/src/adapters/TablesDBAdapter.ts +0 -823
- package/src/adapters/index.ts +0 -37
- package/src/backups/operations/bucketBackup.ts +0 -277
- package/src/backups/operations/collectionBackup.ts +0 -310
- package/src/backups/operations/comprehensiveBackup.ts +0 -342
- package/src/backups/schemas/bucketManifest.ts +0 -78
- package/src/backups/schemas/comprehensiveManifest.ts +0 -76
- package/src/backups/tracking/centralizedTracking.ts +0 -352
- package/src/cli/commands/configCommands.ts +0 -201
- package/src/cli/commands/databaseCommands.ts +0 -879
- package/src/cli/commands/functionCommands.ts +0 -418
- package/src/cli/commands/schemaCommands.ts +0 -200
- package/src/cli/commands/storageCommands.ts +0 -152
- package/src/cli/commands/transferCommands.ts +0 -457
- package/src/collections/attributes.ts +0 -2020
- package/src/collections/attributes.ts.backup +0 -1555
- package/src/collections/indexes.ts +0 -352
- package/src/collections/methods.ts +0 -700
- package/src/collections/tableOperations.ts +0 -521
- package/src/collections/transferOperations.ts +0 -590
- package/src/collections/wipeOperations.ts +0 -346
- package/src/config/ConfigManager.ts +0 -849
- package/src/config/README.md +0 -274
- package/src/config/configMigration.ts +0 -575
- package/src/config/configValidation.ts +0 -445
- package/src/config/index.ts +0 -10
- package/src/config/services/ConfigDiscoveryService.ts +0 -410
- package/src/config/services/ConfigLoaderService.ts +0 -732
- package/src/config/services/ConfigMergeService.ts +0 -388
- package/src/config/services/ConfigValidationService.ts +0 -394
- package/src/config/services/SessionAuthService.ts +0 -565
- package/src/config/services/__tests__/ConfigMergeService.test.ts +0 -351
- package/src/config/services/index.ts +0 -29
- package/src/config/yamlConfig.ts +0 -761
- package/src/databases/methods.ts +0 -49
- package/src/databases/setup.ts +0 -77
- package/src/examples/yamlTerminologyExample.ts +0 -346
- package/src/functions/deployments.ts +0 -220
- package/src/functions/fnConfigDiscovery.ts +0 -103
- package/src/functions/methods.ts +0 -284
- package/src/functions/pathResolution.ts +0 -227
- package/src/functions/templates/count-docs-in-collection/README.md +0 -54
- package/src/functions/templates/count-docs-in-collection/package.json +0 -25
- package/src/functions/templates/count-docs-in-collection/src/main.ts +0 -159
- package/src/functions/templates/count-docs-in-collection/src/request.ts +0 -9
- package/src/functions/templates/count-docs-in-collection/tsconfig.json +0 -28
- package/src/functions/templates/hono-typescript/README.md +0 -286
- package/src/functions/templates/hono-typescript/package.json +0 -26
- package/src/functions/templates/hono-typescript/src/adapters/request.ts +0 -74
- package/src/functions/templates/hono-typescript/src/adapters/response.ts +0 -106
- package/src/functions/templates/hono-typescript/src/app.ts +0 -180
- package/src/functions/templates/hono-typescript/src/context.ts +0 -103
- package/src/functions/templates/hono-typescript/src/middleware/appwrite.ts +0 -119
- package/src/functions/templates/hono-typescript/tsconfig.json +0 -20
- package/src/functions/templates/typescript-node/README.md +0 -32
- package/src/functions/templates/typescript-node/package.json +0 -25
- package/src/functions/templates/typescript-node/src/context.ts +0 -103
- package/src/functions/templates/typescript-node/src/index.ts +0 -29
- package/src/functions/templates/typescript-node/tsconfig.json +0 -28
- package/src/functions/templates/uv/README.md +0 -31
- package/src/functions/templates/uv/pyproject.toml +0 -30
- package/src/functions/templates/uv/src/__init__.py +0 -0
- package/src/functions/templates/uv/src/context.py +0 -125
- package/src/functions/templates/uv/src/index.py +0 -46
- package/src/init.ts +0 -62
- package/src/interactiveCLI.ts +0 -1136
- package/src/main.ts +0 -1670
- package/src/migrations/afterImportActions.ts +0 -580
- package/src/migrations/appwriteToX.ts +0 -664
- package/src/migrations/comprehensiveTransfer.ts +0 -2285
- package/src/migrations/dataLoader.ts +0 -1702
- package/src/migrations/importController.ts +0 -428
- package/src/migrations/importDataActions.ts +0 -315
- package/src/migrations/relationships.ts +0 -334
- package/src/migrations/services/DataTransformationService.ts +0 -196
- package/src/migrations/services/FileHandlerService.ts +0 -311
- package/src/migrations/services/ImportOrchestrator.ts +0 -666
- package/src/migrations/services/RateLimitManager.ts +0 -363
- package/src/migrations/services/RelationshipResolver.ts +0 -461
- package/src/migrations/services/UserMappingService.ts +0 -345
- package/src/migrations/services/ValidationService.ts +0 -349
- package/src/migrations/transfer.ts +0 -1068
- package/src/migrations/yaml/YamlImportConfigLoader.ts +0 -439
- package/src/migrations/yaml/YamlImportIntegration.ts +0 -446
- package/src/migrations/yaml/generateImportSchemas.ts +0 -1354
- package/src/schemas/authUser.ts +0 -23
- package/src/setup.ts +0 -8
- package/src/setupCommands.ts +0 -603
- package/src/setupController.ts +0 -43
- package/src/shared/attributeMapper.ts +0 -229
- package/src/shared/backupMetadataSchema.ts +0 -93
- package/src/shared/backupTracking.ts +0 -211
- package/src/shared/confirmationDialogs.ts +0 -327
- package/src/shared/errorUtils.ts +0 -110
- package/src/shared/functionManager.ts +0 -537
- package/src/shared/jsonSchemaGenerator.ts +0 -383
- package/src/shared/logging.ts +0 -149
- package/src/shared/messageFormatter.ts +0 -208
- package/src/shared/migrationHelpers.ts +0 -232
- package/src/shared/operationLogger.ts +0 -20
- package/src/shared/operationQueue.ts +0 -377
- package/src/shared/operationsTable.ts +0 -338
- package/src/shared/operationsTableSchema.ts +0 -60
- package/src/shared/progressManager.ts +0 -278
- package/src/shared/pydanticModelGenerator.ts +0 -618
- package/src/shared/relationshipExtractor.ts +0 -214
- package/src/shared/schemaGenerator.ts +0 -644
- package/src/shared/selectionDialogs.ts +0 -749
- package/src/storage/backupCompression.ts +0 -88
- package/src/storage/methods.ts +0 -698
- package/src/storage/schemas.ts +0 -205
- package/src/tables/indexManager.ts +0 -409
- package/src/types/node-appwrite-tablesdb.d.ts +0 -44
- package/src/types.ts +0 -9
- package/src/users/methods.ts +0 -359
- package/src/utils/ClientFactory.ts +0 -240
- package/src/utils/configDiscovery.ts +0 -557
- package/src/utils/configMigration.ts +0 -348
- package/src/utils/constantsGenerator.ts +0 -369
- package/src/utils/dataConverters.ts +0 -159
- package/src/utils/directoryUtils.ts +0 -61
- package/src/utils/getClientFromConfig.ts +0 -257
- package/src/utils/helperFunctions.ts +0 -228
- package/src/utils/index.ts +0 -2
- package/src/utils/loadConfigs.ts +0 -449
- package/src/utils/pathResolvers.ts +0 -81
- package/src/utils/projectConfig.ts +0 -340
- package/src/utils/retryFailedPromises.ts +0 -29
- package/src/utils/sessionAuth.ts +0 -230
- package/src/utils/setupFiles.ts +0 -1238
- package/src/utils/typeGuards.ts +0 -65
- package/src/utils/validationRules.ts +0 -88
- package/src/utils/versionDetection.ts +0 -292
- package/src/utils/yamlConverter.ts +0 -542
- package/src/utils/yamlLoader.ts +0 -371
- package/src/utilsController.ts +0 -1213
- package/tests/README.md +0 -497
- package/tests/adapters/AdapterFactory.test.ts +0 -277
- package/tests/integration/syncOperations.test.ts +0 -463
- package/tests/jest.config.js +0 -25
- package/tests/migration/configMigration.test.ts +0 -546
- package/tests/setup.ts +0 -62
- package/tests/testUtils.ts +0 -340
- package/tests/utils/loadConfigs.test.ts +0 -350
- package/tests/validation/configValidation.test.ts +0 -412
- package/tmp-sync-test/.appwrite/collections/TestCollection.yaml +0 -7
- package/tsconfig.json +0 -44
|
@@ -1,180 +1,180 @@
|
|
|
1
|
-
import { Hono } from "hono";
|
|
2
|
-
import { Client, Databases, Storage, Users } from "node-appwrite";
|
|
3
|
-
import { appwriteMiddleware, requestLogger, errorHandler, appwriteHeaders } from "./middleware/appwrite.js";
|
|
4
|
-
|
|
5
|
-
// Create the Hono app
|
|
6
|
-
export const app = new Hono();
|
|
7
|
-
|
|
8
|
-
// Global middleware - Applied to all routes
|
|
9
|
-
app.use("*", errorHandler());
|
|
10
|
-
app.use("*", requestLogger());
|
|
11
|
-
app.use("*", appwriteHeaders());
|
|
12
|
-
|
|
13
|
-
// Helper function to get initialized Appwrite client
|
|
14
|
-
function getAppwriteClient(c: any) {
|
|
15
|
-
const appwriteContext = c.get("appwriteContext");
|
|
16
|
-
|
|
17
|
-
const client = new Client()
|
|
18
|
-
.setEndpoint(process.env["APPWRITE_FUNCTION_ENDPOINT"]!)
|
|
19
|
-
.setProject(process.env["APPWRITE_FUNCTION_PROJECT_ID"]!)
|
|
20
|
-
.setKey(appwriteContext.req.headers["x-appwrite-key"] || process.env["APPWRITE_FUNCTION_API_KEY"]!);
|
|
21
|
-
|
|
22
|
-
return {
|
|
23
|
-
client,
|
|
24
|
-
databases: new Databases(client),
|
|
25
|
-
storage: new Storage(client),
|
|
26
|
-
users: new Users(client),
|
|
27
|
-
};
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
// Routes
|
|
31
|
-
|
|
32
|
-
// Health check endpoint
|
|
33
|
-
app.get("/", (c) => {
|
|
34
|
-
c.log("Health check requested");
|
|
35
|
-
return c.json({
|
|
36
|
-
message: "Hello from {{functionName}} with Hono!",
|
|
37
|
-
functionName: "{{functionName}}",
|
|
38
|
-
timestamp: new Date().toISOString(),
|
|
39
|
-
method: c.req.method,
|
|
40
|
-
path: c.req.path,
|
|
41
|
-
appwriteTrigger: c.appwrite.trigger,
|
|
42
|
-
isAuthenticated: c.appwrite.isUserAuthenticated(),
|
|
43
|
-
});
|
|
44
|
-
});
|
|
45
|
-
|
|
46
|
-
// API health endpoint
|
|
47
|
-
app.get("/health", (c) => {
|
|
48
|
-
return c.json({
|
|
49
|
-
status: "healthy",
|
|
50
|
-
timestamp: new Date().toISOString(),
|
|
51
|
-
version: "1.0.0",
|
|
52
|
-
environment: {
|
|
53
|
-
nodeVersion: process.version,
|
|
54
|
-
appwriteEndpoint: process.env["APPWRITE_FUNCTION_ENDPOINT"],
|
|
55
|
-
appwriteProject: process.env["APPWRITE_FUNCTION_PROJECT_ID"],
|
|
56
|
-
appwriteRuntime: process.env["APPWRITE_FUNCTION_RUNTIME_NAME"],
|
|
57
|
-
},
|
|
58
|
-
});
|
|
59
|
-
});
|
|
60
|
-
|
|
61
|
-
// Example API endpoints
|
|
62
|
-
|
|
63
|
-
// GET /api/user - Get current user info
|
|
64
|
-
app.get("/api/user", async (c) => {
|
|
65
|
-
if (!c.appwrite.isUserAuthenticated()) {
|
|
66
|
-
return c.json({ error: "User not authenticated" }, 401);
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
try {
|
|
70
|
-
const { users } = getAppwriteClient(c);
|
|
71
|
-
const user = await users.get(c.appwrite.userId!);
|
|
72
|
-
|
|
73
|
-
c.log(`Retrieved user info for ${user.email}`);
|
|
74
|
-
return c.json({ user });
|
|
75
|
-
} catch (error) {
|
|
76
|
-
c.error(`Failed to get user: ${error}`);
|
|
77
|
-
return c.json({ error: "Failed to retrieve user" }, 500);
|
|
78
|
-
}
|
|
79
|
-
});
|
|
80
|
-
|
|
81
|
-
// POST /api/webhook - Generic webhook handler
|
|
82
|
-
app.post("/api/webhook", async (c) => {
|
|
83
|
-
const data = await c.req.json();
|
|
84
|
-
|
|
85
|
-
c.log(`Webhook received: ${JSON.stringify(data)}`);
|
|
86
|
-
|
|
87
|
-
// Process webhook data here
|
|
88
|
-
// Example: Save to database, send notifications, etc.
|
|
89
|
-
|
|
90
|
-
return c.json({
|
|
91
|
-
message: "Webhook processed successfully",
|
|
92
|
-
received: data,
|
|
93
|
-
timestamp: new Date().toISOString(),
|
|
94
|
-
event: c.appwrite.event,
|
|
95
|
-
});
|
|
96
|
-
});
|
|
97
|
-
|
|
98
|
-
// GET /api/databases - List databases (requires API key)
|
|
99
|
-
app.get("/api/databases", async (c) => {
|
|
100
|
-
if (!c.appwrite.isApiKeyRequest()) {
|
|
101
|
-
return c.json({ error: "API key required" }, 401);
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
try {
|
|
105
|
-
const { databases } = getAppwriteClient(c);
|
|
106
|
-
const databasesList = await databases.list();
|
|
107
|
-
|
|
108
|
-
c.log(`Listed ${databasesList.databases.length} databases`);
|
|
109
|
-
return c.json({ databases: databasesList.databases });
|
|
110
|
-
} catch (error) {
|
|
111
|
-
c.error(`Failed to list databases: ${error}`);
|
|
112
|
-
return c.json({ error: "Failed to list databases" }, 500);
|
|
113
|
-
}
|
|
114
|
-
});
|
|
115
|
-
|
|
116
|
-
// POST /api/data/:databaseId/:collectionId - Create document
|
|
117
|
-
app.post("/api/data/:databaseId/:collectionId", async (c) => {
|
|
118
|
-
const databaseId = c.req.param("databaseId");
|
|
119
|
-
const collectionId = c.req.param("collectionId");
|
|
120
|
-
const data = await c.req.json();
|
|
121
|
-
|
|
122
|
-
try {
|
|
123
|
-
const { databases } = getAppwriteClient(c);
|
|
124
|
-
const document = await databases.createDocument(
|
|
125
|
-
databaseId,
|
|
126
|
-
collectionId,
|
|
127
|
-
"unique()",
|
|
128
|
-
data
|
|
129
|
-
);
|
|
130
|
-
|
|
131
|
-
c.log(`Created document in ${databaseId}/${collectionId}`);
|
|
132
|
-
return c.json({ document }, 201);
|
|
133
|
-
} catch (error) {
|
|
134
|
-
c.error(`Failed to create document: ${error}`);
|
|
135
|
-
return c.json({ error: "Failed to create document" }, 500);
|
|
136
|
-
}
|
|
137
|
-
});
|
|
138
|
-
|
|
139
|
-
// GET /api/data/:databaseId/:collectionId - List documents
|
|
140
|
-
app.get("/api/data/:databaseId/:collectionId", async (c) => {
|
|
141
|
-
const databaseId = c.req.param("databaseId");
|
|
142
|
-
const collectionId = c.req.param("collectionId");
|
|
143
|
-
const limit = parseInt(c.req.query("limit") || "25");
|
|
144
|
-
const offset = parseInt(c.req.query("offset") || "0");
|
|
145
|
-
|
|
146
|
-
try {
|
|
147
|
-
const { databases } = getAppwriteClient(c);
|
|
148
|
-
const documents = await databases.listDocuments(
|
|
149
|
-
databaseId,
|
|
150
|
-
collectionId,
|
|
151
|
-
undefined,
|
|
152
|
-
limit,
|
|
153
|
-
offset
|
|
154
|
-
);
|
|
155
|
-
|
|
156
|
-
c.log(`Listed ${documents.documents.length} documents from ${databaseId}/${collectionId}`);
|
|
157
|
-
return c.json({ documents: documents.documents, total: documents.total });
|
|
158
|
-
} catch (error) {
|
|
159
|
-
c.error(`Failed to list documents: ${error}`);
|
|
160
|
-
return c.json({ error: "Failed to list documents" }, 500);
|
|
161
|
-
}
|
|
162
|
-
});
|
|
163
|
-
|
|
164
|
-
// Handle 404s
|
|
165
|
-
app.notFound((c) => {
|
|
166
|
-
c.log(`Route not found: ${c.req.method} ${c.req.path}`);
|
|
167
|
-
return c.json({
|
|
168
|
-
error: "Not Found",
|
|
169
|
-
message: `Route ${c.req.method} ${c.req.path} not found`,
|
|
170
|
-
availableRoutes: [
|
|
171
|
-
"GET /",
|
|
172
|
-
"GET /health",
|
|
173
|
-
"GET /api/user",
|
|
174
|
-
"POST /api/webhook",
|
|
175
|
-
"GET /api/databases",
|
|
176
|
-
"POST /api/data/:databaseId/:collectionId",
|
|
177
|
-
"GET /api/data/:databaseId/:collectionId",
|
|
178
|
-
],
|
|
179
|
-
}, 404);
|
|
1
|
+
import { Hono } from "hono";
|
|
2
|
+
import { Client, Databases, Storage, Users } from "node-appwrite";
|
|
3
|
+
import { appwriteMiddleware, requestLogger, errorHandler, appwriteHeaders } from "./middleware/appwrite.js";
|
|
4
|
+
|
|
5
|
+
// Create the Hono app
|
|
6
|
+
export const app = new Hono();
|
|
7
|
+
|
|
8
|
+
// Global middleware - Applied to all routes
|
|
9
|
+
app.use("*", errorHandler());
|
|
10
|
+
app.use("*", requestLogger());
|
|
11
|
+
app.use("*", appwriteHeaders());
|
|
12
|
+
|
|
13
|
+
// Helper function to get initialized Appwrite client
|
|
14
|
+
function getAppwriteClient(c: any) {
|
|
15
|
+
const appwriteContext = c.get("appwriteContext");
|
|
16
|
+
|
|
17
|
+
const client = new Client()
|
|
18
|
+
.setEndpoint(process.env["APPWRITE_FUNCTION_ENDPOINT"]!)
|
|
19
|
+
.setProject(process.env["APPWRITE_FUNCTION_PROJECT_ID"]!)
|
|
20
|
+
.setKey(appwriteContext.req.headers["x-appwrite-key"] || process.env["APPWRITE_FUNCTION_API_KEY"]!);
|
|
21
|
+
|
|
22
|
+
return {
|
|
23
|
+
client,
|
|
24
|
+
databases: new Databases(client),
|
|
25
|
+
storage: new Storage(client),
|
|
26
|
+
users: new Users(client),
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
// Routes
|
|
31
|
+
|
|
32
|
+
// Health check endpoint
|
|
33
|
+
app.get("/", (c) => {
|
|
34
|
+
c.log("Health check requested");
|
|
35
|
+
return c.json({
|
|
36
|
+
message: "Hello from {{functionName}} with Hono!",
|
|
37
|
+
functionName: "{{functionName}}",
|
|
38
|
+
timestamp: new Date().toISOString(),
|
|
39
|
+
method: c.req.method,
|
|
40
|
+
path: c.req.path,
|
|
41
|
+
appwriteTrigger: c.appwrite.trigger,
|
|
42
|
+
isAuthenticated: c.appwrite.isUserAuthenticated(),
|
|
43
|
+
});
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
// API health endpoint
|
|
47
|
+
app.get("/health", (c) => {
|
|
48
|
+
return c.json({
|
|
49
|
+
status: "healthy",
|
|
50
|
+
timestamp: new Date().toISOString(),
|
|
51
|
+
version: "1.0.0",
|
|
52
|
+
environment: {
|
|
53
|
+
nodeVersion: process.version,
|
|
54
|
+
appwriteEndpoint: process.env["APPWRITE_FUNCTION_ENDPOINT"],
|
|
55
|
+
appwriteProject: process.env["APPWRITE_FUNCTION_PROJECT_ID"],
|
|
56
|
+
appwriteRuntime: process.env["APPWRITE_FUNCTION_RUNTIME_NAME"],
|
|
57
|
+
},
|
|
58
|
+
});
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
// Example API endpoints
|
|
62
|
+
|
|
63
|
+
// GET /api/user - Get current user info
|
|
64
|
+
app.get("/api/user", async (c) => {
|
|
65
|
+
if (!c.appwrite.isUserAuthenticated()) {
|
|
66
|
+
return c.json({ error: "User not authenticated" }, 401);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
try {
|
|
70
|
+
const { users } = getAppwriteClient(c);
|
|
71
|
+
const user = await users.get(c.appwrite.userId!);
|
|
72
|
+
|
|
73
|
+
c.log(`Retrieved user info for ${user.email}`);
|
|
74
|
+
return c.json({ user });
|
|
75
|
+
} catch (error) {
|
|
76
|
+
c.error(`Failed to get user: ${error}`);
|
|
77
|
+
return c.json({ error: "Failed to retrieve user" }, 500);
|
|
78
|
+
}
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
// POST /api/webhook - Generic webhook handler
|
|
82
|
+
app.post("/api/webhook", async (c) => {
|
|
83
|
+
const data = await c.req.json();
|
|
84
|
+
|
|
85
|
+
c.log(`Webhook received: ${JSON.stringify(data)}`);
|
|
86
|
+
|
|
87
|
+
// Process webhook data here
|
|
88
|
+
// Example: Save to database, send notifications, etc.
|
|
89
|
+
|
|
90
|
+
return c.json({
|
|
91
|
+
message: "Webhook processed successfully",
|
|
92
|
+
received: data,
|
|
93
|
+
timestamp: new Date().toISOString(),
|
|
94
|
+
event: c.appwrite.event,
|
|
95
|
+
});
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
// GET /api/databases - List databases (requires API key)
|
|
99
|
+
app.get("/api/databases", async (c) => {
|
|
100
|
+
if (!c.appwrite.isApiKeyRequest()) {
|
|
101
|
+
return c.json({ error: "API key required" }, 401);
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
try {
|
|
105
|
+
const { databases } = getAppwriteClient(c);
|
|
106
|
+
const databasesList = await databases.list();
|
|
107
|
+
|
|
108
|
+
c.log(`Listed ${databasesList.databases.length} databases`);
|
|
109
|
+
return c.json({ databases: databasesList.databases });
|
|
110
|
+
} catch (error) {
|
|
111
|
+
c.error(`Failed to list databases: ${error}`);
|
|
112
|
+
return c.json({ error: "Failed to list databases" }, 500);
|
|
113
|
+
}
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
// POST /api/data/:databaseId/:collectionId - Create document
|
|
117
|
+
app.post("/api/data/:databaseId/:collectionId", async (c) => {
|
|
118
|
+
const databaseId = c.req.param("databaseId");
|
|
119
|
+
const collectionId = c.req.param("collectionId");
|
|
120
|
+
const data = await c.req.json();
|
|
121
|
+
|
|
122
|
+
try {
|
|
123
|
+
const { databases } = getAppwriteClient(c);
|
|
124
|
+
const document = await databases.createDocument(
|
|
125
|
+
databaseId,
|
|
126
|
+
collectionId,
|
|
127
|
+
"unique()",
|
|
128
|
+
data
|
|
129
|
+
);
|
|
130
|
+
|
|
131
|
+
c.log(`Created document in ${databaseId}/${collectionId}`);
|
|
132
|
+
return c.json({ document }, 201);
|
|
133
|
+
} catch (error) {
|
|
134
|
+
c.error(`Failed to create document: ${error}`);
|
|
135
|
+
return c.json({ error: "Failed to create document" }, 500);
|
|
136
|
+
}
|
|
137
|
+
});
|
|
138
|
+
|
|
139
|
+
// GET /api/data/:databaseId/:collectionId - List documents
|
|
140
|
+
app.get("/api/data/:databaseId/:collectionId", async (c) => {
|
|
141
|
+
const databaseId = c.req.param("databaseId");
|
|
142
|
+
const collectionId = c.req.param("collectionId");
|
|
143
|
+
const limit = parseInt(c.req.query("limit") || "25");
|
|
144
|
+
const offset = parseInt(c.req.query("offset") || "0");
|
|
145
|
+
|
|
146
|
+
try {
|
|
147
|
+
const { databases } = getAppwriteClient(c);
|
|
148
|
+
const documents = await databases.listDocuments(
|
|
149
|
+
databaseId,
|
|
150
|
+
collectionId,
|
|
151
|
+
undefined,
|
|
152
|
+
limit,
|
|
153
|
+
offset
|
|
154
|
+
);
|
|
155
|
+
|
|
156
|
+
c.log(`Listed ${documents.documents.length} documents from ${databaseId}/${collectionId}`);
|
|
157
|
+
return c.json({ documents: documents.documents, total: documents.total });
|
|
158
|
+
} catch (error) {
|
|
159
|
+
c.error(`Failed to list documents: ${error}`);
|
|
160
|
+
return c.json({ error: "Failed to list documents" }, 500);
|
|
161
|
+
}
|
|
162
|
+
});
|
|
163
|
+
|
|
164
|
+
// Handle 404s
|
|
165
|
+
app.notFound((c) => {
|
|
166
|
+
c.log(`Route not found: ${c.req.method} ${c.req.path}`);
|
|
167
|
+
return c.json({
|
|
168
|
+
error: "Not Found",
|
|
169
|
+
message: `Route ${c.req.method} ${c.req.path} not found`,
|
|
170
|
+
availableRoutes: [
|
|
171
|
+
"GET /",
|
|
172
|
+
"GET /health",
|
|
173
|
+
"GET /api/user",
|
|
174
|
+
"POST /api/webhook",
|
|
175
|
+
"GET /api/databases",
|
|
176
|
+
"POST /api/data/:databaseId/:collectionId",
|
|
177
|
+
"GET /api/data/:databaseId/:collectionId",
|
|
178
|
+
],
|
|
179
|
+
}, 404);
|
|
180
180
|
});
|
|
@@ -1,103 +1,103 @@
|
|
|
1
|
-
import { z } from "zod";
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Appwrite Request Headers Schema
|
|
5
|
-
*/
|
|
6
|
-
export const AppwriteHeadersSchema = z.object({
|
|
7
|
-
"x-appwrite-trigger": z.enum(["http", "schedule", "event"]).optional(),
|
|
8
|
-
"x-appwrite-event": z.string().optional(),
|
|
9
|
-
"x-appwrite-key": z.string().optional(),
|
|
10
|
-
"x-appwrite-user-id": z.string().optional(),
|
|
11
|
-
"x-appwrite-user-jwt": z.string().optional(),
|
|
12
|
-
"x-appwrite-country-code": z.string().optional(),
|
|
13
|
-
"x-appwrite-continent-code": z.string().optional(),
|
|
14
|
-
"x-appwrite-continent-eu": z.string().optional(),
|
|
15
|
-
}).catchall(z.string()); // Allow additional headers
|
|
16
|
-
|
|
17
|
-
/**
|
|
18
|
-
* Appwrite Environment Variables Schema
|
|
19
|
-
*/
|
|
20
|
-
export const AppwriteEnvSchema = z.object({
|
|
21
|
-
APPWRITE_FUNCTION_API_ENDPOINT: z.string(),
|
|
22
|
-
APPWRITE_VERSION: z.string(),
|
|
23
|
-
APPWRITE_REGION: z.string(),
|
|
24
|
-
APPWRITE_FUNCTION_API_KEY: z.string().optional(),
|
|
25
|
-
APPWRITE_FUNCTION_ID: z.string(),
|
|
26
|
-
APPWRITE_FUNCTION_NAME: z.string(),
|
|
27
|
-
APPWRITE_FUNCTION_DEPLOYMENT: z.string(),
|
|
28
|
-
APPWRITE_FUNCTION_PROJECT_ID: z.string(),
|
|
29
|
-
APPWRITE_FUNCTION_RUNTIME_NAME: z.string(),
|
|
30
|
-
APPWRITE_FUNCTION_RUNTIME_VERSION: z.string(),
|
|
31
|
-
});
|
|
32
|
-
|
|
33
|
-
/**
|
|
34
|
-
* Appwrite Request Schema (full version from docs)
|
|
35
|
-
*/
|
|
36
|
-
export const AppwriteRequestSchema = z.object({
|
|
37
|
-
bodyText: z.string().optional(),
|
|
38
|
-
bodyJson: z.union([z.any(), z.string()]).transform((t) => {
|
|
39
|
-
if (typeof t === "string") {
|
|
40
|
-
try {
|
|
41
|
-
return JSON.parse(t);
|
|
42
|
-
} catch {
|
|
43
|
-
return null;
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
return t;
|
|
47
|
-
}).optional(),
|
|
48
|
-
body: z.any().optional(),
|
|
49
|
-
headers: AppwriteHeadersSchema,
|
|
50
|
-
scheme: z.enum(["http", "https"]).optional(),
|
|
51
|
-
method: z.enum(["GET", "POST", "PUT", "DELETE", "PATCH", "OPTIONS", "HEAD"]),
|
|
52
|
-
url: z.string().optional(),
|
|
53
|
-
host: z.string().optional(),
|
|
54
|
-
port: z.number().or(z.string()).optional(),
|
|
55
|
-
path: z.string().optional(),
|
|
56
|
-
queryString: z.string().optional(),
|
|
57
|
-
query: z.record(z.string(), z.any()).optional(),
|
|
58
|
-
variables: z.record(z.string(), z.any()).optional(),
|
|
59
|
-
text: z.any().optional(),
|
|
60
|
-
payload: z.string().optional(),
|
|
61
|
-
});
|
|
62
|
-
|
|
63
|
-
/**
|
|
64
|
-
* Appwrite Response Schema
|
|
65
|
-
*/
|
|
66
|
-
export const AppwriteResponseSchema = z.object({
|
|
67
|
-
json: z.any(),
|
|
68
|
-
text: z.any(),
|
|
69
|
-
empty: z.any().optional(),
|
|
70
|
-
binary: z.any().optional(),
|
|
71
|
-
redirect: z.any().optional(),
|
|
72
|
-
});
|
|
73
|
-
|
|
74
|
-
/**
|
|
75
|
-
* Log Function Schema - Simple function type
|
|
76
|
-
*/
|
|
77
|
-
export const AppwriteLogSchema = z.any();
|
|
78
|
-
|
|
79
|
-
/**
|
|
80
|
-
* Error Function Schema - Simple function type
|
|
81
|
-
*/
|
|
82
|
-
export const AppwriteErrorSchema = z.any();
|
|
83
|
-
|
|
84
|
-
/**
|
|
85
|
-
* Complete Appwrite Context Schema
|
|
86
|
-
*/
|
|
87
|
-
export const AppwriteContextSchema = z.object({
|
|
88
|
-
req: AppwriteRequestSchema,
|
|
89
|
-
res: AppwriteResponseSchema,
|
|
90
|
-
log: AppwriteLogSchema,
|
|
91
|
-
error: AppwriteErrorSchema,
|
|
92
|
-
});
|
|
93
|
-
|
|
94
|
-
/**
|
|
95
|
-
* Type inference helpers
|
|
96
|
-
*/
|
|
97
|
-
export type AppwriteHeaders = z.infer<typeof AppwriteHeadersSchema>;
|
|
98
|
-
export type AppwriteEnv = z.infer<typeof AppwriteEnvSchema>;
|
|
99
|
-
export type AppwriteRequest = z.infer<typeof AppwriteRequestSchema>;
|
|
100
|
-
export type AppwriteResponse = z.infer<typeof AppwriteResponseSchema>;
|
|
101
|
-
export type AppwriteLog = z.infer<typeof AppwriteLogSchema>;
|
|
102
|
-
export type AppwriteError = z.infer<typeof AppwriteErrorSchema>;
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Appwrite Request Headers Schema
|
|
5
|
+
*/
|
|
6
|
+
export const AppwriteHeadersSchema = z.object({
|
|
7
|
+
"x-appwrite-trigger": z.enum(["http", "schedule", "event"]).optional(),
|
|
8
|
+
"x-appwrite-event": z.string().optional(),
|
|
9
|
+
"x-appwrite-key": z.string().optional(),
|
|
10
|
+
"x-appwrite-user-id": z.string().optional(),
|
|
11
|
+
"x-appwrite-user-jwt": z.string().optional(),
|
|
12
|
+
"x-appwrite-country-code": z.string().optional(),
|
|
13
|
+
"x-appwrite-continent-code": z.string().optional(),
|
|
14
|
+
"x-appwrite-continent-eu": z.string().optional(),
|
|
15
|
+
}).catchall(z.string()); // Allow additional headers
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Appwrite Environment Variables Schema
|
|
19
|
+
*/
|
|
20
|
+
export const AppwriteEnvSchema = z.object({
|
|
21
|
+
APPWRITE_FUNCTION_API_ENDPOINT: z.string(),
|
|
22
|
+
APPWRITE_VERSION: z.string(),
|
|
23
|
+
APPWRITE_REGION: z.string(),
|
|
24
|
+
APPWRITE_FUNCTION_API_KEY: z.string().optional(),
|
|
25
|
+
APPWRITE_FUNCTION_ID: z.string(),
|
|
26
|
+
APPWRITE_FUNCTION_NAME: z.string(),
|
|
27
|
+
APPWRITE_FUNCTION_DEPLOYMENT: z.string(),
|
|
28
|
+
APPWRITE_FUNCTION_PROJECT_ID: z.string(),
|
|
29
|
+
APPWRITE_FUNCTION_RUNTIME_NAME: z.string(),
|
|
30
|
+
APPWRITE_FUNCTION_RUNTIME_VERSION: z.string(),
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Appwrite Request Schema (full version from docs)
|
|
35
|
+
*/
|
|
36
|
+
export const AppwriteRequestSchema = z.object({
|
|
37
|
+
bodyText: z.string().optional(),
|
|
38
|
+
bodyJson: z.union([z.any(), z.string()]).transform((t) => {
|
|
39
|
+
if (typeof t === "string") {
|
|
40
|
+
try {
|
|
41
|
+
return JSON.parse(t);
|
|
42
|
+
} catch {
|
|
43
|
+
return null;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return t;
|
|
47
|
+
}).optional(),
|
|
48
|
+
body: z.any().optional(),
|
|
49
|
+
headers: AppwriteHeadersSchema,
|
|
50
|
+
scheme: z.enum(["http", "https"]).optional(),
|
|
51
|
+
method: z.enum(["GET", "POST", "PUT", "DELETE", "PATCH", "OPTIONS", "HEAD"]),
|
|
52
|
+
url: z.string().optional(),
|
|
53
|
+
host: z.string().optional(),
|
|
54
|
+
port: z.number().or(z.string()).optional(),
|
|
55
|
+
path: z.string().optional(),
|
|
56
|
+
queryString: z.string().optional(),
|
|
57
|
+
query: z.record(z.string(), z.any()).optional(),
|
|
58
|
+
variables: z.record(z.string(), z.any()).optional(),
|
|
59
|
+
text: z.any().optional(),
|
|
60
|
+
payload: z.string().optional(),
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Appwrite Response Schema
|
|
65
|
+
*/
|
|
66
|
+
export const AppwriteResponseSchema = z.object({
|
|
67
|
+
json: z.any(),
|
|
68
|
+
text: z.any(),
|
|
69
|
+
empty: z.any().optional(),
|
|
70
|
+
binary: z.any().optional(),
|
|
71
|
+
redirect: z.any().optional(),
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Log Function Schema - Simple function type
|
|
76
|
+
*/
|
|
77
|
+
export const AppwriteLogSchema = z.any();
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* Error Function Schema - Simple function type
|
|
81
|
+
*/
|
|
82
|
+
export const AppwriteErrorSchema = z.any();
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* Complete Appwrite Context Schema
|
|
86
|
+
*/
|
|
87
|
+
export const AppwriteContextSchema = z.object({
|
|
88
|
+
req: AppwriteRequestSchema,
|
|
89
|
+
res: AppwriteResponseSchema,
|
|
90
|
+
log: AppwriteLogSchema,
|
|
91
|
+
error: AppwriteErrorSchema,
|
|
92
|
+
});
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* Type inference helpers
|
|
96
|
+
*/
|
|
97
|
+
export type AppwriteHeaders = z.infer<typeof AppwriteHeadersSchema>;
|
|
98
|
+
export type AppwriteEnv = z.infer<typeof AppwriteEnvSchema>;
|
|
99
|
+
export type AppwriteRequest = z.infer<typeof AppwriteRequestSchema>;
|
|
100
|
+
export type AppwriteResponse = z.infer<typeof AppwriteResponseSchema>;
|
|
101
|
+
export type AppwriteLog = z.infer<typeof AppwriteLogSchema>;
|
|
102
|
+
export type AppwriteError = z.infer<typeof AppwriteErrorSchema>;
|
|
103
103
|
export type AppwriteContext = z.infer<typeof AppwriteContextSchema>;
|
|
@@ -1,54 +1,54 @@
|
|
|
1
|
-
import { app } from "./app.js";
|
|
2
|
-
import { AppwriteContext, AppwriteContextSchema } from "./context.js";
|
|
3
|
-
import { convertAppwriteToWebRequest } from "./adapters/request.js";
|
|
4
|
-
import { convertWebResponseToAppwrite } from "./adapters/response.js";
|
|
5
|
-
import { appwriteMiddleware } from "./middleware/appwrite.js";
|
|
6
|
-
|
|
7
|
-
/**
|
|
8
|
-
* Main Appwrite function entry point
|
|
9
|
-
* This function receives the Appwrite context and routes it through Hono
|
|
10
|
-
*/
|
|
11
|
-
export default async function (context: AppwriteContext) {
|
|
12
|
-
const { req, res, log, error } = context;
|
|
13
|
-
|
|
14
|
-
try {
|
|
15
|
-
// Optional: Validate the context using Zod schema
|
|
16
|
-
AppwriteContextSchema.parse(context);
|
|
17
|
-
log("Context validation successful");
|
|
18
|
-
|
|
19
|
-
// Add Appwrite context middleware to the Hono app
|
|
20
|
-
app.use("*", appwriteMiddleware(context));
|
|
21
|
-
|
|
22
|
-
// Convert Appwrite request to Web API Request for Hono
|
|
23
|
-
const webRequest = convertAppwriteToWebRequest(req);
|
|
24
|
-
|
|
25
|
-
log(`Processing ${req.method} request to ${req.path || "/"}`);
|
|
26
|
-
|
|
27
|
-
// Create execution environment for Hono
|
|
28
|
-
const env = {
|
|
29
|
-
// Add any environment variables or context needed by Hono
|
|
30
|
-
APPWRITE_FUNCTION_ENDPOINT: process.env["APPWRITE_FUNCTION_ENDPOINT"],
|
|
31
|
-
APPWRITE_FUNCTION_PROJECT_ID: process.env["APPWRITE_FUNCTION_PROJECT_ID"],
|
|
32
|
-
APPWRITE_FUNCTION_API_KEY: process.env["APPWRITE_FUNCTION_API_KEY"],
|
|
33
|
-
};
|
|
34
|
-
|
|
35
|
-
// Process request through Hono app
|
|
36
|
-
const honoResponse = await app.fetch(webRequest, env);
|
|
37
|
-
|
|
38
|
-
// Convert Hono response back to Appwrite response format
|
|
39
|
-
await convertWebResponseToAppwrite(honoResponse, res);
|
|
40
|
-
|
|
41
|
-
log(`Request completed with status ${honoResponse.status}`);
|
|
42
|
-
|
|
43
|
-
} catch (validationError) {
|
|
44
|
-
error(`Function execution failed: ${validationError}`);
|
|
45
|
-
|
|
46
|
-
// Return error response
|
|
47
|
-
return res.json({
|
|
48
|
-
error: "Function execution failed",
|
|
49
|
-
message: validationError instanceof Error ? validationError.message : String(validationError),
|
|
50
|
-
functionName: "{{functionName}}",
|
|
51
|
-
timestamp: new Date().toISOString(),
|
|
52
|
-
}, 500);
|
|
53
|
-
}
|
|
1
|
+
import { app } from "./app.js";
|
|
2
|
+
import { AppwriteContext, AppwriteContextSchema } from "./context.js";
|
|
3
|
+
import { convertAppwriteToWebRequest } from "./adapters/request.js";
|
|
4
|
+
import { convertWebResponseToAppwrite } from "./adapters/response.js";
|
|
5
|
+
import { appwriteMiddleware } from "./middleware/appwrite.js";
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Main Appwrite function entry point
|
|
9
|
+
* This function receives the Appwrite context and routes it through Hono
|
|
10
|
+
*/
|
|
11
|
+
export default async function (context: AppwriteContext) {
|
|
12
|
+
const { req, res, log, error } = context;
|
|
13
|
+
|
|
14
|
+
try {
|
|
15
|
+
// Optional: Validate the context using Zod schema
|
|
16
|
+
AppwriteContextSchema.parse(context);
|
|
17
|
+
log("Context validation successful");
|
|
18
|
+
|
|
19
|
+
// Add Appwrite context middleware to the Hono app
|
|
20
|
+
app.use("*", appwriteMiddleware(context));
|
|
21
|
+
|
|
22
|
+
// Convert Appwrite request to Web API Request for Hono
|
|
23
|
+
const webRequest = convertAppwriteToWebRequest(req);
|
|
24
|
+
|
|
25
|
+
log(`Processing ${req.method} request to ${req.path || "/"}`);
|
|
26
|
+
|
|
27
|
+
// Create execution environment for Hono
|
|
28
|
+
const env = {
|
|
29
|
+
// Add any environment variables or context needed by Hono
|
|
30
|
+
APPWRITE_FUNCTION_ENDPOINT: process.env["APPWRITE_FUNCTION_ENDPOINT"],
|
|
31
|
+
APPWRITE_FUNCTION_PROJECT_ID: process.env["APPWRITE_FUNCTION_PROJECT_ID"],
|
|
32
|
+
APPWRITE_FUNCTION_API_KEY: process.env["APPWRITE_FUNCTION_API_KEY"],
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
// Process request through Hono app
|
|
36
|
+
const honoResponse = await app.fetch(webRequest, env);
|
|
37
|
+
|
|
38
|
+
// Convert Hono response back to Appwrite response format
|
|
39
|
+
await convertWebResponseToAppwrite(honoResponse, res);
|
|
40
|
+
|
|
41
|
+
log(`Request completed with status ${honoResponse.status}`);
|
|
42
|
+
|
|
43
|
+
} catch (validationError) {
|
|
44
|
+
error(`Function execution failed: ${validationError}`);
|
|
45
|
+
|
|
46
|
+
// Return error response
|
|
47
|
+
return res.json({
|
|
48
|
+
error: "Function execution failed",
|
|
49
|
+
message: validationError instanceof Error ? validationError.message : String(validationError),
|
|
50
|
+
functionName: "{{functionName}}",
|
|
51
|
+
timestamp: new Date().toISOString(),
|
|
52
|
+
}, 500);
|
|
53
|
+
}
|
|
54
54
|
}
|