Skip to content

Commit 7807e2b

Browse files
Merge pull request #177 from contentstack/enhc/DX-7304
feat: Complete Assets module STJ migration (v1.0.0-beta.4)
2 parents 0317c88 + c7b1d59 commit 7807e2b

39 files changed

Lines changed: 435 additions & 396 deletions

CHANGELOG.md

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,24 @@
11
# Changelog
22

3+
## [v1.0.0-beta.4](https://github.com/contentstack/contentstack-management-dotnet/tree/v1.0.0-beta.4)
4+
- **Assets STJ Migration Complete**
5+
- Fully migrated Assets module from Newtonsoft.Json to System.Text.Json
6+
- Updated Asset.cs, AssetModel.cs, Folder.cs, and Version.cs with STJ service integration
7+
- Migrated UploadService, CreateUpdateFolderService, FetchReferencesService, PublishUnpublishService, and VersionService to use Utf8JsonWriter and JsonSerializerOptions
8+
- Re-enabled Stack.Asset() method for asset operations
9+
10+
## [v1.0.0-beta.3](https://github.com/contentstack/contentstack-management-dotnet/tree/v1.0.0-beta.3)
11+
- **ContentType & QueryService STJ Migration**
12+
- **✅ ContentType Module**: Fully migrated ContentType model and dependencies to System.Text.Json
13+
- **✅ QueryService Migration**: Re-enabled and migrated QueryService for content type listing
14+
- **✅ Field System**: Converted core Field models (FieldMetadata, Field, FieldRules) to STJ
15+
- **✅ ContentModelling**: Updated ContentModelling and Option classes with STJ attributes
16+
- **✅ Service Layer**: Migrated CreateUpdateService, FetchDeleteService, and DeleteService
17+
- **✅ Web App Integration**: Complete ContentType CRUD interface with modern UI
18+
- **✅ Schema Validation**: Added default "Title" field to prevent 422 API errors
19+
- **✅ Error Handling**: Enhanced error reporting with detailed API validation messages
20+
- **✅ Navigation**: Integrated ContentType management into Stack workflow
21+
322
## [v1.0.0-beta.2](https://github.com/contentstack/contentstack-management-dotnet/tree/v1.0.0-beta.2)
423
- **System.Text.Json Migration Complete (Beta)**
524
- **✅ Core Modules STJ-Only**: Client, User, Organization, and Stack modules fully migrated

Contentstack.Management.Core/ContentstackClient.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,7 @@ protected void Initialize(HttpClient? httpClient = null)
200200
SerializerOptions.DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull;
201201
SerializerOptions.PropertyNameCaseInsensitive = true;
202202

203-
// SerializerOptions.Converters.Add(new FieldJsonConverter()); // Excluded for now
203+
SerializerOptions.Converters.Add(new FieldJsonConverter()); // Re-enabled for ContentType support
204204
SerializerOptions.Converters.Add(new NodeJsonConverter());
205205
SerializerOptions.Converters.Add(new TextNodeJsonConverter());
206206
}

Contentstack.Management.Core/Models/Asset.cs

Lines changed: 28 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ public class Asset
1313

1414
internal string resourcePath;
1515

16-
internal Asset(Stack stack, string uid = null)
16+
internal Asset(Stack stack, string? uid = null)
1717
{
1818
stack.ThrowIfAPIKeyEmpty();
1919

@@ -49,7 +49,7 @@ public Query Query()
4949
/// </code></pre>
5050
/// </example>
5151
/// <returns>The <see cref="Models.Folder"/></returns>
52-
public Folder Folder(string uid = null)
52+
public Folder Folder(string? uid = null)
5353
{
5454
ThrowIfUidNotEmpty();
5555
return new Folder(stack, uid);
@@ -83,11 +83,11 @@ public Version Version(int? versionNumber = null)
8383
/// </code></pre>
8484
/// </example>
8585
/// <returns>The <see cref="ContentstackResponse"/>.</returns>
86-
public virtual ContentstackResponse Create(AssetModel model, ParameterCollection collection = null)
86+
public virtual ContentstackResponse Create(AssetModel model, ParameterCollection? collection = null)
8787
{
8888
ThrowIfUidNotEmpty();
8989

90-
var service = new UploadService(stack.client.serializer, stack, resourcePath, model);
90+
var service = new UploadService(stack, resourcePath, model, stjOptions: stack.client.SerializerOptions);
9191
return stack.client.InvokeSync(service);
9292
}
9393

@@ -104,12 +104,12 @@ public virtual ContentstackResponse Create(AssetModel model, ParameterCollection
104104
/// </code></pre>
105105
/// </example>
106106
/// <returns>The Task.</returns>
107-
public virtual Task<ContentstackResponse> CreateAsync(AssetModel model, ParameterCollection collection = null)
107+
public virtual Task<ContentstackResponse> CreateAsync(AssetModel model, ParameterCollection? collection = null)
108108
{
109109
ThrowIfUidNotEmpty();
110110
stack.ThrowIfNotLoggedIn();
111111

112-
var service = new UploadService(stack.client.serializer, stack, resourcePath, model);
112+
var service = new UploadService(stack, resourcePath, model, stjOptions: stack.client.SerializerOptions);
113113
return stack.client.InvokeAsync<UploadService, ContentstackResponse>(service, true);
114114
}
115115

@@ -126,11 +126,11 @@ public virtual Task<ContentstackResponse> CreateAsync(AssetModel model, Paramete
126126
/// </code></pre>
127127
/// </example>
128128
/// <returns>The <see cref="ContentstackResponse"/>.</returns>
129-
public virtual ContentstackResponse Update(AssetModel model, ParameterCollection collection = null)
129+
public virtual ContentstackResponse Update(AssetModel model, ParameterCollection? collection = null)
130130
{
131131
ThrowIfUidEmpty();
132132

133-
var service = new UploadService(stack.client.serializer, stack, resourcePath, model, "PUT");
133+
var service = new UploadService(stack, resourcePath, model, "PUT", stjOptions: stack.client.SerializerOptions);
134134
return stack.client.InvokeSync(service);
135135
}
136136

@@ -147,12 +147,12 @@ public virtual ContentstackResponse Update(AssetModel model, ParameterCollection
147147
/// </code></pre>
148148
/// </example>
149149
/// <returns>The <see cref="ContentstackResponse"/>.</returns>
150-
public virtual Task<ContentstackResponse> UpdateAsync(AssetModel model, ParameterCollection collection = null)
150+
public virtual Task<ContentstackResponse> UpdateAsync(AssetModel model, ParameterCollection? collection = null)
151151
{
152152
stack.ThrowIfNotLoggedIn();
153153
ThrowIfUidEmpty();
154154

155-
var service = new UploadService(stack.client.serializer, stack, resourcePath, model, "PUT");
155+
var service = new UploadService(stack, resourcePath, model, "PUT", stjOptions: stack.client.SerializerOptions);
156156
return stack.client.InvokeAsync<UploadService, ContentstackResponse>(service, true);
157157
}
158158

@@ -167,12 +167,12 @@ public virtual Task<ContentstackResponse> UpdateAsync(AssetModel model, Paramete
167167
/// </code></pre>
168168
/// </example>
169169
/// <returns>The <see cref="ContentstackResponse"/>.</returns>
170-
public virtual ContentstackResponse Fetch(ParameterCollection collection = null)
170+
public virtual ContentstackResponse Fetch(ParameterCollection? collection = null)
171171
{
172172
stack.ThrowIfNotLoggedIn();
173173
ThrowIfUidEmpty();
174174

175-
var service = new FetchDeleteService(stack.client.serializer, stack, resourcePath, collection: collection);
175+
var service = new FetchDeleteService(stack, resourcePath, collection: collection);
176176
return stack.client.InvokeSync(service);
177177
}
178178

@@ -187,12 +187,12 @@ public virtual ContentstackResponse Fetch(ParameterCollection collection = null)
187187
/// </code></pre>
188188
/// </example>
189189
/// <returns>The <see cref="ContentstackResponse"/>.</returns>
190-
public virtual Task<ContentstackResponse> FetchAsync(ParameterCollection collection = null)
190+
public virtual Task<ContentstackResponse> FetchAsync(ParameterCollection? collection = null)
191191
{
192192
stack.ThrowIfNotLoggedIn();
193193
ThrowIfUidEmpty();
194194

195-
var service = new FetchDeleteService(stack.client.serializer, stack, resourcePath, collection: collection);
195+
var service = new FetchDeleteService(stack, resourcePath, collection: collection);
196196
return stack.client.InvokeAsync<FetchDeleteService, ContentstackResponse>(service, true);
197197
}
198198

@@ -212,7 +212,7 @@ public virtual ContentstackResponse Delete()
212212
stack.ThrowIfNotLoggedIn();
213213
ThrowIfUidEmpty();
214214

215-
var service = new FetchDeleteService(stack.client.serializer, stack, resourcePath, "DELETE");
215+
var service = new FetchDeleteService(stack, resourcePath, "DELETE");
216216
return stack.client.InvokeSync(service);
217217
}
218218

@@ -232,7 +232,7 @@ public virtual Task<ContentstackResponse> DeleteAsync()
232232
stack.ThrowIfNotLoggedIn();
233233
ThrowIfUidEmpty();
234234

235-
var service = new FetchDeleteService(stack.client.serializer, stack, resourcePath, "DELETE");
235+
var service = new FetchDeleteService(stack, resourcePath, "DELETE");
236236
return stack.client.InvokeAsync<FetchDeleteService, ContentstackResponse>(service, true);
237237
}
238238

@@ -247,12 +247,12 @@ public virtual Task<ContentstackResponse> DeleteAsync()
247247
/// </code></pre>
248248
/// </example>
249249
/// <returns>The <see cref="ContentstackResponse"/>.</returns>
250-
public virtual ContentstackResponse Publish(PublishUnpublishDetails details, string apiVersion = null)
250+
public virtual ContentstackResponse Publish(PublishUnpublishDetails details, string? apiVersion = null)
251251
{
252252
stack.ThrowIfNotLoggedIn();
253253
ThrowIfUidEmpty();
254254

255-
var service = new PublishUnpublishService(stack.client.serializer, stack, details, $"{resourcePath}/publish", "asset");
255+
var service = new PublishUnpublishService(stack, details, $"{resourcePath}/publish", "asset", stjOptions: stack.client.SerializerOptions);
256256
return stack.client.InvokeSync(service, apiVersion: apiVersion);
257257
}
258258

@@ -267,12 +267,12 @@ public virtual ContentstackResponse Publish(PublishUnpublishDetails details, str
267267
/// </code></pre>
268268
/// </example>
269269
/// <returns>The <see cref="ContentstackResponse"/>.</returns>
270-
public virtual Task<ContentstackResponse> PublishAsync(PublishUnpublishDetails details, string apiVersion = null)
270+
public virtual Task<ContentstackResponse> PublishAsync(PublishUnpublishDetails details, string? apiVersion = null)
271271
{
272272
stack.ThrowIfNotLoggedIn();
273273
ThrowIfUidEmpty();
274274

275-
var service = new PublishUnpublishService(stack.client.serializer, stack, details, $"{resourcePath}/publish", "asset");
275+
var service = new PublishUnpublishService(stack, details, $"{resourcePath}/publish", "asset", stjOptions: stack.client.SerializerOptions);
276276
return stack.client.InvokeAsync<PublishUnpublishService, ContentstackResponse>(service, apiVersion: apiVersion);
277277
}
278278

@@ -287,12 +287,12 @@ public virtual Task<ContentstackResponse> PublishAsync(PublishUnpublishDetails d
287287
/// </code></pre>
288288
/// </example>
289289
/// <returns>The <see cref="ContentstackResponse"/>.</returns>
290-
public virtual ContentstackResponse Unpublish(PublishUnpublishDetails details, string apiVersion = null)
290+
public virtual ContentstackResponse Unpublish(PublishUnpublishDetails details, string? apiVersion = null)
291291
{
292292
stack.ThrowIfNotLoggedIn();
293293
ThrowIfUidEmpty();
294294

295-
var service = new PublishUnpublishService(stack.client.serializer, stack, details, $"{resourcePath}/unpublish", "asset");
295+
var service = new PublishUnpublishService(stack, details, $"{resourcePath}/unpublish", "asset", stjOptions: stack.client.SerializerOptions);
296296
return stack.client.InvokeSync(service, apiVersion: apiVersion);
297297
}
298298

@@ -307,12 +307,12 @@ public virtual ContentstackResponse Unpublish(PublishUnpublishDetails details, s
307307
/// </code></pre>
308308
/// </example>
309309
/// <returns>The <see cref="ContentstackResponse"/>.</returns>
310-
public virtual Task<ContentstackResponse> UnpublishAsync(PublishUnpublishDetails details, string apiVersion = null)
310+
public virtual Task<ContentstackResponse> UnpublishAsync(PublishUnpublishDetails details, string? apiVersion = null)
311311
{
312312
stack.ThrowIfNotLoggedIn();
313313
ThrowIfUidEmpty();
314314

315-
var service = new PublishUnpublishService(stack.client.serializer, stack, details, $"{resourcePath}/unpublish", "asset");
315+
var service = new PublishUnpublishService(stack, details, $"{resourcePath}/unpublish", "asset", stjOptions: stack.client.SerializerOptions);
316316
return stack.client.InvokeAsync<PublishUnpublishService, ContentstackResponse>(service, apiVersion: apiVersion);
317317
}
318318

@@ -326,12 +326,12 @@ public virtual Task<ContentstackResponse> UnpublishAsync(PublishUnpublishDetails
326326
/// </code></pre>
327327
/// </example>
328328
/// <returns>The <see cref="ContentstackResponse"/>.</returns>
329-
public virtual ContentstackResponse References(ParameterCollection collection = null)
329+
public virtual ContentstackResponse References(ParameterCollection? collection = null)
330330
{
331331
stack.ThrowIfNotLoggedIn();
332332
ThrowIfUidEmpty();
333333

334-
var service = new FetchReferencesService(stack.client.serializer, stack, resourcePath, collection: collection);
334+
var service = new FetchReferencesService(stack, resourcePath, collection: collection, stjOptions: stack.client.SerializerOptions);
335335
return stack.client.InvokeSync(service);
336336
}
337337

@@ -345,12 +345,12 @@ public virtual ContentstackResponse References(ParameterCollection collection =
345345
/// </code></pre>
346346
/// </example>
347347
/// <returns>The <see cref="ContentstackResponse"/>.</returns>
348-
public virtual Task<ContentstackResponse> ReferencesAsync(ParameterCollection collection = null)
348+
public virtual Task<ContentstackResponse> ReferencesAsync(ParameterCollection? collection = null)
349349
{
350350
stack.ThrowIfNotLoggedIn();
351351
ThrowIfUidEmpty();
352352

353-
var service = new FetchReferencesService(stack.client.serializer, stack, resourcePath, collection: collection);
353+
var service = new FetchReferencesService(stack, resourcePath, collection: collection, stjOptions: stack.client.SerializerOptions);
354354
return stack.client.InvokeAsync<FetchReferencesService, ContentstackResponse>(service);
355355
}
356356

Contentstack.Management.Core/Models/BaseModel.cs

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ public class BaseModel<T>
1515
public string Uid { get; set; }
1616

1717

18-
public BaseModel(Stack stack, string fieldName, string uid = null)
18+
public BaseModel(Stack stack, string fieldName, string? uid = null)
1919
{
2020
stack.ThrowIfAPIKeyEmpty();
2121
if (fieldName == null)
@@ -27,75 +27,75 @@ public BaseModel(Stack stack, string fieldName, string uid = null)
2727
Uid = uid;
2828
}
2929

30-
public virtual ContentstackResponse Create(T model, ParameterCollection collection = null)
30+
public virtual ContentstackResponse Create(T model, ParameterCollection? collection = null)
3131
{
3232
ThrowIfUidNotEmpty();
3333

34-
var service = new CreateUpdateService<T>(stack.client.serializer, stack, resourcePath, model, this.fieldName, collection: collection);
34+
var service = new CreateUpdateService<T>(stack, resourcePath, model, this.fieldName, collection: collection, stjOptions: stack.client.SerializerOptions);
3535
return stack.client.InvokeSync(service);
3636
}
3737

38-
public virtual Task<ContentstackResponse> CreateAsync(T model, ParameterCollection collection = null)
38+
public virtual Task<ContentstackResponse> CreateAsync(T model, ParameterCollection? collection = null)
3939
{
4040
ThrowIfUidNotEmpty();
4141
stack.ThrowIfNotLoggedIn();
4242

43-
var service = new CreateUpdateService<T>(stack.client.serializer, stack, resourcePath, model, this.fieldName, collection: collection);
43+
var service = new CreateUpdateService<T>(stack, resourcePath, model, this.fieldName, collection: collection, stjOptions: stack.client.SerializerOptions);
4444

4545
return stack.client.InvokeAsync<CreateUpdateService<T>, ContentstackResponse>(service);
4646
}
4747

48-
public virtual ContentstackResponse Update(T model, ParameterCollection collection = null)
48+
public virtual ContentstackResponse Update(T model, ParameterCollection? collection = null)
4949
{
5050
ThrowIfUidEmpty();
5151

52-
var service = new CreateUpdateService<T>(stack.client.serializer, stack, resourcePath, model, this.fieldName, "PUT", collection: collection);
52+
var service = new CreateUpdateService<T>(stack, resourcePath, model, this.fieldName, "PUT", collection: collection, stjOptions: stack.client.SerializerOptions);
5353
return stack.client.InvokeSync(service);
5454
}
5555

56-
public virtual Task<ContentstackResponse> UpdateAsync(T model, ParameterCollection collection = null)
56+
public virtual Task<ContentstackResponse> UpdateAsync(T model, ParameterCollection? collection = null)
5757
{
5858
stack.ThrowIfNotLoggedIn();
5959
ThrowIfUidEmpty();
6060

61-
var service = new CreateUpdateService<T>(stack.client.serializer, stack, resourcePath, model, this.fieldName, "PUT", collection: collection);
61+
var service = new CreateUpdateService<T>(stack, resourcePath, model, this.fieldName, "PUT", collection: collection, stjOptions: stack.client.SerializerOptions);
6262

6363
return stack.client.InvokeAsync<CreateUpdateService<T>, ContentstackResponse>(service);
6464
}
6565

66-
public virtual ContentstackResponse Fetch(ParameterCollection collection = null)
66+
public virtual ContentstackResponse Fetch(ParameterCollection? collection = null)
6767
{
6868
stack.ThrowIfNotLoggedIn();
6969
ThrowIfUidEmpty();
7070

71-
var service = new FetchDeleteService(stack.client.serializer, stack, resourcePath, collection: collection);
71+
var service = new FetchDeleteService(stack, resourcePath, collection: collection, stjOptions: stack.client.SerializerOptions);
7272
return stack.client.InvokeSync(service);
7373
}
7474

75-
public virtual Task<ContentstackResponse> FetchAsync(ParameterCollection collection = null)
75+
public virtual Task<ContentstackResponse> FetchAsync(ParameterCollection? collection = null)
7676
{
7777
stack.ThrowIfNotLoggedIn();
7878
ThrowIfUidEmpty();
7979

80-
var service = new FetchDeleteService(stack.client.serializer, stack, resourcePath, collection: collection);
80+
var service = new FetchDeleteService(stack, resourcePath, collection: collection, stjOptions: stack.client.SerializerOptions);
8181
return stack.client.InvokeAsync<FetchDeleteService, ContentstackResponse>(service);
8282
}
8383

84-
public virtual ContentstackResponse Delete(ParameterCollection collection = null)
84+
public virtual ContentstackResponse Delete(ParameterCollection? collection = null)
8585
{
8686
stack.ThrowIfNotLoggedIn();
8787
ThrowIfUidEmpty();
8888

89-
var service = new FetchDeleteService(stack.client.serializer, stack, resourcePath, "DELETE", collection: collection);
89+
var service = new FetchDeleteService(stack, resourcePath, "DELETE", collection: collection, stjOptions: stack.client.SerializerOptions);
9090
return stack.client.InvokeSync(service);
9191
}
9292

93-
public virtual Task<ContentstackResponse> DeleteAsync(ParameterCollection collection = null)
93+
public virtual Task<ContentstackResponse> DeleteAsync(ParameterCollection? collection = null)
9494
{
9595
stack.ThrowIfNotLoggedIn();
9696
ThrowIfUidEmpty();
9797

98-
var service = new FetchDeleteService(stack.client.serializer, stack, resourcePath, "DELETE", collection: collection);
98+
var service = new FetchDeleteService(stack, resourcePath, "DELETE", collection: collection, stjOptions: stack.client.SerializerOptions);
9999

100100
return stack.client.InvokeAsync<FetchDeleteService, ContentstackResponse>(service);
101101
}

0 commit comments

Comments
 (0)