Skip to content

Commit cfff501

Browse files
authored
Merge pull request #118 from dolittle/new-contracts-structure
New contracts structure
2 parents b2b9c08 + d159e4f commit cfff501

File tree

27 files changed

+180
-83
lines changed

27 files changed

+180
-83
lines changed

Samples/Tutorials/Projections/DishCounter.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
// Sample code for the tutorial at https://dolittle.io/tutorials/projections/typescript/
55

6-
import { ProjectionContext, projection, on, copyProjectionToMongoDB, convertToMongoDB, MongoDBConversion } from '@dolittle/sdk.projections';
6+
import { ProjectionContext, projection, on, copyProjectionToMongoDB } from '@dolittle/sdk.projections';
77

88
import { DishPrepared } from './DishPrepared';
99

@@ -12,7 +12,6 @@ import { DishPrepared } from './DishPrepared';
1212
export class DishCounter {
1313

1414
name: string = 'Unknown';
15-
@convertToMongoDB(MongoDBConversion.Binary)
1615
numberOfTimesPrepared: number = 0;
1716

1817
@on(DishPrepared, _ => _.keyFromProperty('Dish'))

Samples/Tutorials/Projections/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ import { DishPrepared } from './DishPrepared';
1919
.create('0767bc04-bc03-40b8-a0be-5f6c6130f68b')
2020
.forReadModel(Chef)
2121
.copyToMongoDB(_ => _
22-
.withConversion('lastPreparedDish', MongoDBConversion.DateTime)
22+
.withConversion('lastPreparedDish', MongoDBConversion.Date)
2323
)
2424
.on(DishPrepared, _ => _.keyFromProperty('Chef'), (chef, event, projectionContext) => {
2525
chef.name = event.Chef;

Source/artifacts/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@
4747
"@dolittle/concepts": "6.0.0",
4848
"@dolittle/rudiments": "6.0.0",
4949
"@dolittle/types": "6.0.0",
50-
"@dolittle/runtime.contracts": "6.6.0-sam.0"
50+
"@dolittle/runtime.contracts": "6.6.0-sam.2"
5151
},
5252
"devDependencies": {
5353
"@types/is-natural-number": "^4.0.0"

Source/embeddings/package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,9 +45,9 @@
4545
},
4646
"dependencies": {
4747
"@dolittle/concepts": "6.0.0",
48-
"@dolittle/contracts": "6.6.0-sam.0",
48+
"@dolittle/contracts": "6.6.0-sam.2",
4949
"@dolittle/rudiments": "6.0.0",
50-
"@dolittle/runtime.contracts": "6.6.0-sam.0",
50+
"@dolittle/runtime.contracts": "6.6.0-sam.2",
5151
"@dolittle/sdk.artifacts": "22.2.0-sam.2",
5252
"@dolittle/sdk.common": "22.2.0-sam.2",
5353
"@dolittle/sdk.dependencyinversion": "22.2.0-sam.2",

Source/eventHorizon/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@
4646
"dependencies": {
4747
"@dolittle/concepts": "6.0.0",
4848
"@dolittle/rudiments": "6.0.0",
49-
"@dolittle/runtime.contracts": "6.6.0-sam.0",
49+
"@dolittle/runtime.contracts": "6.6.0-sam.2",
5050
"@dolittle/sdk.events": "22.2.0-sam.2",
5151
"@dolittle/sdk.execution": "22.2.0-sam.2",
5252
"@dolittle/sdk.protobuf": "22.2.0-sam.2",

Source/events.filtering/package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,9 +45,9 @@
4545
},
4646
"dependencies": {
4747
"@dolittle/concepts": "6.0.0",
48-
"@dolittle/contracts": "6.6.0-sam.0",
48+
"@dolittle/contracts": "6.6.0-sam.2",
4949
"@dolittle/rudiments": "6.0.0",
50-
"@dolittle/runtime.contracts": "6.6.0-sam.0",
50+
"@dolittle/runtime.contracts": "6.6.0-sam.2",
5151
"@dolittle/sdk.common": "22.2.0-sam.2",
5252
"@dolittle/sdk.dependencyinversion": "22.2.0-sam.2",
5353
"@dolittle/sdk.events": "22.2.0-sam.2",

Source/events.handling/package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,9 +45,9 @@
4545
},
4646
"dependencies": {
4747
"@dolittle/concepts": "6.0.0",
48-
"@dolittle/contracts": "6.6.0-sam.0",
48+
"@dolittle/contracts": "6.6.0-sam.2",
4949
"@dolittle/rudiments": "6.0.0",
50-
"@dolittle/runtime.contracts": "6.6.0-sam.0",
50+
"@dolittle/runtime.contracts": "6.6.0-sam.2",
5151
"@dolittle/sdk.artifacts": "22.2.0-sam.2",
5252
"@dolittle/sdk.common": "22.2.0-sam.2",
5353
"@dolittle/sdk.dependencyinversion": "22.2.0-sam.2",

Source/events.processing/package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,9 +45,9 @@
4545
},
4646
"dependencies": {
4747
"@dolittle/concepts": "6.0.0",
48-
"@dolittle/contracts": "6.6.0-sam.0",
48+
"@dolittle/contracts": "6.6.0-sam.2",
4949
"@dolittle/rudiments": "6.0.0",
50-
"@dolittle/runtime.contracts": "6.6.0-sam.0",
50+
"@dolittle/runtime.contracts": "6.6.0-sam.2",
5151
"@dolittle/sdk.common": "22.2.0-sam.2",
5252
"@dolittle/sdk.dependencyinversion": "22.2.0-sam.2",
5353
"@dolittle/sdk.execution": "22.2.0-sam.2",

Source/events/package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,9 +45,9 @@
4545
},
4646
"dependencies": {
4747
"@dolittle/concepts": "6.0.0",
48-
"@dolittle/contracts": "6.6.0-sam.0",
48+
"@dolittle/contracts": "6.6.0-sam.2",
4949
"@dolittle/rudiments": "6.0.0",
50-
"@dolittle/runtime.contracts": "6.6.0-sam.0",
50+
"@dolittle/runtime.contracts": "6.6.0-sam.2",
5151
"@dolittle/sdk.artifacts": "22.2.0-sam.2",
5252
"@dolittle/sdk.execution": "22.2.0-sam.2",
5353
"@dolittle/sdk.protobuf": "22.2.0-sam.2",

Source/projections/Builders/Copies/CopyToMongoDBBuilder.ts

Lines changed: 54 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,27 @@
11
// Copyright (c) Dolittle. All rights reserved.
22
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
33

4-
import { ComplexValueMap } from '@dolittle/sdk.artifacts';
54
import { IClientBuildResults } from '@dolittle/sdk.common';
65
import { Constructor } from '@dolittle/types';
76

8-
import { ProjectionField } from '../../Copies/ProjectionField';
7+
import { ProjectionProperty } from '../../Copies/ProjectionProperty';
98
import { CollectionName, CollectionNameLike } from '../../Copies/MongoDB/CollectionName';
109
import { Conversion } from '../../Copies/MongoDB/Conversion';
1110
import { MongoDBCopies } from '../../Copies/MongoDB/MongoDBCopies';
11+
import { PropertyConversion } from '../../Copies/MongoDB/PropertyConversion';
1212
import { ProjectionId } from '../../ProjectionId';
1313
import { ReadModelField } from './../ReadModelField';
1414
import { ICopyToMongoDBBuilder } from './ICopyToMongoDBBuilder';
1515

16+
type BuilderConversion = { property: string, convertTo: Conversion, children: BuilderConversion[] };
17+
1618
/**
1719
* Represents an implementation of {@link ICopyToMongoDBBuilder}.
1820
* @template T The type of the projection read model.
1921
*/
2022
export class CopyToMongoDBBuilder<T> extends ICopyToMongoDBBuilder<T> {
2123
private _collectionName?: CollectionName;
22-
private readonly _conversions: Map<ProjectionField, Conversion> = new ComplexValueMap(ProjectionField, field => [field.value], 1);
24+
private readonly _conversions: Map<string, Conversion> = new Map();
2325

2426
/**
2527
* Initialises a new instance of the {@link CopyToMongoDBBuilder} class.
@@ -42,7 +44,7 @@ export class CopyToMongoDBBuilder<T> extends ICopyToMongoDBBuilder<T> {
4244

4345
/** @inheritdoc */
4446
withConversion(field: ReadModelField<T>, to: Conversion): ICopyToMongoDBBuilder<T> {
45-
this._conversions.set(ProjectionField.from(field), to);
47+
this._conversions.set(field, to);
4648
return this;
4749
}
4850

@@ -57,12 +59,59 @@ export class CopyToMongoDBBuilder<T> extends ICopyToMongoDBBuilder<T> {
5759
return undefined;
5860
}
5961

60-
return new MongoDBCopies(true, this._collectionName, this._conversions);
62+
return new MongoDBCopies(true, this._collectionName, this.buildPropertyConversions());
6163
}
6264

6365
private inferCollectionNameFromType() {
6466
if (this._readModelTypeOrInstance instanceof Function) {
6567
this._collectionName = CollectionName.from(this._readModelTypeOrInstance.name);
6668
}
6769
}
70+
71+
private buildPropertyConversions(): PropertyConversion[] {
72+
const conversions: BuilderConversion[] = [];
73+
74+
for (const [field, conversionType] of this._conversions) {
75+
const properties = field.split('.');
76+
const conversion = this.makeConversionWithParents(conversions, properties);
77+
conversion.convertTo = conversionType;
78+
}
79+
80+
return this.convertPropertyConversions(conversions);
81+
}
82+
83+
private makeConversionWithParents(conversions: BuilderConversion[], properties: string[]): BuilderConversion {
84+
const current = properties[0];
85+
const remainder = properties.slice(1);
86+
87+
for (const conversion of conversions) {
88+
if (conversion.property === current) {
89+
if (remainder.length > 0) {
90+
return this.makeConversionWithParents(conversion.children, remainder);
91+
}
92+
93+
return conversion;
94+
}
95+
}
96+
97+
const conversion = { property: current, convertTo: Conversion.None, children: [] };
98+
conversions.push(conversion);
99+
if (remainder.length > 0) {
100+
return this.makeConversionWithParents(conversion.children, remainder);
101+
}
102+
103+
return conversion;
104+
}
105+
106+
private convertPropertyConversions(conversions: BuilderConversion[]): PropertyConversion[] {
107+
return conversions.map(conversion =>
108+
new PropertyConversion(
109+
ProjectionProperty.from(conversion.property),
110+
conversion.convertTo,
111+
false,
112+
ProjectionProperty.from(''),
113+
this.convertPropertyConversions(conversion.children)
114+
)
115+
);
116+
}
68117
}

0 commit comments

Comments
 (0)