appwrite-utils-cli 0.10.86 → 1.0.2
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/.appwrite/.yaml_schemas/appwrite-config.schema.json +380 -0
- package/.appwrite/.yaml_schemas/collection.schema.json +255 -0
- package/.appwrite/collections/Categories.yaml +182 -0
- package/.appwrite/collections/ExampleCollection.yaml +36 -0
- package/.appwrite/collections/Posts.yaml +227 -0
- package/.appwrite/collections/Users.yaml +149 -0
- package/.appwrite/config.yaml +109 -0
- package/.appwrite/import/README.md +148 -0
- package/.appwrite/import/categories-import.yaml +129 -0
- package/.appwrite/import/posts-import.yaml +208 -0
- package/.appwrite/import/users-import.yaml +130 -0
- package/.appwrite/importData/categories.json +194 -0
- package/.appwrite/importData/posts.json +270 -0
- package/.appwrite/importData/users.json +220 -0
- package/.appwrite/schemas/categories.json +128 -0
- package/.appwrite/schemas/exampleCollection.json +52 -0
- package/.appwrite/schemas/posts.json +173 -0
- package/.appwrite/schemas/users.json +125 -0
- package/README.md +264 -33
- package/dist/collections/attributes.js +3 -2
- package/dist/collections/methods.js +56 -38
- package/dist/config/yamlConfig.d.ts +501 -0
- package/dist/config/yamlConfig.js +452 -0
- package/dist/databases/setup.d.ts +6 -0
- package/dist/databases/setup.js +119 -0
- package/dist/functions/methods.d.ts +1 -1
- package/dist/functions/methods.js +5 -2
- package/dist/functions/openapi.d.ts +4 -0
- package/dist/functions/openapi.js +60 -0
- package/dist/interactiveCLI.d.ts +5 -0
- package/dist/interactiveCLI.js +194 -49
- package/dist/main.js +91 -30
- package/dist/migrations/afterImportActions.js +2 -2
- package/dist/migrations/appwriteToX.d.ts +10 -0
- package/dist/migrations/appwriteToX.js +15 -4
- package/dist/migrations/backup.d.ts +16 -16
- package/dist/migrations/dataLoader.d.ts +83 -1
- package/dist/migrations/dataLoader.js +4 -4
- package/dist/migrations/importController.js +25 -18
- package/dist/migrations/importDataActions.js +2 -2
- package/dist/migrations/logging.d.ts +9 -1
- package/dist/migrations/logging.js +41 -22
- package/dist/migrations/migrationHelper.d.ts +4 -4
- package/dist/migrations/relationships.js +1 -1
- package/dist/migrations/services/DataTransformationService.d.ts +55 -0
- package/dist/migrations/services/DataTransformationService.js +158 -0
- package/dist/migrations/services/FileHandlerService.d.ts +75 -0
- package/dist/migrations/services/FileHandlerService.js +236 -0
- package/dist/migrations/services/ImportOrchestrator.d.ts +97 -0
- package/dist/migrations/services/ImportOrchestrator.js +488 -0
- package/dist/migrations/services/RateLimitManager.d.ts +138 -0
- package/dist/migrations/services/RateLimitManager.js +279 -0
- package/dist/migrations/services/RelationshipResolver.d.ts +120 -0
- package/dist/migrations/services/RelationshipResolver.js +332 -0
- package/dist/migrations/services/UserMappingService.d.ts +109 -0
- package/dist/migrations/services/UserMappingService.js +277 -0
- package/dist/migrations/services/ValidationService.d.ts +74 -0
- package/dist/migrations/services/ValidationService.js +260 -0
- package/dist/migrations/transfer.d.ts +0 -6
- package/dist/migrations/transfer.js +16 -132
- package/dist/migrations/yaml/YamlImportConfigLoader.d.ts +384 -0
- package/dist/migrations/yaml/YamlImportConfigLoader.js +375 -0
- package/dist/migrations/yaml/YamlImportIntegration.d.ts +87 -0
- package/dist/migrations/yaml/YamlImportIntegration.js +330 -0
- package/dist/migrations/yaml/generateImportSchemas.d.ts +17 -0
- package/dist/migrations/yaml/generateImportSchemas.js +575 -0
- package/dist/schemas/authUser.d.ts +9 -9
- package/dist/shared/attributeManager.d.ts +17 -0
- package/dist/shared/attributeManager.js +273 -0
- package/dist/shared/confirmationDialogs.d.ts +75 -0
- package/dist/shared/confirmationDialogs.js +236 -0
- package/dist/shared/functionManager.d.ts +48 -0
- package/dist/shared/functionManager.js +322 -0
- package/dist/shared/indexManager.d.ts +24 -0
- package/dist/shared/indexManager.js +150 -0
- package/dist/shared/jsonSchemaGenerator.d.ts +51 -0
- package/dist/shared/jsonSchemaGenerator.js +313 -0
- package/dist/shared/logging.d.ts +10 -0
- package/dist/shared/logging.js +46 -0
- package/dist/shared/messageFormatter.d.ts +37 -0
- package/dist/shared/messageFormatter.js +152 -0
- package/dist/shared/migrationHelpers.d.ts +173 -0
- package/dist/shared/migrationHelpers.js +142 -0
- package/dist/shared/operationLogger.d.ts +3 -0
- package/dist/shared/operationLogger.js +25 -0
- package/dist/shared/operationQueue.d.ts +13 -0
- package/dist/shared/operationQueue.js +79 -0
- package/dist/shared/progressManager.d.ts +62 -0
- package/dist/shared/progressManager.js +215 -0
- package/dist/shared/schemaGenerator.d.ts +18 -0
- package/dist/shared/schemaGenerator.js +523 -0
- package/dist/storage/methods.d.ts +3 -1
- package/dist/storage/methods.js +144 -55
- package/dist/storage/schemas.d.ts +56 -16
- package/dist/types.d.ts +2 -2
- package/dist/types.js +1 -1
- package/dist/users/methods.d.ts +16 -0
- package/dist/users/methods.js +276 -0
- package/dist/utils/configMigration.d.ts +1 -0
- package/dist/utils/configMigration.js +262 -0
- package/dist/utils/dataConverters.d.ts +46 -0
- package/dist/utils/dataConverters.js +139 -0
- package/dist/utils/loadConfigs.d.ts +15 -4
- package/dist/utils/loadConfigs.js +379 -51
- package/dist/utils/schemaStrings.js +2 -1
- package/dist/utils/setupFiles.d.ts +2 -1
- package/dist/utils/setupFiles.js +723 -28
- package/dist/utils/validationRules.d.ts +43 -0
- package/dist/utils/validationRules.js +42 -0
- package/dist/utils/yamlConverter.d.ts +48 -0
- package/dist/utils/yamlConverter.js +98 -0
- package/dist/utilsController.js +65 -43
- package/package.json +19 -15
- package/src/collections/attributes.ts +3 -2
- package/src/collections/methods.ts +85 -51
- package/src/config/yamlConfig.ts +488 -0
- package/src/{migrations/setupDatabase.ts → databases/setup.ts} +11 -5
- package/src/functions/methods.ts +8 -4
- package/src/functions/templates/count-docs-in-collection/package.json +25 -0
- package/src/functions/templates/count-docs-in-collection/tsconfig.json +28 -0
- package/src/functions/templates/typescript-node/package.json +24 -0
- package/src/functions/templates/typescript-node/tsconfig.json +28 -0
- package/src/functions/templates/uv/README.md +31 -0
- package/src/functions/templates/uv/pyproject.toml +29 -0
- package/src/interactiveCLI.ts +226 -61
- package/src/main.ts +111 -37
- package/src/migrations/afterImportActions.ts +2 -2
- package/src/migrations/appwriteToX.ts +17 -4
- package/src/migrations/dataLoader.ts +4 -4
- package/src/migrations/importController.ts +30 -22
- package/src/migrations/importDataActions.ts +2 -2
- package/src/migrations/relationships.ts +1 -1
- package/src/migrations/services/DataTransformationService.ts +196 -0
- package/src/migrations/services/FileHandlerService.ts +311 -0
- package/src/migrations/services/ImportOrchestrator.ts +669 -0
- package/src/migrations/services/RateLimitManager.ts +363 -0
- package/src/migrations/services/RelationshipResolver.ts +461 -0
- package/src/migrations/services/UserMappingService.ts +345 -0
- package/src/migrations/services/ValidationService.ts +349 -0
- package/src/migrations/transfer.ts +22 -228
- package/src/migrations/yaml/YamlImportConfigLoader.ts +427 -0
- package/src/migrations/yaml/YamlImportIntegration.ts +419 -0
- package/src/migrations/yaml/generateImportSchemas.ts +589 -0
- package/src/shared/attributeManager.ts +429 -0
- package/src/shared/confirmationDialogs.ts +327 -0
- package/src/shared/functionManager.ts +515 -0
- package/src/shared/indexManager.ts +253 -0
- package/src/shared/jsonSchemaGenerator.ts +403 -0
- package/src/shared/logging.ts +74 -0
- package/src/shared/messageFormatter.ts +195 -0
- package/src/{migrations/migrationHelper.ts → shared/migrationHelpers.ts} +22 -4
- package/src/{migrations/helper.ts → shared/operationLogger.ts} +7 -2
- package/src/{migrations/queue.ts → shared/operationQueue.ts} +1 -1
- package/src/shared/progressManager.ts +278 -0
- package/src/{migrations/schemaStrings.ts → shared/schemaGenerator.ts} +71 -17
- package/src/storage/methods.ts +199 -78
- package/src/types.ts +2 -2
- package/src/{migrations/users.ts → users/methods.ts} +2 -2
- package/src/utils/configMigration.ts +349 -0
- package/src/utils/loadConfigs.ts +416 -52
- package/src/utils/schemaStrings.ts +2 -1
- package/src/utils/setupFiles.ts +742 -40
- package/src/{migrations → utils}/validationRules.ts +1 -1
- package/src/utils/yamlConverter.ts +131 -0
- package/src/utilsController.ts +75 -54
- package/src/functions/templates/poetry/README.md +0 -30
- package/src/functions/templates/poetry/pyproject.toml +0 -16
- package/src/migrations/attributes.ts +0 -561
- package/src/migrations/backup.ts +0 -205
- package/src/migrations/databases.ts +0 -39
- package/src/migrations/dbHelpers.ts +0 -92
- package/src/migrations/indexes.ts +0 -40
- package/src/migrations/logging.ts +0 -29
- package/src/migrations/storage.ts +0 -538
- /package/src/{migrations → functions}/openapi.ts +0 -0
- /package/src/functions/templates/{poetry → uv}/src/__init__.py +0 -0
- /package/src/functions/templates/{poetry → uv}/src/index.py +0 -0
- /package/src/{migrations/converters.ts → utils/dataConverters.ts} +0 -0
@@ -0,0 +1,148 @@
|
|
1
|
+
# Import Configurations
|
2
|
+
|
3
|
+
This directory contains YAML-based import configurations that demonstrate the powerful import capabilities of Appwrite Utils CLI 1.0.0.
|
4
|
+
|
5
|
+
## Available Import Configurations
|
6
|
+
|
7
|
+
### 1. Users Import (`users-import.yaml`)
|
8
|
+
- **Purpose**: Import user data with avatar file downloads
|
9
|
+
- **Features**:
|
10
|
+
- Downloads avatar images from picsum.photos URLs
|
11
|
+
- Creates user accounts in Appwrite Auth
|
12
|
+
- Validates email addresses and phone numbers
|
13
|
+
- Handles user deduplication based on email
|
14
|
+
- Converts social links and preferences JSON
|
15
|
+
- **Data Source**: `importData/users.json` (12 sample users)
|
16
|
+
|
17
|
+
### 2. Categories Import (`categories-import.yaml`)
|
18
|
+
- **Purpose**: Import hierarchical category structure
|
19
|
+
- **Features**:
|
20
|
+
- Downloads cover images from URLs
|
21
|
+
- Handles parent-child relationships
|
22
|
+
- Supports category hierarchy up to 5 levels
|
23
|
+
- SEO metadata handling
|
24
|
+
- **Data Source**: `importData/categories.json` (10 categories with hierarchy)
|
25
|
+
|
26
|
+
### 3. Posts Import (`posts-import.yaml`)
|
27
|
+
- **Purpose**: Import blog posts with relationships and media
|
28
|
+
- **Features**:
|
29
|
+
- Downloads featured images and gallery images
|
30
|
+
- Links posts to authors (Users collection)
|
31
|
+
- Links posts to categories (Categories collection)
|
32
|
+
- Handles arrays (tags, gallery)
|
33
|
+
- Rich content with HTML support
|
34
|
+
- SEO metadata and social sharing images
|
35
|
+
- **Data Source**: `importData/posts.json` (10 blog posts)
|
36
|
+
|
37
|
+
## File Handling Features
|
38
|
+
|
39
|
+
All import configurations demonstrate advanced file handling:
|
40
|
+
|
41
|
+
- **URL Downloads**: Automatically downloads images from picsum.photos
|
42
|
+
- **File Naming**: Uses template patterns like `{user_id}_avatar`
|
43
|
+
- **Multiple Files**: Supports gallery arrays with multiple images
|
44
|
+
- **File Validation**: Handles missing or invalid URLs gracefully
|
45
|
+
- **Storage Integration**: Uploads to appropriate Appwrite storage buckets
|
46
|
+
|
47
|
+
## Usage
|
48
|
+
|
49
|
+
### Run Individual Imports
|
50
|
+
```bash
|
51
|
+
# Import users with avatars
|
52
|
+
npx appwrite-utils-cli appwrite-migrate --import --collectionIds Users
|
53
|
+
|
54
|
+
# Import categories with hierarchy
|
55
|
+
npx appwrite-utils-cli appwrite-migrate --import --collectionIds Categories
|
56
|
+
|
57
|
+
# Import posts with relationships
|
58
|
+
npx appwrite-utils-cli appwrite-migrate --import --collectionIds Posts
|
59
|
+
```
|
60
|
+
|
61
|
+
### Run All Imports
|
62
|
+
```bash
|
63
|
+
# Import all collections in order
|
64
|
+
npx appwrite-utils-cli appwrite-migrate --import --dbIds main
|
65
|
+
```
|
66
|
+
|
67
|
+
## Import Order
|
68
|
+
|
69
|
+
For best results, import in this order due to relationships:
|
70
|
+
|
71
|
+
1. **Users** (no dependencies)
|
72
|
+
2. **Categories** (self-referential relationships)
|
73
|
+
3. **Posts** (depends on Users and Categories)
|
74
|
+
|
75
|
+
## Configuration Highlights
|
76
|
+
|
77
|
+
### Rate Limiting
|
78
|
+
- **Users**: 25 items per batch (avatar downloads)
|
79
|
+
- **Categories**: 50 items per batch (cover images)
|
80
|
+
- **Posts**: 20 items per batch (multiple images per post)
|
81
|
+
|
82
|
+
### Validation
|
83
|
+
- Email validation for users
|
84
|
+
- URL validation for file downloads
|
85
|
+
- Required field validation
|
86
|
+
- Length constraints for text fields
|
87
|
+
|
88
|
+
### Relationships
|
89
|
+
- **Posts → Users**: Author relationship via userId
|
90
|
+
- **Posts → Categories**: Category relationship via categoryId
|
91
|
+
- **Categories → Categories**: Parent-child hierarchy
|
92
|
+
|
93
|
+
### File Downloads
|
94
|
+
- **User avatars**: 500x500 images from picsum.photos
|
95
|
+
- **Category covers**: 800x400 images from picsum.photos
|
96
|
+
- **Post images**: Various sizes (1200x600, 800x400, etc.)
|
97
|
+
- **Social images**: 1200x630 for social media sharing
|
98
|
+
|
99
|
+
## Testing
|
100
|
+
|
101
|
+
### Dry Run
|
102
|
+
Test configurations without actual import:
|
103
|
+
```bash
|
104
|
+
npx appwrite-utils-cli appwrite-migrate --import --dryRun
|
105
|
+
```
|
106
|
+
|
107
|
+
### Validation Only
|
108
|
+
Validate data without importing:
|
109
|
+
```bash
|
110
|
+
npx appwrite-utils-cli appwrite-migrate --writeData
|
111
|
+
```
|
112
|
+
|
113
|
+
## Customization
|
114
|
+
|
115
|
+
These configurations serve as examples. You can:
|
116
|
+
|
117
|
+
1. **Modify data sources**: Update file paths in YAML configs
|
118
|
+
2. **Add/remove fields**: Modify attribute mappings
|
119
|
+
3. **Change validation rules**: Add or remove validation constraints
|
120
|
+
4. **Adjust batch sizes**: Optimize for your server capacity
|
121
|
+
5. **Add custom converters**: Extend data transformation logic
|
122
|
+
|
123
|
+
## File Structure
|
124
|
+
|
125
|
+
```
|
126
|
+
.appwrite/
|
127
|
+
├── collections/ # YAML collection definitions
|
128
|
+
│ ├── Users.yaml
|
129
|
+
│ ├── Posts.yaml
|
130
|
+
│ └── Categories.yaml
|
131
|
+
├── importData/ # Source data files
|
132
|
+
│ ├── users.json
|
133
|
+
│ ├── posts.json
|
134
|
+
│ └── categories.json
|
135
|
+
├── import/ # Import configurations
|
136
|
+
│ ├── users-import.yaml
|
137
|
+
│ ├── posts-import.yaml
|
138
|
+
│ └── categories-import.yaml
|
139
|
+
└── config.yaml # Main project configuration
|
140
|
+
```
|
141
|
+
|
142
|
+
## Support
|
143
|
+
|
144
|
+
For questions about the import system:
|
145
|
+
- Check the main README.md for CLI usage
|
146
|
+
- Review YAML schema files in `.yaml_schemas/`
|
147
|
+
- See example configurations in this directory
|
148
|
+
- Test with `--dryRun` flag before actual import
|
@@ -0,0 +1,129 @@
|
|
1
|
+
# yaml-language-server: $schema=../.yaml_schemas/import-config.schema.json
|
2
|
+
# Categories Import Configuration with Hierarchy Support
|
3
|
+
|
4
|
+
source:
|
5
|
+
file: "importData/categories.json"
|
6
|
+
basePath: "RECORDS"
|
7
|
+
type: "json"
|
8
|
+
|
9
|
+
target:
|
10
|
+
collection: "Categories"
|
11
|
+
type: "create"
|
12
|
+
primaryKey: "category_id"
|
13
|
+
createUsers: false
|
14
|
+
|
15
|
+
mapping:
|
16
|
+
attributes:
|
17
|
+
# Core Fields
|
18
|
+
- oldKey: "category_id"
|
19
|
+
targetKey: "categoryId"
|
20
|
+
converters: ["anyToString"]
|
21
|
+
validation:
|
22
|
+
- rule: "required"
|
23
|
+
params: ["{categoryId}"]
|
24
|
+
|
25
|
+
- oldKey: "name"
|
26
|
+
targetKey: "name"
|
27
|
+
converters: ["anyToString", "stringTrim"]
|
28
|
+
validation:
|
29
|
+
- rule: "required"
|
30
|
+
params: ["{name}"]
|
31
|
+
- rule: "minLength"
|
32
|
+
params: ["{name}", "2"]
|
33
|
+
|
34
|
+
- oldKey: "slug"
|
35
|
+
targetKey: "slug"
|
36
|
+
converters: ["anyToString", "stringToLowerCase", "stringTrim"]
|
37
|
+
|
38
|
+
- oldKey: "description"
|
39
|
+
targetKey: "description"
|
40
|
+
converters: ["anyToString", "stringTrim"]
|
41
|
+
validation:
|
42
|
+
- rule: "maxLength"
|
43
|
+
params: ["{description}", "500"]
|
44
|
+
|
45
|
+
# Hierarchy
|
46
|
+
- oldKey: "parent_id"
|
47
|
+
targetKey: "parentId"
|
48
|
+
converters: ["anyToString"]
|
49
|
+
|
50
|
+
- oldKey: "level"
|
51
|
+
targetKey: "level"
|
52
|
+
converters: ["anyToNumber"]
|
53
|
+
validation:
|
54
|
+
- rule: "numeric"
|
55
|
+
params: ["{level}"]
|
56
|
+
- rule: "positive"
|
57
|
+
params: ["{level}"]
|
58
|
+
|
59
|
+
- oldKey: "sort_order"
|
60
|
+
targetKey: "sortOrder"
|
61
|
+
converters: ["anyToNumber"]
|
62
|
+
|
63
|
+
# Visual & Branding
|
64
|
+
- oldKey: "color_code"
|
65
|
+
targetKey: "colorCode"
|
66
|
+
converters: ["anyToString"]
|
67
|
+
|
68
|
+
- oldKey: "icon"
|
69
|
+
targetKey: "icon"
|
70
|
+
converters: ["anyToString"]
|
71
|
+
|
72
|
+
# Cover Image with URL Download
|
73
|
+
- oldKey: "cover_image_url"
|
74
|
+
targetKey: "coverImage"
|
75
|
+
fileData:
|
76
|
+
path: "{cover_image_url}"
|
77
|
+
name: "{category_id}_cover"
|
78
|
+
afterImport:
|
79
|
+
- action: "createFileAndUpdateField"
|
80
|
+
params: ["{dbId}", "{collId}", "{docId}", "coverImage", "{bucketId}", "{filePath}", "{fileName}"]
|
81
|
+
|
82
|
+
# Status
|
83
|
+
- oldKey: "is_active"
|
84
|
+
targetKey: "isActive"
|
85
|
+
converters: ["anyToBoolean"]
|
86
|
+
|
87
|
+
- oldKey: "is_featured"
|
88
|
+
targetKey: "isFeatured"
|
89
|
+
converters: ["anyToBoolean"]
|
90
|
+
|
91
|
+
# Statistics
|
92
|
+
- oldKey: "post_count"
|
93
|
+
targetKey: "postCount"
|
94
|
+
converters: ["anyToNumber"]
|
95
|
+
|
96
|
+
- oldKey: "total_post_count"
|
97
|
+
targetKey: "totalPostCount"
|
98
|
+
converters: ["anyToNumber"]
|
99
|
+
|
100
|
+
# SEO
|
101
|
+
- oldKey: "meta_title"
|
102
|
+
targetKey: "metaTitle"
|
103
|
+
converters: ["anyToString", "stringTrim"]
|
104
|
+
validation:
|
105
|
+
- rule: "maxLength"
|
106
|
+
params: ["{metaTitle}", "60"]
|
107
|
+
|
108
|
+
- oldKey: "meta_description"
|
109
|
+
targetKey: "metaDescription"
|
110
|
+
converters: ["anyToString", "stringTrim"]
|
111
|
+
validation:
|
112
|
+
- rule: "maxLength"
|
113
|
+
params: ["{metaDescription}", "160"]
|
114
|
+
|
115
|
+
- oldKey: "guidelines"
|
116
|
+
targetKey: "guidelines"
|
117
|
+
converters: ["anyToString", "stringTrim"]
|
118
|
+
|
119
|
+
relationships:
|
120
|
+
# Parent-Child Relationship Resolution
|
121
|
+
- sourceField: "parent_id"
|
122
|
+
targetField: "parentId"
|
123
|
+
targetCollection: "Categories"
|
124
|
+
|
125
|
+
options:
|
126
|
+
batchSize: 50
|
127
|
+
skipValidation: false
|
128
|
+
dryRun: false
|
129
|
+
continueOnError: true
|
@@ -0,0 +1,208 @@
|
|
1
|
+
# yaml-language-server: $schema=../.yaml_schemas/import-config.schema.json
|
2
|
+
# Posts Import Configuration with Relationships and File Handling
|
3
|
+
|
4
|
+
source:
|
5
|
+
file: "importData/posts.json"
|
6
|
+
basePath: "RECORDS"
|
7
|
+
type: "json"
|
8
|
+
|
9
|
+
target:
|
10
|
+
collection: "Posts"
|
11
|
+
type: "create"
|
12
|
+
primaryKey: "post_id"
|
13
|
+
createUsers: false
|
14
|
+
|
15
|
+
mapping:
|
16
|
+
attributes:
|
17
|
+
# Core Content
|
18
|
+
- oldKey: "post_id"
|
19
|
+
targetKey: "postId"
|
20
|
+
converters: ["anyToString"]
|
21
|
+
validation:
|
22
|
+
- rule: "required"
|
23
|
+
params: ["{postId}"]
|
24
|
+
|
25
|
+
- oldKey: "title"
|
26
|
+
targetKey: "title"
|
27
|
+
converters: ["anyToString", "stringTrim"]
|
28
|
+
validation:
|
29
|
+
- rule: "required"
|
30
|
+
params: ["{title}"]
|
31
|
+
- rule: "minLength"
|
32
|
+
params: ["{title}", "5"]
|
33
|
+
- rule: "maxLength"
|
34
|
+
params: ["{title}", "200"]
|
35
|
+
|
36
|
+
- oldKey: "slug"
|
37
|
+
targetKey: "slug"
|
38
|
+
converters: ["anyToString", "stringToLowerCase", "stringTrim"]
|
39
|
+
|
40
|
+
- oldKey: "content"
|
41
|
+
targetKey: "content"
|
42
|
+
converters: ["anyToString"]
|
43
|
+
validation:
|
44
|
+
- rule: "required"
|
45
|
+
params: ["{content}"]
|
46
|
+
- rule: "minLength"
|
47
|
+
params: ["{content}", "100"]
|
48
|
+
|
49
|
+
- oldKey: "excerpt"
|
50
|
+
targetKey: "excerpt"
|
51
|
+
converters: ["anyToString", "stringTrim"]
|
52
|
+
validation:
|
53
|
+
- rule: "maxLength"
|
54
|
+
params: ["{excerpt}", "500"]
|
55
|
+
|
56
|
+
# Author Relationship (handled in relationships section)
|
57
|
+
- oldKey: "author_id"
|
58
|
+
targetKey: "authorId"
|
59
|
+
converters: ["anyToString"]
|
60
|
+
validation:
|
61
|
+
- rule: "required"
|
62
|
+
params: ["{authorId}"]
|
63
|
+
|
64
|
+
# Category Relationship (handled in relationships section)
|
65
|
+
- oldKey: "category_id"
|
66
|
+
targetKey: "categoryId"
|
67
|
+
converters: ["anyToString"]
|
68
|
+
|
69
|
+
# Featured Image with URL Download
|
70
|
+
- oldKey: "featured_image_url"
|
71
|
+
targetKey: "featuredImage"
|
72
|
+
fileData:
|
73
|
+
path: "{featured_image_url}"
|
74
|
+
name: "{post_id}_featured"
|
75
|
+
afterImport:
|
76
|
+
- action: "createFileAndUpdateField"
|
77
|
+
params: ["{dbId}", "{collId}", "{docId}", "featuredImage", "{bucketId}", "{filePath}", "{fileName}"]
|
78
|
+
|
79
|
+
# Gallery Images (multiple files)
|
80
|
+
- oldKey: "gallery_urls"
|
81
|
+
targetKey: "gallery"
|
82
|
+
fileData:
|
83
|
+
path: "{gallery_urls}"
|
84
|
+
name: "{post_id}_gallery_{index}"
|
85
|
+
afterImport:
|
86
|
+
- action: "createFileAndUpdateField"
|
87
|
+
params: ["{dbId}", "{collId}", "{docId}", "gallery", "{bucketId}", "{filePath}", "{fileName}"]
|
88
|
+
|
89
|
+
# Tags Array
|
90
|
+
- oldKey: "tags"
|
91
|
+
targetKey: "tags"
|
92
|
+
converters: ["anyToStringArray"]
|
93
|
+
|
94
|
+
# Status and Publishing
|
95
|
+
- oldKey: "status"
|
96
|
+
targetKey: "status"
|
97
|
+
converters: ["anyToString", "stringToLowerCase"]
|
98
|
+
validation:
|
99
|
+
- rule: "required"
|
100
|
+
params: ["{status}"]
|
101
|
+
|
102
|
+
- oldKey: "published_at"
|
103
|
+
targetKey: "publishedAt"
|
104
|
+
converters: ["anyToDate"]
|
105
|
+
|
106
|
+
- oldKey: "scheduled_at"
|
107
|
+
targetKey: "scheduledAt"
|
108
|
+
converters: ["anyToDate"]
|
109
|
+
|
110
|
+
# Engagement Metrics
|
111
|
+
- oldKey: "view_count"
|
112
|
+
targetKey: "viewCount"
|
113
|
+
converters: ["anyToNumber"]
|
114
|
+
validation:
|
115
|
+
- rule: "numeric"
|
116
|
+
params: ["{viewCount}"]
|
117
|
+
- rule: "positive"
|
118
|
+
params: ["{viewCount}"]
|
119
|
+
|
120
|
+
- oldKey: "like_count"
|
121
|
+
targetKey: "likeCount"
|
122
|
+
converters: ["anyToNumber"]
|
123
|
+
validation:
|
124
|
+
- rule: "numeric"
|
125
|
+
params: ["{likeCount}"]
|
126
|
+
- rule: "positive"
|
127
|
+
params: ["{likeCount}"]
|
128
|
+
|
129
|
+
- oldKey: "comment_count"
|
130
|
+
targetKey: "commentCount"
|
131
|
+
converters: ["anyToNumber"]
|
132
|
+
validation:
|
133
|
+
- rule: "numeric"
|
134
|
+
params: ["{commentCount}"]
|
135
|
+
- rule: "positive"
|
136
|
+
params: ["{commentCount}"]
|
137
|
+
|
138
|
+
- oldKey: "share_count"
|
139
|
+
targetKey: "shareCount"
|
140
|
+
converters: ["anyToNumber"]
|
141
|
+
validation:
|
142
|
+
- rule: "numeric"
|
143
|
+
params: ["{shareCount}"]
|
144
|
+
- rule: "positive"
|
145
|
+
params: ["{shareCount}"]
|
146
|
+
|
147
|
+
# SEO Fields
|
148
|
+
- oldKey: "meta_title"
|
149
|
+
targetKey: "metaTitle"
|
150
|
+
converters: ["anyToString", "stringTrim"]
|
151
|
+
validation:
|
152
|
+
- rule: "maxLength"
|
153
|
+
params: ["{metaTitle}", "60"]
|
154
|
+
|
155
|
+
- oldKey: "meta_description"
|
156
|
+
targetKey: "metaDescription"
|
157
|
+
converters: ["anyToString", "stringTrim"]
|
158
|
+
validation:
|
159
|
+
- rule: "maxLength"
|
160
|
+
params: ["{metaDescription}", "160"]
|
161
|
+
|
162
|
+
# Social Image with URL Download
|
163
|
+
- oldKey: "social_image_url"
|
164
|
+
targetKey: "socialImage"
|
165
|
+
fileData:
|
166
|
+
path: "{social_image_url}"
|
167
|
+
name: "{post_id}_social"
|
168
|
+
afterImport:
|
169
|
+
- action: "createFileAndUpdateField"
|
170
|
+
params: ["{dbId}", "{collId}", "{docId}", "socialImage", "{bucketId}", "{filePath}", "{fileName}"]
|
171
|
+
|
172
|
+
# Reading Time
|
173
|
+
- oldKey: "reading_time"
|
174
|
+
targetKey: "readingTime"
|
175
|
+
converters: ["anyToNumber"]
|
176
|
+
validation:
|
177
|
+
- rule: "numeric"
|
178
|
+
params: ["{readingTime}"]
|
179
|
+
- rule: "positive"
|
180
|
+
params: ["{readingTime}"]
|
181
|
+
|
182
|
+
# Featured Status
|
183
|
+
- oldKey: "is_featured"
|
184
|
+
targetKey: "isFeatured"
|
185
|
+
converters: ["anyToBoolean"]
|
186
|
+
|
187
|
+
- oldKey: "is_pinned"
|
188
|
+
targetKey: "isPinned"
|
189
|
+
converters: ["anyToBoolean"]
|
190
|
+
|
191
|
+
relationships:
|
192
|
+
# Author Relationship - Link to Users collection
|
193
|
+
- sourceField: "author_id"
|
194
|
+
targetField: "userId"
|
195
|
+
targetCollection: "Users"
|
196
|
+
fieldToSet: "authorId"
|
197
|
+
|
198
|
+
# Category Relationship - Link to Categories collection
|
199
|
+
- sourceField: "category_id"
|
200
|
+
targetField: "categoryId"
|
201
|
+
targetCollection: "Categories"
|
202
|
+
fieldToSet: "categoryId"
|
203
|
+
|
204
|
+
options:
|
205
|
+
batchSize: 20
|
206
|
+
skipValidation: false
|
207
|
+
dryRun: false
|
208
|
+
continueOnError: true
|
@@ -0,0 +1,130 @@
|
|
1
|
+
# yaml-language-server: $schema=../.yaml_schemas/import-config.schema.json
|
2
|
+
# User Import Configuration with Avatar File Handling
|
3
|
+
|
4
|
+
source:
|
5
|
+
file: "importData/users.json"
|
6
|
+
basePath: "RECORDS"
|
7
|
+
type: "json"
|
8
|
+
|
9
|
+
target:
|
10
|
+
collection: "Users"
|
11
|
+
type: "create"
|
12
|
+
primaryKey: "user_id"
|
13
|
+
createUsers: true
|
14
|
+
|
15
|
+
mapping:
|
16
|
+
attributes:
|
17
|
+
# Core Identity Fields
|
18
|
+
- oldKey: "user_id"
|
19
|
+
targetKey: "userId"
|
20
|
+
converters: ["anyToString"]
|
21
|
+
validation:
|
22
|
+
- rule: "required"
|
23
|
+
params: ["{userId}"]
|
24
|
+
|
25
|
+
- oldKey: "name"
|
26
|
+
targetKey: "name"
|
27
|
+
converters: ["anyToString", "stringTrim"]
|
28
|
+
validation:
|
29
|
+
- rule: "required"
|
30
|
+
params: ["{name}"]
|
31
|
+
- rule: "minLength"
|
32
|
+
params: ["{name}", "2"]
|
33
|
+
|
34
|
+
- oldKey: "email"
|
35
|
+
targetKey: "email"
|
36
|
+
converters: ["anyToString", "stringToLowerCase", "stringTrim"]
|
37
|
+
validation:
|
38
|
+
- rule: "required"
|
39
|
+
params: ["{email}"]
|
40
|
+
- rule: "email"
|
41
|
+
params: ["{email}"]
|
42
|
+
|
43
|
+
- oldKey: "username"
|
44
|
+
targetKey: "username"
|
45
|
+
converters: ["anyToString", "stringToLowerCase", "stringTrim"]
|
46
|
+
validation:
|
47
|
+
- rule: "minLength"
|
48
|
+
params: ["{username}", "3"]
|
49
|
+
|
50
|
+
# Avatar File Handling with URL Download
|
51
|
+
- oldKey: "avatar_url"
|
52
|
+
targetKey: "avatar"
|
53
|
+
fileData:
|
54
|
+
path: "{avatar_url}"
|
55
|
+
name: "{user_id}_avatar"
|
56
|
+
afterImport:
|
57
|
+
- action: "createFileAndUpdateField"
|
58
|
+
params: ["{dbId}", "{collId}", "{docId}", "avatar", "{bucketId}", "{filePath}", "{fileName}"]
|
59
|
+
|
60
|
+
# Contact Information
|
61
|
+
- oldKey: "phone"
|
62
|
+
targetKey: "phone"
|
63
|
+
converters: ["anyToString"]
|
64
|
+
validation:
|
65
|
+
- rule: "phone"
|
66
|
+
params: ["{phone}"]
|
67
|
+
|
68
|
+
- oldKey: "bio"
|
69
|
+
targetKey: "bio"
|
70
|
+
converters: ["anyToString", "stringTrim"]
|
71
|
+
validation:
|
72
|
+
- rule: "maxLength"
|
73
|
+
params: ["{bio}", "500"]
|
74
|
+
|
75
|
+
# Dates
|
76
|
+
- oldKey: "date_of_birth"
|
77
|
+
targetKey: "dateOfBirth"
|
78
|
+
converters: ["anyToDate"]
|
79
|
+
|
80
|
+
- oldKey: "last_login_at"
|
81
|
+
targetKey: "lastLoginAt"
|
82
|
+
converters: ["anyToDate"]
|
83
|
+
|
84
|
+
# Location
|
85
|
+
- oldKey: "location"
|
86
|
+
targetKey: "location"
|
87
|
+
converters: ["anyToString", "stringTrim"]
|
88
|
+
|
89
|
+
# User Management
|
90
|
+
- oldKey: "role"
|
91
|
+
targetKey: "role"
|
92
|
+
converters: ["anyToString", "stringToLowerCase"]
|
93
|
+
validation:
|
94
|
+
- rule: "required"
|
95
|
+
params: ["{role}"]
|
96
|
+
|
97
|
+
- oldKey: "is_active"
|
98
|
+
targetKey: "isActive"
|
99
|
+
converters: ["anyToBoolean"]
|
100
|
+
|
101
|
+
- oldKey: "is_verified"
|
102
|
+
targetKey: "isVerified"
|
103
|
+
converters: ["anyToBoolean"]
|
104
|
+
|
105
|
+
# Statistics
|
106
|
+
- oldKey: "profile_views"
|
107
|
+
targetKey: "profileViews"
|
108
|
+
converters: ["anyToNumber"]
|
109
|
+
validation:
|
110
|
+
- rule: "numeric"
|
111
|
+
params: ["{profileViews}"]
|
112
|
+
- rule: "positive"
|
113
|
+
params: ["{profileViews}"]
|
114
|
+
|
115
|
+
# JSON Fields
|
116
|
+
- oldKey: "social_links"
|
117
|
+
targetKey: "socialLinks"
|
118
|
+
converters: ["anyToString"]
|
119
|
+
|
120
|
+
- oldKey: "preferences"
|
121
|
+
targetKey: "preferences"
|
122
|
+
converters: ["anyToString"]
|
123
|
+
|
124
|
+
relationships: []
|
125
|
+
|
126
|
+
options:
|
127
|
+
batchSize: 25
|
128
|
+
skipValidation: false
|
129
|
+
dryRun: false
|
130
|
+
continueOnError: true
|