From b4ca478f2ca3b843d0a75004f46b4fb4c8dedd14 Mon Sep 17 00:00:00 2001 From: Bjarke Berg Date: Thu, 14 Dec 2023 11:46:02 +0100 Subject: [PATCH] Required on view models (#15356) * Added required on view models * Updated OpenApi.json * mark all fields required * Force non-nullable as required. * Missing import * Update OpenApi.json --------- Co-authored-by: Mads Rasmussen --- ...reUmbracoManagementApiSwaggerGenOptions.cs | 1 + src/Umbraco.Cms.Api.Management/OpenApi.json | 851 +++++++++++++++++- ...equireNonNullablePropertiesSchemaFilter.cs | 21 + .../ViewModels/AuditLogs/AuditLogBaseModel.cs | 3 +- .../AuditLogWithUsernameResponseModel.cs | 5 +- .../ViewModels/Content/ContentModelBase.cs | 4 +- .../ViewModels/Content/ValueModelBase.cs | 5 +- .../ViewModels/Content/VariantModelBase.cs | 5 +- .../ContentType/ContentTypeModelBase.cs | 14 +- .../PropertyTypeContainerModelBase.cs | 3 + .../ContentType/PropertyTypeModelBase.cs | 4 + .../ViewModels/Culture/CultureReponseModel.cs | 10 +- .../ViewModels/DataType/DataTypeModelBase.cs | 8 +- .../Dictionary/DictionaryItemModelBase.cs | 9 +- .../DictionaryItemTranslationModel.cs | 6 +- .../DictionaryOverviewResponseModel.cs | 2 +- .../UploadDictionaryResponseModel.cs | 2 +- .../Document/DocumentResponseModel.cs | 2 +- .../CreateDocumentTypeRequestModel.cs | 2 +- .../DocumentType/DocumentTypeResponseModel.cs | 2 +- .../UpdateDocumentTypeRequestModel.cs | 2 +- .../DynamicRoot/DynamicRootRequestModel.cs | 6 + .../DynamicRoot/DynamicRootResponseModel.cs | 6 + .../ViewModels/Folder/FolderModelBase.cs | 5 +- .../ConsentLevelPresentationModel.cs | 2 + .../DatabaseSettingsPresentationModel.cs | 6 + .../Installer/InstallSettingsResponseModel.cs | 3 + .../Installer/UpgradeSettingsResponseModel.cs | 8 +- .../Installer/UserInstallResponseModel.cs | 6 +- .../JsonPatch/JsonPatchViewModel.cs | 11 +- .../Language/CreateLanguageRequestModel.cs | 5 +- .../Item/LanguageItemResponseModel.cs | 6 +- .../ViewModels/Language/LanguageModelBase.cs | 5 +- .../Language/LanguageResponseModel.cs | 5 +- .../LogViewer/LogMessageResponseModel.cs | 2 +- .../ViewModels/Media/MediaResponseModel.cs | 2 +- .../Media/item/MediaTreeItemResponseModel.cs | 4 +- .../Package/PackageManifestResponseModel.cs | 5 +- .../RecycleBin/RecycleBinItemResponseModel.cs | 10 +- .../RelationType/RelationTypeBaseModel.cs | 5 +- .../RelationType/RelationTypeResponseModel.cs | 5 +- .../Searcher/SearchResultResponseModel.cs | 9 +- .../ViewModels/Searcher/SearcherResponse.cs | 7 +- .../Security/ResetPasswordRequestModel.cs | 3 + .../ResetPasswordTokenRequestModel.cs | 3 + .../VerifyResetPasswordTokenRequestModel.cs | 3 + .../ViewModels/Server/VersionResponseModel.cs | 7 +- ...lateQueryExecuteFilterPresentationModel.cs | 5 +- .../ViewModels/Template/TemplateModelBase.cs | 6 +- .../Template/TemplateScaffoldResponseModel.cs | 5 +- .../TemporaryFileResponseModel.cs | 3 + .../TextFiles/TextFileResponseModelBase.cs | 5 +- .../User/Current/UserPermissionViewModel.cs | 2 +- .../Current/UserPermissionsResponseModel.cs | 2 +- .../User/ResendInviteUserRequestModel.cs | 3 + .../User/VerifyInviteUserRequestModel.cs | 4 + 56 files changed, 1072 insertions(+), 63 deletions(-) create mode 100644 src/Umbraco.Cms.Api.Management/OpenApi/RequireNonNullablePropertiesSchemaFilter.cs create mode 100644 src/Umbraco.Cms.Api.Management/ViewModels/DynamicRoot/DynamicRootRequestModel.cs create mode 100644 src/Umbraco.Cms.Api.Management/ViewModels/DynamicRoot/DynamicRootResponseModel.cs diff --git a/src/Umbraco.Cms.Api.Management/Configuration/ConfigureUmbracoManagementApiSwaggerGenOptions.cs b/src/Umbraco.Cms.Api.Management/Configuration/ConfigureUmbracoManagementApiSwaggerGenOptions.cs index 616db6c89b..9e78c5a471 100644 --- a/src/Umbraco.Cms.Api.Management/Configuration/ConfigureUmbracoManagementApiSwaggerGenOptions.cs +++ b/src/Umbraco.Cms.Api.Management/Configuration/ConfigureUmbracoManagementApiSwaggerGenOptions.cs @@ -55,6 +55,7 @@ public class ConfigureUmbracoManagementApiSwaggerGenOptions : IConfigureOptions< // Sets Security requirement on backoffice apis swaggerGenOptions.OperationFilter(); + swaggerGenOptions.SchemaFilter(); } } diff --git a/src/Umbraco.Cms.Api.Management/OpenApi.json b/src/Umbraco.Cms.Api.Management/OpenApi.json index 45dd3288c4..b24263d49c 100644 --- a/src/Umbraco.Cms.Api.Management/OpenApi.json +++ b/src/Umbraco.Cms.Api.Management/OpenApi.json @@ -18491,6 +18491,11 @@ "components": { "schemas": { "AuditLogBaseModel": { + "required": [ + "logType", + "timestamp", + "userId" + ], "type": "object", "properties": { "userId": { @@ -18534,6 +18539,9 @@ "additionalProperties": false }, "AuditLogWithUsernameResponseModel": { + "required": [ + "userAvatars" + ], "type": "object", "allOf": [ { @@ -18549,8 +18557,7 @@ "type": "array", "items": { "type": "string" - }, - "nullable": true + } } }, "additionalProperties": false @@ -18585,6 +18592,9 @@ "type": "string" }, "ChangePasswordUserRequestModel": { + "required": [ + "newPassword" + ], "type": "object", "properties": { "newPassword": { @@ -18598,18 +18608,29 @@ "additionalProperties": false }, "ConsentLevelPresentationModel": { + "required": [ + "description", + "level" + ], "type": "object", "properties": { "level": { "$ref": "#/components/schemas/TelemetryLevelModel" }, "description": { + "minLength": 1, "type": "string" } }, "additionalProperties": false }, "ContentForDocumentResponseModel": { + "required": [ + "contentTypeId", + "id", + "values", + "variants" + ], "type": "object", "properties": { "values": { @@ -18653,6 +18674,11 @@ "type": "string" }, "ContentTreeItemResponseModel": { + "required": [ + "id", + "isTrashed", + "noAccess" + ], "type": "object", "allOf": [ { @@ -18674,6 +18700,9 @@ "additionalProperties": false }, "ContentTypeCleanupModel": { + "required": [ + "preventCleanup" + ], "type": "object", "properties": { "preventCleanup": { @@ -18693,6 +18722,10 @@ "additionalProperties": false }, "ContentTypeCompositionModel": { + "required": [ + "compositionType", + "id" + ], "type": "object", "properties": { "id": { @@ -18713,12 +18746,28 @@ "type": "string" }, "ContentTypeForDocumentTypeResponseModel": { + "required": [ + "alias", + "allowedAsRoot", + "allowedContentTypes", + "compositions", + "containers", + "icon", + "id", + "isElement", + "name", + "properties", + "variesByCulture", + "variesBySegment" + ], "type": "object", "properties": { "alias": { + "minLength": 1, "type": "string" }, "name": { + "minLength": 1, "type": "string" }, "description": { @@ -18726,6 +18775,7 @@ "nullable": true }, "icon": { + "minLength": 1, "type": "string" }, "allowedAsRoot": { @@ -18788,12 +18838,28 @@ "additionalProperties": false }, "ContentTypeForMediaTypeResponseModel": { + "required": [ + "alias", + "allowedAsRoot", + "allowedContentTypes", + "compositions", + "containers", + "icon", + "id", + "isElement", + "name", + "properties", + "variesByCulture", + "variesBySegment" + ], "type": "object", "properties": { "alias": { + "minLength": 1, "type": "string" }, "name": { + "minLength": 1, "type": "string" }, "description": { @@ -18801,6 +18867,7 @@ "nullable": true }, "icon": { + "minLength": 1, "type": "string" }, "allowedAsRoot": { @@ -18863,6 +18930,10 @@ "additionalProperties": false }, "ContentTypeSortModel": { + "required": [ + "id", + "sortOrder" + ], "type": "object", "properties": { "id": { @@ -18877,6 +18948,9 @@ "additionalProperties": false }, "ContentUrlInfoModel": { + "required": [ + "url" + ], "type": "object", "properties": { "culture": { @@ -18901,6 +18975,10 @@ "additionalProperties": false }, "CopyDocumentRequestModel": { + "required": [ + "includeDescendants", + "relateToOriginal" + ], "type": "object", "properties": { "targetId": { @@ -18918,6 +18996,10 @@ "additionalProperties": false }, "CreateContentForDocumentRequestModel": { + "required": [ + "values", + "variants" + ], "type": "object", "properties": { "values": { @@ -18954,6 +19036,10 @@ "additionalProperties": false }, "CreateContentForMediaRequestModel": { + "required": [ + "values", + "variants" + ], "type": "object", "properties": { "values": { @@ -18990,12 +19076,27 @@ "additionalProperties": false }, "CreateContentTypeForDocumentTypeRequestModel": { + "required": [ + "alias", + "allowedAsRoot", + "allowedContentTypes", + "compositions", + "containers", + "icon", + "isElement", + "name", + "properties", + "variesByCulture", + "variesBySegment" + ], "type": "object", "properties": { "alias": { + "minLength": 1, "type": "string" }, "name": { + "minLength": 1, "type": "string" }, "description": { @@ -19003,6 +19104,7 @@ "nullable": true }, "icon": { + "minLength": 1, "type": "string" }, "allowedAsRoot": { @@ -19071,12 +19173,27 @@ "additionalProperties": false }, "CreateContentTypeForMediaTypeRequestModel": { + "required": [ + "alias", + "allowedAsRoot", + "allowedContentTypes", + "compositions", + "containers", + "icon", + "isElement", + "name", + "properties", + "variesByCulture", + "variesBySegment" + ], "type": "object", "properties": { "alias": { + "minLength": 1, "type": "string" }, "name": { + "minLength": 1, "type": "string" }, "description": { @@ -19084,6 +19201,7 @@ "nullable": true }, "icon": { + "minLength": 1, "type": "string" }, "allowedAsRoot": { @@ -19194,6 +19312,9 @@ "additionalProperties": false }, "CreateDocumentRequestModel": { + "required": [ + "contentTypeId" + ], "type": "object", "allOf": [ { @@ -19232,6 +19353,10 @@ "additionalProperties": false }, "CreateDocumentTypeRequestModel": { + "required": [ + "allowedTemplateIds", + "cleanup" + ], "type": "object", "allOf": [ { @@ -19283,6 +19408,9 @@ "additionalProperties": false }, "CreateInitialPasswordUserRequestModel": { + "required": [ + "password" + ], "type": "object", "allOf": [ { @@ -19297,6 +19425,9 @@ "additionalProperties": false }, "CreateLanguageRequestModel": { + "required": [ + "isoCode" + ], "type": "object", "allOf": [ { @@ -19305,12 +19436,16 @@ ], "properties": { "isoCode": { + "minLength": 1, "type": "string" } }, "additionalProperties": false }, "CreateMediaRequestModel": { + "required": [ + "contentTypeId" + ], "type": "object", "allOf": [ { @@ -19462,6 +19597,9 @@ "additionalProperties": false }, "CreateUserResponseModel": { + "required": [ + "userId" + ], "type": "object", "properties": { "userId": { @@ -19476,18 +19614,36 @@ "additionalProperties": false }, "CultureReponseModel": { + "required": [ + "englishName", + "name" + ], "type": "object", "properties": { "name": { + "minLength": 1, "type": "string" }, "englishName": { + "minLength": 1, "type": "string" } }, "additionalProperties": false }, "CurrentUserResponseModel": { + "required": [ + "avatarUrls", + "contentStartNodeIds", + "email", + "hasAccessToAllLanguages", + "id", + "languages", + "mediaStartNodeIds", + "name", + "permissions", + "userName" + ], "type": "object", "properties": { "id": { @@ -19564,12 +19720,19 @@ "additionalProperties": false }, "DataTypeModelBaseModel": { + "required": [ + "editorAlias", + "name", + "values" + ], "type": "object", "properties": { "name": { + "minLength": 1, "type": "string" }, "editorAlias": { + "minLength": 1, "type": "string" }, "editorUiAlias": { @@ -19590,6 +19753,9 @@ "additionalProperties": false }, "DataTypePropertyPresentationModel": { + "required": [ + "alias" + ], "type": "object", "properties": { "alias": { @@ -19602,6 +19768,10 @@ "additionalProperties": false }, "DataTypePropertyReferenceModel": { + "required": [ + "alias", + "name" + ], "type": "object", "properties": { "name": { @@ -19614,6 +19784,11 @@ "additionalProperties": false }, "DataTypeReferenceResponseModel": { + "required": [ + "id", + "properties", + "type" + ], "type": "object", "properties": { "id": { @@ -19637,6 +19812,9 @@ "additionalProperties": false }, "DataTypeResponseModel": { + "required": [ + "id" + ], "type": "object", "allOf": [ { @@ -19674,7 +19852,9 @@ "DatabaseInstallResponseModel": { "required": [ "id", - "providerName" + "providerName", + "trustServerCertificate", + "useIntegratedAuthentication" ], "type": "object", "properties": { @@ -19716,6 +19896,19 @@ "additionalProperties": false }, "DatabaseSettingsPresentationModel": { + "required": [ + "defaultDatabaseName", + "displayName", + "id", + "isConfigured", + "providerName", + "requiresConnectionTest", + "requiresCredentials", + "requiresServer", + "serverPlaceholder", + "sortOrder", + "supportsIntegratedAuthentication" + ], "type": "object", "properties": { "id": { @@ -19727,12 +19920,15 @@ "format": "int32" }, "displayName": { + "minLength": 1, "type": "string" }, "defaultDatabaseName": { + "minLength": 1, "type": "string" }, "providerName": { + "minLength": 1, "type": "string" }, "isConfigured": { @@ -19742,6 +19938,7 @@ "type": "boolean" }, "serverPlaceholder": { + "minLength": 1, "type": "string" }, "requiresCredentials": { @@ -19757,6 +19954,9 @@ "additionalProperties": false }, "DeleteUserGroupsRequestModel": { + "required": [ + "userGroupIds" + ], "type": "object", "properties": { "userGroupIds": { @@ -19771,6 +19971,9 @@ "additionalProperties": false }, "DeleteUsersRequestModel": { + "required": [ + "userIds" + ], "type": "object", "properties": { "userIds": { @@ -19794,9 +19997,14 @@ "additionalProperties": false }, "DictionaryItemModelBaseModel": { + "required": [ + "name", + "translations" + ], "type": "object", "properties": { "name": { + "minLength": 1, "type": "string" }, "translations": { @@ -19813,6 +20021,9 @@ "additionalProperties": false }, "DictionaryItemResponseModel": { + "required": [ + "id" + ], "type": "object", "allOf": [ { @@ -19828,18 +20039,28 @@ "additionalProperties": false }, "DictionaryItemTranslationModel": { + "required": [ + "isoCode", + "translation" + ], "type": "object", "properties": { "isoCode": { + "minLength": 1, "type": "string" }, "translation": { + "minLength": 1, "type": "string" } }, "additionalProperties": false }, "DictionaryOverviewResponseModel": { + "required": [ + "id", + "translatedIsoCodes" + ], "type": "object", "properties": { "name": { @@ -19872,6 +20093,9 @@ "type": "string" }, "DisableUserRequestModel": { + "required": [ + "userIds" + ], "type": "object", "properties": { "userIds": { @@ -19895,6 +20119,10 @@ "additionalProperties": false }, "DocumentBlueprintTreeItemResponseModel": { + "required": [ + "documentTypeAlias", + "documentTypeId" + ], "type": "object", "allOf": [ { @@ -19917,6 +20145,10 @@ "additionalProperties": false }, "DocumentItemResponseModel": { + "required": [ + "contentTypeId", + "isTrashed" + ], "type": "object", "allOf": [ { @@ -19939,6 +20171,10 @@ "additionalProperties": false }, "DocumentNotificationResponseModel": { + "required": [ + "actionId", + "subscribed" + ], "type": "object", "properties": { "actionId": { @@ -19951,6 +20187,10 @@ "additionalProperties": false }, "DocumentResponseModel": { + "required": [ + "isTrashed", + "urls" + ], "type": "object", "allOf": [ { @@ -19980,6 +20220,14 @@ "additionalProperties": false }, "DocumentTreeItemResponseModel": { + "required": [ + "contentTypeId", + "icon", + "isEdited", + "isProtected", + "isPublished", + "variants" + ], "type": "object", "allOf": [ { @@ -20017,6 +20265,9 @@ "additionalProperties": false }, "DocumentTypeItemResponseModel": { + "required": [ + "isElement" + ], "type": "object", "allOf": [ { @@ -20053,6 +20304,10 @@ "additionalProperties": false }, "DocumentTypeResponseModel": { + "required": [ + "allowedTemplateIds", + "cleanup" + ], "type": "object", "allOf": [ { @@ -20083,6 +20338,10 @@ "additionalProperties": false }, "DocumentTypeTreeItemResponseModel": { + "required": [ + "icon", + "isElement" + ], "type": "object", "allOf": [ { @@ -20118,6 +20377,9 @@ "additionalProperties": false }, "DocumentVariantResponseModel": { + "required": [ + "state" + ], "type": "object", "allOf": [ { @@ -20137,6 +20399,10 @@ "additionalProperties": false }, "DomainPresentationModel": { + "required": [ + "domainName", + "isoCode" + ], "type": "object", "properties": { "domainName": { @@ -20149,6 +20415,9 @@ "additionalProperties": false }, "DomainsPresentationModelBaseModel": { + "required": [ + "domains" + ], "type": "object", "properties": { "defaultIsoCode": { @@ -20178,6 +20447,9 @@ "additionalProperties": false }, "EnableUserRequestModel": { + "required": [ + "userIds" + ], "type": "object", "properties": { "userIds": { @@ -20192,6 +20464,10 @@ "additionalProperties": false }, "EntityTreeItemResponseModel": { + "required": [ + "id", + "isContainer" + ], "type": "object", "allOf": [ { @@ -20215,6 +20491,9 @@ "additionalProperties": false }, "ExtractRichTextStylesheetRulesRequestModel": { + "required": [ + "content" + ], "type": "object", "properties": { "content": { @@ -20233,6 +20512,10 @@ "additionalProperties": false }, "FieldPresentationModel": { + "required": [ + "name", + "values" + ], "type": "object", "properties": { "name": { @@ -20248,6 +20531,11 @@ "additionalProperties": false }, "FileItemResponseModelBaseModel": { + "required": [ + "icon", + "name", + "path" + ], "type": "object", "properties": { "name": { @@ -20263,6 +20551,10 @@ "additionalProperties": false }, "FileSystemTreeItemPresentationModel": { + "required": [ + "isFolder", + "path" + ], "type": "object", "allOf": [ { @@ -20280,15 +20572,22 @@ "additionalProperties": false }, "FolderModelBaseModel": { + "required": [ + "name" + ], "type": "object", "properties": { "name": { + "minLength": 1, "type": "string" } }, "additionalProperties": false }, "FolderResponseModel": { + "required": [ + "id" + ], "type": "object", "allOf": [ { @@ -20309,6 +20608,9 @@ "additionalProperties": false }, "FolderTreeItemResponseModel": { + "required": [ + "isFolder" + ], "type": "object", "allOf": [ { @@ -20323,6 +20625,10 @@ "additionalProperties": false }, "HealthCheckActionRequestModel": { + "required": [ + "healthCheckId", + "valueRequired" + ], "type": "object", "properties": { "healthCheckId": { @@ -20360,6 +20666,9 @@ "additionalProperties": false }, "HealthCheckGroupPresentationBaseModel": { + "required": [ + "name" + ], "type": "object", "properties": { "name": { @@ -20369,6 +20678,9 @@ "additionalProperties": false }, "HealthCheckGroupPresentationModel": { + "required": [ + "checks" + ], "type": "object", "allOf": [ { @@ -20399,6 +20711,9 @@ "additionalProperties": false }, "HealthCheckGroupWithResultResponseModel": { + "required": [ + "checks" + ], "type": "object", "properties": { "checks": { @@ -20415,6 +20730,9 @@ "additionalProperties": false }, "HealthCheckModel": { + "required": [ + "name" + ], "type": "object", "allOf": [ { @@ -20433,6 +20751,9 @@ "additionalProperties": false }, "HealthCheckModelBaseModel": { + "required": [ + "id" + ], "type": "object", "properties": { "id": { @@ -20443,6 +20764,10 @@ "additionalProperties": false }, "HealthCheckResultResponseModel": { + "required": [ + "message", + "resultType" + ], "type": "object", "properties": { "message": { @@ -20522,6 +20847,9 @@ "additionalProperties": false }, "ImportDictionaryRequestModel": { + "required": [ + "temporaryFileId" + ], "type": "object", "properties": { "temporaryFileId": { @@ -20541,7 +20869,9 @@ "canRebuild", "documentCount", "fieldCount", - "name" + "healthStatus", + "name", + "searcherName" ], "type": "object", "properties": { @@ -20575,6 +20905,10 @@ "additionalProperties": false }, "InstallSettingsResponseModel": { + "required": [ + "databases", + "user" + ], "type": "object", "properties": { "user": { @@ -20600,6 +20934,7 @@ "InstallVResponseModel": { "required": [ "database", + "telemetryLevel", "user" ], "type": "object", @@ -20646,6 +20981,9 @@ "additionalProperties": false }, "InterpolateRichTextStylesheetResponseModel": { + "required": [ + "content" + ], "type": "object", "properties": { "content": { @@ -20670,6 +21008,10 @@ "additionalProperties": false }, "ItemResponseModelBaseModel": { + "required": [ + "id", + "name" + ], "type": "object", "properties": { "name": { @@ -20683,6 +21025,10 @@ "additionalProperties": false }, "ItemSortingRequestModel": { + "required": [ + "id", + "sortOrder" + ], "type": "object", "properties": { "id": { @@ -20697,21 +21043,33 @@ "additionalProperties": false }, "LanguageItemResponseModel": { + "required": [ + "isoCode", + "name" + ], "type": "object", "properties": { "name": { + "minLength": 1, "type": "string" }, "isoCode": { + "minLength": 1, "type": "string" } }, "additionalProperties": false }, "LanguageModelBaseModel": { + "required": [ + "isDefault", + "isMandatory", + "name" + ], "type": "object", "properties": { "name": { + "minLength": 1, "type": "string" }, "isDefault": { @@ -20728,6 +21086,9 @@ "additionalProperties": false }, "LanguageResponseModel": { + "required": [ + "isoCode" + ], "type": "object", "allOf": [ { @@ -20736,12 +21097,17 @@ ], "properties": { "isoCode": { + "minLength": 1, "type": "string" } }, "additionalProperties": false }, "LinkedLoginModel": { + "required": [ + "providerKey", + "providerName" + ], "type": "object", "properties": { "providerName": { @@ -20754,6 +21120,9 @@ "additionalProperties": false }, "LinkedLoginsRequestModel": { + "required": [ + "linkedLogins" + ], "type": "object", "properties": { "linkedLogins": { @@ -20770,6 +21139,13 @@ "additionalProperties": false }, "LogLevelCountsReponseModel": { + "required": [ + "debug", + "error", + "fatal", + "information", + "warning" + ], "type": "object", "properties": { "information": { @@ -20807,6 +21183,9 @@ "type": "string" }, "LogMessagePropertyPresentationModel": { + "required": [ + "name" + ], "type": "object", "properties": { "name": { @@ -20820,6 +21199,11 @@ "additionalProperties": false }, "LogMessageResponseModel": { + "required": [ + "level", + "properties", + "timestamp" + ], "type": "object", "properties": { "timestamp": { @@ -20855,6 +21239,9 @@ "additionalProperties": false }, "LogTemplateResponseModel": { + "required": [ + "count" + ], "type": "object", "properties": { "messageTemplate": { @@ -20869,6 +21256,10 @@ "additionalProperties": false }, "LoggerResponseModel": { + "required": [ + "level", + "name" + ], "type": "object", "properties": { "name": { @@ -20881,6 +21272,9 @@ "additionalProperties": false }, "MediaItemResponseModel": { + "required": [ + "isTrashed" + ], "type": "object", "allOf": [ { @@ -20899,6 +21293,9 @@ "additionalProperties": false }, "MediaTreeItemResponseModel": { + "required": [ + "icon" + ], "type": "object", "allOf": [ { @@ -20907,6 +21304,7 @@ ], "properties": { "icon": { + "minLength": 1, "type": "string" } }, @@ -20955,6 +21353,9 @@ "additionalProperties": false }, "MediaTypeTreeItemResponseModel": { + "required": [ + "icon" + ], "type": "object", "allOf": [ { @@ -21035,6 +21436,12 @@ "additionalProperties": false }, "ModelsBuilderResponseModel": { + "required": [ + "canGenerate", + "mode", + "outOfDateModels", + "trackingOutOfDateModels" + ], "type": "object", "properties": { "mode": { @@ -21118,6 +21525,9 @@ "additionalProperties": false }, "ObjectTypeResponseModel": { + "required": [ + "id" + ], "type": "object", "properties": { "name": { @@ -21132,6 +21542,9 @@ "additionalProperties": false }, "OkResult": { + "required": [ + "statusCode" + ], "type": "object", "properties": { "statusCode": { @@ -21155,6 +21568,9 @@ "type": "string" }, "OutOfDateStatusResponseModel": { + "required": [ + "status" + ], "type": "object", "properties": { "status": { @@ -21172,6 +21588,10 @@ "type": "string" }, "PackageDefinitionResponseModel": { + "required": [ + "id", + "packagePath" + ], "type": "object", "allOf": [ { @@ -21190,9 +21610,14 @@ "additionalProperties": false }, "PackageManifestResponseModel": { + "required": [ + "extensions", + "name" + ], "type": "object", "properties": { "name": { + "minLength": 1, "type": "string" }, "version": { @@ -21207,6 +21632,10 @@ "additionalProperties": false }, "PackageMigrationStatusResponseModel": { + "required": [ + "hasPendingMigrations", + "packageName" + ], "type": "object", "properties": { "packageName": { @@ -21219,6 +21648,21 @@ "additionalProperties": false }, "PackageModelBaseModel": { + "required": [ + "contentLoadChildNodes", + "dataTypes", + "dictionaryItems", + "documentTypes", + "languages", + "mediaIds", + "mediaLoadChildNodes", + "mediaTypes", + "name", + "partialViews", + "scripts", + "stylesheets", + "templates" + ], "type": "object", "properties": { "name": { @@ -22225,6 +22669,10 @@ "additionalProperties": false }, "PartialViewSnippetResponseModel": { + "required": [ + "content", + "name" + ], "type": "object", "properties": { "name": { @@ -22255,6 +22703,9 @@ "additionalProperties": false }, "PathFolderResponseModel": { + "required": [ + "path" + ], "type": "object", "allOf": [ { @@ -22305,6 +22756,9 @@ "additionalProperties": false }, "ProfilingStatusRequestModel": { + "required": [ + "enabled" + ], "type": "object", "properties": { "enabled": { @@ -22314,6 +22768,9 @@ "additionalProperties": false }, "ProfilingStatusResponseModel": { + "required": [ + "enabled" + ], "type": "object", "properties": { "enabled": { @@ -22323,6 +22780,9 @@ "additionalProperties": false }, "PropertyTypeAppearanceModel": { + "required": [ + "labelOnTop" + ], "type": "object", "properties": { "labelOnTop": { @@ -22332,6 +22792,11 @@ "additionalProperties": false }, "PropertyTypeContainerModelBaseModel": { + "required": [ + "id", + "sortOrder", + "type" + ], "type": "object", "properties": { "id": { @@ -22348,6 +22813,7 @@ "nullable": true }, "type": { + "minLength": 1, "type": "string" }, "sortOrder": { @@ -22358,6 +22824,17 @@ "additionalProperties": false }, "PropertyTypeModelBaseModel": { + "required": [ + "alias", + "appearance", + "dataTypeId", + "id", + "name", + "sortOrder", + "validation", + "variesByCulture", + "variesBySegment" + ], "type": "object", "properties": { "id": { @@ -22374,9 +22851,11 @@ "format": "int32" }, "alias": { + "minLength": 1, "type": "string" }, "name": { + "minLength": 1, "type": "string" }, "description": { @@ -22411,6 +22890,9 @@ "additionalProperties": false }, "PropertyTypeValidationModel": { + "required": [ + "mandatory" + ], "type": "object", "properties": { "mandatory": { @@ -22432,6 +22914,10 @@ "additionalProperties": false }, "PublicAccessBaseModel": { + "required": [ + "errorPageId", + "loginPageId" + ], "type": "object", "properties": { "loginPageId": { @@ -22446,6 +22932,10 @@ "additionalProperties": false }, "PublicAccessRequestModel": { + "required": [ + "memberGroupNames", + "memberUserNames" + ], "type": "object", "allOf": [ { @@ -22469,6 +22959,10 @@ "additionalProperties": false }, "PublicAccessResponseModel": { + "required": [ + "groups", + "members" + ], "type": "object", "allOf": [ { @@ -22500,6 +22994,9 @@ "additionalProperties": false }, "PublishDocumentRequestModel": { + "required": [ + "cultures" + ], "type": "object", "properties": { "cultures": { @@ -22512,6 +23009,9 @@ "additionalProperties": false }, "PublishDocumentWithDescendantsRequestModel": { + "required": [ + "includeUnpublishedDescendants" + ], "type": "object", "allOf": [ { @@ -22535,6 +23035,14 @@ "type": "string" }, "RecycleBinItemResponseModel": { + "required": [ + "hasChildren", + "icon", + "id", + "isContainer", + "name", + "type" + ], "type": "object", "properties": { "id": { @@ -22542,12 +23050,15 @@ "format": "uuid" }, "name": { + "minLength": 1, "type": "string" }, "type": { + "minLength": 1, "type": "string" }, "icon": { + "minLength": 1, "type": "string" }, "hasChildren": { @@ -22572,6 +23083,13 @@ "type": "string" }, "RedirectUrlResponseModel": { + "required": [ + "contentId", + "created", + "destinationUrl", + "id", + "originalUrl" + ], "type": "object", "properties": { "id": { @@ -22600,6 +23118,10 @@ "additionalProperties": false }, "RedirectUrlStatusResponseModel": { + "required": [ + "status", + "userIsAdmin" + ], "type": "object", "properties": { "status": { @@ -22612,6 +23134,11 @@ "additionalProperties": false }, "RelationItemResponseModel": { + "required": [ + "nodeId", + "relationTypeIsBidirectional", + "relationTypeIsDependency" + ], "type": "object", "properties": { "nodeId": { @@ -22656,6 +23183,11 @@ "additionalProperties": false }, "RelationResponseModel": { + "required": [ + "childId", + "createDate", + "parentId" + ], "type": "object", "properties": { "parentId": { @@ -22686,9 +23218,15 @@ "additionalProperties": false }, "RelationTypeBaseModel": { + "required": [ + "isBidirectional", + "isDependency", + "name" + ], "type": "object", "properties": { "name": { + "minLength": 1, "type": "string" }, "isBidirectional": { @@ -22720,6 +23258,11 @@ "additionalProperties": false }, "RelationTypeResponseModel": { + "required": [ + "id", + "isSystemRelationType", + "path" + ], "type": "object", "allOf": [ { @@ -22736,6 +23279,7 @@ "nullable": true }, "path": { + "minLength": 1, "type": "string" }, "isSystemRelationType": { @@ -22753,6 +23297,9 @@ "additionalProperties": false }, "ResendInviteUserRequestModel": { + "required": [ + "userId" + ], "type": "object", "properties": { "userId": { @@ -22767,15 +23314,22 @@ "additionalProperties": false }, "ResetPasswordRequestModel": { + "required": [ + "email" + ], "type": "object", "properties": { "email": { + "minLength": 1, "type": "string" } }, "additionalProperties": false }, "ResetPasswordTokenRequestModel": { + "required": [ + "password" + ], "type": "object", "allOf": [ { @@ -22784,12 +23338,18 @@ ], "properties": { "password": { + "minLength": 1, "type": "string" } }, "additionalProperties": false }, "RichTextRuleModel": { + "required": [ + "name", + "selector", + "styles" + ], "type": "object", "properties": { "name": { @@ -22805,6 +23365,9 @@ "additionalProperties": false }, "RichTextStylesheetRulesResponseModel": { + "required": [ + "rules" + ], "type": "object", "properties": { "rules": { @@ -22832,6 +23395,10 @@ "type": "string" }, "SavedLogSearchPresenationBaseModel": { + "required": [ + "name", + "query" + ], "type": "object", "properties": { "name": { @@ -22898,9 +23465,16 @@ "additionalProperties": false }, "SearchResultResponseModel": { + "required": [ + "fieldCount", + "fields", + "id", + "score" + ], "type": "object", "properties": { "id": { + "minLength": 1, "type": "string" }, "score": { @@ -22926,15 +23500,23 @@ "additionalProperties": false }, "SearcherResponseModel": { + "required": [ + "name" + ], "type": "object", "properties": { "name": { + "minLength": 1, "type": "string" } }, "additionalProperties": false }, "ServerInformationItemResponseModel": { + "required": [ + "data", + "name" + ], "type": "object", "properties": { "name": { @@ -22947,6 +23529,9 @@ "additionalProperties": false }, "ServerInformationResponseModel": { + "required": [ + "items" + ], "type": "object", "properties": { "items": { @@ -22963,6 +23548,9 @@ "additionalProperties": false }, "ServerStatusResponseModel": { + "required": [ + "serverStatus" + ], "type": "object", "properties": { "serverStatus": { @@ -22972,6 +23560,9 @@ "additionalProperties": false }, "SetAvatarRequestModel": { + "required": [ + "fileId" + ], "type": "object", "properties": { "fileId": { @@ -22991,6 +23582,9 @@ "additionalProperties": false }, "SnippetItemResponseModel": { + "required": [ + "name" + ], "type": "object", "properties": { "name": { @@ -23000,6 +23594,9 @@ "additionalProperties": false }, "SortingRequestModel": { + "required": [ + "sorting" + ], "type": "object", "properties": { "parentId": { @@ -23048,6 +23645,10 @@ "additionalProperties": false }, "StylesheetOverviewResponseModel": { + "required": [ + "name", + "path" + ], "type": "object", "properties": { "name": { @@ -23078,6 +23679,10 @@ "additionalProperties": false }, "TagResponseModel": { + "required": [ + "id", + "nodeCount" + ], "type": "object", "properties": { "id": { @@ -23108,6 +23713,9 @@ "type": "string" }, "TelemetryRepresentationBaseModel": { + "required": [ + "telemetryLevel" + ], "type": "object", "properties": { "telemetryLevel": { @@ -23135,6 +23743,9 @@ "additionalProperties": false }, "TemplateItemResponseModel": { + "required": [ + "alias" + ], "type": "object", "allOf": [ { @@ -23149,12 +23760,18 @@ "additionalProperties": false }, "TemplateModelBaseModel": { + "required": [ + "alias", + "name" + ], "type": "object", "properties": { "name": { + "minLength": 1, "type": "string" }, "alias": { + "minLength": 1, "type": "string" }, "content": { @@ -23165,12 +23782,19 @@ "additionalProperties": false }, "TemplateQueryExecuteFilterPresentationModel": { + "required": [ + "constraintValue", + "operator", + "propertyAlias" + ], "type": "object", "properties": { "propertyAlias": { + "minLength": 1, "type": "string" }, "constraintValue": { + "minLength": 1, "type": "string" }, "operator": { @@ -23180,6 +23804,9 @@ "additionalProperties": false }, "TemplateQueryExecuteModel": { + "required": [ + "take" + ], "type": "object", "properties": { "rootContentId": { @@ -23218,6 +23845,9 @@ "additionalProperties": false }, "TemplateQueryExecuteSortModel": { + "required": [ + "propertyAlias" + ], "type": "object", "properties": { "propertyAlias": { @@ -23231,6 +23861,10 @@ "additionalProperties": false }, "TemplateQueryOperatorModel": { + "required": [ + "applicableTypes", + "operator" + ], "type": "object", "properties": { "operator": { @@ -23246,6 +23880,10 @@ "additionalProperties": false }, "TemplateQueryPropertyPresentationModel": { + "required": [ + "alias", + "type" + ], "type": "object", "properties": { "alias": { @@ -23266,6 +23904,10 @@ "type": "string" }, "TemplateQueryResultItemPresentationModel": { + "required": [ + "icon", + "name" + ], "type": "object", "properties": { "icon": { @@ -23278,6 +23920,12 @@ "additionalProperties": false }, "TemplateQueryResultResponseModel": { + "required": [ + "executionTime", + "queryExpression", + "resultCount", + "sampleResults" + ], "type": "object", "properties": { "queryExpression": { @@ -23305,6 +23953,11 @@ "additionalProperties": false }, "TemplateQuerySettingsResponseModel": { + "required": [ + "contentTypeAliases", + "operators", + "properties" + ], "type": "object", "properties": { "contentTypeAliases": { @@ -23337,6 +23990,9 @@ "additionalProperties": false }, "TemplateResponseModel": { + "required": [ + "id" + ], "type": "object", "allOf": [ { @@ -23357,15 +24013,23 @@ "additionalProperties": false }, "TemplateScaffoldResponseModel": { + "required": [ + "content" + ], "type": "object", "properties": { "content": { + "minLength": 1, "type": "string" } }, "additionalProperties": false }, "TemporaryFileResponseModel": { + "required": [ + "fileName", + "id" + ], "type": "object", "properties": { "id": { @@ -23378,12 +24042,16 @@ "nullable": true }, "fileName": { + "minLength": 1, "type": "string" } }, "additionalProperties": false }, "TextFileResponseModelBaseModel": { + "required": [ + "path" + ], "type": "object", "allOf": [ { @@ -23392,12 +24060,18 @@ ], "properties": { "path": { + "minLength": 1, "type": "string" } }, "additionalProperties": false }, "TextFileUpdateModel": { + "required": [ + "content", + "existingPath", + "name" + ], "type": "object", "properties": { "name": { @@ -23413,6 +24087,10 @@ "additionalProperties": false }, "TextFileViewModelBaseModel": { + "required": [ + "content", + "name" + ], "type": "object", "properties": { "name": { @@ -23425,6 +24103,11 @@ "additionalProperties": false }, "TourStatusModel": { + "required": [ + "alias", + "completed", + "disabled" + ], "type": "object", "properties": { "alias": { @@ -23440,6 +24123,11 @@ "additionalProperties": false }, "TreeItemPresentationModel": { + "required": [ + "hasChildren", + "name", + "type" + ], "type": "object", "properties": { "name": { @@ -23455,6 +24143,9 @@ "additionalProperties": false }, "UnlockUsersRequestModel": { + "required": [ + "userIds" + ], "type": "object", "properties": { "userIds": { @@ -23479,6 +24170,10 @@ "additionalProperties": false }, "UpdateContentForDocumentRequestModel": { + "required": [ + "values", + "variants" + ], "type": "object", "properties": { "values": { @@ -23505,6 +24200,10 @@ "additionalProperties": false }, "UpdateContentForMediaRequestModel": { + "required": [ + "values", + "variants" + ], "type": "object", "properties": { "values": { @@ -23531,12 +24230,27 @@ "additionalProperties": false }, "UpdateContentTypeForDocumentTypeRequestModel": { + "required": [ + "alias", + "allowedAsRoot", + "allowedContentTypes", + "compositions", + "containers", + "icon", + "isElement", + "name", + "properties", + "variesByCulture", + "variesBySegment" + ], "type": "object", "properties": { "alias": { + "minLength": 1, "type": "string" }, "name": { + "minLength": 1, "type": "string" }, "description": { @@ -23544,6 +24258,7 @@ "nullable": true }, "icon": { + "minLength": 1, "type": "string" }, "allowedAsRoot": { @@ -23602,12 +24317,27 @@ "additionalProperties": false }, "UpdateContentTypeForMediaTypeRequestModel": { + "required": [ + "alias", + "allowedAsRoot", + "allowedContentTypes", + "compositions", + "containers", + "icon", + "isElement", + "name", + "properties", + "variesByCulture", + "variesBySegment" + ], "type": "object", "properties": { "alias": { + "minLength": 1, "type": "string" }, "name": { + "minLength": 1, "type": "string" }, "description": { @@ -23615,6 +24345,7 @@ "nullable": true }, "icon": { + "minLength": 1, "type": "string" }, "allowedAsRoot": { @@ -23691,6 +24422,9 @@ "additionalProperties": false }, "UpdateDocumentNotificationsRequestModel": { + "required": [ + "subscribedActionIds" + ], "type": "object", "properties": { "subscribedActionIds": { @@ -23737,6 +24471,10 @@ "additionalProperties": false }, "UpdateDocumentTypeRequestModel": { + "required": [ + "allowedTemplateIds", + "cleanup" + ], "type": "object", "allOf": [ { @@ -23830,6 +24568,9 @@ "additionalProperties": false }, "UpdatePackageRequestModel": { + "required": [ + "packagePath" + ], "type": "object", "allOf": [ { @@ -23889,6 +24630,9 @@ "additionalProperties": false }, "UpdateTextFileViewModelBaseModel": { + "required": [ + "existingPath" + ], "type": "object", "allOf": [ { @@ -23912,6 +24656,10 @@ "additionalProperties": false }, "UpdateUserGroupsOnUserRequestModel": { + "required": [ + "userGroupIds", + "userIds" + ], "type": "object", "properties": { "userIds": { @@ -23934,6 +24682,11 @@ "additionalProperties": false }, "UpdateUserRequestModel": { + "required": [ + "contentStartNodeIds", + "languageIsoCode", + "mediaStartNodeIds" + ], "type": "object", "allOf": [ { @@ -23964,18 +24717,29 @@ "additionalProperties": false }, "UpgradeSettingsResponseModel": { + "required": [ + "currentState", + "newState", + "newVersion", + "oldVersion", + "reportUrl" + ], "type": "object", "properties": { "currentState": { + "minLength": 1, "type": "string" }, "newState": { + "minLength": 1, "type": "string" }, "newVersion": { + "minLength": 1, "type": "string" }, "oldVersion": { + "minLength": 1, "type": "string" }, "reportUrl": { @@ -23986,6 +24750,15 @@ "additionalProperties": false }, "UserGroupBaseModel": { + "required": [ + "documentRootAccess", + "hasAccessToAllLanguages", + "languages", + "mediaRootAccess", + "name", + "permissions", + "sections" + ], "type": "object", "properties": { "name": { @@ -24052,6 +24825,10 @@ "additionalProperties": false }, "UserGroupResponseModel": { + "required": [ + "id", + "isSystemGroup" + ], "type": "object", "allOf": [ { @@ -24073,7 +24850,8 @@ "required": [ "email", "name", - "password" + "password", + "subscribeToNewsletter" ], "type": "object", "properties": { @@ -24123,6 +24901,10 @@ "type": "string" }, "UserPermissionModel": { + "required": [ + "nodeKey", + "permissions" + ], "type": "object", "properties": { "nodeKey": { @@ -24139,6 +24921,9 @@ "additionalProperties": false }, "UserPermissionsResponseModel": { + "required": [ + "permissions" + ], "type": "object", "properties": { "permissions": { @@ -24155,6 +24940,12 @@ "additionalProperties": false }, "UserPresentationBaseModel": { + "required": [ + "email", + "name", + "userGroupIds", + "userName" + ], "type": "object", "properties": { "email": { @@ -24178,6 +24969,16 @@ "additionalProperties": false }, "UserResponseModel": { + "required": [ + "avatarUrls", + "contentStartNodeIds", + "createDate", + "failedLoginAttempts", + "id", + "mediaStartNodeIds", + "state", + "updateDate" + ], "type": "object", "allOf": [ { @@ -24249,6 +25050,11 @@ "additionalProperties": false }, "UserSettingsModel": { + "required": [ + "consentLevels", + "minCharLength", + "minNonAlphaNumericLength" + ], "type": "object", "properties": { "minCharLength": { @@ -24284,6 +25090,9 @@ "type": "string" }, "UserTourStatusesResponseModel": { + "required": [ + "tourStatuses" + ], "type": "object", "properties": { "tourStatuses": { @@ -24303,6 +25112,9 @@ "additionalProperties": false }, "ValueModelBaseModel": { + "required": [ + "alias" + ], "type": "object", "properties": { "culture": { @@ -24314,6 +25126,7 @@ "nullable": true }, "alias": { + "minLength": 1, "type": "string" }, "value": { @@ -24323,6 +25136,9 @@ "additionalProperties": false }, "VariantModelBaseModel": { + "required": [ + "name" + ], "type": "object", "properties": { "culture": { @@ -24334,12 +25150,18 @@ "nullable": true }, "name": { + "minLength": 1, "type": "string" } }, "additionalProperties": false }, "VariantResponseModelBaseModel": { + "required": [ + "createDate", + "name", + "updateDate" + ], "type": "object", "properties": { "culture": { @@ -24351,6 +25173,7 @@ "nullable": true }, "name": { + "minLength": 1, "type": "string" }, "createDate": { @@ -24365,6 +25188,10 @@ "additionalProperties": false }, "VariantTreeItemModel": { + "required": [ + "name", + "state" + ], "type": "object", "properties": { "name": { @@ -24381,6 +25208,10 @@ "additionalProperties": false }, "VerifyInviteUserRequestModel": { + "required": [ + "token", + "userId" + ], "type": "object", "properties": { "userId": { @@ -24388,12 +25219,17 @@ "format": "uuid" }, "token": { + "minLength": 1, "type": "string" } }, "additionalProperties": false }, "VerifyResetPasswordTokenRequestModel": { + "required": [ + "resetCode", + "userId" + ], "type": "object", "properties": { "userId": { @@ -24401,15 +25237,20 @@ "format": "uuid" }, "resetCode": { + "minLength": 1, "type": "string" } }, "additionalProperties": false }, "VersionResponseModel": { + "required": [ + "version" + ], "type": "object", "properties": { "version": { + "minLength": 1, "type": "string" } }, diff --git a/src/Umbraco.Cms.Api.Management/OpenApi/RequireNonNullablePropertiesSchemaFilter.cs b/src/Umbraco.Cms.Api.Management/OpenApi/RequireNonNullablePropertiesSchemaFilter.cs new file mode 100644 index 0000000000..0d06da8bf6 --- /dev/null +++ b/src/Umbraco.Cms.Api.Management/OpenApi/RequireNonNullablePropertiesSchemaFilter.cs @@ -0,0 +1,21 @@ +using Microsoft.OpenApi.Models; +using Swashbuckle.AspNetCore.SwaggerGen; + +namespace Umbraco.Cms.Api.Management.OpenApi; + +public class RequireNonNullablePropertiesSchemaFilter : ISchemaFilter +{ + /// + /// Add to model.Required all properties where Nullable is false. + /// + public void Apply(OpenApiSchema model, SchemaFilterContext context) + { + var additionalRequiredProps = model.Properties + .Where(x => !x.Value.Nullable && !model.Required.Contains(x.Key)) + .Select(x => x.Key); + foreach (var propKey in additionalRequiredProps) + { + model.Required.Add(propKey); + } + } +} diff --git a/src/Umbraco.Cms.Api.Management/ViewModels/AuditLogs/AuditLogBaseModel.cs b/src/Umbraco.Cms.Api.Management/ViewModels/AuditLogs/AuditLogBaseModel.cs index b946247dd0..0c21f3f95f 100644 --- a/src/Umbraco.Cms.Api.Management/ViewModels/AuditLogs/AuditLogBaseModel.cs +++ b/src/Umbraco.Cms.Api.Management/ViewModels/AuditLogs/AuditLogBaseModel.cs @@ -1,4 +1,5 @@ -using Umbraco.Cms.Core.Models; +using System.ComponentModel.DataAnnotations; +using Umbraco.Cms.Core.Models; namespace Umbraco.Cms.Api.Management.ViewModels.AuditLogs; diff --git a/src/Umbraco.Cms.Api.Management/ViewModels/AuditLogs/AuditLogWithUsernameResponseModel.cs b/src/Umbraco.Cms.Api.Management/ViewModels/AuditLogs/AuditLogWithUsernameResponseModel.cs index d1b0933ae7..f5d940ea72 100644 --- a/src/Umbraco.Cms.Api.Management/ViewModels/AuditLogs/AuditLogWithUsernameResponseModel.cs +++ b/src/Umbraco.Cms.Api.Management/ViewModels/AuditLogs/AuditLogWithUsernameResponseModel.cs @@ -1,4 +1,5 @@ -using Umbraco.Cms.Core.Models; +using System.ComponentModel.DataAnnotations; +using Umbraco.Cms.Core.Models; namespace Umbraco.Cms.Api.Management.ViewModels.AuditLogs; @@ -6,5 +7,5 @@ public class AuditLogWithUsernameResponseModel : AuditLogBaseModel { public string? UserName { get; set; } - public string[]? UserAvatars { get; set; } + public string[] UserAvatars { get; set; } = Array.Empty(); } diff --git a/src/Umbraco.Cms.Api.Management/ViewModels/Content/ContentModelBase.cs b/src/Umbraco.Cms.Api.Management/ViewModels/Content/ContentModelBase.cs index d7e907c2c0..4ba6cba149 100644 --- a/src/Umbraco.Cms.Api.Management/ViewModels/Content/ContentModelBase.cs +++ b/src/Umbraco.Cms.Api.Management/ViewModels/Content/ContentModelBase.cs @@ -4,7 +4,7 @@ public abstract class ContentModelBase where TValueModel : ValueModelBase where TVariantModel : VariantModelBase { - public IEnumerable Values { get; set; } = Array.Empty(); + public IEnumerable Values { get; set; } = Enumerable.Empty(); - public IEnumerable Variants { get; set; } = Array.Empty(); + public IEnumerable Variants { get; set; } = Enumerable.Empty(); } diff --git a/src/Umbraco.Cms.Api.Management/ViewModels/Content/ValueModelBase.cs b/src/Umbraco.Cms.Api.Management/ViewModels/Content/ValueModelBase.cs index 022bc11f34..f40cb469f3 100644 --- a/src/Umbraco.Cms.Api.Management/ViewModels/Content/ValueModelBase.cs +++ b/src/Umbraco.Cms.Api.Management/ViewModels/Content/ValueModelBase.cs @@ -1,4 +1,6 @@ -namespace Umbraco.Cms.Api.Management.ViewModels.Content; +using System.ComponentModel.DataAnnotations; + +namespace Umbraco.Cms.Api.Management.ViewModels.Content; public abstract class ValueModelBase : IHasCultureAndSegment { @@ -6,6 +8,7 @@ public abstract class ValueModelBase : IHasCultureAndSegment public string? Segment { get; set; } + [Required] public string Alias { get; set; } = string.Empty; public object? Value { get; set; } diff --git a/src/Umbraco.Cms.Api.Management/ViewModels/Content/VariantModelBase.cs b/src/Umbraco.Cms.Api.Management/ViewModels/Content/VariantModelBase.cs index c7bff299c4..3cc4a571a0 100644 --- a/src/Umbraco.Cms.Api.Management/ViewModels/Content/VariantModelBase.cs +++ b/src/Umbraco.Cms.Api.Management/ViewModels/Content/VariantModelBase.cs @@ -1,4 +1,6 @@ -namespace Umbraco.Cms.Api.Management.ViewModels.Content; +using System.ComponentModel.DataAnnotations; + +namespace Umbraco.Cms.Api.Management.ViewModels.Content; public abstract class VariantModelBase : IHasCultureAndSegment { @@ -6,5 +8,6 @@ public abstract class VariantModelBase : IHasCultureAndSegment public string? Segment { get; set; } + [Required] public string Name { get; set; } = string.Empty; } diff --git a/src/Umbraco.Cms.Api.Management/ViewModels/ContentType/ContentTypeModelBase.cs b/src/Umbraco.Cms.Api.Management/ViewModels/ContentType/ContentTypeModelBase.cs index 7414968f2e..53f5d66564 100644 --- a/src/Umbraco.Cms.Api.Management/ViewModels/ContentType/ContentTypeModelBase.cs +++ b/src/Umbraco.Cms.Api.Management/ViewModels/ContentType/ContentTypeModelBase.cs @@ -1,15 +1,20 @@ +using System.ComponentModel.DataAnnotations; + namespace Umbraco.Cms.Api.Management.ViewModels.ContentType; public abstract class ContentTypeModelBase where TPropertyType : PropertyTypeModelBase where TPropertyTypeContainer : PropertyTypeContainerModelBase { + [Required] public string Alias { get; set; } = string.Empty; + [Required] public string Name { get; set; } = string.Empty; public string? Description { get; set; } + [Required] public string Icon { get; set; } = string.Empty; public bool AllowedAsRoot { get; set; } @@ -20,11 +25,12 @@ public abstract class ContentTypeModelBase Properties { get; set; } = Array.Empty(); + [Required] + public IEnumerable Properties { get; set; } = Enumerable.Empty(); - public IEnumerable Containers { get; set; } = Array.Empty(); + public IEnumerable Containers { get; set; } = Enumerable.Empty(); - public IEnumerable AllowedContentTypes { get; set; } = Array.Empty(); + public IEnumerable AllowedContentTypes { get; set; } = Enumerable.Empty(); - public IEnumerable Compositions { get; set; } = Array.Empty(); + public IEnumerable Compositions { get; set; } = Enumerable.Empty(); } diff --git a/src/Umbraco.Cms.Api.Management/ViewModels/ContentType/PropertyTypeContainerModelBase.cs b/src/Umbraco.Cms.Api.Management/ViewModels/ContentType/PropertyTypeContainerModelBase.cs index 7a9cc926d4..2d81588315 100644 --- a/src/Umbraco.Cms.Api.Management/ViewModels/ContentType/PropertyTypeContainerModelBase.cs +++ b/src/Umbraco.Cms.Api.Management/ViewModels/ContentType/PropertyTypeContainerModelBase.cs @@ -1,3 +1,5 @@ +using System.ComponentModel.DataAnnotations; + namespace Umbraco.Cms.Api.Management.ViewModels.ContentType; public abstract class PropertyTypeContainerModelBase @@ -9,6 +11,7 @@ public abstract class PropertyTypeContainerModelBase public string? Name { get; set; } // NOTE: This needs to be a string because it can be anything in the future (= not necessarily limited to "tab" or "group") + [Required] public string Type { get; set; } = string.Empty; public int SortOrder { get; set; } diff --git a/src/Umbraco.Cms.Api.Management/ViewModels/ContentType/PropertyTypeModelBase.cs b/src/Umbraco.Cms.Api.Management/ViewModels/ContentType/PropertyTypeModelBase.cs index 5bce45087e..85e53c0f85 100644 --- a/src/Umbraco.Cms.Api.Management/ViewModels/ContentType/PropertyTypeModelBase.cs +++ b/src/Umbraco.Cms.Api.Management/ViewModels/ContentType/PropertyTypeModelBase.cs @@ -1,3 +1,5 @@ +using System.ComponentModel.DataAnnotations; + namespace Umbraco.Cms.Api.Management.ViewModels.ContentType; public abstract class PropertyTypeModelBase @@ -8,8 +10,10 @@ public abstract class PropertyTypeModelBase public int SortOrder { get; set; } + [Required] public string Alias { get; set; } = string.Empty; + [Required] public string Name { get; set; } = string.Empty; public string? Description { get; set; } diff --git a/src/Umbraco.Cms.Api.Management/ViewModels/Culture/CultureReponseModel.cs b/src/Umbraco.Cms.Api.Management/ViewModels/Culture/CultureReponseModel.cs index 8ddd91754f..2322851d1e 100644 --- a/src/Umbraco.Cms.Api.Management/ViewModels/Culture/CultureReponseModel.cs +++ b/src/Umbraco.Cms.Api.Management/ViewModels/Culture/CultureReponseModel.cs @@ -1,8 +1,12 @@ -namespace Umbraco.Cms.Api.Management.ViewModels.Culture; +using System.ComponentModel.DataAnnotations; + +namespace Umbraco.Cms.Api.Management.ViewModels.Culture; public class CultureReponseModel { - public string Name { get; set; } = null!; + [Required] + public string Name { get; set; } = string.Empty; - public string EnglishName { get; set; } = null!; + [Required] + public string EnglishName { get; set; } = string.Empty; } diff --git a/src/Umbraco.Cms.Api.Management/ViewModels/DataType/DataTypeModelBase.cs b/src/Umbraco.Cms.Api.Management/ViewModels/DataType/DataTypeModelBase.cs index 182736b9f4..dca2958b81 100644 --- a/src/Umbraco.Cms.Api.Management/ViewModels/DataType/DataTypeModelBase.cs +++ b/src/Umbraco.Cms.Api.Management/ViewModels/DataType/DataTypeModelBase.cs @@ -1,12 +1,16 @@ -namespace Umbraco.Cms.Api.Management.ViewModels.DataType; +using System.ComponentModel.DataAnnotations; + +namespace Umbraco.Cms.Api.Management.ViewModels.DataType; public abstract class DataTypeModelBase { + [Required] public string Name { get; set; } = string.Empty; + [Required] public string EditorAlias { get; set; } = string.Empty; public string? EditorUiAlias { get; set; } - public IEnumerable Values { get; set; } = null!; + public IEnumerable Values { get; set; } = Enumerable.Empty(); } diff --git a/src/Umbraco.Cms.Api.Management/ViewModels/Dictionary/DictionaryItemModelBase.cs b/src/Umbraco.Cms.Api.Management/ViewModels/Dictionary/DictionaryItemModelBase.cs index ebdf72fa30..24aaaefa9c 100644 --- a/src/Umbraco.Cms.Api.Management/ViewModels/Dictionary/DictionaryItemModelBase.cs +++ b/src/Umbraco.Cms.Api.Management/ViewModels/Dictionary/DictionaryItemModelBase.cs @@ -1,8 +1,11 @@ -namespace Umbraco.Cms.Api.Management.ViewModels.Dictionary; +using System.ComponentModel.DataAnnotations; + +namespace Umbraco.Cms.Api.Management.ViewModels.Dictionary; public class DictionaryItemModelBase { - public string Name { get; set; } = null!; + [Required] + public string Name { get; set; } = string.Empty; - public IEnumerable Translations { get; set; } = Array.Empty(); + public IEnumerable Translations { get; set; } = Enumerable.Empty(); } diff --git a/src/Umbraco.Cms.Api.Management/ViewModels/Dictionary/DictionaryItemTranslationModel.cs b/src/Umbraco.Cms.Api.Management/ViewModels/Dictionary/DictionaryItemTranslationModel.cs index 57d08380b2..e71760fcf9 100644 --- a/src/Umbraco.Cms.Api.Management/ViewModels/Dictionary/DictionaryItemTranslationModel.cs +++ b/src/Umbraco.Cms.Api.Management/ViewModels/Dictionary/DictionaryItemTranslationModel.cs @@ -1,8 +1,12 @@ -namespace Umbraco.Cms.Api.Management.ViewModels.Dictionary; +using System.ComponentModel.DataAnnotations; + +namespace Umbraco.Cms.Api.Management.ViewModels.Dictionary; public class DictionaryItemTranslationModel { + [Required] public string IsoCode { get; set; } = string.Empty; + [Required] public string Translation { get; set; } = string.Empty; } diff --git a/src/Umbraco.Cms.Api.Management/ViewModels/Dictionary/DictionaryOverviewResponseModel.cs b/src/Umbraco.Cms.Api.Management/ViewModels/Dictionary/DictionaryOverviewResponseModel.cs index 6a185ac559..6149aeb75d 100644 --- a/src/Umbraco.Cms.Api.Management/ViewModels/Dictionary/DictionaryOverviewResponseModel.cs +++ b/src/Umbraco.Cms.Api.Management/ViewModels/Dictionary/DictionaryOverviewResponseModel.cs @@ -20,5 +20,5 @@ public class DictionaryOverviewResponseModel /// /// Sets the translations. /// - public IEnumerable TranslatedIsoCodes { get; set; } = Array.Empty(); + public IEnumerable TranslatedIsoCodes { get; set; } = Enumerable.Empty(); } diff --git a/src/Umbraco.Cms.Api.Management/ViewModels/Dictionary/UploadDictionaryResponseModel.cs b/src/Umbraco.Cms.Api.Management/ViewModels/Dictionary/UploadDictionaryResponseModel.cs index 102fed5d1c..dc80be2e65 100644 --- a/src/Umbraco.Cms.Api.Management/ViewModels/Dictionary/UploadDictionaryResponseModel.cs +++ b/src/Umbraco.Cms.Api.Management/ViewModels/Dictionary/UploadDictionaryResponseModel.cs @@ -2,7 +2,7 @@ public class UploadDictionaryResponseModel { - public IEnumerable DictionaryItems { get; set; } = Array.Empty(); + public IEnumerable DictionaryItems { get; set; } = Enumerable.Empty(); public string? FileName { get; set; } } diff --git a/src/Umbraco.Cms.Api.Management/ViewModels/Document/DocumentResponseModel.cs b/src/Umbraco.Cms.Api.Management/ViewModels/Document/DocumentResponseModel.cs index a453f7f11e..3443095455 100644 --- a/src/Umbraco.Cms.Api.Management/ViewModels/Document/DocumentResponseModel.cs +++ b/src/Umbraco.Cms.Api.Management/ViewModels/Document/DocumentResponseModel.cs @@ -6,7 +6,7 @@ namespace Umbraco.Cms.Api.Management.ViewModels.Document; [ShortGenericSchemaName("ContentForDocumentResponseModel")] public class DocumentResponseModel : ContentResponseModelBase { - public IEnumerable Urls { get; set; } = Array.Empty(); + public IEnumerable Urls { get; set; } = Enumerable.Empty(); public Guid? TemplateId { get; set; } diff --git a/src/Umbraco.Cms.Api.Management/ViewModels/DocumentType/CreateDocumentTypeRequestModel.cs b/src/Umbraco.Cms.Api.Management/ViewModels/DocumentType/CreateDocumentTypeRequestModel.cs index 0a83145e25..feffd076cd 100644 --- a/src/Umbraco.Cms.Api.Management/ViewModels/DocumentType/CreateDocumentTypeRequestModel.cs +++ b/src/Umbraco.Cms.Api.Management/ViewModels/DocumentType/CreateDocumentTypeRequestModel.cs @@ -7,7 +7,7 @@ namespace Umbraco.Cms.Api.Management.ViewModels.DocumentType; public class CreateDocumentTypeRequestModel : CreateContentTypeRequestModelBase { - public IEnumerable AllowedTemplateIds { get; set; } = Array.Empty(); + public IEnumerable AllowedTemplateIds { get; set; } = Enumerable.Empty(); public Guid? DefaultTemplateId { get; set; } diff --git a/src/Umbraco.Cms.Api.Management/ViewModels/DocumentType/DocumentTypeResponseModel.cs b/src/Umbraco.Cms.Api.Management/ViewModels/DocumentType/DocumentTypeResponseModel.cs index 211679337f..18031352d6 100644 --- a/src/Umbraco.Cms.Api.Management/ViewModels/DocumentType/DocumentTypeResponseModel.cs +++ b/src/Umbraco.Cms.Api.Management/ViewModels/DocumentType/DocumentTypeResponseModel.cs @@ -6,7 +6,7 @@ namespace Umbraco.Cms.Api.Management.ViewModels.DocumentType; [ShortGenericSchemaName("ContentTypeForDocumentTypeResponseModel")] public class DocumentTypeResponseModel : ContentTypeResponseModelBase { - public IEnumerable AllowedTemplateIds { get; set; } = Array.Empty(); + public IEnumerable AllowedTemplateIds { get; set; } = Enumerable.Empty(); public Guid? DefaultTemplateId { get; set; } diff --git a/src/Umbraco.Cms.Api.Management/ViewModels/DocumentType/UpdateDocumentTypeRequestModel.cs b/src/Umbraco.Cms.Api.Management/ViewModels/DocumentType/UpdateDocumentTypeRequestModel.cs index 27650fd6d0..54920561d8 100644 --- a/src/Umbraco.Cms.Api.Management/ViewModels/DocumentType/UpdateDocumentTypeRequestModel.cs +++ b/src/Umbraco.Cms.Api.Management/ViewModels/DocumentType/UpdateDocumentTypeRequestModel.cs @@ -7,7 +7,7 @@ namespace Umbraco.Cms.Api.Management.ViewModels.DocumentType; public class UpdateDocumentTypeRequestModel : UpdateContentTypeRequestModelBase { - public IEnumerable AllowedTemplateIds { get; set; } = Array.Empty(); + public IEnumerable AllowedTemplateIds { get; set; } = Enumerable.Empty(); public Guid? DefaultTemplateId { get; set; } diff --git a/src/Umbraco.Cms.Api.Management/ViewModels/DynamicRoot/DynamicRootRequestModel.cs b/src/Umbraco.Cms.Api.Management/ViewModels/DynamicRoot/DynamicRootRequestModel.cs new file mode 100644 index 0000000000..cf0c171485 --- /dev/null +++ b/src/Umbraco.Cms.Api.Management/ViewModels/DynamicRoot/DynamicRootRequestModel.cs @@ -0,0 +1,6 @@ +namespace Umbraco.Cms.Api.Management.ViewModels.DynamicRoot; + +public class DynamicRootRequestModel +{ + +} diff --git a/src/Umbraco.Cms.Api.Management/ViewModels/DynamicRoot/DynamicRootResponseModel.cs b/src/Umbraco.Cms.Api.Management/ViewModels/DynamicRoot/DynamicRootResponseModel.cs new file mode 100644 index 0000000000..1ec4127119 --- /dev/null +++ b/src/Umbraco.Cms.Api.Management/ViewModels/DynamicRoot/DynamicRootResponseModel.cs @@ -0,0 +1,6 @@ +namespace Umbraco.Cms.Api.Management.ViewModels.DynamicRoot; + +public class DynamicRootResponseModel +{ + public IEnumerable Roots { get; set; } = Enumerable.Empty(); +} diff --git a/src/Umbraco.Cms.Api.Management/ViewModels/Folder/FolderModelBase.cs b/src/Umbraco.Cms.Api.Management/ViewModels/Folder/FolderModelBase.cs index 89887b4dc5..47e724a1ac 100644 --- a/src/Umbraco.Cms.Api.Management/ViewModels/Folder/FolderModelBase.cs +++ b/src/Umbraco.Cms.Api.Management/ViewModels/Folder/FolderModelBase.cs @@ -1,6 +1,9 @@ -namespace Umbraco.Cms.Api.Management.ViewModels.Folder; +using System.ComponentModel.DataAnnotations; + +namespace Umbraco.Cms.Api.Management.ViewModels.Folder; public class FolderModelBase { + [Required] public string Name { get; set; } = string.Empty; } diff --git a/src/Umbraco.Cms.Api.Management/ViewModels/Installer/ConsentLevelPresentationModel.cs b/src/Umbraco.Cms.Api.Management/ViewModels/Installer/ConsentLevelPresentationModel.cs index b8ff312e48..072e5229e7 100644 --- a/src/Umbraco.Cms.Api.Management/ViewModels/Installer/ConsentLevelPresentationModel.cs +++ b/src/Umbraco.Cms.Api.Management/ViewModels/Installer/ConsentLevelPresentationModel.cs @@ -1,3 +1,4 @@ +using System.ComponentModel.DataAnnotations; using System.Text.Json.Serialization; using Umbraco.Cms.Core.Models; @@ -8,5 +9,6 @@ public class ConsentLevelPresentationModel [JsonConverter(typeof(JsonStringEnumConverter))] public TelemetryLevel Level { get; set; } + [Required] public string Description { get; set; } = string.Empty; } diff --git a/src/Umbraco.Cms.Api.Management/ViewModels/Installer/DatabaseSettingsPresentationModel.cs b/src/Umbraco.Cms.Api.Management/ViewModels/Installer/DatabaseSettingsPresentationModel.cs index c9628c4384..cb1fe33a4f 100644 --- a/src/Umbraco.Cms.Api.Management/ViewModels/Installer/DatabaseSettingsPresentationModel.cs +++ b/src/Umbraco.Cms.Api.Management/ViewModels/Installer/DatabaseSettingsPresentationModel.cs @@ -1,3 +1,5 @@ +using System.ComponentModel.DataAnnotations; + namespace Umbraco.Cms.Api.Management.ViewModels.Installer; public class DatabaseSettingsPresentationModel @@ -6,16 +8,20 @@ public class DatabaseSettingsPresentationModel public int SortOrder { get; set; } + [Required] public string DisplayName { get; set; } = string.Empty; + [Required] public string DefaultDatabaseName { get; set; } = string.Empty; + [Required] public string ProviderName { get; set; } = string.Empty; public bool IsConfigured { get; set; } public bool RequiresServer { get; set; } + [Required] public string ServerPlaceholder { get; set; } = string.Empty; public bool RequiresCredentials { get; set; } diff --git a/src/Umbraco.Cms.Api.Management/ViewModels/Installer/InstallSettingsResponseModel.cs b/src/Umbraco.Cms.Api.Management/ViewModels/Installer/InstallSettingsResponseModel.cs index 710f6136c6..e492c92eb3 100644 --- a/src/Umbraco.Cms.Api.Management/ViewModels/Installer/InstallSettingsResponseModel.cs +++ b/src/Umbraco.Cms.Api.Management/ViewModels/Installer/InstallSettingsResponseModel.cs @@ -1,7 +1,10 @@ +using System.ComponentModel.DataAnnotations; + namespace Umbraco.Cms.Api.Management.ViewModels.Installer; public class InstallSettingsResponseModel { + [Required] public UserSettingsViewModel User { get; set; } = null!; public IEnumerable Databases { get; set; } = Enumerable.Empty(); diff --git a/src/Umbraco.Cms.Api.Management/ViewModels/Installer/UpgradeSettingsResponseModel.cs b/src/Umbraco.Cms.Api.Management/ViewModels/Installer/UpgradeSettingsResponseModel.cs index 2ff0d52d48..6b1eea2d78 100644 --- a/src/Umbraco.Cms.Api.Management/ViewModels/Installer/UpgradeSettingsResponseModel.cs +++ b/src/Umbraco.Cms.Api.Management/ViewModels/Installer/UpgradeSettingsResponseModel.cs @@ -1,13 +1,19 @@ -namespace Umbraco.Cms.Api.Management.ViewModels.Installer; +using System.ComponentModel.DataAnnotations; + +namespace Umbraco.Cms.Api.Management.ViewModels.Installer; public class UpgradeSettingsResponseModel { + [Required] public string CurrentState { get; set; } = string.Empty; + [Required] public string NewState { get; set; } = string.Empty; + [Required] public string NewVersion { get; set; } = string.Empty; + [Required] public string OldVersion { get; set; } = string.Empty; public string ReportUrl => diff --git a/src/Umbraco.Cms.Api.Management/ViewModels/Installer/UserInstallResponseModel.cs b/src/Umbraco.Cms.Api.Management/ViewModels/Installer/UserInstallResponseModel.cs index 29943de035..8a7bdf4163 100644 --- a/src/Umbraco.Cms.Api.Management/ViewModels/Installer/UserInstallResponseModel.cs +++ b/src/Umbraco.Cms.Api.Management/ViewModels/Installer/UserInstallResponseModel.cs @@ -7,15 +7,15 @@ public class UserInstallResponseModel { [Required] [StringLength(255)] - public string Name { get; set; } = null!; + public string Name { get; set; } = string.Empty; [Required] [EmailAddress] - public string Email { get; set; } = null!; + public string Email { get; set; } = string.Empty; [Required] [PasswordPropertyText] - public string Password { get; set; } = null!; + public string Password { get; set; } = string.Empty; public bool SubscribeToNewsletter { get; } } diff --git a/src/Umbraco.Cms.Api.Management/ViewModels/JsonPatch/JsonPatchViewModel.cs b/src/Umbraco.Cms.Api.Management/ViewModels/JsonPatch/JsonPatchViewModel.cs index ecba170d4e..83861cf990 100644 --- a/src/Umbraco.Cms.Api.Management/ViewModels/JsonPatch/JsonPatchViewModel.cs +++ b/src/Umbraco.Cms.Api.Management/ViewModels/JsonPatch/JsonPatchViewModel.cs @@ -1,10 +1,15 @@ -namespace Umbraco.Cms.Api.Management.ViewModels.JsonPatch; +using System.ComponentModel.DataAnnotations; + +namespace Umbraco.Cms.Api.Management.ViewModels.JsonPatch; public class JsonPatchViewModel { - public string Op { get; set; } = null!; + [Required] + public string Op { get; set; } = string.Empty; - public string Path { get; set; } = null!; + [Required] + public string Path { get; set; } = string.Empty; + [Required] public object Value { get; set; } = null!; } diff --git a/src/Umbraco.Cms.Api.Management/ViewModels/Language/CreateLanguageRequestModel.cs b/src/Umbraco.Cms.Api.Management/ViewModels/Language/CreateLanguageRequestModel.cs index 0a0fe74c5b..f25f1e98a2 100644 --- a/src/Umbraco.Cms.Api.Management/ViewModels/Language/CreateLanguageRequestModel.cs +++ b/src/Umbraco.Cms.Api.Management/ViewModels/Language/CreateLanguageRequestModel.cs @@ -1,6 +1,9 @@ -namespace Umbraco.Cms.Api.Management.ViewModels.Language; +using System.ComponentModel.DataAnnotations; + +namespace Umbraco.Cms.Api.Management.ViewModels.Language; public class CreateLanguageRequestModel : LanguageModelBase { + [Required] public string IsoCode { get; set; } = string.Empty; } diff --git a/src/Umbraco.Cms.Api.Management/ViewModels/Language/Item/LanguageItemResponseModel.cs b/src/Umbraco.Cms.Api.Management/ViewModels/Language/Item/LanguageItemResponseModel.cs index 00ed838299..02038d7c09 100644 --- a/src/Umbraco.Cms.Api.Management/ViewModels/Language/Item/LanguageItemResponseModel.cs +++ b/src/Umbraco.Cms.Api.Management/ViewModels/Language/Item/LanguageItemResponseModel.cs @@ -1,8 +1,12 @@ -namespace Umbraco.Cms.Api.Management.ViewModels.Language.Item; +using System.ComponentModel.DataAnnotations; + +namespace Umbraco.Cms.Api.Management.ViewModels.Language.Item; public class LanguageItemResponseModel { + [Required] public string Name { get; set; } = string.Empty; + [Required] public string IsoCode { get; set; } = string.Empty; } diff --git a/src/Umbraco.Cms.Api.Management/ViewModels/Language/LanguageModelBase.cs b/src/Umbraco.Cms.Api.Management/ViewModels/Language/LanguageModelBase.cs index 4083f1ebfe..db288316a1 100644 --- a/src/Umbraco.Cms.Api.Management/ViewModels/Language/LanguageModelBase.cs +++ b/src/Umbraco.Cms.Api.Management/ViewModels/Language/LanguageModelBase.cs @@ -1,7 +1,10 @@ -namespace Umbraco.Cms.Api.Management.ViewModels.Language; +using System.ComponentModel.DataAnnotations; + +namespace Umbraco.Cms.Api.Management.ViewModels.Language; public class LanguageModelBase { + [Required] public string Name { get; set; } = string.Empty; public bool IsDefault { get; set; } diff --git a/src/Umbraco.Cms.Api.Management/ViewModels/Language/LanguageResponseModel.cs b/src/Umbraco.Cms.Api.Management/ViewModels/Language/LanguageResponseModel.cs index ceb132fb8e..c90bb2ac14 100644 --- a/src/Umbraco.Cms.Api.Management/ViewModels/Language/LanguageResponseModel.cs +++ b/src/Umbraco.Cms.Api.Management/ViewModels/Language/LanguageResponseModel.cs @@ -1,6 +1,9 @@ -namespace Umbraco.Cms.Api.Management.ViewModels.Language; +using System.ComponentModel.DataAnnotations; + +namespace Umbraco.Cms.Api.Management.ViewModels.Language; public class LanguageResponseModel : LanguageModelBase { + [Required] public string IsoCode { get; set; } = string.Empty; } diff --git a/src/Umbraco.Cms.Api.Management/ViewModels/LogViewer/LogMessageResponseModel.cs b/src/Umbraco.Cms.Api.Management/ViewModels/LogViewer/LogMessageResponseModel.cs index cd798a35df..8b4d2faa5c 100644 --- a/src/Umbraco.Cms.Api.Management/ViewModels/LogViewer/LogMessageResponseModel.cs +++ b/src/Umbraco.Cms.Api.Management/ViewModels/LogViewer/LogMessageResponseModel.cs @@ -27,7 +27,7 @@ public class LogMessageResponseModel /// /// Gets or sets the properties associated with the log event, including those presented in MessageTemplate. /// - public IEnumerable Properties { get; set; } = null!; + public IEnumerable Properties { get; set; } = Enumerable.Empty(); /// /// Gets or sets an exception associated with the log event (can be null). diff --git a/src/Umbraco.Cms.Api.Management/ViewModels/Media/MediaResponseModel.cs b/src/Umbraco.Cms.Api.Management/ViewModels/Media/MediaResponseModel.cs index e1f044e561..56de794a4f 100644 --- a/src/Umbraco.Cms.Api.Management/ViewModels/Media/MediaResponseModel.cs +++ b/src/Umbraco.Cms.Api.Management/ViewModels/Media/MediaResponseModel.cs @@ -4,7 +4,7 @@ namespace Umbraco.Cms.Api.Management.ViewModels.Media; public class MediaResponseModel : ContentResponseModelBase { - public IEnumerable Urls { get; set; } = Array.Empty(); + public IEnumerable Urls { get; set; } = Enumerable.Empty(); public bool IsTrashed { get; set; } } diff --git a/src/Umbraco.Cms.Api.Management/ViewModels/Media/item/MediaTreeItemResponseModel.cs b/src/Umbraco.Cms.Api.Management/ViewModels/Media/item/MediaTreeItemResponseModel.cs index 5dfc24d31e..12645b5c6b 100644 --- a/src/Umbraco.Cms.Api.Management/ViewModels/Media/item/MediaTreeItemResponseModel.cs +++ b/src/Umbraco.Cms.Api.Management/ViewModels/Media/item/MediaTreeItemResponseModel.cs @@ -1,8 +1,10 @@ -using Umbraco.Cms.Api.Management.ViewModels.Tree; +using System.ComponentModel.DataAnnotations; +using Umbraco.Cms.Api.Management.ViewModels.Tree; namespace Umbraco.Cms.Api.Management.ViewModels.Media.Item; public class MediaTreeItemResponseModel : ContentTreeItemResponseModel { + [Required] public string Icon { get; set; } = string.Empty; } diff --git a/src/Umbraco.Cms.Api.Management/ViewModels/Package/PackageManifestResponseModel.cs b/src/Umbraco.Cms.Api.Management/ViewModels/Package/PackageManifestResponseModel.cs index 04b0db4dd7..eacbce1221 100644 --- a/src/Umbraco.Cms.Api.Management/ViewModels/Package/PackageManifestResponseModel.cs +++ b/src/Umbraco.Cms.Api.Management/ViewModels/Package/PackageManifestResponseModel.cs @@ -1,7 +1,10 @@ -namespace Umbraco.Cms.Api.Management.ViewModels.Package; +using System.ComponentModel.DataAnnotations; + +namespace Umbraco.Cms.Api.Management.ViewModels.Package; public class PackageManifestResponseModel { + [Required] public string Name { get; set; } = string.Empty; public string? Version { get; set; } diff --git a/src/Umbraco.Cms.Api.Management/ViewModels/RecycleBin/RecycleBinItemResponseModel.cs b/src/Umbraco.Cms.Api.Management/ViewModels/RecycleBin/RecycleBinItemResponseModel.cs index e0d5edc14d..de9f925a21 100644 --- a/src/Umbraco.Cms.Api.Management/ViewModels/RecycleBin/RecycleBinItemResponseModel.cs +++ b/src/Umbraco.Cms.Api.Management/ViewModels/RecycleBin/RecycleBinItemResponseModel.cs @@ -1,17 +1,25 @@ -namespace Umbraco.Cms.Api.Management.ViewModels.RecycleBin; +using System.ComponentModel.DataAnnotations; + +namespace Umbraco.Cms.Api.Management.ViewModels.RecycleBin; public class RecycleBinItemResponseModel : INamedEntityPresentationModel { + [Required] public Guid Id { get; set; } + [Required] public string Name { get; set; } = string.Empty; + [Required] public string Type { get; set; } = string.Empty; + [Required] public string Icon { get; set; } = string.Empty; + [Required] public bool HasChildren { get; set; } + [Required] public bool IsContainer { get; set; } public Guid? ParentId { get; set; } diff --git a/src/Umbraco.Cms.Api.Management/ViewModels/RelationType/RelationTypeBaseModel.cs b/src/Umbraco.Cms.Api.Management/ViewModels/RelationType/RelationTypeBaseModel.cs index 221be13fd8..cae7e1e9a9 100644 --- a/src/Umbraco.Cms.Api.Management/ViewModels/RelationType/RelationTypeBaseModel.cs +++ b/src/Umbraco.Cms.Api.Management/ViewModels/RelationType/RelationTypeBaseModel.cs @@ -1,10 +1,13 @@ -namespace Umbraco.Cms.Api.Management.ViewModels.RelationType; +using System.ComponentModel.DataAnnotations; + +namespace Umbraco.Cms.Api.Management.ViewModels.RelationType; public class RelationTypeBaseModel { /// /// Gets or sets the name of the model. /// + [Required] public string Name { get; set; } = string.Empty; /// diff --git a/src/Umbraco.Cms.Api.Management/ViewModels/RelationType/RelationTypeResponseModel.cs b/src/Umbraco.Cms.Api.Management/ViewModels/RelationType/RelationTypeResponseModel.cs index 848bcfc850..94827421e0 100644 --- a/src/Umbraco.Cms.Api.Management/ViewModels/RelationType/RelationTypeResponseModel.cs +++ b/src/Umbraco.Cms.Api.Management/ViewModels/RelationType/RelationTypeResponseModel.cs @@ -1,4 +1,6 @@ -namespace Umbraco.Cms.Api.Management.ViewModels.RelationType; +using System.ComponentModel.DataAnnotations; + +namespace Umbraco.Cms.Api.Management.ViewModels.RelationType; public class RelationTypeResponseModel : RelationTypeBaseModel { @@ -6,6 +8,7 @@ public class RelationTypeResponseModel : RelationTypeBaseModel public string? Alias { get; set; } + [Required] public string Path { get; set; } = string.Empty; public bool IsSystemRelationType { get; set; } diff --git a/src/Umbraco.Cms.Api.Management/ViewModels/Searcher/SearchResultResponseModel.cs b/src/Umbraco.Cms.Api.Management/ViewModels/Searcher/SearchResultResponseModel.cs index 8569f91247..c05f996d60 100644 --- a/src/Umbraco.Cms.Api.Management/ViewModels/Searcher/SearchResultResponseModel.cs +++ b/src/Umbraco.Cms.Api.Management/ViewModels/Searcher/SearchResultResponseModel.cs @@ -1,12 +1,15 @@ -namespace Umbraco.Cms.Api.Management.ViewModels.Searcher; +using System.ComponentModel.DataAnnotations; + +namespace Umbraco.Cms.Api.Management.ViewModels.Searcher; public class SearchResultResponseModel { - public string Id { get; set; } = null!; + [Required] + public string Id { get; set; } = string.Empty; public float Score { get; set; } public int FieldCount => Fields.Count(); - public IEnumerable Fields { get; set; } = null!; + public IEnumerable Fields { get; set; } = Enumerable.Empty(); } diff --git a/src/Umbraco.Cms.Api.Management/ViewModels/Searcher/SearcherResponse.cs b/src/Umbraco.Cms.Api.Management/ViewModels/Searcher/SearcherResponse.cs index 6ac186721b..da99bfec1d 100644 --- a/src/Umbraco.Cms.Api.Management/ViewModels/Searcher/SearcherResponse.cs +++ b/src/Umbraco.Cms.Api.Management/ViewModels/Searcher/SearcherResponse.cs @@ -1,6 +1,9 @@ -namespace Umbraco.Cms.Api.Management.ViewModels.Searcher; +using System.ComponentModel.DataAnnotations; + +namespace Umbraco.Cms.Api.Management.ViewModels.Searcher; public class SearcherResponse { - public string Name { get; set; } = null!; + [Required] + public string Name { get; set; } = string.Empty; } diff --git a/src/Umbraco.Cms.Api.Management/ViewModels/Security/ResetPasswordRequestModel.cs b/src/Umbraco.Cms.Api.Management/ViewModels/Security/ResetPasswordRequestModel.cs index 038d3867c0..59c7ccc497 100644 --- a/src/Umbraco.Cms.Api.Management/ViewModels/Security/ResetPasswordRequestModel.cs +++ b/src/Umbraco.Cms.Api.Management/ViewModels/Security/ResetPasswordRequestModel.cs @@ -1,6 +1,9 @@ +using System.ComponentModel.DataAnnotations; + namespace Umbraco.Cms.Api.Management.ViewModels.Security; public class ResetPasswordRequestModel { + [Required] public string Email { get; set; } = string.Empty; } diff --git a/src/Umbraco.Cms.Api.Management/ViewModels/Security/ResetPasswordTokenRequestModel.cs b/src/Umbraco.Cms.Api.Management/ViewModels/Security/ResetPasswordTokenRequestModel.cs index fee30b6caa..04276bce01 100644 --- a/src/Umbraco.Cms.Api.Management/ViewModels/Security/ResetPasswordTokenRequestModel.cs +++ b/src/Umbraco.Cms.Api.Management/ViewModels/Security/ResetPasswordTokenRequestModel.cs @@ -1,6 +1,9 @@ +using System.ComponentModel.DataAnnotations; + namespace Umbraco.Cms.Api.Management.ViewModels.Security; public class ResetPasswordTokenRequestModel : VerifyResetPasswordTokenRequestModel { + [Required] public string Password { get; set; } = string.Empty; } diff --git a/src/Umbraco.Cms.Api.Management/ViewModels/Security/VerifyResetPasswordTokenRequestModel.cs b/src/Umbraco.Cms.Api.Management/ViewModels/Security/VerifyResetPasswordTokenRequestModel.cs index 3d7bec94d3..3ba5f71a6a 100644 --- a/src/Umbraco.Cms.Api.Management/ViewModels/Security/VerifyResetPasswordTokenRequestModel.cs +++ b/src/Umbraco.Cms.Api.Management/ViewModels/Security/VerifyResetPasswordTokenRequestModel.cs @@ -1,7 +1,10 @@ +using System.ComponentModel.DataAnnotations; + namespace Umbraco.Cms.Api.Management.ViewModels.Security; public class VerifyResetPasswordTokenRequestModel { public Guid UserId { get; set; } + [Required] public string ResetCode { get; set; } = string.Empty; } diff --git a/src/Umbraco.Cms.Api.Management/ViewModels/Server/VersionResponseModel.cs b/src/Umbraco.Cms.Api.Management/ViewModels/Server/VersionResponseModel.cs index 7473487c41..f53e8f17d0 100644 --- a/src/Umbraco.Cms.Api.Management/ViewModels/Server/VersionResponseModel.cs +++ b/src/Umbraco.Cms.Api.Management/ViewModels/Server/VersionResponseModel.cs @@ -1,6 +1,9 @@ -namespace Umbraco.Cms.Api.Management.ViewModels.Server; +using System.ComponentModel.DataAnnotations; + +namespace Umbraco.Cms.Api.Management.ViewModels.Server; public class VersionResponseModel { - public string Version { get; set; } = null!; + [Required] + public string Version { get; set; } = string.Empty; } diff --git a/src/Umbraco.Cms.Api.Management/ViewModels/Template/Query/TemplateQueryExecuteFilterPresentationModel.cs b/src/Umbraco.Cms.Api.Management/ViewModels/Template/Query/TemplateQueryExecuteFilterPresentationModel.cs index 92888c170e..c15dcc83f2 100644 --- a/src/Umbraco.Cms.Api.Management/ViewModels/Template/Query/TemplateQueryExecuteFilterPresentationModel.cs +++ b/src/Umbraco.Cms.Api.Management/ViewModels/Template/Query/TemplateQueryExecuteFilterPresentationModel.cs @@ -1,11 +1,14 @@ -using Umbraco.Cms.Core.Models.TemplateQuery; +using System.ComponentModel.DataAnnotations; +using Umbraco.Cms.Core.Models.TemplateQuery; namespace Umbraco.Cms.Api.Management.ViewModels.Template.Query; public class TemplateQueryExecuteFilterPresentationModel { + [Required] public string PropertyAlias { get; set; } = string.Empty; + [Required] public string ConstraintValue { get; set; } = string.Empty; public Operator Operator { get; set; } diff --git a/src/Umbraco.Cms.Api.Management/ViewModels/Template/TemplateModelBase.cs b/src/Umbraco.Cms.Api.Management/ViewModels/Template/TemplateModelBase.cs index 43808b8989..ba820c36f6 100644 --- a/src/Umbraco.Cms.Api.Management/ViewModels/Template/TemplateModelBase.cs +++ b/src/Umbraco.Cms.Api.Management/ViewModels/Template/TemplateModelBase.cs @@ -1,9 +1,13 @@ -namespace Umbraco.Cms.Api.Management.ViewModels.Template; +using System.ComponentModel.DataAnnotations; + +namespace Umbraco.Cms.Api.Management.ViewModels.Template; public class TemplateModelBase { + [Required] public string Name { get; set; } = string.Empty; + [Required] public string Alias { get; set; } = string.Empty; public string? Content { get; set; } diff --git a/src/Umbraco.Cms.Api.Management/ViewModels/Template/TemplateScaffoldResponseModel.cs b/src/Umbraco.Cms.Api.Management/ViewModels/Template/TemplateScaffoldResponseModel.cs index d60098ed3b..39f9a4dd2f 100644 --- a/src/Umbraco.Cms.Api.Management/ViewModels/Template/TemplateScaffoldResponseModel.cs +++ b/src/Umbraco.Cms.Api.Management/ViewModels/Template/TemplateScaffoldResponseModel.cs @@ -1,6 +1,9 @@ -namespace Umbraco.Cms.Api.Management.ViewModels.Template; +using System.ComponentModel.DataAnnotations; + +namespace Umbraco.Cms.Api.Management.ViewModels.Template; public class TemplateScaffoldResponseModel { + [Required] public string Content { get; set; } = string.Empty; } diff --git a/src/Umbraco.Cms.Api.Management/ViewModels/TemporaryFile/TemporaryFileResponseModel.cs b/src/Umbraco.Cms.Api.Management/ViewModels/TemporaryFile/TemporaryFileResponseModel.cs index 816b3452df..78e419f23f 100644 --- a/src/Umbraco.Cms.Api.Management/ViewModels/TemporaryFile/TemporaryFileResponseModel.cs +++ b/src/Umbraco.Cms.Api.Management/ViewModels/TemporaryFile/TemporaryFileResponseModel.cs @@ -1,3 +1,5 @@ +using System.ComponentModel.DataAnnotations; + namespace Umbraco.Cms.Api.Management.ViewModels.TemporaryFile; public class TemporaryFileResponseModel @@ -6,5 +8,6 @@ public class TemporaryFileResponseModel public DateTime? AvailableUntil { get; set; } + [Required] public string FileName { get; set; } = string.Empty; } diff --git a/src/Umbraco.Cms.Api.Management/ViewModels/TextFiles/TextFileResponseModelBase.cs b/src/Umbraco.Cms.Api.Management/ViewModels/TextFiles/TextFileResponseModelBase.cs index f7e646f5a4..56f65afdff 100644 --- a/src/Umbraco.Cms.Api.Management/ViewModels/TextFiles/TextFileResponseModelBase.cs +++ b/src/Umbraco.Cms.Api.Management/ViewModels/TextFiles/TextFileResponseModelBase.cs @@ -1,6 +1,9 @@ -namespace Umbraco.Cms.Api.Management.ViewModels.TextFiles; +using System.ComponentModel.DataAnnotations; + +namespace Umbraco.Cms.Api.Management.ViewModels.TextFiles; public class TextFileResponseModelBase : TextFileViewModelBase { + [Required] public string Path { get; set; } = string.Empty; } diff --git a/src/Umbraco.Cms.Api.Management/ViewModels/User/Current/UserPermissionViewModel.cs b/src/Umbraco.Cms.Api.Management/ViewModels/User/Current/UserPermissionViewModel.cs index e24f67cd22..fe645acc4b 100644 --- a/src/Umbraco.Cms.Api.Management/ViewModels/User/Current/UserPermissionViewModel.cs +++ b/src/Umbraco.Cms.Api.Management/ViewModels/User/Current/UserPermissionViewModel.cs @@ -4,5 +4,5 @@ public class UserPermissionViewModel { public Guid NodeKey { get; set; } - public IEnumerable Permissions { get; set; } = Array.Empty(); + public IEnumerable Permissions { get; set; } = Enumerable.Empty(); } diff --git a/src/Umbraco.Cms.Api.Management/ViewModels/User/Current/UserPermissionsResponseModel.cs b/src/Umbraco.Cms.Api.Management/ViewModels/User/Current/UserPermissionsResponseModel.cs index 53862a335a..990470ad7d 100644 --- a/src/Umbraco.Cms.Api.Management/ViewModels/User/Current/UserPermissionsResponseModel.cs +++ b/src/Umbraco.Cms.Api.Management/ViewModels/User/Current/UserPermissionsResponseModel.cs @@ -2,5 +2,5 @@ public class UserPermissionsResponseModel { - public IEnumerable Permissions { get; set; } = Array.Empty(); + public IEnumerable Permissions { get; set; } = Enumerable.Empty(); } diff --git a/src/Umbraco.Cms.Api.Management/ViewModels/User/ResendInviteUserRequestModel.cs b/src/Umbraco.Cms.Api.Management/ViewModels/User/ResendInviteUserRequestModel.cs index cd6211aa59..ce0a9ee004 100644 --- a/src/Umbraco.Cms.Api.Management/ViewModels/User/ResendInviteUserRequestModel.cs +++ b/src/Umbraco.Cms.Api.Management/ViewModels/User/ResendInviteUserRequestModel.cs @@ -1,7 +1,10 @@ +using System.ComponentModel.DataAnnotations; + namespace Umbraco.Cms.Api.Management.ViewModels.User; public class ResendInviteUserRequestModel { + [Required] public Guid UserId { get; set; } = Guid.Empty; public string? Message { get; set; } diff --git a/src/Umbraco.Cms.Api.Management/ViewModels/User/VerifyInviteUserRequestModel.cs b/src/Umbraco.Cms.Api.Management/ViewModels/User/VerifyInviteUserRequestModel.cs index c9d80602e1..d57bc2ee2c 100644 --- a/src/Umbraco.Cms.Api.Management/ViewModels/User/VerifyInviteUserRequestModel.cs +++ b/src/Umbraco.Cms.Api.Management/ViewModels/User/VerifyInviteUserRequestModel.cs @@ -1,8 +1,12 @@ +using System.ComponentModel.DataAnnotations; + namespace Umbraco.Cms.Api.Management.ViewModels.User; public class VerifyInviteUserRequestModel { + [Required] public Guid UserId { get; set; } = Guid.Empty; + [Required] public string Token { get; set; } = string.Empty; }