From 2a2208d422f5beb1718576acdc10d9eb973ba95c Mon Sep 17 00:00:00 2001 From: box-sdk-build <94016436+box-sdk-build@users.noreply.github.com> Date: Tue, 2 Jul 2024 18:27:38 +0200 Subject: [PATCH] feat: add support for `ExtraData` of generic type `(box/box-codegen#521)` (#170) --- .codegen.json | 2 +- ...llaborationAllowlistEntriesManagerTests.cs | 2 +- .../FileMetadata/FileMetadataManagerTests.cs | 22 ++++++++++++--- .../FolderMetadataManagerTests.cs | 22 ++++++++++++--- .../MetadataCascadePoliciesManagerTests.cs | 3 +-- .../MetadataTemplatesManagerTests.cs | 4 +-- .../FileMetadata/FileMetadataManager.cs | 2 +- .../FileMetadata/IFileMetadataManager.cs | 2 +- .../FolderMetadata/FolderMetadataManager.cs | 2 +- .../FolderMetadata/IFolderMetadataManager.cs | 2 +- .../UpdateMetadataTemplateRequestBody.cs | 2 +- ...urceOrFileOrFolderOrGenericSourceOrUser.cs | 10 +++---- .../Schemas/MetadataFull/MetadataFull.cs | 7 ++--- .../SignRequestCreateSigner.cs | 12 +++++---- Box.Sdk.Gen/Serialization/Json/Serializer.cs | 27 +++++++++++++++++++ docs/FileMetadata.md | 6 ++--- docs/FolderMetadata.md | 6 ++--- docs/MetadataTemplates.md | 4 +-- 18 files changed, 99 insertions(+), 38 deletions(-) diff --git a/.codegen.json b/.codegen.json index a787c0e9..c7522e36 100644 --- a/.codegen.json +++ b/.codegen.json @@ -1 +1 @@ -{ "engineHash": "1090584", "specHash": "fc01415", "version": "0.3.1" } +{ "engineHash": "62a25a4", "specHash": "e95d6fa", "version": "0.3.1" } diff --git a/Box.Sdk.Gen.Tests.Integration/Test/CollaborationAllowlistEntries/CollaborationAllowlistEntriesManagerTests.cs b/Box.Sdk.Gen.Tests.Integration/Test/CollaborationAllowlistEntries/CollaborationAllowlistEntriesManagerTests.cs index 93b88c10..19b80661 100644 --- a/Box.Sdk.Gen.Tests.Integration/Test/CollaborationAllowlistEntries/CollaborationAllowlistEntriesManagerTests.cs +++ b/Box.Sdk.Gen.Tests.Integration/Test/CollaborationAllowlistEntries/CollaborationAllowlistEntriesManagerTests.cs @@ -18,7 +18,7 @@ public CollaborationAllowlistEntriesManagerTests() { public async System.Threading.Tasks.Task TestCollaborationAllowlistEntries() { CollaborationAllowlistEntries allowlist = await client.CollaborationAllowlistEntries.GetCollaborationWhitelistEntriesAsync(); Assert.IsTrue(NullableUtils.Unwrap(allowlist.Entries).Count >= 0); - const string domain = "example.com"; + string domain = string.Concat(Utils.GetUUID(), "example.com"); CollaborationAllowlistEntry newEntry = await client.CollaborationAllowlistEntries.CreateCollaborationWhitelistEntryAsync(requestBody: new CreateCollaborationWhitelistEntryRequestBody(direction: CreateCollaborationWhitelistEntryRequestBodyDirectionField.Inbound, domain: domain)); Assert.IsTrue(StringUtils.ToStringRepresentation(newEntry.Type?.Value) == "collaboration_whitelist_entry"); Assert.IsTrue(StringUtils.ToStringRepresentation(newEntry.Direction?.Value) == "inbound"); diff --git a/Box.Sdk.Gen.Tests.Integration/Test/FileMetadata/FileMetadataManagerTests.cs b/Box.Sdk.Gen.Tests.Integration/Test/FileMetadata/FileMetadataManagerTests.cs index 905906a7..0cbce889 100644 --- a/Box.Sdk.Gen.Tests.Integration/Test/FileMetadata/FileMetadataManagerTests.cs +++ b/Box.Sdk.Gen.Tests.Integration/Test/FileMetadata/FileMetadataManagerTests.cs @@ -21,20 +21,36 @@ public async System.Threading.Tasks.Task TestGlobalFileMetadata() { FileFull file = await new CommonsManager().UploadNewFileAsync(); Metadatas fileMetadata = await client.FileMetadata.GetFileMetadataAsync(fileId: file.Id); Assert.IsTrue(NullableUtils.Unwrap(fileMetadata.Entries).Count == 0); - MetadataFull createdMetadata = await client.FileMetadata.CreateFileMetadataByIdAsync(fileId: file.Id, scope: CreateFileMetadataByIdScope.Global, templateKey: "properties", requestBody: new Dictionary() { { "abc", "xyz" } }); + MetadataFull createdMetadata = await client.FileMetadata.CreateFileMetadataByIdAsync(fileId: file.Id, scope: CreateFileMetadataByIdScope.Global, templateKey: "properties", requestBody: new Dictionary() { { "abc", "xyz" } }); Assert.IsTrue(StringUtils.ToStringRepresentation(createdMetadata.Template) == "properties"); Assert.IsTrue(StringUtils.ToStringRepresentation(createdMetadata.Scope) == "global"); Assert.IsTrue(createdMetadata.Version == 0); MetadataFull receivedMetadata = await client.FileMetadata.GetFileMetadataByIdAsync(fileId: file.Id, scope: GetFileMetadataByIdScope.Global, templateKey: "properties"); - Assert.IsTrue(NullableUtils.Unwrap(receivedMetadata.ExtraData)["abc"] == "xyz"); + Assert.IsTrue(StringUtils.ToStringRepresentation(NullableUtils.Unwrap(receivedMetadata.ExtraData)["abc"]) == "xyz"); const string newValue = "bar"; await client.FileMetadata.UpdateFileMetadataByIdAsync(fileId: file.Id, scope: UpdateFileMetadataByIdScope.Global, templateKey: "properties", requestBody: Array.AsReadOnly(new [] {new UpdateFileMetadataByIdRequestBody() { Op = UpdateFileMetadataByIdRequestBodyOpField.Replace, Path = "/abc", Value = newValue }})); MetadataFull receivedUpdatedMetadata = await client.FileMetadata.GetFileMetadataByIdAsync(fileId: file.Id, scope: GetFileMetadataByIdScope.Global, templateKey: "properties"); - Assert.IsTrue(NullableUtils.Unwrap(receivedUpdatedMetadata.ExtraData)["abc"] == newValue); + Assert.IsTrue(StringUtils.ToStringRepresentation(NullableUtils.Unwrap(receivedUpdatedMetadata.ExtraData)["abc"]) == newValue); await client.FileMetadata.DeleteFileMetadataByIdAsync(fileId: file.Id, scope: DeleteFileMetadataByIdScope.Global, templateKey: "properties"); await Assert.That.IsExceptionAsync(async() => await client.FileMetadata.GetFileMetadataByIdAsync(fileId: file.Id, scope: GetFileMetadataByIdScope.Global, templateKey: "properties")); await client.Files.DeleteFileByIdAsync(fileId: file.Id); } + [TestMethod] + public async System.Threading.Tasks.Task TestEnterpriseFileMetadata() { + FileFull file = await new CommonsManager().UploadNewFileAsync(); + string templateKey = string.Concat("key", Utils.GetUUID()); + await client.MetadataTemplates.CreateMetadataTemplateAsync(requestBody: new CreateMetadataTemplateRequestBody(scope: "enterprise", displayName: templateKey) { TemplateKey = templateKey, Fields = Array.AsReadOnly(new [] {new CreateMetadataTemplateRequestBodyFieldsField(type: CreateMetadataTemplateRequestBodyFieldsTypeField.String, key: "name", displayName: "name"),new CreateMetadataTemplateRequestBodyFieldsField(type: CreateMetadataTemplateRequestBodyFieldsTypeField.Float, key: "age", displayName: "age"),new CreateMetadataTemplateRequestBodyFieldsField(type: CreateMetadataTemplateRequestBodyFieldsTypeField.Date, key: "birthDate", displayName: "birthDate"),new CreateMetadataTemplateRequestBodyFieldsField(type: CreateMetadataTemplateRequestBodyFieldsTypeField.Enum, key: "countryCode", displayName: "countryCode") { Options = Array.AsReadOnly(new [] {new CreateMetadataTemplateRequestBodyFieldsOptionsField(key: "US"),new CreateMetadataTemplateRequestBodyFieldsOptionsField(key: "CA")}) },new CreateMetadataTemplateRequestBodyFieldsField(type: CreateMetadataTemplateRequestBodyFieldsTypeField.MultiSelect, key: "sports", displayName: "sports") { Options = Array.AsReadOnly(new [] {new CreateMetadataTemplateRequestBodyFieldsOptionsField(key: "basketball"),new CreateMetadataTemplateRequestBodyFieldsOptionsField(key: "football"),new CreateMetadataTemplateRequestBodyFieldsOptionsField(key: "tennis")}) }}) }); + MetadataFull createdMetadata = await client.FileMetadata.CreateFileMetadataByIdAsync(fileId: file.Id, scope: CreateFileMetadataByIdScope.Enterprise, templateKey: templateKey, requestBody: new Dictionary() { { "name", "John" }, { "age", 23 }, { "birthDate", "2001-01-03T02:20:50.520Z" }, { "countryCode", "US" }, { "sports", Array.AsReadOnly(new [] {"basketball","tennis"}) } }); + Assert.IsTrue(StringUtils.ToStringRepresentation(createdMetadata.Template) == templateKey); + Assert.IsTrue(StringUtils.ToStringRepresentation(NullableUtils.Unwrap(createdMetadata.ExtraData)["name"]) == "John"); + Assert.IsTrue(StringUtils.ToStringRepresentation(NullableUtils.Unwrap(createdMetadata.ExtraData)["age"]) == "23"); + Assert.IsTrue(StringUtils.ToStringRepresentation(NullableUtils.Unwrap(createdMetadata.ExtraData)["birthDate"]) == "2001-01-03T02:20:50.520Z"); + Assert.IsTrue(StringUtils.ToStringRepresentation(NullableUtils.Unwrap(createdMetadata.ExtraData)["countryCode"]) == "US"); + await client.FileMetadata.DeleteFileMetadataByIdAsync(fileId: file.Id, scope: DeleteFileMetadataByIdScope.Enterprise, templateKey: templateKey); + await client.MetadataTemplates.DeleteMetadataTemplateAsync(scope: DeleteMetadataTemplateScope.Enterprise, templateKey: templateKey); + await client.Files.DeleteFileByIdAsync(fileId: file.Id); + } + } } \ No newline at end of file diff --git a/Box.Sdk.Gen.Tests.Integration/Test/FolderMetadata/FolderMetadataManagerTests.cs b/Box.Sdk.Gen.Tests.Integration/Test/FolderMetadata/FolderMetadataManagerTests.cs index 2e0cfbf0..7ffb4eed 100644 --- a/Box.Sdk.Gen.Tests.Integration/Test/FolderMetadata/FolderMetadataManagerTests.cs +++ b/Box.Sdk.Gen.Tests.Integration/Test/FolderMetadata/FolderMetadataManagerTests.cs @@ -21,20 +21,36 @@ public async System.Threading.Tasks.Task TestGlobalFolderMetadata() { FolderFull folder = await new CommonsManager().CreateNewFolderAsync(); Metadatas folderMetadata = await client.FolderMetadata.GetFolderMetadataAsync(folderId: folder.Id); Assert.IsTrue(NullableUtils.Unwrap(folderMetadata.Entries).Count == 0); - MetadataFull createdMetadata = await client.FolderMetadata.CreateFolderMetadataByIdAsync(folderId: folder.Id, scope: CreateFolderMetadataByIdScope.Global, templateKey: "properties", requestBody: new Dictionary() { { "abc", "xyz" } }); + MetadataFull createdMetadata = await client.FolderMetadata.CreateFolderMetadataByIdAsync(folderId: folder.Id, scope: CreateFolderMetadataByIdScope.Global, templateKey: "properties", requestBody: new Dictionary() { { "abc", "xyz" } }); Assert.IsTrue(StringUtils.ToStringRepresentation(createdMetadata.Template) == "properties"); Assert.IsTrue(StringUtils.ToStringRepresentation(createdMetadata.Scope) == "global"); Assert.IsTrue(createdMetadata.Version == 0); MetadataFull receivedMetadata = await client.FolderMetadata.GetFolderMetadataByIdAsync(folderId: folder.Id, scope: GetFolderMetadataByIdScope.Global, templateKey: "properties"); - Assert.IsTrue(NullableUtils.Unwrap(receivedMetadata.ExtraData)["abc"] == "xyz"); + Assert.IsTrue(StringUtils.ToStringRepresentation(NullableUtils.Unwrap(receivedMetadata.ExtraData)["abc"]) == "xyz"); const string newValue = "bar"; await client.FolderMetadata.UpdateFolderMetadataByIdAsync(folderId: folder.Id, scope: UpdateFolderMetadataByIdScope.Global, templateKey: "properties", requestBody: Array.AsReadOnly(new [] {new UpdateFolderMetadataByIdRequestBody() { Op = UpdateFolderMetadataByIdRequestBodyOpField.Replace, Path = "/abc", Value = newValue }})); MetadataFull receivedUpdatedMetadata = await client.FolderMetadata.GetFolderMetadataByIdAsync(folderId: folder.Id, scope: GetFolderMetadataByIdScope.Global, templateKey: "properties"); - Assert.IsTrue(NullableUtils.Unwrap(receivedUpdatedMetadata.ExtraData)["abc"] == newValue); + Assert.IsTrue(StringUtils.ToStringRepresentation(NullableUtils.Unwrap(receivedUpdatedMetadata.ExtraData)["abc"]) == newValue); await client.FolderMetadata.DeleteFolderMetadataByIdAsync(folderId: folder.Id, scope: DeleteFolderMetadataByIdScope.Global, templateKey: "properties"); await Assert.That.IsExceptionAsync(async() => await client.FolderMetadata.GetFolderMetadataByIdAsync(folderId: folder.Id, scope: GetFolderMetadataByIdScope.Global, templateKey: "properties")); await client.Folders.DeleteFolderByIdAsync(folderId: folder.Id); } + [TestMethod] + public async System.Threading.Tasks.Task TestEnterpriseFolderMetadata() { + FolderFull folder = await new CommonsManager().CreateNewFolderAsync(); + string templateKey = string.Concat("key", Utils.GetUUID()); + MetadataTemplate template = await client.MetadataTemplates.CreateMetadataTemplateAsync(requestBody: new CreateMetadataTemplateRequestBody(scope: "enterprise", displayName: templateKey) { TemplateKey = templateKey, Fields = Array.AsReadOnly(new [] {new CreateMetadataTemplateRequestBodyFieldsField(type: CreateMetadataTemplateRequestBodyFieldsTypeField.String, key: "name", displayName: "name"),new CreateMetadataTemplateRequestBodyFieldsField(type: CreateMetadataTemplateRequestBodyFieldsTypeField.Float, key: "age", displayName: "age"),new CreateMetadataTemplateRequestBodyFieldsField(type: CreateMetadataTemplateRequestBodyFieldsTypeField.Date, key: "birthDate", displayName: "birthDate"),new CreateMetadataTemplateRequestBodyFieldsField(type: CreateMetadataTemplateRequestBodyFieldsTypeField.Enum, key: "countryCode", displayName: "countryCode") { Options = Array.AsReadOnly(new [] {new CreateMetadataTemplateRequestBodyFieldsOptionsField(key: "US"),new CreateMetadataTemplateRequestBodyFieldsOptionsField(key: "CA")}) },new CreateMetadataTemplateRequestBodyFieldsField(type: CreateMetadataTemplateRequestBodyFieldsTypeField.MultiSelect, key: "sports", displayName: "sports") { Options = Array.AsReadOnly(new [] {new CreateMetadataTemplateRequestBodyFieldsOptionsField(key: "basketball"),new CreateMetadataTemplateRequestBodyFieldsOptionsField(key: "football"),new CreateMetadataTemplateRequestBodyFieldsOptionsField(key: "tennis")}) }}) }); + MetadataFull createdMetadata = await client.FolderMetadata.CreateFolderMetadataByIdAsync(folderId: folder.Id, scope: CreateFolderMetadataByIdScope.Enterprise, templateKey: templateKey, requestBody: new Dictionary() { { "name", "John" }, { "age", 23 }, { "birthDate", "2001-01-03T02:20:50.520Z" }, { "countryCode", "US" }, { "sports", Array.AsReadOnly(new [] {"basketball","tennis"}) } }); + Assert.IsTrue(StringUtils.ToStringRepresentation(createdMetadata.Template) == templateKey); + Assert.IsTrue(StringUtils.ToStringRepresentation(NullableUtils.Unwrap(createdMetadata.ExtraData)["name"]) == "John"); + Assert.IsTrue(StringUtils.ToStringRepresentation(NullableUtils.Unwrap(createdMetadata.ExtraData)["age"]) == "23"); + Assert.IsTrue(StringUtils.ToStringRepresentation(NullableUtils.Unwrap(createdMetadata.ExtraData)["birthDate"]) == "2001-01-03T02:20:50.520Z"); + Assert.IsTrue(StringUtils.ToStringRepresentation(NullableUtils.Unwrap(createdMetadata.ExtraData)["countryCode"]) == "US"); + await client.FolderMetadata.DeleteFolderMetadataByIdAsync(folderId: folder.Id, scope: DeleteFolderMetadataByIdScope.Enterprise, templateKey: templateKey); + await client.MetadataTemplates.DeleteMetadataTemplateAsync(scope: DeleteMetadataTemplateScope.Enterprise, templateKey: templateKey); + await client.Folders.DeleteFolderByIdAsync(folderId: folder.Id); + } + } } \ No newline at end of file diff --git a/Box.Sdk.Gen.Tests.Integration/Test/MetadataCascadePolicies/MetadataCascadePoliciesManagerTests.cs b/Box.Sdk.Gen.Tests.Integration/Test/MetadataCascadePolicies/MetadataCascadePoliciesManagerTests.cs index 05997fa6..19cd8285 100644 --- a/Box.Sdk.Gen.Tests.Integration/Test/MetadataCascadePolicies/MetadataCascadePoliciesManagerTests.cs +++ b/Box.Sdk.Gen.Tests.Integration/Test/MetadataCascadePolicies/MetadataCascadePoliciesManagerTests.cs @@ -36,8 +36,7 @@ public async System.Threading.Tasks.Task TestMetadataCascadePolicies() { MetadataCascadePolicies policies = await client.MetadataCascadePolicies.GetMetadataCascadePoliciesAsync(queryParams: new GetMetadataCascadePoliciesQueryParams(folderId: folder.Id)); Assert.IsTrue(NullableUtils.Unwrap(policies.Entries).Count == 1); await Assert.That.IsExceptionAsync(async() => await client.MetadataCascadePolicies.ApplyMetadataCascadePolicyAsync(metadataCascadePolicyId: cascadePolicyId, requestBody: new ApplyMetadataCascadePolicyRequestBody(conflictResolution: ApplyMetadataCascadePolicyRequestBodyConflictResolutionField.Overwrite))); - Dictionary data = new Dictionary() { { "testName", "xyz" } }; - await client.FolderMetadata.CreateFolderMetadataByIdAsync(folderId: folder.Id, scope: CreateFolderMetadataByIdScope.Enterprise, templateKey: templateKey, requestBody: data); + await client.FolderMetadata.CreateFolderMetadataByIdAsync(folderId: folder.Id, scope: CreateFolderMetadataByIdScope.Enterprise, templateKey: templateKey, requestBody: new Dictionary() { { "testName", "xyz" } }); await client.MetadataCascadePolicies.ApplyMetadataCascadePolicyAsync(metadataCascadePolicyId: cascadePolicyId, requestBody: new ApplyMetadataCascadePolicyRequestBody(conflictResolution: ApplyMetadataCascadePolicyRequestBodyConflictResolutionField.Overwrite)); await client.MetadataCascadePolicies.DeleteMetadataCascadePolicyByIdAsync(metadataCascadePolicyId: cascadePolicyId); await Assert.That.IsExceptionAsync(async() => await client.MetadataCascadePolicies.GetMetadataCascadePolicyByIdAsync(metadataCascadePolicyId: cascadePolicyId)); diff --git a/Box.Sdk.Gen.Tests.Integration/Test/MetadataTemplates/MetadataTemplatesManagerTests.cs b/Box.Sdk.Gen.Tests.Integration/Test/MetadataTemplates/MetadataTemplatesManagerTests.cs index 82641414..554b315f 100644 --- a/Box.Sdk.Gen.Tests.Integration/Test/MetadataTemplates/MetadataTemplatesManagerTests.cs +++ b/Box.Sdk.Gen.Tests.Integration/Test/MetadataTemplates/MetadataTemplatesManagerTests.cs @@ -24,7 +24,7 @@ public async System.Threading.Tasks.Task TestMetadataTemplates() { Assert.IsTrue(NullableUtils.Unwrap(template.Fields).Count == 1); Assert.IsTrue(NullableUtils.Unwrap(template.Fields)[0].Key == "testName"); Assert.IsTrue(NullableUtils.Unwrap(template.Fields)[0].DisplayName == "testName"); - MetadataTemplate updatedTemplate = await client.MetadataTemplates.UpdateMetadataTemplateAsync(scope: UpdateMetadataTemplateScope.Enterprise, templateKey: templateKey, requestBody: Array.AsReadOnly(new [] {new UpdateMetadataTemplateRequestBody(op: UpdateMetadataTemplateRequestBodyOpField.AddField) { FieldKey = "newfieldname", Data = new Dictionary() { { "type", "string" }, { "displayName", "newFieldName" } } }})); + MetadataTemplate updatedTemplate = await client.MetadataTemplates.UpdateMetadataTemplateAsync(scope: UpdateMetadataTemplateScope.Enterprise, templateKey: templateKey, requestBody: Array.AsReadOnly(new [] {new UpdateMetadataTemplateRequestBody(op: UpdateMetadataTemplateRequestBodyOpField.AddField) { FieldKey = "newfieldname", Data = new Dictionary() { { "type", "string" }, { "displayName", "newFieldName" } } }})); Assert.IsTrue(NullableUtils.Unwrap(updatedTemplate.Fields).Count == 2); Assert.IsTrue(NullableUtils.Unwrap(updatedTemplate.Fields)[1].Key == "newfieldname"); Assert.IsTrue(NullableUtils.Unwrap(updatedTemplate.Fields)[1].DisplayName == "newFieldName"); @@ -45,7 +45,7 @@ public async System.Threading.Tasks.Task TestGetMetadataTemplateByInstance() { FileFull file = await new CommonsManager().UploadNewFileAsync(); string templateKey = string.Concat("key", Utils.GetUUID()); MetadataTemplate template = await client.MetadataTemplates.CreateMetadataTemplateAsync(requestBody: new CreateMetadataTemplateRequestBody(scope: "enterprise", displayName: templateKey) { TemplateKey = templateKey, Fields = Array.AsReadOnly(new [] {new CreateMetadataTemplateRequestBodyFieldsField(type: CreateMetadataTemplateRequestBodyFieldsTypeField.String, key: "testName", displayName: "testName")}) }); - MetadataFull createdMetadataInstance = await client.FileMetadata.CreateFileMetadataByIdAsync(fileId: file.Id, scope: CreateFileMetadataByIdScope.Enterprise, templateKey: templateKey, requestBody: new Dictionary() { { "testName", "xyz" } }); + MetadataFull createdMetadataInstance = await client.FileMetadata.CreateFileMetadataByIdAsync(fileId: file.Id, scope: CreateFileMetadataByIdScope.Enterprise, templateKey: templateKey, requestBody: new Dictionary() { { "testName", "xyz" } }); MetadataTemplates metadataTemplates = await client.MetadataTemplates.GetMetadataTemplatesByInstanceIdAsync(queryParams: new GetMetadataTemplatesByInstanceIdQueryParams(metadataInstanceId: NullableUtils.Unwrap(createdMetadataInstance.Id))); Assert.IsTrue(NullableUtils.Unwrap(metadataTemplates.Entries).Count == 1); Assert.IsTrue(NullableUtils.Unwrap(metadataTemplates.Entries)[0].DisplayName == templateKey); diff --git a/Box.Sdk.Gen/Managers/FileMetadata/FileMetadataManager.cs b/Box.Sdk.Gen/Managers/FileMetadata/FileMetadataManager.cs index bec5f30c..c44630f6 100644 --- a/Box.Sdk.Gen/Managers/FileMetadata/FileMetadataManager.cs +++ b/Box.Sdk.Gen/Managers/FileMetadata/FileMetadataManager.cs @@ -114,7 +114,7 @@ public async System.Threading.Tasks.Task GetFileMetadataByIdAsync( /// /// Token used for request cancellation. /// - public async System.Threading.Tasks.Task CreateFileMetadataByIdAsync(string fileId, CreateFileMetadataByIdScope scope, string templateKey, Dictionary requestBody, CreateFileMetadataByIdHeaders? headers = default, System.Threading.CancellationToken? cancellationToken = null) { + public async System.Threading.Tasks.Task CreateFileMetadataByIdAsync(string fileId, CreateFileMetadataByIdScope scope, string templateKey, Dictionary requestBody, CreateFileMetadataByIdHeaders? headers = default, System.Threading.CancellationToken? cancellationToken = null) { headers = headers ?? new CreateFileMetadataByIdHeaders(); Dictionary headersMap = Utils.PrepareParams(map: DictionaryUtils.MergeDictionaries(new Dictionary() { }, headers.ExtraHeaders)); FetchResponse response = await HttpClientAdapter.FetchAsync(string.Concat(this.NetworkSession.BaseUrls.BaseUrl, "/2.0/files/", StringUtils.ToStringRepresentation(fileId), "/metadata/", StringUtils.ToStringRepresentation(scope), "/", StringUtils.ToStringRepresentation(templateKey)), new FetchOptions(networkSession: this.NetworkSession) { Method = "POST", Headers = headersMap, Data = SimpleJsonSerializer.Serialize(requestBody), ContentType = "application/json", ResponseFormat = "json", Auth = this.Auth, CancellationToken = cancellationToken }).ConfigureAwait(false); diff --git a/Box.Sdk.Gen/Managers/FileMetadata/IFileMetadataManager.cs b/Box.Sdk.Gen/Managers/FileMetadata/IFileMetadataManager.cs index f61912da..69926d30 100644 --- a/Box.Sdk.Gen/Managers/FileMetadata/IFileMetadataManager.cs +++ b/Box.Sdk.Gen/Managers/FileMetadata/IFileMetadataManager.cs @@ -17,7 +17,7 @@ public interface IFileMetadataManager { public System.Threading.Tasks.Task GetFileMetadataByIdAsync(string fileId, GetFileMetadataByIdScope scope, string templateKey, GetFileMetadataByIdHeaders? headers = default, System.Threading.CancellationToken? cancellationToken = null) => throw new System.NotImplementedException("This method needs to be implemented by the derived class before calling it."); - public System.Threading.Tasks.Task CreateFileMetadataByIdAsync(string fileId, CreateFileMetadataByIdScope scope, string templateKey, Dictionary requestBody, CreateFileMetadataByIdHeaders? headers = default, System.Threading.CancellationToken? cancellationToken = null) => throw new System.NotImplementedException("This method needs to be implemented by the derived class before calling it."); + public System.Threading.Tasks.Task CreateFileMetadataByIdAsync(string fileId, CreateFileMetadataByIdScope scope, string templateKey, Dictionary requestBody, CreateFileMetadataByIdHeaders? headers = default, System.Threading.CancellationToken? cancellationToken = null) => throw new System.NotImplementedException("This method needs to be implemented by the derived class before calling it."); public System.Threading.Tasks.Task UpdateFileMetadataByIdAsync(string fileId, UpdateFileMetadataByIdScope scope, string templateKey, IReadOnlyList requestBody, UpdateFileMetadataByIdHeaders? headers = default, System.Threading.CancellationToken? cancellationToken = null) => throw new System.NotImplementedException("This method needs to be implemented by the derived class before calling it."); diff --git a/Box.Sdk.Gen/Managers/FolderMetadata/FolderMetadataManager.cs b/Box.Sdk.Gen/Managers/FolderMetadata/FolderMetadataManager.cs index 3c56ad86..f2586c27 100644 --- a/Box.Sdk.Gen/Managers/FolderMetadata/FolderMetadataManager.cs +++ b/Box.Sdk.Gen/Managers/FolderMetadata/FolderMetadataManager.cs @@ -128,7 +128,7 @@ public async System.Threading.Tasks.Task GetFolderMetadataByIdAsyn /// /// Token used for request cancellation. /// - public async System.Threading.Tasks.Task CreateFolderMetadataByIdAsync(string folderId, CreateFolderMetadataByIdScope scope, string templateKey, Dictionary requestBody, CreateFolderMetadataByIdHeaders? headers = default, System.Threading.CancellationToken? cancellationToken = null) { + public async System.Threading.Tasks.Task CreateFolderMetadataByIdAsync(string folderId, CreateFolderMetadataByIdScope scope, string templateKey, Dictionary requestBody, CreateFolderMetadataByIdHeaders? headers = default, System.Threading.CancellationToken? cancellationToken = null) { headers = headers ?? new CreateFolderMetadataByIdHeaders(); Dictionary headersMap = Utils.PrepareParams(map: DictionaryUtils.MergeDictionaries(new Dictionary() { }, headers.ExtraHeaders)); FetchResponse response = await HttpClientAdapter.FetchAsync(string.Concat(this.NetworkSession.BaseUrls.BaseUrl, "/2.0/folders/", StringUtils.ToStringRepresentation(folderId), "/metadata/", StringUtils.ToStringRepresentation(scope), "/", StringUtils.ToStringRepresentation(templateKey)), new FetchOptions(networkSession: this.NetworkSession) { Method = "POST", Headers = headersMap, Data = SimpleJsonSerializer.Serialize(requestBody), ContentType = "application/json", ResponseFormat = "json", Auth = this.Auth, CancellationToken = cancellationToken }).ConfigureAwait(false); diff --git a/Box.Sdk.Gen/Managers/FolderMetadata/IFolderMetadataManager.cs b/Box.Sdk.Gen/Managers/FolderMetadata/IFolderMetadataManager.cs index c7183eb7..b5993aff 100644 --- a/Box.Sdk.Gen/Managers/FolderMetadata/IFolderMetadataManager.cs +++ b/Box.Sdk.Gen/Managers/FolderMetadata/IFolderMetadataManager.cs @@ -17,7 +17,7 @@ public interface IFolderMetadataManager { public System.Threading.Tasks.Task GetFolderMetadataByIdAsync(string folderId, GetFolderMetadataByIdScope scope, string templateKey, GetFolderMetadataByIdHeaders? headers = default, System.Threading.CancellationToken? cancellationToken = null) => throw new System.NotImplementedException("This method needs to be implemented by the derived class before calling it."); - public System.Threading.Tasks.Task CreateFolderMetadataByIdAsync(string folderId, CreateFolderMetadataByIdScope scope, string templateKey, Dictionary requestBody, CreateFolderMetadataByIdHeaders? headers = default, System.Threading.CancellationToken? cancellationToken = null) => throw new System.NotImplementedException("This method needs to be implemented by the derived class before calling it."); + public System.Threading.Tasks.Task CreateFolderMetadataByIdAsync(string folderId, CreateFolderMetadataByIdScope scope, string templateKey, Dictionary requestBody, CreateFolderMetadataByIdHeaders? headers = default, System.Threading.CancellationToken? cancellationToken = null) => throw new System.NotImplementedException("This method needs to be implemented by the derived class before calling it."); public System.Threading.Tasks.Task UpdateFolderMetadataByIdAsync(string folderId, UpdateFolderMetadataByIdScope scope, string templateKey, IReadOnlyList requestBody, UpdateFolderMetadataByIdHeaders? headers = default, System.Threading.CancellationToken? cancellationToken = null) => throw new System.NotImplementedException("This method needs to be implemented by the derived class before calling it."); diff --git a/Box.Sdk.Gen/Managers/MetadataTemplates/UpdateMetadataTemplateRequestBody.cs b/Box.Sdk.Gen/Managers/MetadataTemplates/UpdateMetadataTemplateRequestBody.cs index 6ade55db..587b1e5d 100644 --- a/Box.Sdk.Gen/Managers/MetadataTemplates/UpdateMetadataTemplateRequestBody.cs +++ b/Box.Sdk.Gen/Managers/MetadataTemplates/UpdateMetadataTemplateRequestBody.cs @@ -22,7 +22,7 @@ public class UpdateMetadataTemplateRequestBody { /// operation being performed. /// [JsonPropertyName("data")] - public Dictionary? Data { get; init; } + public Dictionary? Data { get; init; } /// /// For operations that affect a single field this defines the key of diff --git a/Box.Sdk.Gen/Schemas/AppItemEventSourceOrEventSourceOrFileOrFolderOrGenericSourceOrUser/AppItemEventSourceOrEventSourceOrFileOrFolderOrGenericSourceOrUser.cs b/Box.Sdk.Gen/Schemas/AppItemEventSourceOrEventSourceOrFileOrFolderOrGenericSourceOrUser/AppItemEventSourceOrEventSourceOrFileOrFolderOrGenericSourceOrUser.cs index 97755ebe..ca40bfaa 100644 --- a/Box.Sdk.Gen/Schemas/AppItemEventSourceOrEventSourceOrFileOrFolderOrGenericSourceOrUser/AppItemEventSourceOrEventSourceOrFileOrFolderOrGenericSourceOrUser.cs +++ b/Box.Sdk.Gen/Schemas/AppItemEventSourceOrEventSourceOrFileOrFolderOrGenericSourceOrUser/AppItemEventSourceOrEventSourceOrFileOrFolderOrGenericSourceOrUser.cs @@ -8,7 +8,7 @@ namespace Box.Sdk.Gen.Schemas { [JsonConverter(typeof(AppItemEventSourceOrEventSourceOrFileOrFolderOrGenericSourceOrUserConverter))] - public class AppItemEventSourceOrEventSourceOrFileOrFolderOrGenericSourceOrUser : OneOf, User> { + public class AppItemEventSourceOrEventSourceOrFileOrFolderOrGenericSourceOrUser : OneOf, User> { public AppItemEventSource? AppItemEventSource => _val0; public EventSource? EventSource => _val1; @@ -17,7 +17,7 @@ public class AppItemEventSourceOrEventSourceOrFileOrFolderOrGenericSourceOrUser public Folder? Folder => _val3; - public Dictionary? GenericSource => _val4; + public Dictionary? GenericSource => _val4; public User? User => _val5; @@ -29,7 +29,7 @@ public AppItemEventSourceOrEventSourceOrFileOrFolderOrGenericSourceOrUser(File v public AppItemEventSourceOrEventSourceOrFileOrFolderOrGenericSourceOrUser(Folder value) : base(value) {} - public AppItemEventSourceOrEventSourceOrFileOrFolderOrGenericSourceOrUser(Dictionary value) : base(value) {} + public AppItemEventSourceOrEventSourceOrFileOrFolderOrGenericSourceOrUser(Dictionary value) : base(value) {} public AppItemEventSourceOrEventSourceOrFileOrFolderOrGenericSourceOrUser(User value) : base(value) {} @@ -41,7 +41,7 @@ public AppItemEventSourceOrEventSourceOrFileOrFolderOrGenericSourceOrUser(User v public static implicit operator AppItemEventSourceOrEventSourceOrFileOrFolderOrGenericSourceOrUser(Folder value) => new AppItemEventSourceOrEventSourceOrFileOrFolderOrGenericSourceOrUser(value); - public static implicit operator AppItemEventSourceOrEventSourceOrFileOrFolderOrGenericSourceOrUser(Dictionary value) => new AppItemEventSourceOrEventSourceOrFileOrFolderOrGenericSourceOrUser(value); + public static implicit operator AppItemEventSourceOrEventSourceOrFileOrFolderOrGenericSourceOrUser(Dictionary value) => new AppItemEventSourceOrEventSourceOrFileOrFolderOrGenericSourceOrUser(value); public static implicit operator AppItemEventSourceOrEventSourceOrFileOrFolderOrGenericSourceOrUser(User value) => new AppItemEventSourceOrEventSourceOrFileOrFolderOrGenericSourceOrUser(value); @@ -71,7 +71,7 @@ public override AppItemEventSourceOrEventSourceOrFileOrFolderOrGenericSourceOrUs } } try { - var result = JsonSerializer.Deserialize>(document, new JsonSerializerOptions() { UnmappedMemberHandling = JsonUnmappedMemberHandling.Disallow }); + var result = JsonSerializer.Deserialize>(document, new JsonSerializerOptions() { UnmappedMemberHandling = JsonUnmappedMemberHandling.Disallow }); return result; } catch { diff --git a/Box.Sdk.Gen/Schemas/MetadataFull/MetadataFull.cs b/Box.Sdk.Gen/Schemas/MetadataFull/MetadataFull.cs index 29f644a6..e611f9b9 100644 --- a/Box.Sdk.Gen/Schemas/MetadataFull/MetadataFull.cs +++ b/Box.Sdk.Gen/Schemas/MetadataFull/MetadataFull.cs @@ -3,6 +3,7 @@ using System.Collections.ObjectModel; using System.Text.Json.Serialization; using System.Text.Json; +using Serializer; using Box.Sdk.Gen.Schemas; namespace Box.Sdk.Gen.Schemas { @@ -36,7 +37,7 @@ public class MetadataFull : Metadata, IJsonOnDeserialized { public long? TypeVersion { get; init; } [JsonPropertyName("extraData")] - public Dictionary? ExtraData { get; set; } + public Dictionary? ExtraData { get; set; } public MetadataFull() { @@ -50,9 +51,9 @@ public MetadataFull() { public void OnDeserialized() { if (_additionalProperties != null) { - ExtraData = new Dictionary(); + ExtraData = new Dictionary(); foreach (var kvp in _additionalProperties) { - ExtraData.Add(kvp.Key, JsonSerializer.Deserialize(kvp.Value)); + ExtraData.Add(kvp.Key, SimpleJsonSerializer.ConvertJsonElement(kvp.Value)); } _additionalProperties.Clear(); } diff --git a/Box.Sdk.Gen/Schemas/SignRequestCreateSigner/SignRequestCreateSigner.cs b/Box.Sdk.Gen/Schemas/SignRequestCreateSigner/SignRequestCreateSigner.cs index 2fd01d61..4aa40c81 100644 --- a/Box.Sdk.Gen/Schemas/SignRequestCreateSigner/SignRequestCreateSigner.cs +++ b/Box.Sdk.Gen/Schemas/SignRequestCreateSigner/SignRequestCreateSigner.cs @@ -63,17 +63,19 @@ public class SignRequestCreateSigner { public string? DeclinedRedirectUrl { get; init; } /// - /// If set to true, signer will need to login to a Box account + /// If set to true, the signer will need to log in to a Box account /// before signing the request. If the signer does not have - /// an existing account, they will have an option to create - /// a free Box account. + /// an existing account, they will have the option to create + /// a free Box account. Cannot be selected in combination with + /// `verification_phone_number`. /// [JsonPropertyName("login_required")] public bool? LoginRequired { get; init; } /// - /// If set, this phone number is be used to verify the signer - /// via two factor authentication before they are able to sign the document. + /// If set, this phone number will be used to verify the signer + /// via two-factor authentication before they are able to sign the document. + /// Cannot be selected in combination with `login_required`. /// [JsonPropertyName("verification_phone_number")] public string? VerificationPhoneNumber { get; init; } diff --git a/Box.Sdk.Gen/Serialization/Json/Serializer.cs b/Box.Sdk.Gen/Serialization/Json/Serializer.cs index 4a2c050e..f95221d4 100644 --- a/Box.Sdk.Gen/Serialization/Json/Serializer.cs +++ b/Box.Sdk.Gen/Serialization/Json/Serializer.cs @@ -33,6 +33,33 @@ public static T Deserialize(SerializedData obj) } public static string SdToJson(SerializedData obj) => JsonSerializer.Serialize(obj.Data, _options); + + internal static object? ConvertJsonElement(JsonElement element) + { + return element.ValueKind switch + { + JsonValueKind.Object => JsonSerializer.Deserialize>(element.GetRawText()), + JsonValueKind.Array => ConvertJsonArray(element), + JsonValueKind.String => element.GetString(), + JsonValueKind.Number => element.TryGetInt32(out int intValue) ? (object)intValue : element.GetDouble(), + JsonValueKind.True => true, + JsonValueKind.False => false, + JsonValueKind.Null => null, + _ => throw new JsonException($"Unexpected JsonValueKind: {element.ValueKind}") + }; + } + + private static List ConvertJsonArray(JsonElement element) + { + var list = new List(); + + foreach (var item in element.EnumerateArray()) + { + list.Add(ConvertJsonElement(item)); + } + + return list; + } } //Remove when migrated to .NET 7 diff --git a/docs/FileMetadata.md b/docs/FileMetadata.md index e9c97ca8..7227670a 100644 --- a/docs/FileMetadata.md +++ b/docs/FileMetadata.md @@ -94,7 +94,7 @@ See the endpoint docs at ``` -await client.FileMetadata.CreateFileMetadataByIdAsync(fileId: file.Id, scope: CreateFileMetadataByIdScope.Global, templateKey: "properties", requestBody: new Dictionary() { { "abc", "xyz" } }); +await client.FileMetadata.CreateFileMetadataByIdAsync(fileId: file.Id, scope: CreateFileMetadataByIdScope.Enterprise, templateKey: templateKey, requestBody: new Dictionary() { { "name", "John" }, { "age", 23 }, { "birthDate", "2001-01-03T02:20:50.520Z" }, { "countryCode", "US" }, { "sports", Array.AsReadOnly(new [] {"basketball","tennis"}) } }); ``` ### Arguments @@ -105,7 +105,7 @@ await client.FileMetadata.CreateFileMetadataByIdAsync(fileId: file.Id, scope: Cr - The scope of the metadata template Example: "global" - templateKey `string` - The name of the metadata template Example: "properties" -- requestBody `Dictionary` +- requestBody `Dictionary` - Request body of createFileMetadataById method - headers `CreateFileMetadataByIdHeaders` - Headers of createFileMetadataById method @@ -177,7 +177,7 @@ See the endpoint docs at ``` -await client.FileMetadata.DeleteFileMetadataByIdAsync(fileId: file.Id, scope: DeleteFileMetadataByIdScope.Global, templateKey: "properties"); +await client.FileMetadata.DeleteFileMetadataByIdAsync(fileId: file.Id, scope: DeleteFileMetadataByIdScope.Enterprise, templateKey: templateKey); ``` ### Arguments diff --git a/docs/FolderMetadata.md b/docs/FolderMetadata.md index a2387cdf..7cf8dd0d 100644 --- a/docs/FolderMetadata.md +++ b/docs/FolderMetadata.md @@ -99,7 +99,7 @@ See the endpoint docs at ``` -await client.FolderMetadata.CreateFolderMetadataByIdAsync(folderId: folder.Id, scope: CreateFolderMetadataByIdScope.Global, templateKey: "properties", requestBody: new Dictionary() { { "abc", "xyz" } }); +await client.FolderMetadata.CreateFolderMetadataByIdAsync(folderId: folder.Id, scope: CreateFolderMetadataByIdScope.Enterprise, templateKey: templateKey, requestBody: new Dictionary() { { "name", "John" }, { "age", 23 }, { "birthDate", "2001-01-03T02:20:50.520Z" }, { "countryCode", "US" }, { "sports", Array.AsReadOnly(new [] {"basketball","tennis"}) } }); ``` ### Arguments @@ -110,7 +110,7 @@ await client.FolderMetadata.CreateFolderMetadataByIdAsync(folderId: folder.Id, s - The scope of the metadata template Example: "global" - templateKey `string` - The name of the metadata template Example: "properties" -- requestBody `Dictionary` +- requestBody `Dictionary` - Request body of createFolderMetadataById method - headers `CreateFolderMetadataByIdHeaders` - Headers of createFolderMetadataById method @@ -182,7 +182,7 @@ See the endpoint docs at ``` -await client.FolderMetadata.DeleteFolderMetadataByIdAsync(folderId: folder.Id, scope: DeleteFolderMetadataByIdScope.Global, templateKey: "properties"); +await client.FolderMetadata.DeleteFolderMetadataByIdAsync(folderId: folder.Id, scope: DeleteFolderMetadataByIdScope.Enterprise, templateKey: templateKey); ``` ### Arguments diff --git a/docs/MetadataTemplates.md b/docs/MetadataTemplates.md index 125d2273..4daf004b 100644 --- a/docs/MetadataTemplates.md +++ b/docs/MetadataTemplates.md @@ -97,7 +97,7 @@ See the endpoint docs at ``` -await client.MetadataTemplates.UpdateMetadataTemplateAsync(scope: UpdateMetadataTemplateScope.Enterprise, templateKey: templateKey, requestBody: Array.AsReadOnly(new [] {new UpdateMetadataTemplateRequestBody(op: UpdateMetadataTemplateRequestBodyOpField.AddField) { FieldKey = "newfieldname", Data = new Dictionary() { { "type", "string" }, { "displayName", "newFieldName" } } }})); +await client.MetadataTemplates.UpdateMetadataTemplateAsync(scope: UpdateMetadataTemplateScope.Enterprise, templateKey: templateKey, requestBody: Array.AsReadOnly(new [] {new UpdateMetadataTemplateRequestBody(op: UpdateMetadataTemplateRequestBodyOpField.AddField) { FieldKey = "newfieldname", Data = new Dictionary() { { "type", "string" }, { "displayName", "newFieldName" } } }})); ``` ### Arguments @@ -266,7 +266,7 @@ See the endpoint docs at ``` -await client.MetadataTemplates.CreateMetadataTemplateAsync(requestBody: new CreateMetadataTemplateRequestBody(scope: "enterprise", displayName: templateKey) { TemplateKey = templateKey, Fields = Array.AsReadOnly(new [] {new CreateMetadataTemplateRequestBodyFieldsField(type: CreateMetadataTemplateRequestBodyFieldsTypeField.String, key: "testName", displayName: "testName")}) }); +await client.MetadataTemplates.CreateMetadataTemplateAsync(requestBody: new CreateMetadataTemplateRequestBody(scope: "enterprise", displayName: templateKey) { TemplateKey = templateKey, Fields = Array.AsReadOnly(new [] {new CreateMetadataTemplateRequestBodyFieldsField(type: CreateMetadataTemplateRequestBodyFieldsTypeField.String, key: "name", displayName: "name"),new CreateMetadataTemplateRequestBodyFieldsField(type: CreateMetadataTemplateRequestBodyFieldsTypeField.Float, key: "age", displayName: "age"),new CreateMetadataTemplateRequestBodyFieldsField(type: CreateMetadataTemplateRequestBodyFieldsTypeField.Date, key: "birthDate", displayName: "birthDate"),new CreateMetadataTemplateRequestBodyFieldsField(type: CreateMetadataTemplateRequestBodyFieldsTypeField.Enum, key: "countryCode", displayName: "countryCode") { Options = Array.AsReadOnly(new [] {new CreateMetadataTemplateRequestBodyFieldsOptionsField(key: "US"),new CreateMetadataTemplateRequestBodyFieldsOptionsField(key: "CA")}) },new CreateMetadataTemplateRequestBodyFieldsField(type: CreateMetadataTemplateRequestBodyFieldsTypeField.MultiSelect, key: "sports", displayName: "sports") { Options = Array.AsReadOnly(new [] {new CreateMetadataTemplateRequestBodyFieldsOptionsField(key: "basketball"),new CreateMetadataTemplateRequestBodyFieldsOptionsField(key: "football"),new CreateMetadataTemplateRequestBodyFieldsOptionsField(key: "tennis")}) }}) }); ``` ### Arguments