mdb-engine 0.2.3__tar.gz → 0.2.4__tar.gz
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.
- {mdb_engine-0.2.3/mdb_engine.egg-info → mdb_engine-0.2.4}/PKG-INFO +81 -6
- {mdb_engine-0.2.3 → mdb_engine-0.2.4}/README.md +80 -5
- {mdb_engine-0.2.3 → mdb_engine-0.2.4}/mdb_engine/__init__.py +7 -1
- {mdb_engine-0.2.3 → mdb_engine-0.2.4}/mdb_engine/auth/README.md +6 -0
- {mdb_engine-0.2.3 → mdb_engine-0.2.4}/mdb_engine/auth/shared_middleware.py +330 -119
- {mdb_engine-0.2.3 → mdb_engine-0.2.4}/mdb_engine/core/manifest.py +21 -0
- {mdb_engine-0.2.3 → mdb_engine-0.2.4}/mdb_engine/embeddings/service.py +37 -8
- {mdb_engine-0.2.3 → mdb_engine-0.2.4}/mdb_engine/memory/README.md +93 -2
- mdb_engine-0.2.4/mdb_engine/memory/service.py +480 -0
- {mdb_engine-0.2.3 → mdb_engine-0.2.4}/mdb_engine/utils/__init__.py +3 -1
- mdb_engine-0.2.4/mdb_engine/utils/mongo.py +117 -0
- {mdb_engine-0.2.3 → mdb_engine-0.2.4/mdb_engine.egg-info}/PKG-INFO +81 -6
- {mdb_engine-0.2.3 → mdb_engine-0.2.4}/mdb_engine.egg-info/SOURCES.txt +2 -1
- {mdb_engine-0.2.3 → mdb_engine-0.2.4}/pyproject.toml +1 -1
- {mdb_engine-0.2.3 → mdb_engine-0.2.4}/setup.py +1 -1
- mdb_engine-0.2.3/mdb_engine/memory/service.py +0 -1228
- {mdb_engine-0.2.3 → mdb_engine-0.2.4}/LICENSE +0 -0
- {mdb_engine-0.2.3 → mdb_engine-0.2.4}/MANIFEST.in +0 -0
- {mdb_engine-0.2.3 → mdb_engine-0.2.4}/mdb_engine/README.md +0 -0
- {mdb_engine-0.2.3 → mdb_engine-0.2.4}/mdb_engine/auth/ARCHITECTURE.md +0 -0
- {mdb_engine-0.2.3 → mdb_engine-0.2.4}/mdb_engine/auth/__init__.py +0 -0
- {mdb_engine-0.2.3 → mdb_engine-0.2.4}/mdb_engine/auth/audit.py +0 -0
- {mdb_engine-0.2.3 → mdb_engine-0.2.4}/mdb_engine/auth/base.py +0 -0
- {mdb_engine-0.2.3 → mdb_engine-0.2.4}/mdb_engine/auth/casbin_factory.py +0 -0
- {mdb_engine-0.2.3 → mdb_engine-0.2.4}/mdb_engine/auth/casbin_models.py +0 -0
- {mdb_engine-0.2.3 → mdb_engine-0.2.4}/mdb_engine/auth/config_defaults.py +0 -0
- {mdb_engine-0.2.3 → mdb_engine-0.2.4}/mdb_engine/auth/config_helpers.py +0 -0
- {mdb_engine-0.2.3 → mdb_engine-0.2.4}/mdb_engine/auth/cookie_utils.py +0 -0
- {mdb_engine-0.2.3 → mdb_engine-0.2.4}/mdb_engine/auth/csrf.py +0 -0
- {mdb_engine-0.2.3 → mdb_engine-0.2.4}/mdb_engine/auth/decorators.py +0 -0
- {mdb_engine-0.2.3 → mdb_engine-0.2.4}/mdb_engine/auth/dependencies.py +0 -0
- {mdb_engine-0.2.3 → mdb_engine-0.2.4}/mdb_engine/auth/helpers.py +0 -0
- {mdb_engine-0.2.3 → mdb_engine-0.2.4}/mdb_engine/auth/integration.py +0 -0
- {mdb_engine-0.2.3 → mdb_engine-0.2.4}/mdb_engine/auth/jwt.py +0 -0
- {mdb_engine-0.2.3 → mdb_engine-0.2.4}/mdb_engine/auth/middleware.py +0 -0
- {mdb_engine-0.2.3 → mdb_engine-0.2.4}/mdb_engine/auth/oso_factory.py +0 -0
- {mdb_engine-0.2.3 → mdb_engine-0.2.4}/mdb_engine/auth/provider.py +0 -0
- {mdb_engine-0.2.3 → mdb_engine-0.2.4}/mdb_engine/auth/rate_limiter.py +0 -0
- {mdb_engine-0.2.3 → mdb_engine-0.2.4}/mdb_engine/auth/restrictions.py +0 -0
- {mdb_engine-0.2.3 → mdb_engine-0.2.4}/mdb_engine/auth/session_manager.py +0 -0
- {mdb_engine-0.2.3 → mdb_engine-0.2.4}/mdb_engine/auth/shared_users.py +0 -0
- {mdb_engine-0.2.3 → mdb_engine-0.2.4}/mdb_engine/auth/token_lifecycle.py +0 -0
- {mdb_engine-0.2.3 → mdb_engine-0.2.4}/mdb_engine/auth/token_store.py +0 -0
- {mdb_engine-0.2.3 → mdb_engine-0.2.4}/mdb_engine/auth/users.py +0 -0
- {mdb_engine-0.2.3 → mdb_engine-0.2.4}/mdb_engine/auth/utils.py +0 -0
- {mdb_engine-0.2.3 → mdb_engine-0.2.4}/mdb_engine/cli/__init__.py +0 -0
- {mdb_engine-0.2.3 → mdb_engine-0.2.4}/mdb_engine/cli/commands/__init__.py +0 -0
- {mdb_engine-0.2.3 → mdb_engine-0.2.4}/mdb_engine/cli/commands/generate.py +0 -0
- {mdb_engine-0.2.3 → mdb_engine-0.2.4}/mdb_engine/cli/commands/migrate.py +0 -0
- {mdb_engine-0.2.3 → mdb_engine-0.2.4}/mdb_engine/cli/commands/show.py +0 -0
- {mdb_engine-0.2.3 → mdb_engine-0.2.4}/mdb_engine/cli/commands/validate.py +0 -0
- {mdb_engine-0.2.3 → mdb_engine-0.2.4}/mdb_engine/cli/main.py +0 -0
- {mdb_engine-0.2.3 → mdb_engine-0.2.4}/mdb_engine/cli/utils.py +0 -0
- {mdb_engine-0.2.3 → mdb_engine-0.2.4}/mdb_engine/config.py +0 -0
- {mdb_engine-0.2.3 → mdb_engine-0.2.4}/mdb_engine/constants.py +0 -0
- {mdb_engine-0.2.3 → mdb_engine-0.2.4}/mdb_engine/core/README.md +0 -0
- {mdb_engine-0.2.3 → mdb_engine-0.2.4}/mdb_engine/core/__init__.py +0 -0
- {mdb_engine-0.2.3 → mdb_engine-0.2.4}/mdb_engine/core/app_registration.py +0 -0
- {mdb_engine-0.2.3 → mdb_engine-0.2.4}/mdb_engine/core/app_secrets.py +0 -0
- {mdb_engine-0.2.3 → mdb_engine-0.2.4}/mdb_engine/core/connection.py +0 -0
- {mdb_engine-0.2.3 → mdb_engine-0.2.4}/mdb_engine/core/encryption.py +0 -0
- {mdb_engine-0.2.3 → mdb_engine-0.2.4}/mdb_engine/core/engine.py +0 -0
- {mdb_engine-0.2.3 → mdb_engine-0.2.4}/mdb_engine/core/index_management.py +0 -0
- {mdb_engine-0.2.3 → mdb_engine-0.2.4}/mdb_engine/core/ray_integration.py +0 -0
- {mdb_engine-0.2.3 → mdb_engine-0.2.4}/mdb_engine/core/seeding.py +0 -0
- {mdb_engine-0.2.3 → mdb_engine-0.2.4}/mdb_engine/core/service_initialization.py +0 -0
- {mdb_engine-0.2.3 → mdb_engine-0.2.4}/mdb_engine/core/types.py +0 -0
- {mdb_engine-0.2.3 → mdb_engine-0.2.4}/mdb_engine/database/README.md +0 -0
- {mdb_engine-0.2.3 → mdb_engine-0.2.4}/mdb_engine/database/__init__.py +0 -0
- {mdb_engine-0.2.3 → mdb_engine-0.2.4}/mdb_engine/database/abstraction.py +0 -0
- {mdb_engine-0.2.3 → mdb_engine-0.2.4}/mdb_engine/database/connection.py +0 -0
- {mdb_engine-0.2.3 → mdb_engine-0.2.4}/mdb_engine/database/query_validator.py +0 -0
- {mdb_engine-0.2.3 → mdb_engine-0.2.4}/mdb_engine/database/resource_limiter.py +0 -0
- {mdb_engine-0.2.3 → mdb_engine-0.2.4}/mdb_engine/database/scoped_wrapper.py +0 -0
- {mdb_engine-0.2.3 → mdb_engine-0.2.4}/mdb_engine/dependencies.py +0 -0
- {mdb_engine-0.2.3 → mdb_engine-0.2.4}/mdb_engine/di/__init__.py +0 -0
- {mdb_engine-0.2.3 → mdb_engine-0.2.4}/mdb_engine/di/container.py +0 -0
- {mdb_engine-0.2.3 → mdb_engine-0.2.4}/mdb_engine/di/providers.py +0 -0
- {mdb_engine-0.2.3 → mdb_engine-0.2.4}/mdb_engine/di/scopes.py +0 -0
- {mdb_engine-0.2.3 → mdb_engine-0.2.4}/mdb_engine/embeddings/README.md +0 -0
- {mdb_engine-0.2.3 → mdb_engine-0.2.4}/mdb_engine/embeddings/__init__.py +0 -0
- {mdb_engine-0.2.3 → mdb_engine-0.2.4}/mdb_engine/embeddings/dependencies.py +0 -0
- {mdb_engine-0.2.3 → mdb_engine-0.2.4}/mdb_engine/exceptions.py +0 -0
- {mdb_engine-0.2.3 → mdb_engine-0.2.4}/mdb_engine/indexes/README.md +0 -0
- {mdb_engine-0.2.3 → mdb_engine-0.2.4}/mdb_engine/indexes/__init__.py +0 -0
- {mdb_engine-0.2.3 → mdb_engine-0.2.4}/mdb_engine/indexes/helpers.py +0 -0
- {mdb_engine-0.2.3 → mdb_engine-0.2.4}/mdb_engine/indexes/manager.py +0 -0
- {mdb_engine-0.2.3 → mdb_engine-0.2.4}/mdb_engine/memory/__init__.py +0 -0
- {mdb_engine-0.2.3 → mdb_engine-0.2.4}/mdb_engine/observability/README.md +0 -0
- {mdb_engine-0.2.3 → mdb_engine-0.2.4}/mdb_engine/observability/__init__.py +0 -0
- {mdb_engine-0.2.3 → mdb_engine-0.2.4}/mdb_engine/observability/health.py +0 -0
- {mdb_engine-0.2.3 → mdb_engine-0.2.4}/mdb_engine/observability/logging.py +0 -0
- {mdb_engine-0.2.3 → mdb_engine-0.2.4}/mdb_engine/observability/metrics.py +0 -0
- {mdb_engine-0.2.3 → mdb_engine-0.2.4}/mdb_engine/repositories/__init__.py +0 -0
- {mdb_engine-0.2.3 → mdb_engine-0.2.4}/mdb_engine/repositories/base.py +0 -0
- {mdb_engine-0.2.3 → mdb_engine-0.2.4}/mdb_engine/repositories/mongo.py +0 -0
- {mdb_engine-0.2.3 → mdb_engine-0.2.4}/mdb_engine/repositories/unit_of_work.py +0 -0
- {mdb_engine-0.2.3 → mdb_engine-0.2.4}/mdb_engine/routing/README.md +0 -0
- {mdb_engine-0.2.3 → mdb_engine-0.2.4}/mdb_engine/routing/__init__.py +0 -0
- {mdb_engine-0.2.3 → mdb_engine-0.2.4}/mdb_engine/routing/websockets.py +0 -0
- {mdb_engine-0.2.3 → mdb_engine-0.2.4}/mdb_engine.egg-info/dependency_links.txt +0 -0
- {mdb_engine-0.2.3 → mdb_engine-0.2.4}/mdb_engine.egg-info/entry_points.txt +0 -0
- {mdb_engine-0.2.3 → mdb_engine-0.2.4}/mdb_engine.egg-info/requires.txt +0 -0
- {mdb_engine-0.2.3 → mdb_engine-0.2.4}/mdb_engine.egg-info/top_level.txt +0 -0
- {mdb_engine-0.2.3 → mdb_engine-0.2.4}/setup.cfg +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: mdb-engine
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.4
|
|
4
4
|
Summary: MongoDB Engine
|
|
5
5
|
Home-page: https://github.com/ranfysvalle02/mdb-engine
|
|
6
6
|
Author: Fabian Valle
|
|
@@ -73,6 +73,31 @@ Dynamic: requires-python
|
|
|
73
73
|
|
|
74
74
|
---
|
|
75
75
|
|
|
76
|
+
## 🎯 manifest.json: The Key to Everything
|
|
77
|
+
|
|
78
|
+
**`manifest.json` is the foundation of your application.** It's a single configuration file that defines your app's identity, data structure, authentication, indexes, and services. Everything flows from this file.
|
|
79
|
+
|
|
80
|
+
### Your First manifest.json
|
|
81
|
+
|
|
82
|
+
Create a `manifest.json` file with just 3 fields:
|
|
83
|
+
|
|
84
|
+
```json
|
|
85
|
+
{
|
|
86
|
+
"schema_version": "2.0",
|
|
87
|
+
"slug": "my_app",
|
|
88
|
+
"name": "My App"
|
|
89
|
+
}
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
That's it! This minimal manifest gives you:
|
|
93
|
+
- ✅ Automatic data scoping (all queries filtered by `app_id`)
|
|
94
|
+
- ✅ Collection name prefixing (`db.tasks` → `my_app_tasks`)
|
|
95
|
+
- ✅ App registration and lifecycle management
|
|
96
|
+
|
|
97
|
+
**Learn more**: [Quick Start Guide](docs/QUICK_START.md) | [Manifest Deep Dive](docs/MANIFEST_DEEP_DIVE.md)
|
|
98
|
+
|
|
99
|
+
---
|
|
100
|
+
|
|
76
101
|
## Installation
|
|
77
102
|
|
|
78
103
|
```bash
|
|
@@ -83,28 +108,55 @@ pip install mdb-engine
|
|
|
83
108
|
|
|
84
109
|
## 30-Second Quick Start
|
|
85
110
|
|
|
111
|
+
**Step 1**: Create your `manifest.json`:
|
|
112
|
+
|
|
113
|
+
```json
|
|
114
|
+
{
|
|
115
|
+
"schema_version": "2.0",
|
|
116
|
+
"slug": "my_app",
|
|
117
|
+
"name": "My App",
|
|
118
|
+
"managed_indexes": {
|
|
119
|
+
"tasks": [
|
|
120
|
+
{
|
|
121
|
+
"type": "regular",
|
|
122
|
+
"keys": {"status": 1, "created_at": -1},
|
|
123
|
+
"name": "status_sort"
|
|
124
|
+
}
|
|
125
|
+
]
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
**Step 2**: Create your FastAPI app:
|
|
131
|
+
|
|
86
132
|
```python
|
|
87
133
|
from pathlib import Path
|
|
88
134
|
from fastapi import Depends
|
|
89
135
|
from mdb_engine import MongoDBEngine
|
|
90
136
|
from mdb_engine.dependencies import get_scoped_db
|
|
91
137
|
|
|
92
|
-
#
|
|
138
|
+
# Initialize the engine
|
|
93
139
|
engine = MongoDBEngine(
|
|
94
140
|
mongo_uri="mongodb://localhost:27017",
|
|
95
141
|
db_name="my_database"
|
|
96
142
|
)
|
|
97
143
|
|
|
98
|
-
#
|
|
144
|
+
# Create app - manifest.json is loaded automatically!
|
|
99
145
|
app = engine.create_app(slug="my_app", manifest=Path("manifest.json"))
|
|
100
146
|
|
|
101
|
-
#
|
|
147
|
+
# Use request-scoped dependencies - all queries automatically isolated
|
|
102
148
|
@app.post("/tasks")
|
|
103
149
|
async def create_task(task: dict, db=Depends(get_scoped_db)):
|
|
104
150
|
result = await db.tasks.insert_one(task)
|
|
105
151
|
return {"id": str(result.inserted_id)}
|
|
106
152
|
```
|
|
107
153
|
|
|
154
|
+
**What just happened?**
|
|
155
|
+
- ✅ Engine loaded your `manifest.json`
|
|
156
|
+
- ✅ Indexes created automatically from `managed_indexes`
|
|
157
|
+
- ✅ Database queries automatically scoped to your app
|
|
158
|
+
- ✅ Lifecycle management handled (startup/shutdown)
|
|
159
|
+
|
|
108
160
|
That's it. Your data is automatically sandboxed, indexes are created, and cleanup is handled.
|
|
109
161
|
|
|
110
162
|
---
|
|
@@ -200,9 +252,11 @@ async def health():
|
|
|
200
252
|
|
|
201
253
|
## Why mdb-engine?
|
|
202
254
|
|
|
255
|
+
- **manifest.json is everything** — Single source of truth for your entire app configuration
|
|
203
256
|
- **Zero boilerplate** — No more connection setup, index creation scripts, or auth handlers
|
|
204
257
|
- **Data isolation** — Multi-tenant ready with automatic app sandboxing
|
|
205
258
|
- **Manifest-driven** — Define your app's "DNA" in JSON, not scattered code
|
|
259
|
+
- **Incremental adoption** — Start minimal, add features as needed
|
|
206
260
|
- **No lock-in** — Standard Motor/PyMongo underneath; export anytime with `mongodump --query='{"app_id":"my_app"}'`
|
|
207
261
|
|
|
208
262
|
---
|
|
@@ -300,13 +354,34 @@ async def get_items():
|
|
|
300
354
|
|
|
301
355
|
---
|
|
302
356
|
|
|
357
|
+
## Understanding manifest.json
|
|
358
|
+
|
|
359
|
+
Your `manifest.json` is the heart of your application. It defines:
|
|
360
|
+
|
|
361
|
+
- **App Identity**: `slug`, `name`, `description`
|
|
362
|
+
- **Data Access**: `data_access.read_scopes`, `data_access.write_scope`
|
|
363
|
+
- **Indexes**: `managed_indexes` (regular, vector, text, TTL, compound)
|
|
364
|
+
- **Authentication**: `auth.policy`, `auth.users` (Casbin/OSO, demo users)
|
|
365
|
+
- **AI Services**: `embedding_config`, `memory_config`
|
|
366
|
+
- **Real-time**: `websockets` endpoints
|
|
367
|
+
- **CORS**: `cors` settings
|
|
368
|
+
|
|
369
|
+
**Start minimal, grow as needed.** You can begin with just `slug`, `name`, and `schema_version`, then add features incrementally.
|
|
370
|
+
|
|
371
|
+
**📖 Learn More:**
|
|
372
|
+
- [Quick Start Guide](docs/QUICK_START.md) - Get started with manifest.json
|
|
373
|
+
- [Manifest Deep Dive](docs/MANIFEST_DEEP_DIVE.md) - Comprehensive manifest.json guide
|
|
374
|
+
- [Examples](examples/) - Real-world manifest.json files
|
|
375
|
+
|
|
376
|
+
---
|
|
377
|
+
|
|
303
378
|
## Links
|
|
304
379
|
|
|
305
380
|
- [GitHub Repository](https://github.com/ranfysvalle02/mdb-engine)
|
|
306
381
|
- [Documentation](https://github.com/ranfysvalle02/mdb-engine/tree/main/docs)
|
|
307
382
|
- [All Examples](https://github.com/ranfysvalle02/mdb-engine/tree/main/examples)
|
|
308
|
-
- [Quick Start Guide](
|
|
309
|
-
- [Contributing](
|
|
383
|
+
- [Quick Start Guide](docs/QUICK_START.md) - **Start here!**
|
|
384
|
+
- [Contributing](CONTRIBUTING.md)
|
|
310
385
|
|
|
311
386
|
---
|
|
312
387
|
|
|
@@ -8,6 +8,31 @@
|
|
|
8
8
|
|
|
9
9
|
---
|
|
10
10
|
|
|
11
|
+
## 🎯 manifest.json: The Key to Everything
|
|
12
|
+
|
|
13
|
+
**`manifest.json` is the foundation of your application.** It's a single configuration file that defines your app's identity, data structure, authentication, indexes, and services. Everything flows from this file.
|
|
14
|
+
|
|
15
|
+
### Your First manifest.json
|
|
16
|
+
|
|
17
|
+
Create a `manifest.json` file with just 3 fields:
|
|
18
|
+
|
|
19
|
+
```json
|
|
20
|
+
{
|
|
21
|
+
"schema_version": "2.0",
|
|
22
|
+
"slug": "my_app",
|
|
23
|
+
"name": "My App"
|
|
24
|
+
}
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
That's it! This minimal manifest gives you:
|
|
28
|
+
- ✅ Automatic data scoping (all queries filtered by `app_id`)
|
|
29
|
+
- ✅ Collection name prefixing (`db.tasks` → `my_app_tasks`)
|
|
30
|
+
- ✅ App registration and lifecycle management
|
|
31
|
+
|
|
32
|
+
**Learn more**: [Quick Start Guide](docs/QUICK_START.md) | [Manifest Deep Dive](docs/MANIFEST_DEEP_DIVE.md)
|
|
33
|
+
|
|
34
|
+
---
|
|
35
|
+
|
|
11
36
|
## Installation
|
|
12
37
|
|
|
13
38
|
```bash
|
|
@@ -18,28 +43,55 @@ pip install mdb-engine
|
|
|
18
43
|
|
|
19
44
|
## 30-Second Quick Start
|
|
20
45
|
|
|
46
|
+
**Step 1**: Create your `manifest.json`:
|
|
47
|
+
|
|
48
|
+
```json
|
|
49
|
+
{
|
|
50
|
+
"schema_version": "2.0",
|
|
51
|
+
"slug": "my_app",
|
|
52
|
+
"name": "My App",
|
|
53
|
+
"managed_indexes": {
|
|
54
|
+
"tasks": [
|
|
55
|
+
{
|
|
56
|
+
"type": "regular",
|
|
57
|
+
"keys": {"status": 1, "created_at": -1},
|
|
58
|
+
"name": "status_sort"
|
|
59
|
+
}
|
|
60
|
+
]
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
**Step 2**: Create your FastAPI app:
|
|
66
|
+
|
|
21
67
|
```python
|
|
22
68
|
from pathlib import Path
|
|
23
69
|
from fastapi import Depends
|
|
24
70
|
from mdb_engine import MongoDBEngine
|
|
25
71
|
from mdb_engine.dependencies import get_scoped_db
|
|
26
72
|
|
|
27
|
-
#
|
|
73
|
+
# Initialize the engine
|
|
28
74
|
engine = MongoDBEngine(
|
|
29
75
|
mongo_uri="mongodb://localhost:27017",
|
|
30
76
|
db_name="my_database"
|
|
31
77
|
)
|
|
32
78
|
|
|
33
|
-
#
|
|
79
|
+
# Create app - manifest.json is loaded automatically!
|
|
34
80
|
app = engine.create_app(slug="my_app", manifest=Path("manifest.json"))
|
|
35
81
|
|
|
36
|
-
#
|
|
82
|
+
# Use request-scoped dependencies - all queries automatically isolated
|
|
37
83
|
@app.post("/tasks")
|
|
38
84
|
async def create_task(task: dict, db=Depends(get_scoped_db)):
|
|
39
85
|
result = await db.tasks.insert_one(task)
|
|
40
86
|
return {"id": str(result.inserted_id)}
|
|
41
87
|
```
|
|
42
88
|
|
|
89
|
+
**What just happened?**
|
|
90
|
+
- ✅ Engine loaded your `manifest.json`
|
|
91
|
+
- ✅ Indexes created automatically from `managed_indexes`
|
|
92
|
+
- ✅ Database queries automatically scoped to your app
|
|
93
|
+
- ✅ Lifecycle management handled (startup/shutdown)
|
|
94
|
+
|
|
43
95
|
That's it. Your data is automatically sandboxed, indexes are created, and cleanup is handled.
|
|
44
96
|
|
|
45
97
|
---
|
|
@@ -135,9 +187,11 @@ async def health():
|
|
|
135
187
|
|
|
136
188
|
## Why mdb-engine?
|
|
137
189
|
|
|
190
|
+
- **manifest.json is everything** — Single source of truth for your entire app configuration
|
|
138
191
|
- **Zero boilerplate** — No more connection setup, index creation scripts, or auth handlers
|
|
139
192
|
- **Data isolation** — Multi-tenant ready with automatic app sandboxing
|
|
140
193
|
- **Manifest-driven** — Define your app's "DNA" in JSON, not scattered code
|
|
194
|
+
- **Incremental adoption** — Start minimal, add features as needed
|
|
141
195
|
- **No lock-in** — Standard Motor/PyMongo underneath; export anytime with `mongodump --query='{"app_id":"my_app"}'`
|
|
142
196
|
|
|
143
197
|
---
|
|
@@ -235,13 +289,34 @@ async def get_items():
|
|
|
235
289
|
|
|
236
290
|
---
|
|
237
291
|
|
|
292
|
+
## Understanding manifest.json
|
|
293
|
+
|
|
294
|
+
Your `manifest.json` is the heart of your application. It defines:
|
|
295
|
+
|
|
296
|
+
- **App Identity**: `slug`, `name`, `description`
|
|
297
|
+
- **Data Access**: `data_access.read_scopes`, `data_access.write_scope`
|
|
298
|
+
- **Indexes**: `managed_indexes` (regular, vector, text, TTL, compound)
|
|
299
|
+
- **Authentication**: `auth.policy`, `auth.users` (Casbin/OSO, demo users)
|
|
300
|
+
- **AI Services**: `embedding_config`, `memory_config`
|
|
301
|
+
- **Real-time**: `websockets` endpoints
|
|
302
|
+
- **CORS**: `cors` settings
|
|
303
|
+
|
|
304
|
+
**Start minimal, grow as needed.** You can begin with just `slug`, `name`, and `schema_version`, then add features incrementally.
|
|
305
|
+
|
|
306
|
+
**📖 Learn More:**
|
|
307
|
+
- [Quick Start Guide](docs/QUICK_START.md) - Get started with manifest.json
|
|
308
|
+
- [Manifest Deep Dive](docs/MANIFEST_DEEP_DIVE.md) - Comprehensive manifest.json guide
|
|
309
|
+
- [Examples](examples/) - Real-world manifest.json files
|
|
310
|
+
|
|
311
|
+
---
|
|
312
|
+
|
|
238
313
|
## Links
|
|
239
314
|
|
|
240
315
|
- [GitHub Repository](https://github.com/ranfysvalle02/mdb-engine)
|
|
241
316
|
- [Documentation](https://github.com/ranfysvalle02/mdb-engine/tree/main/docs)
|
|
242
317
|
- [All Examples](https://github.com/ranfysvalle02/mdb-engine/tree/main/examples)
|
|
243
|
-
- [Quick Start Guide](
|
|
244
|
-
- [Contributing](
|
|
318
|
+
- [Quick Start Guide](docs/QUICK_START.md) - **Start here!**
|
|
319
|
+
- [Contributing](CONTRIBUTING.md)
|
|
245
320
|
|
|
246
321
|
---
|
|
247
322
|
|
|
@@ -78,7 +78,10 @@ from .indexes import (
|
|
|
78
78
|
# Repository pattern
|
|
79
79
|
from .repositories import Entity, MongoRepository, Repository, UnitOfWork
|
|
80
80
|
|
|
81
|
-
|
|
81
|
+
# Utilities
|
|
82
|
+
from .utils import clean_mongo_doc, clean_mongo_docs
|
|
83
|
+
|
|
84
|
+
__version__ = "0.2.4" # Patch version bump for exception handling improvements
|
|
82
85
|
|
|
83
86
|
__all__ = [
|
|
84
87
|
# Core Engine
|
|
@@ -127,4 +130,7 @@ __all__ = [
|
|
|
127
130
|
"AsyncAtlasIndexManager",
|
|
128
131
|
"AutoIndexManager",
|
|
129
132
|
"run_index_creation_for_collection",
|
|
133
|
+
# Utilities
|
|
134
|
+
"clean_mongo_doc",
|
|
135
|
+
"clean_mongo_docs",
|
|
130
136
|
]
|
|
@@ -42,6 +42,10 @@ All apps share a central user pool. Users authenticate once and can access any a
|
|
|
42
42
|
{
|
|
43
43
|
"auth": {
|
|
44
44
|
"mode": "shared",
|
|
45
|
+
"auth_hub_url": "http://localhost:8000",
|
|
46
|
+
"related_apps": {
|
|
47
|
+
"dashboard": "http://localhost:8001"
|
|
48
|
+
},
|
|
45
49
|
"roles": ["viewer", "editor", "admin"],
|
|
46
50
|
"default_role": "viewer",
|
|
47
51
|
"require_role": "viewer",
|
|
@@ -60,6 +64,8 @@ All apps share a central user pool. Users authenticate once and can access any a
|
|
|
60
64
|
| Field | Description |
|
|
61
65
|
|-------|-------------|
|
|
62
66
|
| `roles` | Available roles for this app |
|
|
67
|
+
| `auth_hub_url` | URL of the authentication hub for SSO apps. Used for redirecting unauthenticated users to login. Can be overridden via `AUTH_HUB_URL` environment variable |
|
|
68
|
+
| `related_apps` | Map of related app slugs to their URLs for cross-app navigation. Keys are app slugs, values are URLs. Can be overridden via `{APP_SLUG_UPPER}_URL` environment variables |
|
|
63
69
|
| `default_role` | Role assigned to new users |
|
|
64
70
|
| `require_role` | Minimum role required to access app |
|
|
65
71
|
| `public_routes` | Routes that don't require authentication |
|