@@ -15,19 +15,21 @@ public class OperationsProcessor : IOperationsProcessor
15
15
private readonly IOperationProcessorAccessor _operationProcessorAccessor ;
16
16
private readonly IOperationsTransactionFactory _operationsTransactionFactory ;
17
17
private readonly ILocalIdTracker _localIdTracker ;
18
+ private readonly IVersionTracker _versionTracker ;
18
19
private readonly IResourceGraph _resourceGraph ;
19
20
private readonly IJsonApiRequest _request ;
20
21
private readonly ITargetedFields _targetedFields ;
21
22
private readonly ISparseFieldSetCache _sparseFieldSetCache ;
22
23
private readonly LocalIdValidator _localIdValidator ;
23
24
24
25
public OperationsProcessor ( IOperationProcessorAccessor operationProcessorAccessor , IOperationsTransactionFactory operationsTransactionFactory ,
25
- ILocalIdTracker localIdTracker , IResourceGraph resourceGraph , IJsonApiRequest request , ITargetedFields targetedFields ,
26
+ ILocalIdTracker localIdTracker , IVersionTracker versionTracker , IResourceGraph resourceGraph , IJsonApiRequest request , ITargetedFields targetedFields ,
26
27
ISparseFieldSetCache sparseFieldSetCache )
27
28
{
28
29
ArgumentGuard . NotNull ( operationProcessorAccessor , nameof ( operationProcessorAccessor ) ) ;
29
30
ArgumentGuard . NotNull ( operationsTransactionFactory , nameof ( operationsTransactionFactory ) ) ;
30
31
ArgumentGuard . NotNull ( localIdTracker , nameof ( localIdTracker ) ) ;
32
+ ArgumentGuard . NotNull ( versionTracker , nameof ( versionTracker ) ) ;
31
33
ArgumentGuard . NotNull ( resourceGraph , nameof ( resourceGraph ) ) ;
32
34
ArgumentGuard . NotNull ( request , nameof ( request ) ) ;
33
35
ArgumentGuard . NotNull ( targetedFields , nameof ( targetedFields ) ) ;
@@ -36,6 +38,7 @@ public OperationsProcessor(IOperationProcessorAccessor operationProcessorAccesso
36
38
_operationProcessorAccessor = operationProcessorAccessor ;
37
39
_operationsTransactionFactory = operationsTransactionFactory ;
38
40
_localIdTracker = localIdTracker ;
41
+ _versionTracker = versionTracker ;
39
42
_resourceGraph = resourceGraph ;
40
43
_request = request ;
41
44
_targetedFields = targetedFields ;
@@ -104,11 +107,15 @@ public OperationsProcessor(IOperationProcessorAccessor operationProcessorAccesso
104
107
cancellationToken . ThrowIfCancellationRequested ( ) ;
105
108
106
109
TrackLocalIdsForOperation ( operation ) ;
110
+ RefreshVersionsForOperation ( operation ) ;
107
111
108
112
_targetedFields . CopyFrom ( operation . TargetedFields ) ;
109
113
_request . CopyFrom ( operation . Request ) ;
110
114
111
115
return await _operationProcessorAccessor . ProcessAsync ( operation , cancellationToken ) ;
116
+
117
+ // Ideally we'd take the versions from response here and update the version cache, but currently
118
+ // not all resource service methods return data. Therefore this is handled elsewhere.
112
119
}
113
120
114
121
protected void TrackLocalIdsForOperation ( OperationContainer operation )
@@ -144,4 +151,36 @@ private void AssignStringId(IIdentifiable resource)
144
151
resource . StringId = _localIdTracker . GetValue ( resource . LocalId , resourceType ) ;
145
152
}
146
153
}
154
+
155
+ private void RefreshVersionsForOperation ( OperationContainer operation )
156
+ {
157
+ if ( operation . Request . PrimaryResourceType ! . IsVersioned )
158
+ {
159
+ string ? requestVersion = operation . Resource . GetVersion ( ) ;
160
+
161
+ if ( requestVersion == null )
162
+ {
163
+ string ? trackedVersion = _versionTracker . GetVersion ( operation . Request . PrimaryResourceType , operation . Resource . StringId ! ) ;
164
+ operation . Resource . SetVersion ( trackedVersion ) ;
165
+
166
+ ( ( JsonApiRequest ) operation . Request ) . PrimaryVersion = trackedVersion ;
167
+ }
168
+ }
169
+
170
+ foreach ( IIdentifiable rightResource in operation . GetSecondaryResources ( ) )
171
+ {
172
+ ResourceType rightResourceType = _resourceGraph . GetResourceType ( rightResource . GetClrType ( ) ) ;
173
+
174
+ if ( rightResourceType . IsVersioned )
175
+ {
176
+ string ? requestVersion = rightResource . GetVersion ( ) ;
177
+
178
+ if ( requestVersion == null )
179
+ {
180
+ string ? trackedVersion = _versionTracker . GetVersion ( rightResourceType , rightResource . StringId ! ) ;
181
+ rightResource . SetVersion ( trackedVersion ) ;
182
+ }
183
+ }
184
+ }
185
+ }
147
186
}
0 commit comments