REST SDK client for the Jebi service. Provides IJebiSdkService to manage catalog metadata, ingestion plans and local execution against a remote Jebi server.
$ dotnet add package Jebi.SDK.RestJebi is a .NET library that maps JSON data onto a relational database, applying configurable transformation rules to bridge structural differences between source JSON and the target EF Core model.
Jebi is split into two distinct layers:
A single combined REST server exposes both the Catalog and Ingestion Plan surfaces:
| Project | Role |
|---|---|
apps/Servers/Jebi.Catalog.IngestionPlan.Server.Rest | Production server — Catalog + Plan REST API |
Endpoints:
api/source/* — JSON schema managementapi/target/* — EF Core DbContext metadataapi/bindings/* — binding configurations and transformation rulesapi/plan/* — ingestion plan setup and key correlations| Package | Description |
|---|---|
Jebi.SDK.Rest | Published NuGet package. Wires IJebiSdkService against the remote server + local execution engine. |
Consumer App
└── IJebiSdkService (from Jebi.SDK.Rest package)
├── Catalog calls ──→ HTTP → Jebi Server (api/source, api/target, api/bindings)
├── Plan calls ──→ HTTP → Jebi Server (api/plan)
└── Execute ──→ local → JebiIngestionDb + consumer's target DbContext(s)
The server holds all metadata (schemas, target models, binding rules, plans). Execution runs client-side against the consumer's own databases.
| Project | Purpose |
|---|---|
src/Catalog/Jebi.Catalog.Infrastructure | Catalog persistence (source / target / binding) |
src/Ingestion/Jebi.Ingestion.Plan.Infrastructure | Plan persistence (setup / key correlations / run results) |
src/Ingestion/Jebi.Ingestion.Execute.Infrastructure | Runtime execution (EF provider, target integration) |
src/Shared/Jebi.Shared.Infrastructure | Shared EF base components |
The server requires two connection strings:
"ConnectionStrings": {
"JebiCatalogDb": "...",
"JebiPlanDb": "..."
}
builder.Services.AddJebiSdkRest(
serverBaseAddress: "https://jebi.example.com",
jebiIngestionConnectionString: "Data Source=jebi-execute.db",
tenantRemoteTokenOptions: tenantOptions,
ensureTargetDatabases: true,
typeof(MyTargetDbContext));
builder.Services.AddJebiSdkLocal(
jebiCatalogConnectionString: "Data Source=catalog.db",
jebiIngestionConnectionString: "Data Source=plan.db",
ensureTargetDatabases: true,
typeof(MyTargetDbContext));
var jebi = serviceProvider.GetRequiredService<IJebiSdkService>();
var binding = await jebi.CreateBindingConfigurationAsync(new JebiCreateBindingConfigurationRequestDto
{
SourceSchemaName = "CustomerSchema",
TargetContextName = "MyTargetDbContext",
Name = "CustomerBinding"
});
await jebi.AddPropertyBindingRuleAsync(new JebiAddPropertyBindingRuleRequestDto
{
BindingConfigurationId = binding.BindingConfigurationId,
SourcePropertyName = "CustomerDef.customerId",
TargetPropertyFullyQualifiedName = "MyApp.Customer.CustomerId"
});
var result = await jebi.RunFromBindingAsync(new JebiRunFromBindingRequestDto
{
BindingConfigurationName = "CustomerBinding",
JsonPayload = jsonPayload,
Options = new JebiIngestionOptionsDto { ValidateSchema = true, PersistRequested = true }
});
Work on a focused subset of the solution using the available filters:
dotnet build Jebi.Catalog.slnf
dotnet build Jebi.Ingestion.slnf
dotnet build Jebi.SDK.slnf
dotnet build Jebi.AppHost.slnf
Check project boundary rules:
bash scripts/ci/check-project-boundaries.sh
Validates that:
DisableTransitiveProjectReferences=truecompile dependenciesAlso enforced in CI via the Architecture Boundaries workflow.
Pull and run the server:
docker pull ghcr.io/boffoli/jebi-catalog-ingestionplan-server-rest:latest
docker run -d -p 8080:8080 ghcr.io/boffoli/jebi-catalog-ingestionplan-server-rest:latest
See docs/docker-demo-launchers.md for ready-to-use launcher scripts.