diff --git a/backend/extensions/Squidex.Extensions/Text/Azure/AzureIndexDefinition.cs b/backend/extensions/Squidex.Extensions/Text/Azure/AzureIndexDefinition.cs index 9fa3561d1..74b6eb5ab 100644 --- a/backend/extensions/Squidex.Extensions/Text/Azure/AzureIndexDefinition.cs +++ b/backend/extensions/Squidex.Extensions/Text/Azure/AzureIndexDefinition.cs @@ -116,6 +116,14 @@ public static class AzureIndexDefinition { IsFilterable = true, }, + new SimpleField("userInfoApiKey", SearchFieldDataType.String) + { + IsFilterable = true, + }, + new SimpleField("userInfoField", SearchFieldDataType.String) + { + IsFilterable = true, + }, }; foreach (var (field, analyzer) in FieldAnalyzers.Values) diff --git a/backend/extensions/Squidex.Extensions/Text/Azure/AzureTextIndex.cs b/backend/extensions/Squidex.Extensions/Text/Azure/AzureTextIndex.cs index b8ec78968..866af21eb 100644 --- a/backend/extensions/Squidex.Extensions/Text/Azure/AzureTextIndex.cs +++ b/backend/extensions/Squidex.Extensions/Text/Azure/AzureTextIndex.cs @@ -123,20 +123,52 @@ public sealed class AzureTextIndex : IInitializable, ITextIndex CancellationToken ct = default) { var searchField = GetServeField(scope); + var searchFilter = $"{string.Join(" or ", schemaIds.Select(x => $"schemaId eq '{x}'"))} and {searchField} eq true"; - var filter = $"{string.Join(" or ", schemaIds.Select(x => $"schemaId eq '{x}'"))} and {searchField} eq true"; - - return SearchAsync(result, text, filter, take, factor, ct); + return SearchAsync(result, text, searchFilter, take, factor, ct); } private Task SearchByAppAsync(List<(DomainId, double)> result, string text, App app, SearchScope scope, int take, double factor, CancellationToken ct = default) { var searchField = GetServeField(scope); + var searchFilter = $"appId eq '{app.Id}' and {searchField} eq true"; + + return SearchAsync(result, text, searchFilter, take, factor, ct); + } + + public async Task FindUserInfo(App app, ApiKeyQuery query, SearchScope scope, + CancellationToken ct = default) + { + Guard.NotNull(app); + Guard.NotNull(query); + + var searchField = GetServeField(scope); + var searchFilter = $"appId eq '{app.Id}' and {searchField} eq true and userApiKey eq '{query.ApiKey}'"; + var searchOptions = new SearchOptions + { + Filter = searchFilter, + }; - var filter = $"appId eq '{app.Id}' and {searchField} eq true"; + searchOptions.Select.Add("contentId"); + searchOptions.Select.Add("userInfoApiKey"); + searchOptions.Select.Add("userInfoRole"); + searchOptions.Size = 1; + searchOptions.QueryType = SearchQueryType.Full; + + var results = await searchClient.SearchAsync(searchFilter, searchOptions, ct); + + await foreach (var item in results.Value.GetResultsAsync().WithCancellation(ct)) + { + if (item != null) + { + var id = DomainId.Create(item.Document["contentId"].ToString()!); + + return new UserInfoResult(id, item.Document["userInfoRole"].ToString()!); + } + } - return SearchAsync(result, text, filter, take, factor, ct); + return null; } private async Task SearchAsync(List<(DomainId, double)> result, string text, string filter, int take, double factor, diff --git a/backend/extensions/Squidex.Extensions/Text/Azure/CommandFactory.cs b/backend/extensions/Squidex.Extensions/Text/Azure/CommandFactory.cs index 776108e42..7c75d6a59 100644 --- a/backend/extensions/Squidex.Extensions/Text/Azure/CommandFactory.cs +++ b/backend/extensions/Squidex.Extensions/Text/Azure/CommandFactory.cs @@ -70,6 +70,28 @@ public static class CommandFactory } } + if (upsert.UserInfos != null) + { + foreach (var userInfo in upsert.UserInfos) + { + var geoDocument = new SearchDocument + { + ["docId"] = upsert.ToDocId(), + ["appId"] = upsert.UniqueContentId.AppId.ToString(), + ["appName"] = string.Empty, + ["contentId"] = upsert.UniqueContentId.ContentId.ToString(), + ["schemaId"] = upsert.SchemaId.Id.ToString(), + ["schemaName"] = upsert.SchemaId.Name, + ["serveAll"] = upsert.ServeAll, + ["servePublished"] = upsert.ServePublished, + ["userInfoApiKey"] = userInfo, + ["userInfoRole"] = userInfo.Role, + }; + + batch.Add(IndexDocumentsAction.MergeOrUpload(geoDocument)); + } + } + if (upsert.Texts is { Count: > 0 }) { var document = new SearchDocument diff --git a/backend/extensions/Squidex.Extensions/Text/ElasticSearch/CommandFactory.cs b/backend/extensions/Squidex.Extensions/Text/ElasticSearch/CommandFactory.cs index e0acb14c4..89bf8c197 100644 --- a/backend/extensions/Squidex.Extensions/Text/ElasticSearch/CommandFactory.cs +++ b/backend/extensions/Squidex.Extensions/Text/ElasticSearch/CommandFactory.cs @@ -81,6 +81,28 @@ public static class CommandFactory } } + if (upsert.UserInfos != null) + { + foreach (var userInfo in upsert.UserInfos) + { + var userInfoApiKey = userInfo.ApiKey; + var userInfoRole = userInfo.Role; + + AddArgs(new + { + appId = upsert.UniqueContentId.AppId.ToString(), + appName = string.Empty, + contentId = upsert.UniqueContentId.ContentId.ToString(), + schemaId = upsert.SchemaId.Id.ToString(), + schemaName = upsert.SchemaId.Name, + serveAll = upsert.ServeAll, + servePublished = upsert.ServePublished, + userInfoApiKey, + userInfoRole, + }); + } + } + if (upsert.Texts is { Count: > 0 }) { var texts = new Dictionary(); diff --git a/backend/extensions/Squidex.Extensions/Text/ElasticSearch/ElasticSearchIndexDefinition.cs b/backend/extensions/Squidex.Extensions/Text/ElasticSearch/ElasticSearchIndexDefinition.cs index d869e99f8..652ae0012 100644 --- a/backend/extensions/Squidex.Extensions/Text/ElasticSearch/ElasticSearchIndexDefinition.cs +++ b/backend/extensions/Squidex.Extensions/Text/ElasticSearch/ElasticSearchIndexDefinition.cs @@ -105,6 +105,10 @@ public static class ElasticSearchIndexDefinition { type = "geo_point", }, + ["userInfoApiKey"] = new + { + type = "text", + }, }, }; diff --git a/backend/extensions/Squidex.Extensions/Text/ElasticSearch/ElasticSearchTextIndex.cs b/backend/extensions/Squidex.Extensions/Text/ElasticSearch/ElasticSearchTextIndex.cs index 03a54bdb2..d25bdf353 100644 --- a/backend/extensions/Squidex.Extensions/Text/ElasticSearch/ElasticSearchTextIndex.cs +++ b/backend/extensions/Squidex.Extensions/Text/ElasticSearch/ElasticSearchTextIndex.cs @@ -15,7 +15,8 @@ using Squidex.Infrastructure.Json; namespace Squidex.Extensions.Text.ElasticSearch; -public sealed partial class ElasticSearchTextIndex(IElasticSearchClient elasticClient, string indexName, IJsonSerializer jsonSerializer) : ITextIndex, IInitializable +public sealed partial class ElasticSearchTextIndex(IElasticSearchClient elasticClient, string indexName, IJsonSerializer jsonSerializer) + : ITextIndex, IInitializable { private static readonly Regex RegexLanguageNormal = BuildLanguageRegexNormal(); private static readonly Regex RegexLanguageStart = BuildLanguageRegexStart(); @@ -198,13 +199,62 @@ public sealed partial class ElasticSearchTextIndex(IElasticSearchClient elasticC return await SearchAsync(elasticQuery, ct); } + public async Task FindUserInfo(App app, ApiKeyQuery query, SearchScope scope, + CancellationToken ct = default) + { + Guard.NotNull(app); + Guard.NotNull(query); + + var serveField = GetServeField(scope); + + var elasticQuery = new + { + query = new + { + @bool = new + { + filter = new object[] + { + new + { + term = new Dictionary + { + [serveField] = "true", + }, + }, + new + { + term = new Dictionary + { + ["userInfoApiKey.keyword"] = query.ApiKey, + }, + }, + }, + }, + }, + _source = new[] + { + "contentId", + "userInfoApiKey", + "userInfoRole", + }, + size = 1, + }; + + var hits = await elasticClient.SearchAsync(indexName, elasticQuery, ct); + var hit = hits.FirstOrDefault(); + + return hit != null ? + new UserInfoResult(DomainId.Create(hit["_source"]["contentId"]), hit["_source"]["userInfoRole"]) : + null; + } + private async Task> SearchAsync(object query, CancellationToken ct) { var hits = await elasticClient.SearchAsync(indexName, query, ct); var ids = new List(); - foreach (var item in hits) { ids.Add(DomainId.Create(item["_source"]["contentId"])); diff --git a/backend/i18n/frontend_de.json b/backend/i18n/frontend_de.json index 38b268162..0b8f823cc 100644 --- a/backend/i18n/frontend_de.json +++ b/backend/i18n/frontend_de.json @@ -198,6 +198,7 @@ "common.administration": "Verwaltung", "common.administrationPageTitle": "Verwaltung", "common.api": "API", + "common.apiKey": "API Key", "common.apps": "Apps", "common.aspectRatio": "Seitenverhältnis", "common.assets": "Assets", @@ -523,6 +524,7 @@ "contents.unsetValueConfirmTitle": "Möchten Sie den Wert zurücksetzen?", "contents.updated": "Inhalt erfolgreich aktualisiert.", "contents.updateFailed": "Fehler beim Aktualisieren des Inhalts. Bitte neu laden.", + "contents.userInfo.instructions": "Connect as this user with the following header. The first part of the value is the app name.\n\nDo not miss the colon and remember the assign a restrictive role.", "contents.validate": "Validieren", "contents.validationHint": "Bitte denken Sie daran, alle Sprachen zu überprüfen, wenn Sie Validierungsfehler sehen.", "contents.versionCompare": "Vergleichen", @@ -984,6 +986,9 @@ "schemas.fieldTypes.tags.countMin": "Min. Elemente", "schemas.fieldTypes.tags.description": "Spezialformat für Tags.", "schemas.fieldTypes.ui.description": "Trennzeichen für die Bearbeitungsoberfläche.", + "schemas.fieldTypes.user.description": "User Credentials for custom Auth.", + "schemas.fieldTypes.userInfo.defaultRole": "Default Role", + "schemas.fieldTypes.userInfo.defaultRoleHint": "The default role. If a value is set a user info with a random API Key will be generated.", "schemas.hideFieldFailed": "Fehler beim Ausblenden des Feldes. Bitte neu laden.", "schemas.import": "Schema importieren", "schemas.indexes.addIndex": "Index hinzufügen", diff --git a/backend/i18n/frontend_en.json b/backend/i18n/frontend_en.json index e4d52db8c..d24ee97ad 100644 --- a/backend/i18n/frontend_en.json +++ b/backend/i18n/frontend_en.json @@ -198,6 +198,7 @@ "common.administration": "Administration", "common.administrationPageTitle": "Administration", "common.api": "API", + "common.apiKey": "API Key", "common.apps": "Apps", "common.aspectRatio": "AspectRatio", "common.assets": "Assets", @@ -523,6 +524,7 @@ "contents.unsetValueConfirmTitle": "Do you want to unset the value?", "contents.updated": "Content updated successfully.", "contents.updateFailed": "Failed to update content. Please reload.", + "contents.userInfo.instructions": "Connect as this user with the following header. The first part of the value is the app name.\n\nDo not miss the colon and remember the assign a restrictive role.", "contents.validate": "Validate", "contents.validationHint": "Please remember to check all languages when you see validation errors.", "contents.versionCompare": "Compare", @@ -984,6 +986,9 @@ "schemas.fieldTypes.tags.countMin": "Min Items", "schemas.fieldTypes.tags.description": "Special format for tags.", "schemas.fieldTypes.ui.description": "Separator for editing UI.", + "schemas.fieldTypes.user.description": "User Credentials for custom Auth.", + "schemas.fieldTypes.userInfo.defaultRole": "Default Role", + "schemas.fieldTypes.userInfo.defaultRoleHint": "The default role. If a value is set a user info with a random API Key will be generated.", "schemas.hideFieldFailed": "Failed to hide field. Please reload.", "schemas.import": "Import schema", "schemas.indexes.addIndex": "Add Index", diff --git a/backend/i18n/frontend_fr.json b/backend/i18n/frontend_fr.json index 3da5bd9d1..ab5ba9a18 100644 --- a/backend/i18n/frontend_fr.json +++ b/backend/i18n/frontend_fr.json @@ -198,6 +198,7 @@ "common.administration": "Administration", "common.administrationPageTitle": "Administration", "common.api": "API", + "common.apiKey": "API Key", "common.apps": "applications", "common.aspectRatio": "Ratio d'aspect", "common.assets": "Actifs", @@ -523,6 +524,7 @@ "contents.unsetValueConfirmTitle": "Voulez-vous annuler la valeur\u00A0?", "contents.updated": "Contenu mis à jour avec succès.", "contents.updateFailed": "Échec de la mise à jour du contenu. Veuillez recharger.", + "contents.userInfo.instructions": "Connect as this user with the following header. The first part of the value is the app name.\n\nDo not miss the colon and remember the assign a restrictive role.", "contents.validate": "Valider", "contents.validationHint": "N'oubliez pas de vérifier toutes les langues lorsque vous voyez des erreurs de validation.", "contents.versionCompare": "Comparer", @@ -984,6 +986,9 @@ "schemas.fieldTypes.tags.countMin": "Articles minimum", "schemas.fieldTypes.tags.description": "Format spécial pour les balises.", "schemas.fieldTypes.ui.description": "Séparateur pour l'édition de l'interface utilisateur.", + "schemas.fieldTypes.user.description": "User Credentials for custom Auth.", + "schemas.fieldTypes.userInfo.defaultRole": "Default Role", + "schemas.fieldTypes.userInfo.defaultRoleHint": "The default role. If a value is set a user info with a random API Key will be generated.", "schemas.hideFieldFailed": "Impossible de masquer le champ. Veuillez recharger.", "schemas.import": "Calendrier d'importation", "schemas.indexes.addIndex": "Add Index", diff --git a/backend/i18n/frontend_it.json b/backend/i18n/frontend_it.json index e088d7075..64faac1fc 100644 --- a/backend/i18n/frontend_it.json +++ b/backend/i18n/frontend_it.json @@ -198,6 +198,7 @@ "common.administration": "Amministrazione", "common.administrationPageTitle": "Amministrazione", "common.api": "API", + "common.apiKey": "API Key", "common.apps": "App", "common.aspectRatio": "Proporzioni", "common.assets": "Risorse", @@ -523,6 +524,7 @@ "contents.unsetValueConfirmTitle": "Sei sicuro di voler annullare il valore impostato?", "contents.updated": "Contenuto aggiornato con successo.", "contents.updateFailed": "Non è stato possibile aggiornare il contenuto. Per favore ricarica.", + "contents.userInfo.instructions": "Connect as this user with the following header. The first part of the value is the app name.\n\nDo not miss the colon and remember the assign a restrictive role.", "contents.validate": "Convalida", "contents.validationHint": "Ricorda di verificare tutte le lingue quando vedi errori di validazione.", "contents.versionCompare": "Confronta", @@ -984,6 +986,9 @@ "schemas.fieldTypes.tags.countMin": "Numero min di Elementi", "schemas.fieldTypes.tags.description": "Formato speciale per i tag.", "schemas.fieldTypes.ui.description": "Separatore per il pannello delle modifiche della UI.", + "schemas.fieldTypes.user.description": "User Credentials for custom Auth.", + "schemas.fieldTypes.userInfo.defaultRole": "Default Role", + "schemas.fieldTypes.userInfo.defaultRoleHint": "The default role. If a value is set a user info with a random API Key will be generated.", "schemas.hideFieldFailed": "Non è stato possibile nascondere il campo. Per favore ricarica.", "schemas.import": "Importa uno schema", "schemas.indexes.addIndex": "Add Index", diff --git a/backend/i18n/frontend_nl.json b/backend/i18n/frontend_nl.json index 4f850e5cd..75e970f3b 100644 --- a/backend/i18n/frontend_nl.json +++ b/backend/i18n/frontend_nl.json @@ -198,6 +198,7 @@ "common.administration": "Administratie", "common.administrationPageTitle": "Administratie", "common.api": "API", + "common.apiKey": "API Key", "common.apps": "Apps", "common.aspectRatio": "AspectRatio", "common.assets": "Bestanden", @@ -523,6 +524,7 @@ "contents.unsetValueConfirmTitle": "Weet je zeker dat je de waarde leeg wilt maken?", "contents.updated": "Inhoud succesvol bijgewerkt.", "contents.updateFailed": "Bijwerken van inhoud is mislukt. Laad opnieuw.", + "contents.userInfo.instructions": "Connect as this user with the following header. The first part of the value is the app name.\n\nDo not miss the colon and remember the assign a restrictive role.", "contents.validate": "Valideren", "contents.validationHint": "Denk eraan om alle talen te controleren wanneer je validatiefouten ziet.", "contents.versionCompare": "Vergelijk", @@ -984,6 +986,9 @@ "schemas.fieldTypes.tags.countMin": "Min. items", "schemas.fieldTypes.tags.description": "Speciaal formaat voor tags.", "schemas.fieldTypes.ui.description": "Scheidingsteken voor het bewerken van gebruikersinterface.", + "schemas.fieldTypes.user.description": "User Credentials for custom Auth.", + "schemas.fieldTypes.userInfo.defaultRole": "Default Role", + "schemas.fieldTypes.userInfo.defaultRoleHint": "The default role. If a value is set a user info with a random API Key will be generated.", "schemas.hideFieldFailed": "Kan veld niet verbergen. Laad opnieuw.", "schemas.import": "Importeer schema", "schemas.indexes.addIndex": "Add Index", diff --git a/backend/i18n/frontend_pt.json b/backend/i18n/frontend_pt.json index c5667a5af..f4fd44d35 100644 --- a/backend/i18n/frontend_pt.json +++ b/backend/i18n/frontend_pt.json @@ -198,6 +198,7 @@ "common.administration": "Administração", "common.administrationPageTitle": "Administração", "common.api": "API", + "common.apiKey": "API Key", "common.apps": "Aplicativos", "common.aspectRatio": "AspectRatio", "common.assets": "Ficheiros", @@ -523,6 +524,7 @@ "contents.unsetValueConfirmTitle": "Quer desaparassar o valor?", "contents.updated": "Conteúdo atualizado com sucesso.", "contents.updateFailed": "Falhou na atualização do conteúdo. Por favor, recarregue.", + "contents.userInfo.instructions": "Connect as this user with the following header. The first part of the value is the app name.\n\nDo not miss the colon and remember the assign a restrictive role.", "contents.validate": "Validar", "contents.validationHint": "Por favor, lembre-se de verificar todos os idiomas quando vir erros de validação.", "contents.versionCompare": "Comparar", @@ -984,6 +986,9 @@ "schemas.fieldTypes.tags.countMin": "Min Itens", "schemas.fieldTypes.tags.description": "Formato especial para tags.", "schemas.fieldTypes.ui.description": "Separador para edição de UI.", + "schemas.fieldTypes.user.description": "User Credentials for custom Auth.", + "schemas.fieldTypes.userInfo.defaultRole": "Default Role", + "schemas.fieldTypes.userInfo.defaultRoleHint": "The default role. If a value is set a user info with a random API Key will be generated.", "schemas.hideFieldFailed": "Falhou em esconder o campo. Por favor, recarregue.", "schemas.import": "Esquema de importação", "schemas.indexes.addIndex": "Add Index", diff --git a/backend/i18n/frontend_zh.json b/backend/i18n/frontend_zh.json index 08f8305cf..2f76f965b 100644 --- a/backend/i18n/frontend_zh.json +++ b/backend/i18n/frontend_zh.json @@ -198,6 +198,7 @@ "common.administration": "管理", "common.administrationPageTitle": "管理", "common.api": "API", + "common.apiKey": "API Key", "common.apps": "应用程序", "common.aspectRatio": "纵横比", "common.assets": "资源", @@ -523,6 +524,7 @@ "contents.unsetValueConfirmTitle": "你想取消设置吗?", "contents.updated": "内容更新成功。", "contents.updateFailed": "更新内容失败,请重新加载。", + "contents.userInfo.instructions": "Connect as this user with the following header. The first part of the value is the app name.\n\nDo not miss the colon and remember the assign a restrictive role.", "contents.validate": "验证", "contents.validationHint": "当您看到验证错误时,请记住检查所有语言。", "contents.versionCompare": "比较", @@ -984,6 +986,9 @@ "schemas.fieldTypes.tags.countMin": "最小项目", "schemas.fieldTypes.tags.description": "标签的特殊格式。", "schemas.fieldTypes.ui.description": "编辑 UI 的分隔符。", + "schemas.fieldTypes.user.description": "User Credentials for custom Auth.", + "schemas.fieldTypes.userInfo.defaultRole": "Default Role", + "schemas.fieldTypes.userInfo.defaultRoleHint": "The default role. If a value is set a user info with a random API Key will be generated.", "schemas.hideFieldFailed": "隐藏字段失败。请重新加载。", "schemas.import": "导入Schemas", "schemas.indexes.addIndex": "Add Index", diff --git a/backend/i18n/source/backend_en.json b/backend/i18n/source/backend_en.json index aabfcd7b8..be1ae1ea5 100644 --- a/backend/i18n/source/backend_en.json +++ b/backend/i18n/source/backend_en.json @@ -139,6 +139,9 @@ "contents.invalidNumber": "Invalid json type, expected number.", "contents.invalidRichText": "Invalid rich text.", "contents.invalidString": "Invalid json type, expected string.", + "contents.invalidUserInfo": "Invalid json type, expected apiKey+role object.", + "contents.invalidUserInfoApiKey": "ApiKey must be defined.", + "contents.invalidUserInfoRole": "Role must be defined.", "contents.listReferences": "{count} Reference(s)", "contents.referenced": "Content is referenced by another content and cannot be deleted or unpublished.", "contents.schemaNotPublished": "Schema not published.", diff --git a/backend/i18n/source/frontend_en.json b/backend/i18n/source/frontend_en.json index e4d52db8c..d24ee97ad 100644 --- a/backend/i18n/source/frontend_en.json +++ b/backend/i18n/source/frontend_en.json @@ -198,6 +198,7 @@ "common.administration": "Administration", "common.administrationPageTitle": "Administration", "common.api": "API", + "common.apiKey": "API Key", "common.apps": "Apps", "common.aspectRatio": "AspectRatio", "common.assets": "Assets", @@ -523,6 +524,7 @@ "contents.unsetValueConfirmTitle": "Do you want to unset the value?", "contents.updated": "Content updated successfully.", "contents.updateFailed": "Failed to update content. Please reload.", + "contents.userInfo.instructions": "Connect as this user with the following header. The first part of the value is the app name.\n\nDo not miss the colon and remember the assign a restrictive role.", "contents.validate": "Validate", "contents.validationHint": "Please remember to check all languages when you see validation errors.", "contents.versionCompare": "Compare", @@ -984,6 +986,9 @@ "schemas.fieldTypes.tags.countMin": "Min Items", "schemas.fieldTypes.tags.description": "Special format for tags.", "schemas.fieldTypes.ui.description": "Separator for editing UI.", + "schemas.fieldTypes.user.description": "User Credentials for custom Auth.", + "schemas.fieldTypes.userInfo.defaultRole": "Default Role", + "schemas.fieldTypes.userInfo.defaultRoleHint": "The default role. If a value is set a user info with a random API Key will be generated.", "schemas.hideFieldFailed": "Failed to hide field. Please reload.", "schemas.import": "Import schema", "schemas.indexes.addIndex": "Add Index", diff --git a/backend/src/Squidex.Data.EntityFramework/Domain/Apps/Entities/Contents/Text/EFTextBuilder.cs b/backend/src/Squidex.Data.EntityFramework/Domain/Apps/Entities/Contents/Text/EFTextBuilder.cs index 989820325..8bca3d824 100644 --- a/backend/src/Squidex.Data.EntityFramework/Domain/Apps/Entities/Contents/Text/EFTextBuilder.cs +++ b/backend/src/Squidex.Data.EntityFramework/Domain/Apps/Entities/Contents/Text/EFTextBuilder.cs @@ -25,8 +25,6 @@ public static class EFTextBuilder builder.Entity(b => { - b.ToTable("Texts"); - b.Property(x => x.Id).HasMaxLength(400); b.Property(x => x.AppId).AsString(); b.Property(x => x.SchemaId).AsString(); b.Property(x => x.ContentId).AsString(); @@ -34,12 +32,16 @@ public static class EFTextBuilder builder.Entity(b => { - b.ToTable("Geos"); - b.Property(x => x.Id).HasMaxLength(400); b.Property(x => x.AppId).AsString(); b.Property(x => x.SchemaId).AsString(); b.Property(x => x.ContentId).AsString(); - b.Property(x => x.GeoField).HasMaxLength(255); + }); + + builder.Entity(b => + { + b.Property(x => x.AppId).AsString(); + b.Property(x => x.SchemaId).AsString(); + b.Property(x => x.ContentId).AsString(); }); } } diff --git a/backend/src/Squidex.Data.EntityFramework/Domain/Apps/Entities/Contents/Text/EFTextIndex.cs b/backend/src/Squidex.Data.EntityFramework/Domain/Apps/Entities/Contents/Text/EFTextIndex.cs index d82bbc267..d859f60ba 100644 --- a/backend/src/Squidex.Data.EntityFramework/Domain/Apps/Entities/Contents/Text/EFTextIndex.cs +++ b/backend/src/Squidex.Data.EntityFramework/Domain/Apps/Entities/Contents/Text/EFTextIndex.cs @@ -53,6 +53,9 @@ public sealed class EFTextIndex(IDbContextFactory dbContextF await dbContext.Set().Where(x => x.AppId == app.Id) .ExecuteDeleteAsync(ct); + + await dbContext.Set().Where(x => x.AppId == app.Id) + .ExecuteDeleteAsync(ct); } async Task IDeleter.DeleteSchemaAsync(App app, Schema schema, @@ -65,6 +68,9 @@ public sealed class EFTextIndex(IDbContextFactory dbContextF await dbContext.Set().Where(x => x.AppId == app.Id && x.SchemaId == schema.Id) .ExecuteDeleteAsync(ct); + + await dbContext.Set().Where(x => x.AppId == app.Id && x.SchemaId == schema.Id) + .ExecuteDeleteAsync(ct); } public async Task ClearAsync(CancellationToken ct = default) @@ -91,15 +97,19 @@ public sealed class EFTextIndex(IDbContextFactory dbContextF SRID = 4326, }; - // The distance must be converted to decrees (in contrast to MongoDB, which uses radian). - var degrees = query.Radius / 111320; + var distance = query.Radius; + if (dbContext.Database.IsNpgsql()) + { + // The distance must be converted to decrees (in contrast to MongoDB, which uses radian). + distance = query.Radius / 111320; + } var ids = await dbContext.Set() .Where(x => x.AppId == app.Id) .Where(x => x.SchemaId == query.SchemaId) .Where(x => x.GeoField == query.Field) - .Where(x => x.GeoObject.Distance(point) < degrees) + .Where(x => x.GeoObject.Distance(point) < distance) .WhereScope(scope) .Select(x => x.ContentId) .ToListAsync(ct); @@ -151,38 +161,63 @@ public sealed class EFTextIndex(IDbContextFactory dbContextF return search.Results.OrderByDescending(x => x.Score).Select(x => x.Id).Distinct().ToList(); } - private static Task SearchBySchemaAsync(TContext context, SearchOperation search, IEnumerable schemaIds, double factor, + public async Task FindUserInfo(App app, ApiKeyQuery query, SearchScope scope, CancellationToken ct = default) { + Guard.NotNull(app); + Guard.NotNull(query); + + await using var dbContext = await CreateDbContextAsync(ct); + var queryBuilder = - context.Query() + dbContext.Query() + .Where(ClrFilter.Eq("AppId", app.Id)) + .Where(ClrFilter.Eq("UserInfoApiKey", query.ApiKey)) + .WhereScope(scope); + + var (sql, parameters) = queryBuilder.Compile(); + + var entity = + await dbContext.Set().FromSqlRaw(sql, parameters) + .FirstOrDefaultAsync(ct); + + return entity != null ? + new UserInfoResult(entity.ContentId, entity.UserInfoRole) : + null; + } + + private static Task SearchBySchemaAsync(TContext dbContext, SearchOperation search, IEnumerable schemaIds, double factor, + CancellationToken ct = default) + { + var queryBuilder = + dbContext.Query() .Where(ClrFilter.Eq("AppId", search.App.Id)) .Where(ClrFilter.In("SchemaId", schemaIds.ToList())) .WhereMatch("Texts", search.SearchTerms) .WhereScope(search.SearchScope); - return SearchAsync(context, search, queryBuilder, factor, ct); + return SearchAsync(dbContext, search, queryBuilder, factor, ct); } - private static Task SearchByAppAsync(TContext context, SearchOperation search, double factor, + private static Task SearchByAppAsync(TContext dbContext, SearchOperation search, double factor, CancellationToken ct = default) { var queryBuilder = - context.Query() + dbContext.Query() .Where(ClrFilter.Eq("AppId", search.App.Id)) .WhereMatch("Texts", search.SearchTerms) .WhereScope(search.SearchScope); - return SearchAsync(context, search, queryBuilder, factor, ct); + return SearchAsync(dbContext, search, queryBuilder, factor, ct); } - private static async Task SearchAsync(TContext context, SearchOperation search, SqlQueryBuilder queryBuilder, double factor, + private static async Task SearchAsync(TContext dbContext, SearchOperation search, SqlQueryBuilder queryBuilder, double factor, CancellationToken ct) { var (sql, parameters) = queryBuilder.Compile(); var ids = - await context.Set().FromSqlRaw(sql, parameters) + await dbContext.Set().FromSqlRaw(sql, parameters) .Select(x => x.ContentId) .ToListAsync(ct); @@ -196,6 +231,7 @@ public sealed class EFTextIndex(IDbContextFactory dbContextF var insertsText = new List(); var insertsGeo = new List(); + var insertsUser = new List(); foreach (var batch in commands.Batch(1000)) { @@ -264,6 +300,24 @@ public sealed class EFTextIndex(IDbContextFactory dbContextF } } + foreach (var userInfo in upsert.UserInfos.OrEmpty()) + { + var entity = new EFTextIndexUserInfoEntity + { + Id = id, + AppId = appId, + ContentId = contentId, + UserInfoApiKey = userInfo.ApiKey, + UserInfoRole = userInfo.Role, + SchemaId = upsert.SchemaId.Id, + ServeAll = upsert.ServeAll, + ServePublished = upsert.ServePublished, + Stage = upsert.Stage, + }; + + insertsUser.Add(entity); + } + break; case DeleteIndexEntry: await dbContext.Set() @@ -273,6 +327,10 @@ public sealed class EFTextIndex(IDbContextFactory dbContextF await dbContext.Set() .Where(x => x.Id == id) .ExecuteDeleteAsync(ct); + + await dbContext.Set() + .Where(x => x.Id == id) + .ExecuteDeleteAsync(ct); break; case UpdateIndexEntry update: await dbContext.Set() @@ -288,6 +346,13 @@ public sealed class EFTextIndex(IDbContextFactory dbContextF .SetProperty(x => x.ServeAll, update.ServeAll) .SetProperty(x => x.ServePublished, update.ServePublished), ct); + + await dbContext.Set() + .Where(x => x.Id == id) + .ExecuteUpdateAsync(u => u + .SetProperty(x => x.ServeAll, update.ServeAll) + .SetProperty(x => x.ServePublished, update.ServePublished), + ct); break; } } @@ -295,6 +360,7 @@ public sealed class EFTextIndex(IDbContextFactory dbContextF await dbContext.BulkUpsertAsync(insertsText, ct); await dbContext.BulkUpsertAsync(insertsGeo, ct); + await dbContext.BulkUpsertAsync(insertsUser, ct); } private Task CreateDbContextAsync(CancellationToken ct) diff --git a/backend/src/Squidex.Data.EntityFramework/Domain/Apps/Entities/Contents/Text/EFTextIndexGeoEntity.cs b/backend/src/Squidex.Data.EntityFramework/Domain/Apps/Entities/Contents/Text/EFTextIndexGeoEntity.cs index 797a776b9..3da46fd5f 100644 --- a/backend/src/Squidex.Data.EntityFramework/Domain/Apps/Entities/Contents/Text/EFTextIndexGeoEntity.cs +++ b/backend/src/Squidex.Data.EntityFramework/Domain/Apps/Entities/Contents/Text/EFTextIndexGeoEntity.cs @@ -6,14 +6,17 @@ // ========================================================================== using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; using NetTopologySuite.Geometries; using Squidex.Infrastructure; namespace Squidex.Domain.Apps.Entities.Contents.Text; +[Table("Geos")] public sealed class EFTextIndexGeoEntity { [Key] + [MaxLength(400)] required public string Id { get; set; } public DomainId AppId { get; set; } @@ -28,6 +31,7 @@ public sealed class EFTextIndexGeoEntity public bool ServePublished { get; set; } + [MaxLength(255)] public string GeoField { get; set; } public Geometry GeoObject { get; set; } diff --git a/backend/src/Squidex.Data.EntityFramework/Domain/Apps/Entities/Contents/Text/EFTextIndexTextEntity.cs b/backend/src/Squidex.Data.EntityFramework/Domain/Apps/Entities/Contents/Text/EFTextIndexTextEntity.cs index 03b9b7f7e..66c2009e7 100644 --- a/backend/src/Squidex.Data.EntityFramework/Domain/Apps/Entities/Contents/Text/EFTextIndexTextEntity.cs +++ b/backend/src/Squidex.Data.EntityFramework/Domain/Apps/Entities/Contents/Text/EFTextIndexTextEntity.cs @@ -6,13 +6,16 @@ // ========================================================================== using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; using Squidex.Infrastructure; namespace Squidex.Domain.Apps.Entities.Contents.Text; +[Table("Texts")] public sealed class EFTextIndexTextEntity { [Key] + [MaxLength(400)] required public string Id { get; set; } public DomainId AppId { get; set; } diff --git a/backend/src/Squidex.Data.EntityFramework/Domain/Apps/Entities/Contents/Text/EFTextIndexUserInfoEntity.cs b/backend/src/Squidex.Data.EntityFramework/Domain/Apps/Entities/Contents/Text/EFTextIndexUserInfoEntity.cs new file mode 100644 index 000000000..ad0222dc6 --- /dev/null +++ b/backend/src/Squidex.Data.EntityFramework/Domain/Apps/Entities/Contents/Text/EFTextIndexUserInfoEntity.cs @@ -0,0 +1,40 @@ +// ========================================================================== +// Squidex Headless CMS +// ========================================================================== +// Copyright (c) Squidex UG (haftungsbeschraenkt) +// All rights reserved. Licensed under the MIT license. +// ========================================================================== + +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; +using Microsoft.EntityFrameworkCore; +using Squidex.Infrastructure; + +namespace Squidex.Domain.Apps.Entities.Contents.Text; + +[Table("UserInfos")] +[Index(nameof(UserInfoApiKey))] +public sealed class EFTextIndexUserInfoEntity +{ + [Key] + [MaxLength(400)] + required public string Id { get; set; } + + public DomainId AppId { get; set; } + + public DomainId SchemaId { get; set; } + + public DomainId ContentId { get; set; } + + public byte Stage { get; set; } + + public bool ServeAll { get; set; } + + public bool ServePublished { get; set; } + + [MaxLength(256)] + public string UserInfoApiKey { get; set; } + + [MaxLength(256)] + public string UserInfoRole { get; set; } +} diff --git a/backend/src/Squidex.Data.EntityFramework/Providers/MySql/App/Migrations/20260117183413_AddUserInfoIndex.Designer.cs b/backend/src/Squidex.Data.EntityFramework/Providers/MySql/App/Migrations/20260117183413_AddUserInfoIndex.Designer.cs new file mode 100644 index 000000000..6833bd645 --- /dev/null +++ b/backend/src/Squidex.Data.EntityFramework/Providers/MySql/App/Migrations/20260117183413_AddUserInfoIndex.Designer.cs @@ -0,0 +1,1629 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using NetTopologySuite.Geometries; +using Squidex.Providers.MySql.App; + +#nullable disable + +namespace Squidex.Providers.MySql.App.Migrations +{ + [DbContext(typeof(MySqlAppDbContext))] + [Migration("20260117183413_AddUserInfoIndex")] + partial class AddUserInfoIndex + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "8.0.16") + .HasAnnotation("Relational:MaxIdentifierLength", 64); + + MySqlModelBuilderExtensions.AutoIncrementColumns(modelBuilder); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRole", b => + { + b.Property("Id") + .HasColumnType("varchar(255)"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnType("longtext"); + + b.Property("Name") + .HasMaxLength(256) + .HasColumnType("varchar(256)"); + + b.Property("NormalizedName") + .HasMaxLength(256) + .HasColumnType("varchar(256)"); + + b.HasKey("Id"); + + b.HasIndex("NormalizedName") + .IsUnique() + .HasDatabaseName("RoleNameIndex"); + + b.ToTable("AspNetRoles", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("Id")); + + b.Property("ClaimType") + .HasColumnType("longtext"); + + b.Property("ClaimValue") + .HasColumnType("longtext"); + + b.Property("RoleId") + .IsRequired() + .HasColumnType("varchar(255)"); + + b.HasKey("Id"); + + b.HasIndex("RoleId"); + + b.ToTable("AspNetRoleClaims", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUser", b => + { + b.Property("Id") + .HasColumnType("varchar(255)"); + + b.Property("AccessFailedCount") + .HasColumnType("int"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnType("longtext"); + + b.Property("Email") + .HasMaxLength(256) + .HasColumnType("varchar(256)"); + + b.Property("EmailConfirmed") + .HasColumnType("tinyint(1)"); + + b.Property("LockoutEnabled") + .HasColumnType("tinyint(1)"); + + b.Property("LockoutEnd") + .HasColumnType("datetime(6)"); + + b.Property("NormalizedEmail") + .HasMaxLength(256) + .HasColumnType("varchar(256)"); + + b.Property("NormalizedUserName") + .HasMaxLength(256) + .HasColumnType("varchar(256)"); + + b.Property("PasswordHash") + .HasColumnType("longtext"); + + b.Property("PhoneNumber") + .HasColumnType("longtext"); + + b.Property("PhoneNumberConfirmed") + .HasColumnType("tinyint(1)"); + + b.Property("SecurityStamp") + .HasColumnType("longtext"); + + b.Property("TwoFactorEnabled") + .HasColumnType("tinyint(1)"); + + b.Property("UserName") + .HasMaxLength(256) + .HasColumnType("varchar(256)"); + + b.HasKey("Id"); + + b.HasIndex("NormalizedEmail") + .HasDatabaseName("EmailIndex"); + + b.HasIndex("NormalizedUserName") + .IsUnique() + .HasDatabaseName("UserNameIndex"); + + b.ToTable("AspNetUsers", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("Id")); + + b.Property("ClaimType") + .HasColumnType("longtext"); + + b.Property("ClaimValue") + .HasColumnType("longtext"); + + b.Property("UserId") + .IsRequired() + .HasColumnType("varchar(255)"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("AspNetUserClaims", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => + { + b.Property("LoginProvider") + .HasColumnType("varchar(255)"); + + b.Property("ProviderKey") + .HasColumnType("varchar(255)"); + + b.Property("ProviderDisplayName") + .HasColumnType("longtext"); + + b.Property("UserId") + .IsRequired() + .HasColumnType("varchar(255)"); + + b.HasKey("LoginProvider", "ProviderKey"); + + b.HasIndex("UserId"); + + b.ToTable("AspNetUserLogins", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => + { + b.Property("UserId") + .HasColumnType("varchar(255)"); + + b.Property("RoleId") + .HasColumnType("varchar(255)"); + + b.HasKey("UserId", "RoleId"); + + b.HasIndex("RoleId"); + + b.ToTable("AspNetUserRoles", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => + { + b.Property("UserId") + .HasColumnType("varchar(255)"); + + b.Property("LoginProvider") + .HasColumnType("varchar(255)"); + + b.Property("Name") + .HasColumnType("varchar(255)"); + + b.Property("Value") + .HasColumnType("longtext"); + + b.HasKey("UserId", "LoginProvider", "Name"); + + b.ToTable("AspNetUserTokens", (string)null); + }); + + modelBuilder.Entity("OpenIddict.EntityFrameworkCore.Models.OpenIddictEntityFrameworkCoreAuthorization", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("varchar(255)"); + + b.Property("ApplicationId") + .IsRequired() + .HasColumnType("varchar(255)"); + + b.Property("ConcurrencyToken") + .IsConcurrencyToken() + .HasMaxLength(50) + .HasColumnType("varchar(50)"); + + b.Property("CreationDate") + .HasColumnType("datetime(6)"); + + b.Property("Properties") + .HasColumnType("longtext"); + + b.Property("Scopes") + .HasColumnType("longtext"); + + b.Property("Status") + .HasMaxLength(50) + .HasColumnType("varchar(50)"); + + b.Property("Subject") + .HasMaxLength(400) + .HasColumnType("varchar(400)"); + + b.Property("Type") + .HasMaxLength(50) + .HasColumnType("varchar(50)"); + + b.HasKey("Id"); + + b.HasIndex("ApplicationId", "Status", "Subject", "Type"); + + b.ToTable("OpenIddictAuthorizations", (string)null); + }); + + modelBuilder.Entity("OpenIddict.EntityFrameworkCore.Models.OpenIddictEntityFrameworkCoreToken", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("varchar(255)"); + + b.Property("ApplicationId") + .HasColumnType("varchar(255)"); + + b.Property("AuthorizationId") + .HasColumnType("varchar(255)"); + + b.Property("ConcurrencyToken") + .IsConcurrencyToken() + .HasMaxLength(50) + .HasColumnType("varchar(50)"); + + b.Property("CreationDate") + .HasColumnType("datetime(6)"); + + b.Property("ExpirationDate") + .HasColumnType("datetime(6)"); + + b.Property("Payload") + .HasColumnType("longtext"); + + b.Property("Properties") + .HasColumnType("longtext"); + + b.Property("RedemptionDate") + .HasColumnType("datetime(6)"); + + b.Property("ReferenceId") + .HasMaxLength(100) + .HasColumnType("varchar(100)"); + + b.Property("Status") + .HasMaxLength(50) + .HasColumnType("varchar(50)"); + + b.Property("Subject") + .HasMaxLength(400) + .HasColumnType("varchar(400)"); + + b.Property("Type") + .HasMaxLength(50) + .HasColumnType("varchar(50)"); + + b.HasKey("Id"); + + b.HasIndex("AuthorizationId"); + + b.HasIndex("ReferenceId") + .IsUnique(); + + b.HasIndex("ApplicationId", "Status", "Subject", "Type"); + + b.ToTable("OpenIddictTokens", (string)null); + }); + + modelBuilder.Entity("Squidex.AI.Mongo.EFChatEntity", b => + { + b.Property("Id") + .HasMaxLength(255) + .HasColumnType("varchar(255)"); + + b.Property("LastUpdated") + .HasColumnType("datetime(6)"); + + b.Property("Value") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Version") + .IsConcurrencyToken() + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("LastUpdated"); + + b.ToTable("Chats", (string)null); + }); + + modelBuilder.Entity("Squidex.Assets.EntityFramework.EFAssetKeyValueEntity", b => + { + b.Property("Key") + .HasMaxLength(255) + .HasColumnType("varchar(255)"); + + b.Property("Expires") + .HasColumnType("datetime(6)"); + + b.Property("Value") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Key"); + + b.HasIndex("Expires"); + + b.ToTable("AssetKeyValueStore_TusMetadata", (string)null); + }); + + modelBuilder.Entity("Squidex.Domain.Apps.Entities.Apps.EFAppEntity", b => + { + b.Property("DocumentId") + .HasMaxLength(255) + .HasColumnType("varchar(255)"); + + b.Property("Document") + .HasColumnType("json"); + + b.Property("IndexedCreated") + .HasColumnType("datetime(6)") + .HasColumnName("Created"); + + b.Property("IndexedDeleted") + .HasColumnType("tinyint(1)") + .HasColumnName("Deleted"); + + b.Property("IndexedName") + .IsRequired() + .HasColumnType("longtext") + .HasColumnName("Name"); + + b.Property("IndexedTeamId") + .HasMaxLength(255) + .HasColumnType("varchar(255)") + .HasColumnName("TeamId"); + + b.Property("IndexedUserIds") + .IsRequired() + .HasColumnType("longtext") + .HasColumnName("UserIds"); + + b.Property("Version") + .HasColumnType("bigint"); + + b.HasKey("DocumentId"); + + b.ToTable("States_App", (string)null); + }); + + modelBuilder.Entity("Squidex.Domain.Apps.Entities.Assets.EFAssetEntity", b => + { + b.Property("DocumentId") + .HasMaxLength(255) + .HasColumnType("varchar(255)"); + + b.Property("AppId") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("varchar(255)"); + + b.Property("Created") + .HasColumnType("datetime(6)"); + + b.Property("CreatedBy") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("varchar(100)"); + + b.Property("FileHash") + .HasColumnType("longtext"); + + b.Property("FileName") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("FileSize") + .HasColumnType("bigint"); + + b.Property("FileVersion") + .HasColumnType("bigint"); + + b.Property("Id") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("varchar(255)"); + + b.Property("IndexedAppId") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("varchar(255)"); + + b.Property("IsDeleted") + .HasColumnType("tinyint(1)"); + + b.Property("IsProtected") + .HasColumnType("tinyint(1)"); + + b.Property("LastModified") + .HasColumnType("datetime(6)"); + + b.Property("LastModifiedBy") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("varchar(100)"); + + b.Property("Metadata") + .IsRequired() + .HasColumnType("json"); + + b.Property("MimeType") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("ParentId") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("varchar(255)"); + + b.Property("Slug") + .HasColumnType("longtext"); + + b.Property("Tags") + .IsRequired() + .HasMaxLength(1000) + .HasColumnType("varchar(1000)"); + + b.Property("TotalSize") + .HasColumnType("bigint"); + + b.Property("Type") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("varchar(100)"); + + b.Property("Version") + .HasColumnType("bigint"); + + b.HasKey("DocumentId"); + + b.HasIndex("IndexedAppId", "Id"); + + b.ToTable("Assets"); + }); + + modelBuilder.Entity("Squidex.Domain.Apps.Entities.Assets.EFAssetFolderEntity", b => + { + b.Property("DocumentId") + .HasMaxLength(255) + .HasColumnType("varchar(255)"); + + b.Property("AppId") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("varchar(255)"); + + b.Property("Created") + .HasColumnType("datetime(6)"); + + b.Property("CreatedBy") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("varchar(100)"); + + b.Property("FolderName") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Id") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("varchar(255)"); + + b.Property("IndexedAppId") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("varchar(255)"); + + b.Property("IsDeleted") + .HasColumnType("tinyint(1)"); + + b.Property("LastModified") + .HasColumnType("datetime(6)"); + + b.Property("LastModifiedBy") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("varchar(100)"); + + b.Property("ParentId") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("varchar(255)"); + + b.Property("Version") + .HasColumnType("bigint"); + + b.HasKey("DocumentId"); + + b.HasIndex("IndexedAppId", "Id"); + + b.ToTable("AssetFolders"); + }); + + modelBuilder.Entity("Squidex.Domain.Apps.Entities.Contents.EFContentCompleteEntity", b => + { + b.Property("DocumentId") + .HasMaxLength(255) + .HasColumnType("varchar(255)"); + + b.Property("AppId") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("varchar(255)"); + + b.Property("Created") + .HasColumnType("datetime(6)"); + + b.Property("CreatedBy") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("varchar(100)"); + + b.Property("Data") + .IsRequired() + .HasColumnType("json"); + + b.Property("Id") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("varchar(255)"); + + b.Property("IndexedAppId") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("varchar(255)"); + + b.Property("IndexedSchemaId") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("varchar(255)"); + + b.Property("IsDeleted") + .HasColumnType("tinyint(1)"); + + b.Property("LastModified") + .HasColumnType("datetime(6)"); + + b.Property("LastModifiedBy") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("varchar(100)"); + + b.Property("NewData") + .HasColumnType("json"); + + b.Property("NewStatus") + .HasMaxLength(100) + .HasColumnType("varchar(100)"); + + b.Property("ScheduleJob") + .HasColumnType("json"); + + b.Property("ScheduledAt") + .HasColumnType("datetime(6)"); + + b.Property("SchemaId") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("varchar(255)"); + + b.Property("Status") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("varchar(100)"); + + b.Property("TranslationStatus") + .HasColumnType("json"); + + b.Property("Version") + .HasColumnType("bigint"); + + b.HasKey("DocumentId"); + + b.ToTable("ContentsAll", (string)null); + }); + + modelBuilder.Entity("Squidex.Domain.Apps.Entities.Contents.EFContentPublishedEntity", b => + { + b.Property("DocumentId") + .HasMaxLength(255) + .HasColumnType("varchar(255)"); + + b.Property("AppId") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("varchar(255)"); + + b.Property("Created") + .HasColumnType("datetime(6)"); + + b.Property("CreatedBy") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("varchar(100)"); + + b.Property("Data") + .IsRequired() + .HasColumnType("json"); + + b.Property("Id") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("varchar(255)"); + + b.Property("IndexedAppId") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("varchar(255)"); + + b.Property("IndexedSchemaId") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("varchar(255)"); + + b.Property("IsDeleted") + .HasColumnType("tinyint(1)"); + + b.Property("LastModified") + .HasColumnType("datetime(6)"); + + b.Property("LastModifiedBy") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("varchar(100)"); + + b.Property("NewData") + .HasColumnType("json"); + + b.Property("NewStatus") + .HasMaxLength(100) + .HasColumnType("varchar(100)"); + + b.Property("ScheduleJob") + .HasColumnType("json"); + + b.Property("ScheduledAt") + .HasColumnType("datetime(6)"); + + b.Property("SchemaId") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("varchar(255)"); + + b.Property("Status") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("varchar(100)"); + + b.Property("TranslationStatus") + .HasColumnType("json"); + + b.Property("Version") + .HasColumnType("bigint"); + + b.HasKey("DocumentId"); + + b.ToTable("ContentsPublished", (string)null); + }); + + modelBuilder.Entity("Squidex.Domain.Apps.Entities.Contents.EFContentTableEntity", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("Id")); + + b.Property("AppId") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("varchar(255)"); + + b.Property("SchemaId") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("varchar(255)"); + + b.HasKey("Id"); + + b.HasIndex("AppId", "SchemaId") + .IsUnique(); + + b.ToTable("ContentTables", (string)null); + }); + + modelBuilder.Entity("Squidex.Domain.Apps.Entities.Contents.EFReferenceCompleteEntity", b => + { + b.Property("AppId") + .HasMaxLength(255) + .HasColumnType("varchar(255)"); + + b.Property("FromKey") + .HasMaxLength(255) + .HasColumnType("varchar(255)"); + + b.Property("ToId") + .HasMaxLength(255) + .HasColumnType("varchar(255)"); + + b.Property("FromSchema") + .IsRequired() + .ValueGeneratedOnAdd() + .HasMaxLength(255) + .HasColumnType("varchar(255)") + .HasDefaultValue("00000000-0000-0000-0000-000000000000"); + + b.HasKey("AppId", "FromKey", "ToId"); + + b.ToTable("ContentReferencesAll", (string)null); + }); + + modelBuilder.Entity("Squidex.Domain.Apps.Entities.Contents.EFReferencePublishedEntity", b => + { + b.Property("AppId") + .HasMaxLength(255) + .HasColumnType("varchar(255)"); + + b.Property("FromKey") + .HasMaxLength(255) + .HasColumnType("varchar(255)"); + + b.Property("ToId") + .HasMaxLength(255) + .HasColumnType("varchar(255)"); + + b.Property("FromSchema") + .IsRequired() + .ValueGeneratedOnAdd() + .HasMaxLength(255) + .HasColumnType("varchar(255)") + .HasDefaultValue("00000000-0000-0000-0000-000000000000"); + + b.HasKey("AppId", "FromKey", "ToId"); + + b.ToTable("ContentReferencesPublished", (string)null); + }); + + modelBuilder.Entity("Squidex.Domain.Apps.Entities.Contents.Text.EFTextIndexGeoEntity", b => + { + b.Property("Id") + .HasMaxLength(400) + .HasColumnType("varchar(400)"); + + b.Property("AppId") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("varchar(255)"); + + b.Property("ContentId") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("varchar(255)"); + + b.Property("GeoField") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("varchar(255)"); + + b.Property("GeoObject") + .IsRequired() + .HasColumnType("geometry"); + + b.Property("SchemaId") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("varchar(255)"); + + b.Property("ServeAll") + .HasColumnType("tinyint(1)"); + + b.Property("ServePublished") + .HasColumnType("tinyint(1)"); + + b.Property("Stage") + .HasColumnType("tinyint unsigned"); + + b.HasKey("Id"); + + b.ToTable("Geos"); + }); + + modelBuilder.Entity("Squidex.Domain.Apps.Entities.Contents.Text.EFTextIndexTextEntity", b => + { + b.Property("Id") + .HasMaxLength(400) + .HasColumnType("varchar(400)"); + + b.Property("AppId") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("varchar(255)"); + + b.Property("ContentId") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("varchar(255)"); + + b.Property("SchemaId") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("varchar(255)"); + + b.Property("ServeAll") + .HasColumnType("tinyint(1)"); + + b.Property("ServePublished") + .HasColumnType("tinyint(1)"); + + b.Property("Stage") + .HasColumnType("tinyint unsigned"); + + b.Property("Texts") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("Texts"); + }); + + modelBuilder.Entity("Squidex.Domain.Apps.Entities.Contents.Text.EFTextIndexUserInfoEntity", b => + { + b.Property("Id") + .HasMaxLength(400) + .HasColumnType("varchar(400)"); + + b.Property("AppId") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("varchar(255)"); + + b.Property("ContentId") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("varchar(255)"); + + b.Property("SchemaId") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("varchar(255)"); + + b.Property("ServeAll") + .HasColumnType("tinyint(1)"); + + b.Property("ServePublished") + .HasColumnType("tinyint(1)"); + + b.Property("Stage") + .HasColumnType("tinyint unsigned"); + + b.Property("UserInfoApiKey") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("varchar(256)"); + + b.Property("UserInfoRole") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("varchar(256)"); + + b.HasKey("Id"); + + b.HasIndex("UserInfoApiKey"); + + b.ToTable("UserInfos"); + }); + + modelBuilder.Entity("Squidex.Domain.Apps.Entities.Contents.Text.State.TextContentState", b => + { + b.Property("UniqueContentId") + .HasMaxLength(255) + .HasColumnType("varchar(255)"); + + b.Property("State") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("varchar(100)"); + + b.HasKey("UniqueContentId"); + + b.ToTable("TextState", (string)null); + }); + + modelBuilder.Entity("Squidex.Domain.Apps.Entities.History.HistoryEvent", b => + { + b.Property("Id") + .HasMaxLength(255) + .HasColumnType("varchar(255)"); + + b.Property("Actor") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("varchar(100)"); + + b.Property("Channel") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Created") + .HasColumnType("datetime(6)"); + + b.Property("EventType") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("OwnerId") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("varchar(255)"); + + b.Property("Parameters") + .IsRequired() + .HasColumnType("json"); + + b.Property("Version") + .HasColumnType("bigint"); + + b.HasKey("Id"); + + b.ToTable("HistoryEvent"); + }); + + modelBuilder.Entity("Squidex.Domain.Apps.Entities.Rules.EFRuleEntity", b => + { + b.Property("DocumentId") + .HasMaxLength(255) + .HasColumnType("varchar(255)"); + + b.Property("Document") + .HasColumnType("json"); + + b.Property("IndexedAppId") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("varchar(255)") + .HasColumnName("AppId"); + + b.Property("IndexedDeleted") + .HasColumnType("tinyint(1)") + .HasColumnName("Deleted"); + + b.Property("IndexedId") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("varchar(255)") + .HasColumnName("Id"); + + b.Property("Version") + .HasColumnType("bigint"); + + b.HasKey("DocumentId"); + + b.ToTable("States_Rule", (string)null); + }); + + modelBuilder.Entity("Squidex.Domain.Apps.Entities.Schemas.EFSchemaEntity", b => + { + b.Property("DocumentId") + .HasMaxLength(255) + .HasColumnType("varchar(255)"); + + b.Property("Document") + .HasColumnType("json"); + + b.Property("IndexedAppId") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("varchar(255)") + .HasColumnName("AppId"); + + b.Property("IndexedDeleted") + .HasColumnType("tinyint(1)") + .HasColumnName("Deleted"); + + b.Property("IndexedId") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("varchar(255)") + .HasColumnName("Id"); + + b.Property("IndexedName") + .IsRequired() + .HasColumnType("longtext") + .HasColumnName("Name"); + + b.Property("Version") + .HasColumnType("bigint"); + + b.HasKey("DocumentId"); + + b.ToTable("States_Schema", (string)null); + }); + + modelBuilder.Entity("Squidex.Domain.Apps.Entities.Teams.EFTeamEntity", b => + { + b.Property("DocumentId") + .HasMaxLength(255) + .HasColumnType("varchar(255)"); + + b.Property("Document") + .HasColumnType("json"); + + b.Property("IndexedAuthDomain") + .HasColumnType("longtext") + .HasColumnName("AuthDomain"); + + b.Property("IndexedDeleted") + .HasColumnType("tinyint(1)") + .HasColumnName("Deleted"); + + b.Property("IndexedUserIds") + .IsRequired() + .HasColumnType("longtext") + .HasColumnName("UserIds"); + + b.Property("Version") + .HasColumnType("bigint"); + + b.HasKey("DocumentId"); + + b.ToTable("States_Team", (string)null); + }); + + modelBuilder.Entity("Squidex.Events.EntityFramework.EFEventCommit", b => + { + b.Property("Id") + .HasColumnType("char(36)"); + + b.Property("EventStream") + .IsRequired() + .HasMaxLength(750) + .HasColumnType("varchar(750)"); + + b.Property("EventStreamOffset") + .HasColumnType("bigint"); + + b.Property("Events") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("EventsCount") + .HasColumnType("bigint"); + + b.Property("Position") + .HasColumnType("bigint"); + + b.Property("Timestamp") + .HasColumnType("datetime(6)"); + + b.HasKey("Id"); + + b.HasIndex("EventStream", "EventStreamOffset") + .IsUnique(); + + b.HasIndex("EventStream", "Position"); + + b.HasIndex("EventStream", "Timestamp"); + + b.ToTable("Events"); + }); + + modelBuilder.Entity("Squidex.Events.EntityFramework.EFPosition", b => + { + b.Property("Id") + .HasColumnType("bigint"); + + b.Property("Position") + .HasColumnType("bigint"); + + b.HasKey("Id"); + + b.ToTable("EventPosition"); + }); + + modelBuilder.Entity("Squidex.Flows.EntityFramework.EFCronJobEntity", b => + { + b.Property("Id") + .HasMaxLength(255) + .HasColumnType("varchar(255)"); + + b.Property("Data") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("DueTime") + .HasColumnType("datetime(6)"); + + b.HasKey("Id"); + + b.HasIndex("DueTime"); + + b.ToTable("CronJobs", (string)null); + }); + + modelBuilder.Entity("Squidex.Flows.EntityFramework.EFFlowStateEntity", b => + { + b.Property("Id") + .HasColumnType("char(36)"); + + b.Property("Created") + .HasColumnType("datetime(6)"); + + b.Property("DefinitionId") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("varchar(255)"); + + b.Property("DueTime") + .HasColumnType("datetime(6)"); + + b.Property("OwnerId") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("varchar(255)"); + + b.Property("SchedulePartition") + .HasColumnType("int"); + + b.Property("State") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.HasIndex("DueTime", "SchedulePartition"); + + b.ToTable("Flows", (string)null); + }); + + modelBuilder.Entity("Squidex.Infrastructure.Caching.EFCacheEntity", b => + { + b.Property("Key") + .HasColumnType("varchar(255)"); + + b.Property("Expires") + .HasColumnType("datetime(6)"); + + b.Property("Value") + .IsRequired() + .HasColumnType("longblob"); + + b.HasKey("Key"); + + b.ToTable("Cache", (string)null); + }); + + modelBuilder.Entity("Squidex.Infrastructure.Log.EFRequestEntity", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("Id")); + + b.Property("Key") + .IsRequired() + .HasColumnType("varchar(255)"); + + b.Property("Properties") + .IsRequired() + .HasColumnType("json"); + + b.Property("Timestamp") + .HasColumnType("datetime(6)"); + + b.HasKey("Id"); + + b.HasIndex("Key"); + + b.ToTable("Requests", (string)null); + }); + + modelBuilder.Entity("Squidex.Infrastructure.Migrations.EFMigrationEntity", b => + { + b.Property("Id") + .HasColumnType("int"); + + b.Property("IsLocked") + .HasColumnType("tinyint(1)"); + + b.Property("Version") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.ToTable("Migrations", (string)null); + }); + + modelBuilder.Entity("Squidex.Infrastructure.States.EFState", b => + { + b.Property("DocumentId") + .HasMaxLength(255) + .HasColumnType("varchar(255)"); + + b.Property("Document") + .HasColumnType("json"); + + b.Property("Version") + .HasColumnType("bigint"); + + b.HasKey("DocumentId"); + + b.ToTable("States_UISettings", (string)null); + }); + + modelBuilder.Entity("Squidex.Infrastructure.States.EFState", b => + { + b.Property("DocumentId") + .HasMaxLength(255) + .HasColumnType("varchar(255)"); + + b.Property("Document") + .HasColumnType("json"); + + b.Property("Version") + .HasColumnType("bigint"); + + b.HasKey("DocumentId"); + + b.ToTable("States_Index_TagHistory", (string)null); + }); + + modelBuilder.Entity("Squidex.Infrastructure.States.EFState", b => + { + b.Property("DocumentId") + .HasMaxLength(255) + .HasColumnType("varchar(255)"); + + b.Property("Document") + .HasColumnType("json"); + + b.Property("Version") + .HasColumnType("bigint"); + + b.HasKey("DocumentId"); + + b.ToTable("States_UsageNotifications", (string)null); + }); + + modelBuilder.Entity("Squidex.Infrastructure.States.EFState", b => + { + b.Property("DocumentId") + .HasMaxLength(255) + .HasColumnType("varchar(255)"); + + b.Property("Document") + .HasColumnType("json"); + + b.Property("Version") + .HasColumnType("bigint"); + + b.HasKey("DocumentId"); + + b.ToTable("States_Counters", (string)null); + }); + + modelBuilder.Entity("Squidex.Infrastructure.States.EFState", b => + { + b.Property("DocumentId") + .HasMaxLength(255) + .HasColumnType("varchar(255)"); + + b.Property("Document") + .HasColumnType("json"); + + b.Property("Version") + .HasColumnType("bigint"); + + b.HasKey("DocumentId"); + + b.ToTable("States_JobsState", (string)null); + }); + + modelBuilder.Entity("Squidex.Infrastructure.States.EFState", b => + { + b.Property("DocumentId") + .HasMaxLength(255) + .HasColumnType("varchar(255)"); + + b.Property("Document") + .HasColumnType("json"); + + b.Property("Version") + .HasColumnType("bigint"); + + b.HasKey("DocumentId"); + + b.ToTable("States_UsageTracker", (string)null); + }); + + modelBuilder.Entity("Squidex.Infrastructure.States.EFState", b => + { + b.Property("DocumentId") + .HasMaxLength(255) + .HasColumnType("varchar(255)"); + + b.Property("Document") + .HasColumnType("json"); + + b.Property("Version") + .HasColumnType("bigint"); + + b.HasKey("DocumentId"); + + b.ToTable("States_Index_Tags", (string)null); + }); + + modelBuilder.Entity("Squidex.Infrastructure.States.EFState", b => + { + b.Property("DocumentId") + .HasMaxLength(255) + .HasColumnType("varchar(255)"); + + b.Property("Document") + .HasColumnType("json"); + + b.Property("Version") + .HasColumnType("bigint"); + + b.HasKey("DocumentId"); + + b.ToTable("States_Identity_Keys", (string)null); + }); + + modelBuilder.Entity("Squidex.Infrastructure.States.EFState", b => + { + b.Property("DocumentId") + .HasMaxLength(255) + .HasColumnType("varchar(255)"); + + b.Property("Document") + .HasColumnType("json"); + + b.Property("Version") + .HasColumnType("bigint"); + + b.HasKey("DocumentId"); + + b.ToTable("States_Identity_Xml", (string)null); + }); + + modelBuilder.Entity("Squidex.Infrastructure.States.EFState", b => + { + b.Property("DocumentId") + .HasMaxLength(255) + .HasColumnType("varchar(255)"); + + b.Property("Document") + .HasColumnType("json"); + + b.Property("Version") + .HasColumnType("bigint"); + + b.HasKey("DocumentId"); + + b.ToTable("States_EventConsumerState", (string)null); + }); + + modelBuilder.Entity("Squidex.Infrastructure.States.EFState", b => + { + b.Property("DocumentId") + .HasMaxLength(255) + .HasColumnType("varchar(255)"); + + b.Property("Document") + .HasColumnType("json"); + + b.Property("Version") + .HasColumnType("bigint"); + + b.HasKey("DocumentId"); + + b.ToTable("States_Names", (string)null); + }); + + modelBuilder.Entity("Squidex.Infrastructure.UsageTracking.EFUsageCounterEntity", b => + { + b.Property("Key") + .HasColumnType("varchar(255)"); + + b.Property("Date") + .HasColumnType("datetime(6)"); + + b.Property("Category") + .HasColumnType("varchar(255)"); + + b.Property("CounterKey") + .HasColumnType("varchar(255)"); + + b.Property("CounterValue") + .HasColumnType("double"); + + b.HasKey("Key", "Date", "Category", "CounterKey"); + + b.ToTable("Counter", (string)null); + }); + + modelBuilder.Entity("Squidex.Messaging.EntityFramework.EFMessage", b => + { + b.Property("Id") + .HasColumnType("varchar(255)"); + + b.Property("ChannelName") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("varchar(255)"); + + b.Property("MessageData") + .IsRequired() + .HasColumnType("longblob"); + + b.Property("MessageHeaders") + .IsRequired() + .HasMaxLength(2000) + .HasColumnType("varchar(2000)"); + + b.Property("QueueName") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("varchar(255)"); + + b.Property("TimeHandled") + .HasColumnType("datetime(6)"); + + b.Property("TimeToLive") + .HasColumnType("datetime(6)"); + + b.Property("Version") + .IsConcurrencyToken() + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ChannelName", "TimeHandled"); + + b.ToTable("Messages", (string)null); + }); + + modelBuilder.Entity("Squidex.Messaging.EntityFramework.EFMessagingDataEntity", b => + { + b.Property("Group") + .HasMaxLength(255) + .HasColumnType("varchar(255)"); + + b.Property("Key") + .HasMaxLength(255) + .HasColumnType("varchar(255)"); + + b.Property("Expiration") + .HasColumnType("datetime(6)"); + + b.Property("ValueData") + .IsRequired() + .HasColumnType("longblob"); + + b.Property("ValueFormat") + .HasMaxLength(255) + .HasColumnType("varchar(255)"); + + b.Property("ValueType") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("varchar(255)"); + + b.HasKey("Group", "Key"); + + b.HasIndex("Expiration"); + + b.ToTable("MessagingData", (string)null); + }); + + modelBuilder.Entity("YDotNet.Server.EntityFramework.YDotNetDocument", b => + { + b.Property("Id") + .HasMaxLength(256) + .HasColumnType("varchar(256)"); + + b.Property("Data") + .IsRequired() + .HasColumnType("longblob"); + + b.Property("Expiration") + .HasColumnType("datetime(6)"); + + b.HasKey("Id"); + + b.ToTable("YDotNetDocument", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null) + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null) + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("OpenIddict.EntityFrameworkCore.Models.OpenIddictEntityFrameworkCoreToken", b => + { + b.HasOne("OpenIddict.EntityFrameworkCore.Models.OpenIddictEntityFrameworkCoreAuthorization", "Authorization") + .WithMany("Tokens") + .HasForeignKey("AuthorizationId"); + + b.Navigation("Authorization"); + }); + + modelBuilder.Entity("OpenIddict.EntityFrameworkCore.Models.OpenIddictEntityFrameworkCoreAuthorization", b => + { + b.Navigation("Tokens"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/backend/src/Squidex.Data.EntityFramework/Providers/MySql/App/Migrations/20260117183413_AddUserInfoIndex.cs b/backend/src/Squidex.Data.EntityFramework/Providers/MySql/App/Migrations/20260117183413_AddUserInfoIndex.cs new file mode 100644 index 000000000..e59fae3ef --- /dev/null +++ b/backend/src/Squidex.Data.EntityFramework/Providers/MySql/App/Migrations/20260117183413_AddUserInfoIndex.cs @@ -0,0 +1,52 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace Squidex.Providers.MySql.App.Migrations +{ + /// + public partial class AddUserInfoIndex : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateTable( + name: "UserInfos", + columns: table => new + { + Id = table.Column(type: "varchar(400)", maxLength: 400, nullable: false) + .Annotation("MySql:CharSet", "utf8mb4"), + AppId = table.Column(type: "varchar(255)", maxLength: 255, nullable: false) + .Annotation("MySql:CharSet", "utf8mb4"), + SchemaId = table.Column(type: "varchar(255)", maxLength: 255, nullable: false) + .Annotation("MySql:CharSet", "utf8mb4"), + ContentId = table.Column(type: "varchar(255)", maxLength: 255, nullable: false) + .Annotation("MySql:CharSet", "utf8mb4"), + Stage = table.Column(type: "tinyint unsigned", nullable: false), + ServeAll = table.Column(type: "tinyint(1)", nullable: false), + ServePublished = table.Column(type: "tinyint(1)", nullable: false), + UserInfoApiKey = table.Column(type: "varchar(256)", maxLength: 256, nullable: false) + .Annotation("MySql:CharSet", "utf8mb4"), + UserInfoRole = table.Column(type: "varchar(256)", maxLength: 256, nullable: false) + .Annotation("MySql:CharSet", "utf8mb4") + }, + constraints: table => + { + table.PrimaryKey("PK_UserInfos", x => x.Id); + }) + .Annotation("MySql:CharSet", "utf8mb4"); + + migrationBuilder.CreateIndex( + name: "IX_UserInfos_UserInfoApiKey", + table: "UserInfos", + column: "UserInfoApiKey"); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "UserInfos"); + } + } +} diff --git a/backend/src/Squidex.Data.EntityFramework/Providers/MySql/App/Migrations/MySqlDbContextModelSnapshot.cs b/backend/src/Squidex.Data.EntityFramework/Providers/MySql/App/Migrations/MySqlDbContextModelSnapshot.cs index e6dd9f393..67a07b809 100644 --- a/backend/src/Squidex.Data.EntityFramework/Providers/MySql/App/Migrations/MySqlDbContextModelSnapshot.cs +++ b/backend/src/Squidex.Data.EntityFramework/Providers/MySql/App/Migrations/MySqlDbContextModelSnapshot.cs @@ -18,7 +18,7 @@ namespace Squidex.Providers.MySql.Migrations { #pragma warning disable 612, 618 modelBuilder - .HasAnnotation("ProductVersion", "8.0.14") + .HasAnnotation("ProductVersion", "8.0.16") .HasAnnotation("Relational:MaxIdentifierLength", 64); MySqlModelBuilderExtensions.AutoIncrementColumns(modelBuilder); @@ -845,7 +845,7 @@ namespace Squidex.Providers.MySql.Migrations b.HasKey("Id"); - b.ToTable("Geos", (string)null); + b.ToTable("Geos"); }); modelBuilder.Entity("Squidex.Domain.Apps.Entities.Contents.Text.EFTextIndexTextEntity", b => @@ -884,7 +884,54 @@ namespace Squidex.Providers.MySql.Migrations b.HasKey("Id"); - b.ToTable("Texts", (string)null); + b.ToTable("Texts"); + }); + + modelBuilder.Entity("Squidex.Domain.Apps.Entities.Contents.Text.EFTextIndexUserInfoEntity", b => + { + b.Property("Id") + .HasMaxLength(400) + .HasColumnType("varchar(400)"); + + b.Property("AppId") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("varchar(255)"); + + b.Property("ContentId") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("varchar(255)"); + + b.Property("SchemaId") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("varchar(255)"); + + b.Property("ServeAll") + .HasColumnType("tinyint(1)"); + + b.Property("ServePublished") + .HasColumnType("tinyint(1)"); + + b.Property("Stage") + .HasColumnType("tinyint unsigned"); + + b.Property("UserInfoApiKey") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("varchar(256)"); + + b.Property("UserInfoRole") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("varchar(256)"); + + b.HasKey("Id"); + + b.HasIndex("UserInfoApiKey"); + + b.ToTable("UserInfos"); }); modelBuilder.Entity("Squidex.Domain.Apps.Entities.Contents.Text.State.TextContentState", b => @@ -1046,7 +1093,6 @@ namespace Squidex.Providers.MySql.Migrations modelBuilder.Entity("Squidex.Events.EntityFramework.EFEventCommit", b => { b.Property("Id") - .ValueGeneratedOnAdd() .HasColumnType("char(36)"); b.Property("EventStream") @@ -1118,7 +1164,6 @@ namespace Squidex.Providers.MySql.Migrations modelBuilder.Entity("Squidex.Flows.EntityFramework.EFFlowStateEntity", b => { b.Property("Id") - .ValueGeneratedOnAdd() .HasColumnType("char(36)"); b.Property("Created") diff --git a/backend/src/Squidex.Data.EntityFramework/Providers/Postgres/App/Migrations/20260117183420_AddUserInfoIndex.Designer.cs b/backend/src/Squidex.Data.EntityFramework/Providers/Postgres/App/Migrations/20260117183420_AddUserInfoIndex.Designer.cs new file mode 100644 index 000000000..c0e859b76 --- /dev/null +++ b/backend/src/Squidex.Data.EntityFramework/Providers/Postgres/App/Migrations/20260117183420_AddUserInfoIndex.Designer.cs @@ -0,0 +1,1630 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using NetTopologySuite.Geometries; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; +using Squidex.Providers.Postgres.App; + +#nullable disable + +namespace Squidex.Providers.Postgres.App.Migrations +{ + [DbContext(typeof(PostgresAppDbContext))] + [Migration("20260117183420_AddUserInfoIndex")] + partial class AddUserInfoIndex + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "8.0.16") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + NpgsqlModelBuilderExtensions.HasPostgresExtension(modelBuilder, "postgis"); + NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRole", b => + { + b.Property("Id") + .HasColumnType("text"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnType("text"); + + b.Property("Name") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("NormalizedName") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.HasKey("Id"); + + b.HasIndex("NormalizedName") + .IsUnique() + .HasDatabaseName("RoleNameIndex"); + + b.ToTable("AspNetRoles", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ClaimType") + .HasColumnType("text"); + + b.Property("ClaimValue") + .HasColumnType("text"); + + b.Property("RoleId") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("RoleId"); + + b.ToTable("AspNetRoleClaims", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUser", b => + { + b.Property("Id") + .HasColumnType("text"); + + b.Property("AccessFailedCount") + .HasColumnType("integer"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnType("text"); + + b.Property("Email") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("EmailConfirmed") + .HasColumnType("boolean"); + + b.Property("LockoutEnabled") + .HasColumnType("boolean"); + + b.Property("LockoutEnd") + .HasColumnType("timestamp with time zone"); + + b.Property("NormalizedEmail") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("NormalizedUserName") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("PasswordHash") + .HasColumnType("text"); + + b.Property("PhoneNumber") + .HasColumnType("text"); + + b.Property("PhoneNumberConfirmed") + .HasColumnType("boolean"); + + b.Property("SecurityStamp") + .HasColumnType("text"); + + b.Property("TwoFactorEnabled") + .HasColumnType("boolean"); + + b.Property("UserName") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.HasKey("Id"); + + b.HasIndex("NormalizedEmail") + .HasDatabaseName("EmailIndex"); + + b.HasIndex("NormalizedUserName") + .IsUnique() + .HasDatabaseName("UserNameIndex"); + + b.ToTable("AspNetUsers", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ClaimType") + .HasColumnType("text"); + + b.Property("ClaimValue") + .HasColumnType("text"); + + b.Property("UserId") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("AspNetUserClaims", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => + { + b.Property("LoginProvider") + .HasColumnType("text"); + + b.Property("ProviderKey") + .HasColumnType("text"); + + b.Property("ProviderDisplayName") + .HasColumnType("text"); + + b.Property("UserId") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("LoginProvider", "ProviderKey"); + + b.HasIndex("UserId"); + + b.ToTable("AspNetUserLogins", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => + { + b.Property("UserId") + .HasColumnType("text"); + + b.Property("RoleId") + .HasColumnType("text"); + + b.HasKey("UserId", "RoleId"); + + b.HasIndex("RoleId"); + + b.ToTable("AspNetUserRoles", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => + { + b.Property("UserId") + .HasColumnType("text"); + + b.Property("LoginProvider") + .HasColumnType("text"); + + b.Property("Name") + .HasColumnType("text"); + + b.Property("Value") + .HasColumnType("text"); + + b.HasKey("UserId", "LoginProvider", "Name"); + + b.ToTable("AspNetUserTokens", (string)null); + }); + + modelBuilder.Entity("OpenIddict.EntityFrameworkCore.Models.OpenIddictEntityFrameworkCoreAuthorization", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("text"); + + b.Property("ApplicationId") + .IsRequired() + .HasColumnType("text"); + + b.Property("ConcurrencyToken") + .IsConcurrencyToken() + .HasMaxLength(50) + .HasColumnType("character varying(50)"); + + b.Property("CreationDate") + .HasColumnType("timestamp with time zone"); + + b.Property("Properties") + .HasColumnType("text"); + + b.Property("Scopes") + .HasColumnType("text"); + + b.Property("Status") + .HasMaxLength(50) + .HasColumnType("character varying(50)"); + + b.Property("Subject") + .HasMaxLength(400) + .HasColumnType("character varying(400)"); + + b.Property("Type") + .HasMaxLength(50) + .HasColumnType("character varying(50)"); + + b.HasKey("Id"); + + b.HasIndex("ApplicationId", "Status", "Subject", "Type"); + + b.ToTable("OpenIddictAuthorizations", (string)null); + }); + + modelBuilder.Entity("OpenIddict.EntityFrameworkCore.Models.OpenIddictEntityFrameworkCoreToken", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("text"); + + b.Property("ApplicationId") + .HasColumnType("text"); + + b.Property("AuthorizationId") + .HasColumnType("text"); + + b.Property("ConcurrencyToken") + .IsConcurrencyToken() + .HasMaxLength(50) + .HasColumnType("character varying(50)"); + + b.Property("CreationDate") + .HasColumnType("timestamp with time zone"); + + b.Property("ExpirationDate") + .HasColumnType("timestamp with time zone"); + + b.Property("Payload") + .HasColumnType("text"); + + b.Property("Properties") + .HasColumnType("text"); + + b.Property("RedemptionDate") + .HasColumnType("timestamp with time zone"); + + b.Property("ReferenceId") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("Status") + .HasMaxLength(50) + .HasColumnType("character varying(50)"); + + b.Property("Subject") + .HasMaxLength(400) + .HasColumnType("character varying(400)"); + + b.Property("Type") + .HasMaxLength(50) + .HasColumnType("character varying(50)"); + + b.HasKey("Id"); + + b.HasIndex("AuthorizationId"); + + b.HasIndex("ReferenceId") + .IsUnique(); + + b.HasIndex("ApplicationId", "Status", "Subject", "Type"); + + b.ToTable("OpenIddictTokens", (string)null); + }); + + modelBuilder.Entity("Squidex.AI.Mongo.EFChatEntity", b => + { + b.Property("Id") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("LastUpdated") + .HasColumnType("timestamp with time zone"); + + b.Property("Value") + .IsRequired() + .HasColumnType("text"); + + b.Property("Version") + .IsConcurrencyToken() + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("LastUpdated"); + + b.ToTable("Chats", (string)null); + }); + + modelBuilder.Entity("Squidex.Assets.EntityFramework.EFAssetKeyValueEntity", b => + { + b.Property("Key") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("Expires") + .HasColumnType("timestamp with time zone"); + + b.Property("Value") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Key"); + + b.HasIndex("Expires"); + + b.ToTable("AssetKeyValueStore_TusMetadata", (string)null); + }); + + modelBuilder.Entity("Squidex.Domain.Apps.Entities.Apps.EFAppEntity", b => + { + b.Property("DocumentId") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("Document") + .HasColumnType("jsonb"); + + b.Property("IndexedCreated") + .HasColumnType("timestamp with time zone") + .HasColumnName("Created"); + + b.Property("IndexedDeleted") + .HasColumnType("boolean") + .HasColumnName("Deleted"); + + b.Property("IndexedName") + .IsRequired() + .HasColumnType("text") + .HasColumnName("Name"); + + b.Property("IndexedTeamId") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("TeamId"); + + b.Property("IndexedUserIds") + .IsRequired() + .HasColumnType("text") + .HasColumnName("UserIds"); + + b.Property("Version") + .HasColumnType("bigint"); + + b.HasKey("DocumentId"); + + b.ToTable("States_App", (string)null); + }); + + modelBuilder.Entity("Squidex.Domain.Apps.Entities.Assets.EFAssetEntity", b => + { + b.Property("DocumentId") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("AppId") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("Created") + .HasColumnType("timestamp with time zone"); + + b.Property("CreatedBy") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("FileHash") + .HasColumnType("text"); + + b.Property("FileName") + .IsRequired() + .HasColumnType("text"); + + b.Property("FileSize") + .HasColumnType("bigint"); + + b.Property("FileVersion") + .HasColumnType("bigint"); + + b.Property("Id") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("IndexedAppId") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("IsDeleted") + .HasColumnType("boolean"); + + b.Property("IsProtected") + .HasColumnType("boolean"); + + b.Property("LastModified") + .HasColumnType("timestamp with time zone"); + + b.Property("LastModifiedBy") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("Metadata") + .IsRequired() + .HasColumnType("jsonb"); + + b.Property("MimeType") + .IsRequired() + .HasColumnType("text"); + + b.Property("ParentId") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("Slug") + .HasColumnType("text"); + + b.Property("Tags") + .IsRequired() + .HasMaxLength(1000) + .HasColumnType("character varying(1000)"); + + b.Property("TotalSize") + .HasColumnType("bigint"); + + b.Property("Type") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("Version") + .HasColumnType("bigint"); + + b.HasKey("DocumentId"); + + b.HasIndex("IndexedAppId", "Id"); + + b.ToTable("Assets"); + }); + + modelBuilder.Entity("Squidex.Domain.Apps.Entities.Assets.EFAssetFolderEntity", b => + { + b.Property("DocumentId") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("AppId") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("Created") + .HasColumnType("timestamp with time zone"); + + b.Property("CreatedBy") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("FolderName") + .IsRequired() + .HasColumnType("text"); + + b.Property("Id") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("IndexedAppId") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("IsDeleted") + .HasColumnType("boolean"); + + b.Property("LastModified") + .HasColumnType("timestamp with time zone"); + + b.Property("LastModifiedBy") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("ParentId") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("Version") + .HasColumnType("bigint"); + + b.HasKey("DocumentId"); + + b.HasIndex("IndexedAppId", "Id"); + + b.ToTable("AssetFolders"); + }); + + modelBuilder.Entity("Squidex.Domain.Apps.Entities.Contents.EFContentCompleteEntity", b => + { + b.Property("DocumentId") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("AppId") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("Created") + .HasColumnType("timestamp with time zone"); + + b.Property("CreatedBy") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("Data") + .IsRequired() + .HasColumnType("jsonb"); + + b.Property("Id") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("IndexedAppId") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("IndexedSchemaId") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("IsDeleted") + .HasColumnType("boolean"); + + b.Property("LastModified") + .HasColumnType("timestamp with time zone"); + + b.Property("LastModifiedBy") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("NewData") + .HasColumnType("jsonb"); + + b.Property("NewStatus") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("ScheduleJob") + .HasColumnType("jsonb"); + + b.Property("ScheduledAt") + .HasColumnType("timestamp with time zone"); + + b.Property("SchemaId") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("Status") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("TranslationStatus") + .HasColumnType("jsonb"); + + b.Property("Version") + .HasColumnType("bigint"); + + b.HasKey("DocumentId"); + + b.ToTable("ContentsAll", (string)null); + }); + + modelBuilder.Entity("Squidex.Domain.Apps.Entities.Contents.EFContentPublishedEntity", b => + { + b.Property("DocumentId") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("AppId") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("Created") + .HasColumnType("timestamp with time zone"); + + b.Property("CreatedBy") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("Data") + .IsRequired() + .HasColumnType("jsonb"); + + b.Property("Id") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("IndexedAppId") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("IndexedSchemaId") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("IsDeleted") + .HasColumnType("boolean"); + + b.Property("LastModified") + .HasColumnType("timestamp with time zone"); + + b.Property("LastModifiedBy") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("NewData") + .HasColumnType("jsonb"); + + b.Property("NewStatus") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("ScheduleJob") + .HasColumnType("jsonb"); + + b.Property("ScheduledAt") + .HasColumnType("timestamp with time zone"); + + b.Property("SchemaId") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("Status") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("TranslationStatus") + .HasColumnType("jsonb"); + + b.Property("Version") + .HasColumnType("bigint"); + + b.HasKey("DocumentId"); + + b.ToTable("ContentsPublished", (string)null); + }); + + modelBuilder.Entity("Squidex.Domain.Apps.Entities.Contents.EFContentTableEntity", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("AppId") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("SchemaId") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.HasKey("Id"); + + b.HasIndex("AppId", "SchemaId") + .IsUnique(); + + b.ToTable("ContentTables", (string)null); + }); + + modelBuilder.Entity("Squidex.Domain.Apps.Entities.Contents.EFReferenceCompleteEntity", b => + { + b.Property("AppId") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("FromKey") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("ToId") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("FromSchema") + .IsRequired() + .ValueGeneratedOnAdd() + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasDefaultValue("00000000-0000-0000-0000-000000000000"); + + b.HasKey("AppId", "FromKey", "ToId"); + + b.ToTable("ContentReferencesAll", (string)null); + }); + + modelBuilder.Entity("Squidex.Domain.Apps.Entities.Contents.EFReferencePublishedEntity", b => + { + b.Property("AppId") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("FromKey") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("ToId") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("FromSchema") + .IsRequired() + .ValueGeneratedOnAdd() + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasDefaultValue("00000000-0000-0000-0000-000000000000"); + + b.HasKey("AppId", "FromKey", "ToId"); + + b.ToTable("ContentReferencesPublished", (string)null); + }); + + modelBuilder.Entity("Squidex.Domain.Apps.Entities.Contents.Text.EFTextIndexGeoEntity", b => + { + b.Property("Id") + .HasMaxLength(400) + .HasColumnType("character varying(400)"); + + b.Property("AppId") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("ContentId") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("GeoField") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("GeoObject") + .IsRequired() + .HasColumnType("geometry"); + + b.Property("SchemaId") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("ServeAll") + .HasColumnType("boolean"); + + b.Property("ServePublished") + .HasColumnType("boolean"); + + b.Property("Stage") + .HasColumnType("smallint"); + + b.HasKey("Id"); + + b.ToTable("Geos"); + }); + + modelBuilder.Entity("Squidex.Domain.Apps.Entities.Contents.Text.EFTextIndexTextEntity", b => + { + b.Property("Id") + .HasMaxLength(400) + .HasColumnType("character varying(400)"); + + b.Property("AppId") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("ContentId") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("SchemaId") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("ServeAll") + .HasColumnType("boolean"); + + b.Property("ServePublished") + .HasColumnType("boolean"); + + b.Property("Stage") + .HasColumnType("smallint"); + + b.Property("Texts") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.ToTable("Texts"); + }); + + modelBuilder.Entity("Squidex.Domain.Apps.Entities.Contents.Text.EFTextIndexUserInfoEntity", b => + { + b.Property("Id") + .HasMaxLength(400) + .HasColumnType("character varying(400)"); + + b.Property("AppId") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("ContentId") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("SchemaId") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("ServeAll") + .HasColumnType("boolean"); + + b.Property("ServePublished") + .HasColumnType("boolean"); + + b.Property("Stage") + .HasColumnType("smallint"); + + b.Property("UserInfoApiKey") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("UserInfoRole") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.HasKey("Id"); + + b.HasIndex("UserInfoApiKey"); + + b.ToTable("UserInfos"); + }); + + modelBuilder.Entity("Squidex.Domain.Apps.Entities.Contents.Text.State.TextContentState", b => + { + b.Property("UniqueContentId") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("State") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.HasKey("UniqueContentId"); + + b.ToTable("TextState", (string)null); + }); + + modelBuilder.Entity("Squidex.Domain.Apps.Entities.History.HistoryEvent", b => + { + b.Property("Id") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("Actor") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("Channel") + .IsRequired() + .HasColumnType("text"); + + b.Property("Created") + .HasColumnType("timestamp with time zone"); + + b.Property("EventType") + .IsRequired() + .HasColumnType("text"); + + b.Property("OwnerId") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("Parameters") + .IsRequired() + .HasColumnType("jsonb"); + + b.Property("Version") + .HasColumnType("bigint"); + + b.HasKey("Id"); + + b.ToTable("HistoryEvent"); + }); + + modelBuilder.Entity("Squidex.Domain.Apps.Entities.Rules.EFRuleEntity", b => + { + b.Property("DocumentId") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("Document") + .HasColumnType("jsonb"); + + b.Property("IndexedAppId") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("AppId"); + + b.Property("IndexedDeleted") + .HasColumnType("boolean") + .HasColumnName("Deleted"); + + b.Property("IndexedId") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("Id"); + + b.Property("Version") + .HasColumnType("bigint"); + + b.HasKey("DocumentId"); + + b.ToTable("States_Rule", (string)null); + }); + + modelBuilder.Entity("Squidex.Domain.Apps.Entities.Schemas.EFSchemaEntity", b => + { + b.Property("DocumentId") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("Document") + .HasColumnType("jsonb"); + + b.Property("IndexedAppId") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("AppId"); + + b.Property("IndexedDeleted") + .HasColumnType("boolean") + .HasColumnName("Deleted"); + + b.Property("IndexedId") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("Id"); + + b.Property("IndexedName") + .IsRequired() + .HasColumnType("text") + .HasColumnName("Name"); + + b.Property("Version") + .HasColumnType("bigint"); + + b.HasKey("DocumentId"); + + b.ToTable("States_Schema", (string)null); + }); + + modelBuilder.Entity("Squidex.Domain.Apps.Entities.Teams.EFTeamEntity", b => + { + b.Property("DocumentId") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("Document") + .HasColumnType("jsonb"); + + b.Property("IndexedAuthDomain") + .HasColumnType("text") + .HasColumnName("AuthDomain"); + + b.Property("IndexedDeleted") + .HasColumnType("boolean") + .HasColumnName("Deleted"); + + b.Property("IndexedUserIds") + .IsRequired() + .HasColumnType("text") + .HasColumnName("UserIds"); + + b.Property("Version") + .HasColumnType("bigint"); + + b.HasKey("DocumentId"); + + b.ToTable("States_Team", (string)null); + }); + + modelBuilder.Entity("Squidex.Events.EntityFramework.EFEventCommit", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("EventStream") + .IsRequired() + .HasMaxLength(750) + .HasColumnType("character varying(750)"); + + b.Property("EventStreamOffset") + .HasColumnType("bigint"); + + b.Property("Events") + .IsRequired() + .HasColumnType("text[]"); + + b.Property("EventsCount") + .HasColumnType("bigint"); + + b.Property("Position") + .HasColumnType("bigint"); + + b.Property("Timestamp") + .HasColumnType("timestamp with time zone"); + + b.HasKey("Id"); + + b.HasIndex("EventStream", "EventStreamOffset") + .IsUnique(); + + b.HasIndex("EventStream", "Position"); + + b.HasIndex("EventStream", "Timestamp"); + + b.ToTable("Events"); + }); + + modelBuilder.Entity("Squidex.Events.EntityFramework.EFPosition", b => + { + b.Property("Id") + .HasColumnType("bigint"); + + b.Property("Position") + .HasColumnType("bigint"); + + b.HasKey("Id"); + + b.ToTable("EventPosition"); + }); + + modelBuilder.Entity("Squidex.Flows.EntityFramework.EFCronJobEntity", b => + { + b.Property("Id") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("Data") + .IsRequired() + .HasColumnType("text"); + + b.Property("DueTime") + .HasColumnType("timestamp with time zone"); + + b.HasKey("Id"); + + b.HasIndex("DueTime"); + + b.ToTable("CronJobs", (string)null); + }); + + modelBuilder.Entity("Squidex.Flows.EntityFramework.EFFlowStateEntity", b => + { + b.Property("Id") + .HasColumnType("uuid"); + + b.Property("Created") + .HasColumnType("timestamp with time zone"); + + b.Property("DefinitionId") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("DueTime") + .HasColumnType("timestamp with time zone"); + + b.Property("OwnerId") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("SchedulePartition") + .HasColumnType("integer"); + + b.Property("State") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("DueTime", "SchedulePartition"); + + b.ToTable("Flows", (string)null); + }); + + modelBuilder.Entity("Squidex.Infrastructure.Caching.EFCacheEntity", b => + { + b.Property("Key") + .HasColumnType("text"); + + b.Property("Expires") + .HasColumnType("timestamp with time zone"); + + b.Property("Value") + .IsRequired() + .HasColumnType("bytea"); + + b.HasKey("Key"); + + b.ToTable("Cache", (string)null); + }); + + modelBuilder.Entity("Squidex.Infrastructure.Log.EFRequestEntity", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Key") + .IsRequired() + .HasColumnType("text"); + + b.Property("Properties") + .IsRequired() + .HasColumnType("jsonb"); + + b.Property("Timestamp") + .HasColumnType("timestamp with time zone"); + + b.HasKey("Id"); + + b.HasIndex("Key"); + + b.ToTable("Requests", (string)null); + }); + + modelBuilder.Entity("Squidex.Infrastructure.Migrations.EFMigrationEntity", b => + { + b.Property("Id") + .HasColumnType("integer"); + + b.Property("IsLocked") + .HasColumnType("boolean"); + + b.Property("Version") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.ToTable("Migrations", (string)null); + }); + + modelBuilder.Entity("Squidex.Infrastructure.States.EFState", b => + { + b.Property("DocumentId") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("Document") + .HasColumnType("jsonb"); + + b.Property("Version") + .HasColumnType("bigint"); + + b.HasKey("DocumentId"); + + b.ToTable("States_UISettings", (string)null); + }); + + modelBuilder.Entity("Squidex.Infrastructure.States.EFState", b => + { + b.Property("DocumentId") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("Document") + .HasColumnType("jsonb"); + + b.Property("Version") + .HasColumnType("bigint"); + + b.HasKey("DocumentId"); + + b.ToTable("States_Index_TagHistory", (string)null); + }); + + modelBuilder.Entity("Squidex.Infrastructure.States.EFState", b => + { + b.Property("DocumentId") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("Document") + .HasColumnType("jsonb"); + + b.Property("Version") + .HasColumnType("bigint"); + + b.HasKey("DocumentId"); + + b.ToTable("States_UsageNotifications", (string)null); + }); + + modelBuilder.Entity("Squidex.Infrastructure.States.EFState", b => + { + b.Property("DocumentId") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("Document") + .HasColumnType("jsonb"); + + b.Property("Version") + .HasColumnType("bigint"); + + b.HasKey("DocumentId"); + + b.ToTable("States_Counters", (string)null); + }); + + modelBuilder.Entity("Squidex.Infrastructure.States.EFState", b => + { + b.Property("DocumentId") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("Document") + .HasColumnType("jsonb"); + + b.Property("Version") + .HasColumnType("bigint"); + + b.HasKey("DocumentId"); + + b.ToTable("States_JobsState", (string)null); + }); + + modelBuilder.Entity("Squidex.Infrastructure.States.EFState", b => + { + b.Property("DocumentId") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("Document") + .HasColumnType("jsonb"); + + b.Property("Version") + .HasColumnType("bigint"); + + b.HasKey("DocumentId"); + + b.ToTable("States_UsageTracker", (string)null); + }); + + modelBuilder.Entity("Squidex.Infrastructure.States.EFState", b => + { + b.Property("DocumentId") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("Document") + .HasColumnType("jsonb"); + + b.Property("Version") + .HasColumnType("bigint"); + + b.HasKey("DocumentId"); + + b.ToTable("States_Index_Tags", (string)null); + }); + + modelBuilder.Entity("Squidex.Infrastructure.States.EFState", b => + { + b.Property("DocumentId") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("Document") + .HasColumnType("jsonb"); + + b.Property("Version") + .HasColumnType("bigint"); + + b.HasKey("DocumentId"); + + b.ToTable("States_Identity_Keys", (string)null); + }); + + modelBuilder.Entity("Squidex.Infrastructure.States.EFState", b => + { + b.Property("DocumentId") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("Document") + .HasColumnType("jsonb"); + + b.Property("Version") + .HasColumnType("bigint"); + + b.HasKey("DocumentId"); + + b.ToTable("States_Identity_Xml", (string)null); + }); + + modelBuilder.Entity("Squidex.Infrastructure.States.EFState", b => + { + b.Property("DocumentId") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("Document") + .HasColumnType("jsonb"); + + b.Property("Version") + .HasColumnType("bigint"); + + b.HasKey("DocumentId"); + + b.ToTable("States_EventConsumerState", (string)null); + }); + + modelBuilder.Entity("Squidex.Infrastructure.States.EFState", b => + { + b.Property("DocumentId") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("Document") + .HasColumnType("jsonb"); + + b.Property("Version") + .HasColumnType("bigint"); + + b.HasKey("DocumentId"); + + b.ToTable("States_Names", (string)null); + }); + + modelBuilder.Entity("Squidex.Infrastructure.UsageTracking.EFUsageCounterEntity", b => + { + b.Property("Key") + .HasColumnType("text"); + + b.Property("Date") + .HasColumnType("timestamp with time zone"); + + b.Property("Category") + .HasColumnType("text"); + + b.Property("CounterKey") + .HasColumnType("text"); + + b.Property("CounterValue") + .HasColumnType("double precision"); + + b.HasKey("Key", "Date", "Category", "CounterKey"); + + b.ToTable("Counter", (string)null); + }); + + modelBuilder.Entity("Squidex.Messaging.EntityFramework.EFMessage", b => + { + b.Property("Id") + .HasColumnType("text"); + + b.Property("ChannelName") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("MessageData") + .IsRequired() + .HasColumnType("bytea"); + + b.Property("MessageHeaders") + .IsRequired() + .HasMaxLength(2000) + .HasColumnType("character varying(2000)"); + + b.Property("QueueName") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("TimeHandled") + .HasColumnType("timestamp with time zone"); + + b.Property("TimeToLive") + .HasColumnType("timestamp with time zone"); + + b.Property("Version") + .IsConcurrencyToken() + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("ChannelName", "TimeHandled"); + + b.ToTable("Messages", (string)null); + }); + + modelBuilder.Entity("Squidex.Messaging.EntityFramework.EFMessagingDataEntity", b => + { + b.Property("Group") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("Key") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("Expiration") + .HasColumnType("timestamp with time zone"); + + b.Property("ValueData") + .IsRequired() + .HasColumnType("bytea"); + + b.Property("ValueFormat") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("ValueType") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.HasKey("Group", "Key"); + + b.HasIndex("Expiration"); + + b.ToTable("MessagingData", (string)null); + }); + + modelBuilder.Entity("YDotNet.Server.EntityFramework.YDotNetDocument", b => + { + b.Property("Id") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("Data") + .IsRequired() + .HasColumnType("bytea"); + + b.Property("Expiration") + .HasColumnType("timestamp with time zone"); + + b.HasKey("Id"); + + b.ToTable("YDotNetDocument", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null) + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null) + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("OpenIddict.EntityFrameworkCore.Models.OpenIddictEntityFrameworkCoreToken", b => + { + b.HasOne("OpenIddict.EntityFrameworkCore.Models.OpenIddictEntityFrameworkCoreAuthorization", "Authorization") + .WithMany("Tokens") + .HasForeignKey("AuthorizationId"); + + b.Navigation("Authorization"); + }); + + modelBuilder.Entity("OpenIddict.EntityFrameworkCore.Models.OpenIddictEntityFrameworkCoreAuthorization", b => + { + b.Navigation("Tokens"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/backend/src/Squidex.Data.EntityFramework/Providers/Postgres/App/Migrations/20260117183420_AddUserInfoIndex.cs b/backend/src/Squidex.Data.EntityFramework/Providers/Postgres/App/Migrations/20260117183420_AddUserInfoIndex.cs new file mode 100644 index 000000000..763c6fee1 --- /dev/null +++ b/backend/src/Squidex.Data.EntityFramework/Providers/Postgres/App/Migrations/20260117183420_AddUserInfoIndex.cs @@ -0,0 +1,45 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace Squidex.Providers.Postgres.App.Migrations +{ + /// + public partial class AddUserInfoIndex : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateTable( + name: "UserInfos", + columns: table => new + { + Id = table.Column(type: "character varying(400)", maxLength: 400, nullable: false), + AppId = table.Column(type: "character varying(255)", maxLength: 255, nullable: false), + SchemaId = table.Column(type: "character varying(255)", maxLength: 255, nullable: false), + ContentId = table.Column(type: "character varying(255)", maxLength: 255, nullable: false), + Stage = table.Column(type: "smallint", nullable: false), + ServeAll = table.Column(type: "boolean", nullable: false), + ServePublished = table.Column(type: "boolean", nullable: false), + UserInfoApiKey = table.Column(type: "character varying(256)", maxLength: 256, nullable: false), + UserInfoRole = table.Column(type: "character varying(256)", maxLength: 256, nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_UserInfos", x => x.Id); + }); + + migrationBuilder.CreateIndex( + name: "IX_UserInfos_UserInfoApiKey", + table: "UserInfos", + column: "UserInfoApiKey"); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "UserInfos"); + } + } +} diff --git a/backend/src/Squidex.Data.EntityFramework/Providers/Postgres/App/Migrations/PostgresDbContextModelSnapshot.cs b/backend/src/Squidex.Data.EntityFramework/Providers/Postgres/App/Migrations/PostgresDbContextModelSnapshot.cs index ee2599db2..73fe5610f 100644 --- a/backend/src/Squidex.Data.EntityFramework/Providers/Postgres/App/Migrations/PostgresDbContextModelSnapshot.cs +++ b/backend/src/Squidex.Data.EntityFramework/Providers/Postgres/App/Migrations/PostgresDbContextModelSnapshot.cs @@ -18,7 +18,7 @@ namespace Squidex.Providers.Postgres.Migrations { #pragma warning disable 612, 618 modelBuilder - .HasAnnotation("ProductVersion", "8.0.14") + .HasAnnotation("ProductVersion", "8.0.16") .HasAnnotation("Relational:MaxIdentifierLength", 63); NpgsqlModelBuilderExtensions.HasPostgresExtension(modelBuilder, "postgis"); @@ -846,7 +846,7 @@ namespace Squidex.Providers.Postgres.Migrations b.HasKey("Id"); - b.ToTable("Geos", (string)null); + b.ToTable("Geos"); }); modelBuilder.Entity("Squidex.Domain.Apps.Entities.Contents.Text.EFTextIndexTextEntity", b => @@ -885,7 +885,54 @@ namespace Squidex.Providers.Postgres.Migrations b.HasKey("Id"); - b.ToTable("Texts", (string)null); + b.ToTable("Texts"); + }); + + modelBuilder.Entity("Squidex.Domain.Apps.Entities.Contents.Text.EFTextIndexUserInfoEntity", b => + { + b.Property("Id") + .HasMaxLength(400) + .HasColumnType("character varying(400)"); + + b.Property("AppId") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("ContentId") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("SchemaId") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("ServeAll") + .HasColumnType("boolean"); + + b.Property("ServePublished") + .HasColumnType("boolean"); + + b.Property("Stage") + .HasColumnType("smallint"); + + b.Property("UserInfoApiKey") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("UserInfoRole") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.HasKey("Id"); + + b.HasIndex("UserInfoApiKey"); + + b.ToTable("UserInfos"); }); modelBuilder.Entity("Squidex.Domain.Apps.Entities.Contents.Text.State.TextContentState", b => @@ -1047,7 +1094,6 @@ namespace Squidex.Providers.Postgres.Migrations modelBuilder.Entity("Squidex.Events.EntityFramework.EFEventCommit", b => { b.Property("Id") - .ValueGeneratedOnAdd() .HasColumnType("uuid"); b.Property("EventStream") @@ -1119,7 +1165,6 @@ namespace Squidex.Providers.Postgres.Migrations modelBuilder.Entity("Squidex.Flows.EntityFramework.EFFlowStateEntity", b => { b.Property("Id") - .ValueGeneratedOnAdd() .HasColumnType("uuid"); b.Property("Created") diff --git a/backend/src/Squidex.Data.EntityFramework/Providers/SqlServer/App/Migrations/20260117183427_AddUserInfoIndex.Designer.cs b/backend/src/Squidex.Data.EntityFramework/Providers/SqlServer/App/Migrations/20260117183427_AddUserInfoIndex.Designer.cs new file mode 100644 index 000000000..20abc3bfd --- /dev/null +++ b/backend/src/Squidex.Data.EntityFramework/Providers/SqlServer/App/Migrations/20260117183427_AddUserInfoIndex.Designer.cs @@ -0,0 +1,1632 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using NetTopologySuite.Geometries; +using Squidex.Providers.SqlServer.App; + +#nullable disable + +namespace Squidex.Providers.SqlServer.App.Migrations +{ + [DbContext(typeof(SqlServerAppDbContext))] + [Migration("20260117183427_AddUserInfoIndex")] + partial class AddUserInfoIndex + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "8.0.16") + .HasAnnotation("Relational:MaxIdentifierLength", 128); + + SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRole", b => + { + b.Property("Id") + .HasColumnType("nvarchar(450)"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnType("nvarchar(max)"); + + b.Property("Name") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("NormalizedName") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.HasKey("Id"); + + b.HasIndex("NormalizedName") + .IsUnique() + .HasDatabaseName("RoleNameIndex") + .HasFilter("[NormalizedName] IS NOT NULL"); + + b.ToTable("AspNetRoles", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("ClaimType") + .HasColumnType("nvarchar(max)"); + + b.Property("ClaimValue") + .HasColumnType("nvarchar(max)"); + + b.Property("RoleId") + .IsRequired() + .HasColumnType("nvarchar(450)"); + + b.HasKey("Id"); + + b.HasIndex("RoleId"); + + b.ToTable("AspNetRoleClaims", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUser", b => + { + b.Property("Id") + .HasColumnType("nvarchar(450)"); + + b.Property("AccessFailedCount") + .HasColumnType("int"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnType("nvarchar(max)"); + + b.Property("Email") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("EmailConfirmed") + .HasColumnType("bit"); + + b.Property("LockoutEnabled") + .HasColumnType("bit"); + + b.Property("LockoutEnd") + .HasColumnType("datetimeoffset"); + + b.Property("NormalizedEmail") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("NormalizedUserName") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("PasswordHash") + .HasColumnType("nvarchar(max)"); + + b.Property("PhoneNumber") + .HasColumnType("nvarchar(max)"); + + b.Property("PhoneNumberConfirmed") + .HasColumnType("bit"); + + b.Property("SecurityStamp") + .HasColumnType("nvarchar(max)"); + + b.Property("TwoFactorEnabled") + .HasColumnType("bit"); + + b.Property("UserName") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.HasKey("Id"); + + b.HasIndex("NormalizedEmail") + .HasDatabaseName("EmailIndex"); + + b.HasIndex("NormalizedUserName") + .IsUnique() + .HasDatabaseName("UserNameIndex") + .HasFilter("[NormalizedUserName] IS NOT NULL"); + + b.ToTable("AspNetUsers", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("ClaimType") + .HasColumnType("nvarchar(max)"); + + b.Property("ClaimValue") + .HasColumnType("nvarchar(max)"); + + b.Property("UserId") + .IsRequired() + .HasColumnType("nvarchar(450)"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("AspNetUserClaims", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => + { + b.Property("LoginProvider") + .HasColumnType("nvarchar(450)"); + + b.Property("ProviderKey") + .HasColumnType("nvarchar(450)"); + + b.Property("ProviderDisplayName") + .HasColumnType("nvarchar(max)"); + + b.Property("UserId") + .IsRequired() + .HasColumnType("nvarchar(450)"); + + b.HasKey("LoginProvider", "ProviderKey"); + + b.HasIndex("UserId"); + + b.ToTable("AspNetUserLogins", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => + { + b.Property("UserId") + .HasColumnType("nvarchar(450)"); + + b.Property("RoleId") + .HasColumnType("nvarchar(450)"); + + b.HasKey("UserId", "RoleId"); + + b.HasIndex("RoleId"); + + b.ToTable("AspNetUserRoles", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => + { + b.Property("UserId") + .HasColumnType("nvarchar(450)"); + + b.Property("LoginProvider") + .HasColumnType("nvarchar(450)"); + + b.Property("Name") + .HasColumnType("nvarchar(450)"); + + b.Property("Value") + .HasColumnType("nvarchar(max)"); + + b.HasKey("UserId", "LoginProvider", "Name"); + + b.ToTable("AspNetUserTokens", (string)null); + }); + + modelBuilder.Entity("OpenIddict.EntityFrameworkCore.Models.OpenIddictEntityFrameworkCoreAuthorization", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("nvarchar(450)"); + + b.Property("ApplicationId") + .IsRequired() + .HasColumnType("nvarchar(450)"); + + b.Property("ConcurrencyToken") + .IsConcurrencyToken() + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.Property("CreationDate") + .HasColumnType("datetime2"); + + b.Property("Properties") + .HasColumnType("nvarchar(max)"); + + b.Property("Scopes") + .HasColumnType("nvarchar(max)"); + + b.Property("Status") + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.Property("Subject") + .HasMaxLength(400) + .HasColumnType("nvarchar(400)"); + + b.Property("Type") + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.HasKey("Id"); + + b.HasIndex("ApplicationId", "Status", "Subject", "Type"); + + b.ToTable("OpenIddictAuthorizations", (string)null); + }); + + modelBuilder.Entity("OpenIddict.EntityFrameworkCore.Models.OpenIddictEntityFrameworkCoreToken", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("nvarchar(450)"); + + b.Property("ApplicationId") + .HasColumnType("nvarchar(450)"); + + b.Property("AuthorizationId") + .HasColumnType("nvarchar(450)"); + + b.Property("ConcurrencyToken") + .IsConcurrencyToken() + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.Property("CreationDate") + .HasColumnType("datetime2"); + + b.Property("ExpirationDate") + .HasColumnType("datetime2"); + + b.Property("Payload") + .HasColumnType("nvarchar(max)"); + + b.Property("Properties") + .HasColumnType("nvarchar(max)"); + + b.Property("RedemptionDate") + .HasColumnType("datetime2"); + + b.Property("ReferenceId") + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); + + b.Property("Status") + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.Property("Subject") + .HasMaxLength(400) + .HasColumnType("nvarchar(400)"); + + b.Property("Type") + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.HasKey("Id"); + + b.HasIndex("AuthorizationId"); + + b.HasIndex("ReferenceId") + .IsUnique() + .HasFilter("[ReferenceId] IS NOT NULL"); + + b.HasIndex("ApplicationId", "Status", "Subject", "Type"); + + b.ToTable("OpenIddictTokens", (string)null); + }); + + modelBuilder.Entity("Squidex.AI.Mongo.EFChatEntity", b => + { + b.Property("Id") + .HasMaxLength(255) + .HasColumnType("nvarchar(255)"); + + b.Property("LastUpdated") + .HasColumnType("datetime2"); + + b.Property("Value") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Version") + .IsConcurrencyToken() + .HasColumnType("uniqueidentifier"); + + b.HasKey("Id"); + + b.HasIndex("LastUpdated"); + + b.ToTable("Chats", (string)null); + }); + + modelBuilder.Entity("Squidex.Assets.EntityFramework.EFAssetKeyValueEntity", b => + { + b.Property("Key") + .HasMaxLength(255) + .HasColumnType("nvarchar(255)"); + + b.Property("Expires") + .HasColumnType("datetimeoffset"); + + b.Property("Value") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.HasKey("Key"); + + b.HasIndex("Expires"); + + b.ToTable("AssetKeyValueStore_TusMetadata", (string)null); + }); + + modelBuilder.Entity("Squidex.Domain.Apps.Entities.Apps.EFAppEntity", b => + { + b.Property("DocumentId") + .HasMaxLength(255) + .HasColumnType("nvarchar(255)"); + + b.Property("Document") + .HasColumnType("nvarchar(max)"); + + b.Property("IndexedCreated") + .HasColumnType("datetimeoffset") + .HasColumnName("Created"); + + b.Property("IndexedDeleted") + .HasColumnType("bit") + .HasColumnName("Deleted"); + + b.Property("IndexedName") + .IsRequired() + .HasColumnType("nvarchar(max)") + .HasColumnName("Name"); + + b.Property("IndexedTeamId") + .HasMaxLength(255) + .HasColumnType("nvarchar(255)") + .HasColumnName("TeamId"); + + b.Property("IndexedUserIds") + .IsRequired() + .HasColumnType("nvarchar(max)") + .HasColumnName("UserIds"); + + b.Property("Version") + .HasColumnType("bigint"); + + b.HasKey("DocumentId"); + + b.ToTable("States_App", (string)null); + }); + + modelBuilder.Entity("Squidex.Domain.Apps.Entities.Assets.EFAssetEntity", b => + { + b.Property("DocumentId") + .HasMaxLength(255) + .HasColumnType("nvarchar(255)"); + + b.Property("AppId") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("nvarchar(255)"); + + b.Property("Created") + .HasColumnType("datetimeoffset"); + + b.Property("CreatedBy") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); + + b.Property("FileHash") + .HasColumnType("nvarchar(max)"); + + b.Property("FileName") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("FileSize") + .HasColumnType("bigint"); + + b.Property("FileVersion") + .HasColumnType("bigint"); + + b.Property("Id") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("nvarchar(255)"); + + b.Property("IndexedAppId") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("nvarchar(255)"); + + b.Property("IsDeleted") + .HasColumnType("bit"); + + b.Property("IsProtected") + .HasColumnType("bit"); + + b.Property("LastModified") + .HasColumnType("datetimeoffset"); + + b.Property("LastModifiedBy") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); + + b.Property("Metadata") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("MimeType") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("ParentId") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("nvarchar(255)"); + + b.Property("Slug") + .HasColumnType("nvarchar(max)"); + + b.Property("Tags") + .IsRequired() + .HasMaxLength(1000) + .HasColumnType("nvarchar(1000)"); + + b.Property("TotalSize") + .HasColumnType("bigint"); + + b.Property("Type") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); + + b.Property("Version") + .HasColumnType("bigint"); + + b.HasKey("DocumentId"); + + b.HasIndex("IndexedAppId", "Id"); + + b.ToTable("Assets"); + }); + + modelBuilder.Entity("Squidex.Domain.Apps.Entities.Assets.EFAssetFolderEntity", b => + { + b.Property("DocumentId") + .HasMaxLength(255) + .HasColumnType("nvarchar(255)"); + + b.Property("AppId") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("nvarchar(255)"); + + b.Property("Created") + .HasColumnType("datetimeoffset"); + + b.Property("CreatedBy") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); + + b.Property("FolderName") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Id") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("nvarchar(255)"); + + b.Property("IndexedAppId") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("nvarchar(255)"); + + b.Property("IsDeleted") + .HasColumnType("bit"); + + b.Property("LastModified") + .HasColumnType("datetimeoffset"); + + b.Property("LastModifiedBy") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); + + b.Property("ParentId") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("nvarchar(255)"); + + b.Property("Version") + .HasColumnType("bigint"); + + b.HasKey("DocumentId"); + + b.HasIndex("IndexedAppId", "Id"); + + b.ToTable("AssetFolders"); + }); + + modelBuilder.Entity("Squidex.Domain.Apps.Entities.Contents.EFContentCompleteEntity", b => + { + b.Property("DocumentId") + .HasMaxLength(255) + .HasColumnType("nvarchar(255)"); + + b.Property("AppId") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("nvarchar(255)"); + + b.Property("Created") + .HasColumnType("datetimeoffset"); + + b.Property("CreatedBy") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); + + b.Property("Data") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Id") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("nvarchar(255)"); + + b.Property("IndexedAppId") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("nvarchar(255)"); + + b.Property("IndexedSchemaId") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("nvarchar(255)"); + + b.Property("IsDeleted") + .HasColumnType("bit"); + + b.Property("LastModified") + .HasColumnType("datetimeoffset"); + + b.Property("LastModifiedBy") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); + + b.Property("NewData") + .HasColumnType("nvarchar(max)"); + + b.Property("NewStatus") + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); + + b.Property("ScheduleJob") + .HasColumnType("nvarchar(max)"); + + b.Property("ScheduledAt") + .HasColumnType("datetimeoffset"); + + b.Property("SchemaId") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("nvarchar(255)"); + + b.Property("Status") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); + + b.Property("TranslationStatus") + .HasColumnType("nvarchar(max)"); + + b.Property("Version") + .HasColumnType("bigint"); + + b.HasKey("DocumentId"); + + b.ToTable("ContentsAll", (string)null); + }); + + modelBuilder.Entity("Squidex.Domain.Apps.Entities.Contents.EFContentPublishedEntity", b => + { + b.Property("DocumentId") + .HasMaxLength(255) + .HasColumnType("nvarchar(255)"); + + b.Property("AppId") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("nvarchar(255)"); + + b.Property("Created") + .HasColumnType("datetimeoffset"); + + b.Property("CreatedBy") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); + + b.Property("Data") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Id") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("nvarchar(255)"); + + b.Property("IndexedAppId") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("nvarchar(255)"); + + b.Property("IndexedSchemaId") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("nvarchar(255)"); + + b.Property("IsDeleted") + .HasColumnType("bit"); + + b.Property("LastModified") + .HasColumnType("datetimeoffset"); + + b.Property("LastModifiedBy") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); + + b.Property("NewData") + .HasColumnType("nvarchar(max)"); + + b.Property("NewStatus") + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); + + b.Property("ScheduleJob") + .HasColumnType("nvarchar(max)"); + + b.Property("ScheduledAt") + .HasColumnType("datetimeoffset"); + + b.Property("SchemaId") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("nvarchar(255)"); + + b.Property("Status") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); + + b.Property("TranslationStatus") + .HasColumnType("nvarchar(max)"); + + b.Property("Version") + .HasColumnType("bigint"); + + b.HasKey("DocumentId"); + + b.ToTable("ContentsPublished", (string)null); + }); + + modelBuilder.Entity("Squidex.Domain.Apps.Entities.Contents.EFContentTableEntity", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("AppId") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("nvarchar(255)"); + + b.Property("SchemaId") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("nvarchar(255)"); + + b.HasKey("Id"); + + b.HasIndex("AppId", "SchemaId") + .IsUnique(); + + b.ToTable("ContentTables", (string)null); + }); + + modelBuilder.Entity("Squidex.Domain.Apps.Entities.Contents.EFReferenceCompleteEntity", b => + { + b.Property("AppId") + .HasMaxLength(255) + .HasColumnType("nvarchar(255)"); + + b.Property("FromKey") + .HasMaxLength(255) + .HasColumnType("nvarchar(255)"); + + b.Property("ToId") + .HasMaxLength(255) + .HasColumnType("nvarchar(255)"); + + b.Property("FromSchema") + .IsRequired() + .ValueGeneratedOnAdd() + .HasMaxLength(255) + .HasColumnType("nvarchar(255)") + .HasDefaultValue("00000000-0000-0000-0000-000000000000"); + + b.HasKey("AppId", "FromKey", "ToId"); + + b.ToTable("ContentReferencesAll", (string)null); + }); + + modelBuilder.Entity("Squidex.Domain.Apps.Entities.Contents.EFReferencePublishedEntity", b => + { + b.Property("AppId") + .HasMaxLength(255) + .HasColumnType("nvarchar(255)"); + + b.Property("FromKey") + .HasMaxLength(255) + .HasColumnType("nvarchar(255)"); + + b.Property("ToId") + .HasMaxLength(255) + .HasColumnType("nvarchar(255)"); + + b.Property("FromSchema") + .IsRequired() + .ValueGeneratedOnAdd() + .HasMaxLength(255) + .HasColumnType("nvarchar(255)") + .HasDefaultValue("00000000-0000-0000-0000-000000000000"); + + b.HasKey("AppId", "FromKey", "ToId"); + + b.ToTable("ContentReferencesPublished", (string)null); + }); + + modelBuilder.Entity("Squidex.Domain.Apps.Entities.Contents.Text.EFTextIndexGeoEntity", b => + { + b.Property("Id") + .HasMaxLength(400) + .HasColumnType("nvarchar(400)"); + + b.Property("AppId") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("nvarchar(255)"); + + b.Property("ContentId") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("nvarchar(255)"); + + b.Property("GeoField") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("nvarchar(255)"); + + b.Property("GeoObject") + .IsRequired() + .HasColumnType("geography"); + + b.Property("SchemaId") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("nvarchar(255)"); + + b.Property("ServeAll") + .HasColumnType("bit"); + + b.Property("ServePublished") + .HasColumnType("bit"); + + b.Property("Stage") + .HasColumnType("tinyint"); + + b.HasKey("Id"); + + b.ToTable("Geos"); + }); + + modelBuilder.Entity("Squidex.Domain.Apps.Entities.Contents.Text.EFTextIndexTextEntity", b => + { + b.Property("Id") + .HasMaxLength(400) + .HasColumnType("nvarchar(400)"); + + b.Property("AppId") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("nvarchar(255)"); + + b.Property("ContentId") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("nvarchar(255)"); + + b.Property("SchemaId") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("nvarchar(255)"); + + b.Property("ServeAll") + .HasColumnType("bit"); + + b.Property("ServePublished") + .HasColumnType("bit"); + + b.Property("Stage") + .HasColumnType("tinyint"); + + b.Property("Texts") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.ToTable("Texts"); + }); + + modelBuilder.Entity("Squidex.Domain.Apps.Entities.Contents.Text.EFTextIndexUserInfoEntity", b => + { + b.Property("Id") + .HasMaxLength(400) + .HasColumnType("nvarchar(400)"); + + b.Property("AppId") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("nvarchar(255)"); + + b.Property("ContentId") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("nvarchar(255)"); + + b.Property("SchemaId") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("nvarchar(255)"); + + b.Property("ServeAll") + .HasColumnType("bit"); + + b.Property("ServePublished") + .HasColumnType("bit"); + + b.Property("Stage") + .HasColumnType("tinyint"); + + b.Property("UserInfoApiKey") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("UserInfoRole") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.HasKey("Id"); + + b.HasIndex("UserInfoApiKey"); + + b.ToTable("UserInfos"); + }); + + modelBuilder.Entity("Squidex.Domain.Apps.Entities.Contents.Text.State.TextContentState", b => + { + b.Property("UniqueContentId") + .HasMaxLength(255) + .HasColumnType("nvarchar(255)"); + + b.Property("State") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); + + b.HasKey("UniqueContentId"); + + b.ToTable("TextState", (string)null); + }); + + modelBuilder.Entity("Squidex.Domain.Apps.Entities.History.HistoryEvent", b => + { + b.Property("Id") + .HasMaxLength(255) + .HasColumnType("nvarchar(255)"); + + b.Property("Actor") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); + + b.Property("Channel") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Created") + .HasColumnType("datetimeoffset"); + + b.Property("EventType") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("OwnerId") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("nvarchar(255)"); + + b.Property("Parameters") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Version") + .HasColumnType("bigint"); + + b.HasKey("Id"); + + b.ToTable("HistoryEvent"); + }); + + modelBuilder.Entity("Squidex.Domain.Apps.Entities.Rules.EFRuleEntity", b => + { + b.Property("DocumentId") + .HasMaxLength(255) + .HasColumnType("nvarchar(255)"); + + b.Property("Document") + .HasColumnType("nvarchar(max)"); + + b.Property("IndexedAppId") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("nvarchar(255)") + .HasColumnName("AppId"); + + b.Property("IndexedDeleted") + .HasColumnType("bit") + .HasColumnName("Deleted"); + + b.Property("IndexedId") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("nvarchar(255)") + .HasColumnName("Id"); + + b.Property("Version") + .HasColumnType("bigint"); + + b.HasKey("DocumentId"); + + b.ToTable("States_Rule", (string)null); + }); + + modelBuilder.Entity("Squidex.Domain.Apps.Entities.Schemas.EFSchemaEntity", b => + { + b.Property("DocumentId") + .HasMaxLength(255) + .HasColumnType("nvarchar(255)"); + + b.Property("Document") + .HasColumnType("nvarchar(max)"); + + b.Property("IndexedAppId") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("nvarchar(255)") + .HasColumnName("AppId"); + + b.Property("IndexedDeleted") + .HasColumnType("bit") + .HasColumnName("Deleted"); + + b.Property("IndexedId") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("nvarchar(255)") + .HasColumnName("Id"); + + b.Property("IndexedName") + .IsRequired() + .HasColumnType("nvarchar(max)") + .HasColumnName("Name"); + + b.Property("Version") + .HasColumnType("bigint"); + + b.HasKey("DocumentId"); + + b.ToTable("States_Schema", (string)null); + }); + + modelBuilder.Entity("Squidex.Domain.Apps.Entities.Teams.EFTeamEntity", b => + { + b.Property("DocumentId") + .HasMaxLength(255) + .HasColumnType("nvarchar(255)"); + + b.Property("Document") + .HasColumnType("nvarchar(max)"); + + b.Property("IndexedAuthDomain") + .HasColumnType("nvarchar(max)") + .HasColumnName("AuthDomain"); + + b.Property("IndexedDeleted") + .HasColumnType("bit") + .HasColumnName("Deleted"); + + b.Property("IndexedUserIds") + .IsRequired() + .HasColumnType("nvarchar(max)") + .HasColumnName("UserIds"); + + b.Property("Version") + .HasColumnType("bigint"); + + b.HasKey("DocumentId"); + + b.ToTable("States_Team", (string)null); + }); + + modelBuilder.Entity("Squidex.Events.EntityFramework.EFEventCommit", b => + { + b.Property("Id") + .HasColumnType("uniqueidentifier"); + + b.Property("EventStream") + .IsRequired() + .HasMaxLength(750) + .HasColumnType("nvarchar(750)"); + + b.Property("EventStreamOffset") + .HasColumnType("bigint"); + + b.Property("Events") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("EventsCount") + .HasColumnType("bigint"); + + b.Property("Position") + .HasColumnType("bigint"); + + b.Property("Timestamp") + .HasColumnType("datetime2"); + + b.HasKey("Id"); + + b.HasIndex("EventStream", "EventStreamOffset") + .IsUnique(); + + b.HasIndex("EventStream", "Position"); + + b.HasIndex("EventStream", "Timestamp"); + + b.ToTable("Events"); + }); + + modelBuilder.Entity("Squidex.Events.EntityFramework.EFPosition", b => + { + b.Property("Id") + .HasColumnType("bigint"); + + b.Property("Position") + .HasColumnType("bigint"); + + b.HasKey("Id"); + + b.ToTable("EventPosition"); + }); + + modelBuilder.Entity("Squidex.Flows.EntityFramework.EFCronJobEntity", b => + { + b.Property("Id") + .HasMaxLength(255) + .HasColumnType("nvarchar(255)"); + + b.Property("Data") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("DueTime") + .HasColumnType("datetimeoffset"); + + b.HasKey("Id"); + + b.HasIndex("DueTime"); + + b.ToTable("CronJobs", (string)null); + }); + + modelBuilder.Entity("Squidex.Flows.EntityFramework.EFFlowStateEntity", b => + { + b.Property("Id") + .HasColumnType("uniqueidentifier"); + + b.Property("Created") + .HasColumnType("datetimeoffset"); + + b.Property("DefinitionId") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("nvarchar(255)"); + + b.Property("DueTime") + .HasColumnType("datetimeoffset"); + + b.Property("OwnerId") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("nvarchar(255)"); + + b.Property("SchedulePartition") + .HasColumnType("int"); + + b.Property("State") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.HasIndex("DueTime", "SchedulePartition"); + + b.ToTable("Flows", (string)null); + }); + + modelBuilder.Entity("Squidex.Infrastructure.Caching.EFCacheEntity", b => + { + b.Property("Key") + .HasColumnType("nvarchar(450)"); + + b.Property("Expires") + .HasColumnType("datetime2"); + + b.Property("Value") + .IsRequired() + .HasColumnType("varbinary(max)"); + + b.HasKey("Key"); + + b.ToTable("Cache", (string)null); + }); + + modelBuilder.Entity("Squidex.Infrastructure.Log.EFRequestEntity", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("Key") + .IsRequired() + .HasColumnType("nvarchar(450)"); + + b.Property("Properties") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Timestamp") + .HasColumnType("datetimeoffset"); + + b.HasKey("Id"); + + b.HasIndex("Key"); + + b.ToTable("Requests", (string)null); + }); + + modelBuilder.Entity("Squidex.Infrastructure.Migrations.EFMigrationEntity", b => + { + b.Property("Id") + .HasColumnType("int"); + + b.Property("IsLocked") + .HasColumnType("bit"); + + b.Property("Version") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.ToTable("Migrations", (string)null); + }); + + modelBuilder.Entity("Squidex.Infrastructure.States.EFState", b => + { + b.Property("DocumentId") + .HasMaxLength(255) + .HasColumnType("nvarchar(255)"); + + b.Property("Document") + .HasColumnType("nvarchar(max)"); + + b.Property("Version") + .HasColumnType("bigint"); + + b.HasKey("DocumentId"); + + b.ToTable("States_UISettings", (string)null); + }); + + modelBuilder.Entity("Squidex.Infrastructure.States.EFState", b => + { + b.Property("DocumentId") + .HasMaxLength(255) + .HasColumnType("nvarchar(255)"); + + b.Property("Document") + .HasColumnType("nvarchar(max)"); + + b.Property("Version") + .HasColumnType("bigint"); + + b.HasKey("DocumentId"); + + b.ToTable("States_Index_TagHistory", (string)null); + }); + + modelBuilder.Entity("Squidex.Infrastructure.States.EFState", b => + { + b.Property("DocumentId") + .HasMaxLength(255) + .HasColumnType("nvarchar(255)"); + + b.Property("Document") + .HasColumnType("nvarchar(max)"); + + b.Property("Version") + .HasColumnType("bigint"); + + b.HasKey("DocumentId"); + + b.ToTable("States_UsageNotifications", (string)null); + }); + + modelBuilder.Entity("Squidex.Infrastructure.States.EFState", b => + { + b.Property("DocumentId") + .HasMaxLength(255) + .HasColumnType("nvarchar(255)"); + + b.Property("Document") + .HasColumnType("nvarchar(max)"); + + b.Property("Version") + .HasColumnType("bigint"); + + b.HasKey("DocumentId"); + + b.ToTable("States_Counters", (string)null); + }); + + modelBuilder.Entity("Squidex.Infrastructure.States.EFState", b => + { + b.Property("DocumentId") + .HasMaxLength(255) + .HasColumnType("nvarchar(255)"); + + b.Property("Document") + .HasColumnType("nvarchar(max)"); + + b.Property("Version") + .HasColumnType("bigint"); + + b.HasKey("DocumentId"); + + b.ToTable("States_JobsState", (string)null); + }); + + modelBuilder.Entity("Squidex.Infrastructure.States.EFState", b => + { + b.Property("DocumentId") + .HasMaxLength(255) + .HasColumnType("nvarchar(255)"); + + b.Property("Document") + .HasColumnType("nvarchar(max)"); + + b.Property("Version") + .HasColumnType("bigint"); + + b.HasKey("DocumentId"); + + b.ToTable("States_UsageTracker", (string)null); + }); + + modelBuilder.Entity("Squidex.Infrastructure.States.EFState", b => + { + b.Property("DocumentId") + .HasMaxLength(255) + .HasColumnType("nvarchar(255)"); + + b.Property("Document") + .HasColumnType("nvarchar(max)"); + + b.Property("Version") + .HasColumnType("bigint"); + + b.HasKey("DocumentId"); + + b.ToTable("States_Index_Tags", (string)null); + }); + + modelBuilder.Entity("Squidex.Infrastructure.States.EFState", b => + { + b.Property("DocumentId") + .HasMaxLength(255) + .HasColumnType("nvarchar(255)"); + + b.Property("Document") + .HasColumnType("nvarchar(max)"); + + b.Property("Version") + .HasColumnType("bigint"); + + b.HasKey("DocumentId"); + + b.ToTable("States_Identity_Keys", (string)null); + }); + + modelBuilder.Entity("Squidex.Infrastructure.States.EFState", b => + { + b.Property("DocumentId") + .HasMaxLength(255) + .HasColumnType("nvarchar(255)"); + + b.Property("Document") + .HasColumnType("nvarchar(max)"); + + b.Property("Version") + .HasColumnType("bigint"); + + b.HasKey("DocumentId"); + + b.ToTable("States_Identity_Xml", (string)null); + }); + + modelBuilder.Entity("Squidex.Infrastructure.States.EFState", b => + { + b.Property("DocumentId") + .HasMaxLength(255) + .HasColumnType("nvarchar(255)"); + + b.Property("Document") + .HasColumnType("nvarchar(max)"); + + b.Property("Version") + .HasColumnType("bigint"); + + b.HasKey("DocumentId"); + + b.ToTable("States_EventConsumerState", (string)null); + }); + + modelBuilder.Entity("Squidex.Infrastructure.States.EFState", b => + { + b.Property("DocumentId") + .HasMaxLength(255) + .HasColumnType("nvarchar(255)"); + + b.Property("Document") + .HasColumnType("nvarchar(max)"); + + b.Property("Version") + .HasColumnType("bigint"); + + b.HasKey("DocumentId"); + + b.ToTable("States_Names", (string)null); + }); + + modelBuilder.Entity("Squidex.Infrastructure.UsageTracking.EFUsageCounterEntity", b => + { + b.Property("Key") + .HasColumnType("nvarchar(450)"); + + b.Property("Date") + .HasColumnType("datetime2"); + + b.Property("Category") + .HasColumnType("nvarchar(450)"); + + b.Property("CounterKey") + .HasColumnType("nvarchar(450)"); + + b.Property("CounterValue") + .HasColumnType("float"); + + b.HasKey("Key", "Date", "Category", "CounterKey"); + + b.ToTable("Counter", (string)null); + }); + + modelBuilder.Entity("Squidex.Messaging.EntityFramework.EFMessage", b => + { + b.Property("Id") + .HasColumnType("nvarchar(450)"); + + b.Property("ChannelName") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("nvarchar(255)"); + + b.Property("MessageData") + .IsRequired() + .HasColumnType("varbinary(max)"); + + b.Property("MessageHeaders") + .IsRequired() + .HasMaxLength(2000) + .HasColumnType("nvarchar(2000)"); + + b.Property("QueueName") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("nvarchar(255)"); + + b.Property("TimeHandled") + .HasColumnType("datetime2"); + + b.Property("TimeToLive") + .HasColumnType("datetime2"); + + b.Property("Version") + .IsConcurrencyToken() + .HasColumnType("uniqueidentifier"); + + b.HasKey("Id"); + + b.HasIndex("ChannelName", "TimeHandled"); + + b.ToTable("Messages", (string)null); + }); + + modelBuilder.Entity("Squidex.Messaging.EntityFramework.EFMessagingDataEntity", b => + { + b.Property("Group") + .HasMaxLength(255) + .HasColumnType("nvarchar(255)"); + + b.Property("Key") + .HasMaxLength(255) + .HasColumnType("nvarchar(255)"); + + b.Property("Expiration") + .HasColumnType("datetime2"); + + b.Property("ValueData") + .IsRequired() + .HasColumnType("varbinary(max)"); + + b.Property("ValueFormat") + .HasMaxLength(255) + .HasColumnType("nvarchar(255)"); + + b.Property("ValueType") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("nvarchar(255)"); + + b.HasKey("Group", "Key"); + + b.HasIndex("Expiration"); + + b.ToTable("MessagingData", (string)null); + }); + + modelBuilder.Entity("YDotNet.Server.EntityFramework.YDotNetDocument", b => + { + b.Property("Id") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("Data") + .IsRequired() + .HasColumnType("varbinary(max)"); + + b.Property("Expiration") + .HasColumnType("datetime2"); + + b.HasKey("Id"); + + b.ToTable("YDotNetDocument", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null) + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null) + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("OpenIddict.EntityFrameworkCore.Models.OpenIddictEntityFrameworkCoreToken", b => + { + b.HasOne("OpenIddict.EntityFrameworkCore.Models.OpenIddictEntityFrameworkCoreAuthorization", "Authorization") + .WithMany("Tokens") + .HasForeignKey("AuthorizationId"); + + b.Navigation("Authorization"); + }); + + modelBuilder.Entity("OpenIddict.EntityFrameworkCore.Models.OpenIddictEntityFrameworkCoreAuthorization", b => + { + b.Navigation("Tokens"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/backend/src/Squidex.Data.EntityFramework/Providers/SqlServer/App/Migrations/20260117183427_AddUserInfoIndex.cs b/backend/src/Squidex.Data.EntityFramework/Providers/SqlServer/App/Migrations/20260117183427_AddUserInfoIndex.cs new file mode 100644 index 000000000..8e30c07bf --- /dev/null +++ b/backend/src/Squidex.Data.EntityFramework/Providers/SqlServer/App/Migrations/20260117183427_AddUserInfoIndex.cs @@ -0,0 +1,45 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace Squidex.Providers.SqlServer.App.Migrations +{ + /// + public partial class AddUserInfoIndex : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateTable( + name: "UserInfos", + columns: table => new + { + Id = table.Column(type: "nvarchar(400)", maxLength: 400, nullable: false), + AppId = table.Column(type: "nvarchar(255)", maxLength: 255, nullable: false), + SchemaId = table.Column(type: "nvarchar(255)", maxLength: 255, nullable: false), + ContentId = table.Column(type: "nvarchar(255)", maxLength: 255, nullable: false), + Stage = table.Column(type: "tinyint", nullable: false), + ServeAll = table.Column(type: "bit", nullable: false), + ServePublished = table.Column(type: "bit", nullable: false), + UserInfoApiKey = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), + UserInfoRole = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_UserInfos", x => x.Id); + }); + + migrationBuilder.CreateIndex( + name: "IX_UserInfos_UserInfoApiKey", + table: "UserInfos", + column: "UserInfoApiKey"); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "UserInfos"); + } + } +} diff --git a/backend/src/Squidex.Data.EntityFramework/Providers/SqlServer/App/Migrations/SqlServerDbContextModelSnapshot.cs b/backend/src/Squidex.Data.EntityFramework/Providers/SqlServer/App/Migrations/SqlServerDbContextModelSnapshot.cs index 7fd48ad17..abcb6f693 100644 --- a/backend/src/Squidex.Data.EntityFramework/Providers/SqlServer/App/Migrations/SqlServerDbContextModelSnapshot.cs +++ b/backend/src/Squidex.Data.EntityFramework/Providers/SqlServer/App/Migrations/SqlServerDbContextModelSnapshot.cs @@ -18,7 +18,7 @@ namespace Squidex.Providers.SqlServer.Migrations { #pragma warning disable 612, 618 modelBuilder - .HasAnnotation("ProductVersion", "8.0.14") + .HasAnnotation("ProductVersion", "8.0.16") .HasAnnotation("Relational:MaxIdentifierLength", 128); SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); @@ -848,7 +848,7 @@ namespace Squidex.Providers.SqlServer.Migrations b.HasKey("Id"); - b.ToTable("Geos", (string)null); + b.ToTable("Geos"); }); modelBuilder.Entity("Squidex.Domain.Apps.Entities.Contents.Text.EFTextIndexTextEntity", b => @@ -887,7 +887,54 @@ namespace Squidex.Providers.SqlServer.Migrations b.HasKey("Id"); - b.ToTable("Texts", (string)null); + b.ToTable("Texts"); + }); + + modelBuilder.Entity("Squidex.Domain.Apps.Entities.Contents.Text.EFTextIndexUserInfoEntity", b => + { + b.Property("Id") + .HasMaxLength(400) + .HasColumnType("nvarchar(400)"); + + b.Property("AppId") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("nvarchar(255)"); + + b.Property("ContentId") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("nvarchar(255)"); + + b.Property("SchemaId") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("nvarchar(255)"); + + b.Property("ServeAll") + .HasColumnType("bit"); + + b.Property("ServePublished") + .HasColumnType("bit"); + + b.Property("Stage") + .HasColumnType("tinyint"); + + b.Property("UserInfoApiKey") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("UserInfoRole") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.HasKey("Id"); + + b.HasIndex("UserInfoApiKey"); + + b.ToTable("UserInfos"); }); modelBuilder.Entity("Squidex.Domain.Apps.Entities.Contents.Text.State.TextContentState", b => @@ -1049,7 +1096,6 @@ namespace Squidex.Providers.SqlServer.Migrations modelBuilder.Entity("Squidex.Events.EntityFramework.EFEventCommit", b => { b.Property("Id") - .ValueGeneratedOnAdd() .HasColumnType("uniqueidentifier"); b.Property("EventStream") @@ -1121,7 +1167,6 @@ namespace Squidex.Providers.SqlServer.Migrations modelBuilder.Entity("Squidex.Flows.EntityFramework.EFFlowStateEntity", b => { b.Property("Id") - .ValueGeneratedOnAdd() .HasColumnType("uniqueidentifier"); b.Property("Created") diff --git a/backend/src/Squidex.Data.MongoDb/Domain/Apps/Entities/Contents/Text/CommandFactory.cs b/backend/src/Squidex.Data.MongoDb/Domain/Apps/Entities/Contents/Text/CommandFactory.cs index dcbe6d193..a2e083538 100644 --- a/backend/src/Squidex.Data.MongoDb/Domain/Apps/Entities/Contents/Text/CommandFactory.cs +++ b/backend/src/Squidex.Data.MongoDb/Domain/Apps/Entities/Contents/Text/CommandFactory.cs @@ -80,6 +80,37 @@ public sealed class CommandFactory(Func, T> textBu })); } } + + if (upsert.UserInfos?.Count > 0) + { + if (!upsert.IsNew) + { + writes.Add( + new DeleteManyModel>( + Filter.And( + FilterByCommand(upsert), + Filter.Exists(x => x.UserInfoApiKey), + Filter.Exists(x => x.UserInfoRole)))); + } + + foreach (var userInfo in upsert.UserInfos) + { + writes.Add( + new InsertOneModel>( + new MongoTextIndexEntity + { + Id = ObjectId.GenerateNewId(), + AppId = upsert.UniqueContentId.AppId, + ContentId = upsert.UniqueContentId.ContentId, + UserInfoApiKey = userInfo.ApiKey, + UserInfoRole = userInfo.Role, + SchemaId = upsert.SchemaId.Id, + ServeAll = upsert.ServeAll, + ServePublished = upsert.ServePublished, + Stage = upsert.Stage, + })); + } + } } private T? BuildTexts(UpsertIndexEntry upsert) diff --git a/backend/src/Squidex.Data.MongoDb/Domain/Apps/Entities/Contents/Text/DocumentDbTextIndex.cs b/backend/src/Squidex.Data.MongoDb/Domain/Apps/Entities/Contents/Text/DocumentDbTextIndex.cs index 03ac5f9ce..659419c4f 100644 --- a/backend/src/Squidex.Data.MongoDb/Domain/Apps/Entities/Contents/Text/DocumentDbTextIndex.cs +++ b/backend/src/Squidex.Data.MongoDb/Domain/Apps/Entities/Contents/Text/DocumentDbTextIndex.cs @@ -14,7 +14,8 @@ using Squidex.Infrastructure.ObjectPool; namespace Squidex.Domain.Apps.Entities.Contents.Text; public sealed class DocumentDbTextIndex(IMongoDatabase database, string shardKey) - : MongoTextIndexBase(database, shardKey, new CommandFactory(BuildTexts)) + : MongoTextIndexBase(database, shardKey, + new CommandFactory(BuildTexts)) { private record struct SearchOperation { diff --git a/backend/src/Squidex.Data.MongoDb/Domain/Apps/Entities/Contents/Text/MongoShardedTextIndex.cs b/backend/src/Squidex.Data.MongoDb/Domain/Apps/Entities/Contents/Text/MongoShardedTextIndex.cs index b456a8636..7e34abc8d 100644 --- a/backend/src/Squidex.Data.MongoDb/Domain/Apps/Entities/Contents/Text/MongoShardedTextIndex.cs +++ b/backend/src/Squidex.Data.MongoDb/Domain/Apps/Entities/Contents/Text/MongoShardedTextIndex.cs @@ -12,7 +12,8 @@ using Squidex.Infrastructure.States; namespace Squidex.Domain.Apps.Entities.Contents.Text; -public sealed class MongoShardedTextIndex(IShardingStrategy sharding, Func> factory) : ShardedService>(sharding, factory), ITextIndex, IDeleter where T : class +public sealed class MongoShardedTextIndex(IShardingStrategy sharding, Func> factory) + : ShardedService>(sharding, factory), ITextIndex, IDeleter where T : class { public async Task ClearAsync( CancellationToken ct = default) @@ -45,6 +46,12 @@ public sealed class MongoShardedTextIndex(IShardingStrategy sharding, Func FindUserInfo(App app, ApiKeyQuery query, SearchScope scope, + CancellationToken ct = default) + { + return Shard(app.Id).FindUserInfo(app, query, scope, ct); + } + async Task IDeleter.DeleteAppAsync(App app, CancellationToken ct) { diff --git a/backend/src/Squidex.Data.MongoDb/Domain/Apps/Entities/Contents/Text/MongoTextIndex.cs b/backend/src/Squidex.Data.MongoDb/Domain/Apps/Entities/Contents/Text/MongoTextIndex.cs index d64ec1dff..20cb93460 100644 --- a/backend/src/Squidex.Data.MongoDb/Domain/Apps/Entities/Contents/Text/MongoTextIndex.cs +++ b/backend/src/Squidex.Data.MongoDb/Domain/Apps/Entities/Contents/Text/MongoTextIndex.cs @@ -11,8 +11,9 @@ using Squidex.Infrastructure; namespace Squidex.Domain.Apps.Entities.Contents.Text; -public sealed class MongoTextIndex(IMongoDatabase database, string shardKey) - : MongoTextIndexBase>(database, shardKey, new CommandFactory>(BuildTexts)) +public sealed class MongoTextIndex(IMongoDatabase database, string shardKey) + : MongoTextIndexBase>(database, shardKey, + new CommandFactory>(BuildTexts)) { private record struct SearchOperation { diff --git a/backend/src/Squidex.Data.MongoDb/Domain/Apps/Entities/Contents/Text/MongoTextIndexBase.cs b/backend/src/Squidex.Data.MongoDb/Domain/Apps/Entities/Contents/Text/MongoTextIndexBase.cs index f4ab89dfd..165b568a7 100644 --- a/backend/src/Squidex.Data.MongoDb/Domain/Apps/Entities/Contents/Text/MongoTextIndexBase.cs +++ b/backend/src/Squidex.Data.MongoDb/Domain/Apps/Entities/Contents/Text/MongoTextIndexBase.cs @@ -14,7 +14,8 @@ using Squidex.Infrastructure; namespace Squidex.Domain.Apps.Entities.Contents.Text; -public abstract class MongoTextIndexBase(IMongoDatabase database, string shardKey, CommandFactory factory) : MongoRepositoryBase>(database), ITextIndex, IDeleter where T : class +public abstract class MongoTextIndexBase(IMongoDatabase database, string shardKey, CommandFactory factory) + : MongoRepositoryBase>(database), ITextIndex, IDeleter where T : class { protected sealed class MongoTextResult { @@ -31,6 +32,25 @@ public abstract class MongoTextIndexBase(IMongoDatabase database, string shar public double Score { get; set; } } + protected sealed class MongoApiKeyResult + { + [BsonId] + [BsonElement] + public ObjectId Id { get; set; } + + [BsonRequired] + [BsonElement("c")] + public DomainId ContentId { get; set; } + + [BsonIgnoreIfNull] + [BsonElement("k")] + public string UserInfoApiKey { get; set; } + + [BsonIgnoreIfNull] + [BsonElement("r")] + public string UserInfoRole { get; set; } + } + protected override async Task SetupCollectionAsync(IMongoCollection> collection, CancellationToken ct) { @@ -54,6 +74,11 @@ public abstract class MongoTextIndexBase(IMongoDatabase database, string shar new CreateIndexModel>( Index .Geo2DSphere(x => x.GeoObject)), + + new CreateIndexModel>( + Index + .Geo2DSphere(x => x.UserInfoApiKey), + new CreateIndexOptions { Sparse = true }), ], ct); } else @@ -123,6 +148,27 @@ public abstract class MongoTextIndexBase(IMongoDatabase database, string shar } } + public async Task FindUserInfo(App app, ApiKeyQuery query, SearchScope scope, + CancellationToken ct = default) + { + Guard.NotNull(app); + Guard.NotNull(query); + + // Use the filter in the correct order to leverage the index in the best way. + var findFilter = + Filter.And( + Filter.Eq(x => x.AppId, app.Id), + Filter.Eq(x => x.UserInfoApiKey, query.ApiKey), + FilterByScope(scope)); + + var byApiKey = + await GetCollection(scope).Find(findFilter).Limit(1) + .Project(Projection.Include(x => x.ContentId).Include(x => x.UserInfoRole)) + .FirstOrDefaultAsync(ct); + + return byApiKey != null ? new UserInfoResult(byApiKey.ContentId, byApiKey.UserInfoRole) : null; + } + public virtual async Task?> SearchAsync(App app, GeoQuery query, SearchScope scope, CancellationToken ct = default) { diff --git a/backend/src/Squidex.Data.MongoDb/Domain/Apps/Entities/Contents/Text/MongoTextIndexEntity.cs b/backend/src/Squidex.Data.MongoDb/Domain/Apps/Entities/Contents/Text/MongoTextIndexEntity.cs index 2012c92e0..ddc4e0c7c 100644 --- a/backend/src/Squidex.Data.MongoDb/Domain/Apps/Entities/Contents/Text/MongoTextIndexEntity.cs +++ b/backend/src/Squidex.Data.MongoDb/Domain/Apps/Entities/Contents/Text/MongoTextIndexEntity.cs @@ -8,6 +8,7 @@ using MongoDB.Bson; using MongoDB.Bson.Serialization.Attributes; using NetTopologySuite.Geometries; +using Squidex.Domain.Apps.Core.Contents; using Squidex.Infrastructure; namespace Squidex.Domain.Apps.Entities.Contents.Text; @@ -49,6 +50,14 @@ public sealed class MongoTextIndexEntity [BsonElement("t")] public T Texts { get; set; } + [BsonIgnoreIfNull] + [BsonElement("k")] + public string? UserInfoApiKey { get; set; } + + [BsonIgnoreIfNull] + [BsonElement("r")] + public string? UserInfoRole { get; set; } + [BsonIgnoreIfNull] [BsonElement("g")] public string GeoField { get; set; } diff --git a/backend/src/Squidex.Domain.Apps.Core.Model/Contents/Component.cs b/backend/src/Squidex.Domain.Apps.Core.Model/Contents/Component.cs index f3abb5e6b..5f186da15 100644 --- a/backend/src/Squidex.Domain.Apps.Core.Model/Contents/Component.cs +++ b/backend/src/Squidex.Domain.Apps.Core.Model/Contents/Component.cs @@ -53,7 +53,6 @@ public sealed record Component(string Type, JsonObject Data, Schema Schema) } discriminator = s; - return true; } } diff --git a/backend/src/Squidex.Domain.Apps.Core.Model/Contents/GeoJsonValue.cs b/backend/src/Squidex.Domain.Apps.Core.Model/Contents/GeoJsonValue.cs index 5345d3eef..3cc377a34 100644 --- a/backend/src/Squidex.Domain.Apps.Core.Model/Contents/GeoJsonValue.cs +++ b/backend/src/Squidex.Domain.Apps.Core.Model/Contents/GeoJsonValue.cs @@ -41,7 +41,6 @@ public static class GeoJsonValue } geoJSON = new Point(new Coordinate(lon, lat)); - return GeoJsonParseResult.Success; } diff --git a/backend/src/Squidex.Domain.Apps.Core.Model/Contents/UserInfoParseResult.cs b/backend/src/Squidex.Domain.Apps.Core.Model/Contents/UserInfoParseResult.cs new file mode 100644 index 000000000..42d456c3c --- /dev/null +++ b/backend/src/Squidex.Domain.Apps.Core.Model/Contents/UserInfoParseResult.cs @@ -0,0 +1,16 @@ +// ========================================================================== +// Squidex Headless CMS +// ========================================================================== +// Copyright (c) Squidex UG (haftungsbeschraenkt) +// All rights reserved. Licensed under the MIT license. +// ========================================================================== + +namespace Squidex.Domain.Apps.Core.Contents; + +public enum UserInfoParseResult +{ + Success, + InvalidApiKey, + InvalidRole, + InvalidValue, +} diff --git a/backend/src/Squidex.Domain.Apps.Core.Model/Contents/UserInfoValue.cs b/backend/src/Squidex.Domain.Apps.Core.Model/Contents/UserInfoValue.cs new file mode 100644 index 000000000..fd3fe5609 --- /dev/null +++ b/backend/src/Squidex.Domain.Apps.Core.Model/Contents/UserInfoValue.cs @@ -0,0 +1,53 @@ +// ========================================================================== +// Squidex Headless CMS +// ========================================================================== +// Copyright (c) Squidex UG (haftungsbeschraenkt) +// All rights reserved. Licensed under the MIT license. +// ========================================================================== + +using Squidex.Infrastructure; +using Squidex.Infrastructure.Json.Objects; + +#pragma warning disable SA1313 // Parameter names should begin with lower-case letter + +namespace Squidex.Domain.Apps.Core.Contents; + +public sealed record UserInfoValue(string ApiKey, string Role) +{ + public static JsonValue CreateDefault(string role) + { + var apiKey = + Guid.NewGuid().ToString().ToSha256Base64() + .Replace("+", string.Empty, StringComparison.Ordinal) + .Replace("/", string.Empty, StringComparison.Ordinal) + .TrimEnd('='); + + return JsonValue.Object().Add("apiKey", apiKey).Add("role", role); + } + + public static UserInfoParseResult TryParse(JsonValue value, out UserInfoValue? userInfo) + { + Guard.NotNull(value); + + userInfo = null; + + if (value.Value is JsonObject o) + { + if (!o.TryGetValue("apiKey", out var found) || found.Value is not string apiKey || string.IsNullOrWhiteSpace(apiKey)) + { + return UserInfoParseResult.InvalidApiKey; + } + + if (!o.TryGetValue("role", out found) || found.Value is not string role || string.IsNullOrWhiteSpace(role)) + { + return UserInfoParseResult.InvalidRole; + } + + userInfo = new UserInfoValue(apiKey, role); + + return UserInfoParseResult.Success; + } + + return UserInfoParseResult.InvalidValue; + } +} diff --git a/backend/src/Squidex.Domain.Apps.Core.Model/FieldDescriptions.Designer.cs b/backend/src/Squidex.Domain.Apps.Core.Model/FieldDescriptions.Designer.cs index a5d3b8211..3a2ab86c4 100644 --- a/backend/src/Squidex.Domain.Apps.Core.Model/FieldDescriptions.Designer.cs +++ b/backend/src/Squidex.Domain.Apps.Core.Model/FieldDescriptions.Designer.cs @@ -1131,6 +1131,24 @@ namespace Squidex.Domain.Apps.Core { } } + /// + /// Looks up a localized string similar to The API key for authentication.. + /// + public static string UserInfoApiKey { + get { + return ResourceManager.GetString("UserInfoApiKey", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The user role.. + /// + public static string UserInfoRole { + get { + return ResourceManager.GetString("UserInfoRole", resourceCulture); + } + } + /// /// Looks up a localized string similar to True when this user is a client, which is typically the case when the request is made from the API.. /// diff --git a/backend/src/Squidex.Domain.Apps.Core.Model/FieldDescriptions.resx b/backend/src/Squidex.Domain.Apps.Core.Model/FieldDescriptions.resx index 97c9d1af2..ccd701913 100644 --- a/backend/src/Squidex.Domain.Apps.Core.Model/FieldDescriptions.resx +++ b/backend/src/Squidex.Domain.Apps.Core.Model/FieldDescriptions.resx @@ -483,4 +483,10 @@ The type of action that is performed. + + The API key for authentication. + + + The user role. + \ No newline at end of file diff --git a/backend/src/Squidex.Domain.Apps.Core.Model/Schemas/ArrayField.cs b/backend/src/Squidex.Domain.Apps.Core.Model/Schemas/ArrayField.cs index 50c36f2b0..840140d60 100644 --- a/backend/src/Squidex.Domain.Apps.Core.Model/Schemas/ArrayField.cs +++ b/backend/src/Squidex.Domain.Apps.Core.Model/Schemas/ArrayField.cs @@ -45,7 +45,7 @@ public sealed record ArrayField : RootField, IArrayField } [Pure] - public ArrayField AddField(NestedField field) + public ArrayField AddUserInfo(NestedField field) { return Updatefields(f => f.Add(field)); } diff --git a/backend/src/Squidex.Domain.Apps.Core.Model/Schemas/Fields.cs b/backend/src/Squidex.Domain.Apps.Core.Model/Schemas/Fields.cs index 48851f043..4810e5fb8 100644 --- a/backend/src/Squidex.Domain.Apps.Core.Model/Schemas/Fields.cs +++ b/backend/src/Squidex.Domain.Apps.Core.Model/Schemas/Fields.cs @@ -11,170 +11,452 @@ namespace Squidex.Domain.Apps.Core.Schemas; public static class Fields { - public static ArrayField Array(long id, string name, Partitioning partitioning, - ArrayFieldProperties? properties = null, params NestedField[] fields) + public static ArrayField Array( + long id, + string name, + Partitioning partitioning, + ArrayFieldProperties? properties = null, + params NestedField[] fields + ) + { + return new ArrayField + { + Id = id, + Name = name, + Partitioning = partitioning, + Properties = properties ?? new(), + FieldCollection = new FieldCollection(fields), + }; + } + + public static RootField Assets( + long id, + string name, + Partitioning partitioning, + AssetsFieldProperties? properties = null + ) + { + return new RootField + { + Id = id, + Name = name, + Partitioning = partitioning, + Properties = properties ?? new(), + }; + } + + public static RootField Boolean( + long id, + string name, + Partitioning partitioning, + BooleanFieldProperties? properties = null + ) { - return new ArrayField { Id = id, Name = name, Partitioning = partitioning, Properties = properties ?? new(), FieldCollection = new FieldCollection(fields) }; + return new RootField + { + Id = id, + Name = name, + Partitioning = partitioning, + Properties = properties ?? new(), + }; } - public static RootField Assets(long id, string name, Partitioning partitioning, - AssetsFieldProperties? properties = null) + public static RootField Component( + long id, + string name, + Partitioning partitioning, + ComponentFieldProperties? properties = null + ) { - return new RootField { Id = id, Name = name, Partitioning = partitioning, Properties = properties ?? new() }; + return new RootField + { + Id = id, + Name = name, + Partitioning = partitioning, + Properties = properties ?? new(), + }; } - public static RootField Boolean(long id, string name, Partitioning partitioning, - BooleanFieldProperties? properties = null) + public static RootField Components( + long id, + string name, + Partitioning partitioning, + ComponentsFieldProperties? properties = null + ) { - return new RootField { Id = id, Name = name, Partitioning = partitioning, Properties = properties ?? new() }; + return new RootField + { + Id = id, + Name = name, + Partitioning = partitioning, + Properties = properties ?? new(), + }; } - public static RootField Component(long id, string name, Partitioning partitioning, - ComponentFieldProperties? properties = null) + public static RootField DateTime( + long id, + string name, + Partitioning partitioning, + DateTimeFieldProperties? properties = null + ) { - return new RootField { Id = id, Name = name, Partitioning = partitioning, Properties = properties ?? new() }; + return new RootField + { + Id = id, + Name = name, + Partitioning = partitioning, + Properties = properties ?? new(), + }; } - public static RootField Components(long id, string name, Partitioning partitioning, - ComponentsFieldProperties? properties = null) + public static RootField Geolocation( + long id, + string name, + Partitioning partitioning, + GeolocationFieldProperties? properties = null + ) { - return new RootField { Id = id, Name = name, Partitioning = partitioning, Properties = properties ?? new() }; + return new RootField + { + Id = id, + Name = name, + Partitioning = partitioning, + Properties = properties ?? new(), + }; } - public static RootField DateTime(long id, string name, Partitioning partitioning, - DateTimeFieldProperties? properties = null) + public static RootField Json( + long id, + string name, + Partitioning partitioning, + JsonFieldProperties? properties = null + ) { - return new RootField { Id = id, Name = name, Partitioning = partitioning, Properties = properties ?? new() }; + return new RootField + { + Id = id, + Name = name, + Partitioning = partitioning, + Properties = properties ?? new(), + }; } - public static RootField Geolocation(long id, string name, Partitioning partitioning, - GeolocationFieldProperties? properties = null) + public static RootField Number( + long id, + string name, + Partitioning partitioning, + NumberFieldProperties? properties = null + ) { - return new RootField { Id = id, Name = name, Partitioning = partitioning, Properties = properties ?? new() }; + return new RootField + { + Id = id, + Name = name, + Partitioning = partitioning, + Properties = properties ?? new(), + }; } - public static RootField Json(long id, string name, Partitioning partitioning, - JsonFieldProperties? properties = null) + public static RootField References( + long id, + string name, + Partitioning partitioning, + ReferencesFieldProperties? properties = null + ) { - return new RootField { Id = id, Name = name, Partitioning = partitioning, Properties = properties ?? new() }; + return new RootField + { + Id = id, + Name = name, + Partitioning = partitioning, + Properties = properties ?? new(), + }; } - public static RootField Number(long id, string name, Partitioning partitioning, - NumberFieldProperties? properties = null) + public static RootField RichText( + long id, + string name, + Partitioning partitioning, + RichTextFieldProperties? properties = null + ) { - return new RootField { Id = id, Name = name, Partitioning = partitioning, Properties = properties ?? new() }; + return new RootField + { + Id = id, + Name = name, + Partitioning = partitioning, + Properties = properties ?? new(), + }; } - public static RootField References(long id, string name, Partitioning partitioning, - ReferencesFieldProperties? properties = null) + public static RootField String( + long id, + string name, + Partitioning partitioning, + StringFieldProperties? properties = null + ) { - return new RootField { Id = id, Name = name, Partitioning = partitioning, Properties = properties ?? new() }; + return new RootField + { + Id = id, + Name = name, + Partitioning = partitioning, + Properties = properties ?? new(), + }; } - public static RootField RichText(long id, string name, Partitioning partitioning, - RichTextFieldProperties? properties = null) + public static RootField Tags( + long id, + string name, + Partitioning partitioning, + TagsFieldProperties? properties = null + ) { - return new RootField { Id = id, Name = name, Partitioning = partitioning, Properties = properties ?? new() }; + return new RootField + { + Id = id, + Name = name, + Partitioning = partitioning, + Properties = properties ?? new(), + }; } - public static RootField String(long id, string name, Partitioning partitioning, - StringFieldProperties? properties = null) + public static RootField UI( + long id, + string name, + Partitioning partitioning, + UIFieldProperties? properties = null + ) { - return new RootField { Id = id, Name = name, Partitioning = partitioning, Properties = properties ?? new() }; + return new RootField + { + Id = id, + Name = name, + Partitioning = partitioning, + Properties = properties ?? new(), + }; } - public static RootField Tags(long id, string name, Partitioning partitioning, - TagsFieldProperties? properties = null) + public static RootField UserInfo( + long id, + string name, + Partitioning partitioning, + UserInfoFieldProperties? properties = null + ) { - return new RootField { Id = id, Name = name, Partitioning = partitioning, Properties = properties ?? new() }; + return new RootField + { + Id = id, + Name = name, + Partitioning = partitioning, + Properties = properties ?? new(), + }; } - public static RootField UI(long id, string name, Partitioning partitioning, - UIFieldProperties? properties = null) + public static NestedField Assets( + long id, + string name, + AssetsFieldProperties? properties = null + ) { - return new RootField { Id = id, Name = name, Partitioning = partitioning, Properties = properties ?? new() }; + return new NestedField + { + Id = id, + Name = name, + Properties = properties ?? new(), + }; } - public static NestedField Assets(long id, string name, - AssetsFieldProperties? properties = null) + public static NestedField Boolean( + long id, + string name, + BooleanFieldProperties? properties = null + ) { - return new NestedField { Id = id, Name = name, Properties = properties ?? new() }; + return new NestedField + { + Id = id, + Name = name, + Properties = properties ?? new(), + }; } - public static NestedField Boolean(long id, string name, - BooleanFieldProperties? properties = null) + public static NestedField Component( + long id, + string name, + ComponentFieldProperties? properties = null + ) { - return new NestedField { Id = id, Name = name, Properties = properties ?? new() }; + return new NestedField + { + Id = id, + Name = name, + Properties = properties ?? new(), + }; } - public static NestedField Component(long id, string name, - ComponentFieldProperties? properties = null) + public static NestedField Components( + long id, + string name, + ComponentsFieldProperties? properties = null + ) { - return new NestedField { Id = id, Name = name, Properties = properties ?? new() }; + return new NestedField + { + Id = id, + Name = name, + Properties = properties ?? new(), + }; } - public static NestedField Components(long id, string name, - ComponentsFieldProperties? properties = null) + public static NestedField DateTime( + long id, + string name, + DateTimeFieldProperties? properties = null + ) { - return new NestedField { Id = id, Name = name, Properties = properties ?? new() }; + return new NestedField + { + Id = id, + Name = name, + Properties = properties ?? new(), + }; } - public static NestedField DateTime(long id, string name, - DateTimeFieldProperties? properties = null) + public static NestedField Geolocation( + long id, + string name, + GeolocationFieldProperties? properties = null + ) { - return new NestedField { Id = id, Name = name, Properties = properties ?? new() }; + return new NestedField + { + Id = id, + Name = name, + Properties = properties ?? new(), + }; } - public static NestedField Geolocation(long id, string name, - GeolocationFieldProperties? properties = null) + public static NestedField Json( + long id, + string name, + JsonFieldProperties? properties = null + ) { - return new NestedField { Id = id, Name = name, Properties = properties ?? new() }; + return new NestedField + { + Id = id, + Name = name, + Properties = properties ?? new(), + }; } - public static NestedField Json(long id, string name, - JsonFieldProperties? properties = null) + public static NestedField Number( + long id, + string name, + NumberFieldProperties? properties = null + ) { - return new NestedField { Id = id, Name = name, Properties = properties ?? new() }; + return new NestedField + { + Id = id, + Name = name, + Properties = properties ?? new(), + }; } - public static NestedField Number(long id, string name, - NumberFieldProperties? properties = null) + public static NestedField References( + long id, + string name, + ReferencesFieldProperties? properties = null + ) { - return new NestedField { Id = id, Name = name, Properties = properties ?? new() }; + return new NestedField + { + Id = id, + Name = name, + Properties = properties ?? new(), + }; } - public static NestedField References(long id, string name, - ReferencesFieldProperties? properties = null) + public static NestedField RichText( + long id, + string name, + RichTextFieldProperties? properties = null + ) { - return new NestedField { Id = id, Name = name, Properties = properties ?? new() }; + return new NestedField + { + Id = id, + Name = name, + Properties = properties ?? new(), + }; } - public static NestedField RichText(long id, string name, - RichTextFieldProperties? properties = null) + public static NestedField String( + long id, + string name, + StringFieldProperties? properties = null + ) { - return new NestedField { Id = id, Name = name, Properties = properties ?? new() }; + return new NestedField + { + Id = id, + Name = name, + Properties = properties ?? new(), + }; } - public static NestedField String(long id, string name, - StringFieldProperties? properties = null) + public static NestedField Tags( + long id, + string name, + TagsFieldProperties? properties = null + ) { - return new NestedField { Id = id, Name = name, Properties = properties ?? new() }; + return new NestedField + { + Id = id, + Name = name, + Properties = properties ?? new(), + }; } - public static NestedField Tags(long id, string name, - TagsFieldProperties? properties = null) + public static NestedField UI( + long id, + string name, + UIFieldProperties? properties = null + ) { - return new NestedField { Id = id, Name = name, Properties = properties ?? new() }; + return new NestedField + { + Id = id, + Name = name, + Properties = properties ?? new(), + }; } - public static NestedField UI(long id, string name, - UIFieldProperties? properties = null) + public static NestedField User( + long id, + string name, + UserInfoFieldProperties? properties = null + ) { - return new NestedField { Id = id, Name = name, Properties = properties ?? new() }; + return new NestedField + { + Id = id, + Name = name, + Properties = properties ?? new(), + }; } - public static Schema AddArray(this Schema schema, long id, string name, Partitioning partitioning, - Func? handler = null, ArrayFieldProperties? properties = null) + public static Schema AddArray( + this Schema schema, + long id, + string name, + Partitioning partitioning, + Func? handler = null, + ArrayFieldProperties? properties = null + ) { var field = Array(id, name, partitioning, properties); @@ -186,159 +468,297 @@ public static class Fields return schema.AddField(field); } - public static Schema AddAssets(this Schema schema, long id, string name, Partitioning partitioning, - AssetsFieldProperties? properties = null) + public static Schema AddAssets( + this Schema schema, + long id, + string name, + Partitioning partitioning, + AssetsFieldProperties? properties = null + ) { return schema.AddField(Assets(id, name, partitioning, properties)); } - public static Schema AddBoolean(this Schema schema, long id, string name, Partitioning partitioning, - BooleanFieldProperties? properties = null) + public static Schema AddBoolean( + this Schema schema, + long id, + string name, + Partitioning partitioning, + BooleanFieldProperties? properties = null + ) { return schema.AddField(Boolean(id, name, partitioning, properties)); } - public static Schema AddComponent(this Schema schema, long id, string name, Partitioning partitioning, - ComponentFieldProperties? properties = null) + public static Schema AddComponent( + this Schema schema, + long id, + string name, + Partitioning partitioning, + ComponentFieldProperties? properties = null + ) { return schema.AddField(Component(id, name, partitioning, properties)); } - public static Schema AddComponents(this Schema schema, long id, string name, Partitioning partitioning, - ComponentsFieldProperties? properties = null) + public static Schema AddComponents( + this Schema schema, + long id, + string name, + Partitioning partitioning, + ComponentsFieldProperties? properties = null + ) { return schema.AddField(Components(id, name, partitioning, properties)); } - public static Schema AddDateTime(this Schema schema, long id, string name, Partitioning partitioning, - DateTimeFieldProperties? properties = null) + public static Schema AddDateTime( + this Schema schema, + long id, + string name, + Partitioning partitioning, + DateTimeFieldProperties? properties = null + ) { return schema.AddField(DateTime(id, name, partitioning, properties)); } - public static Schema AddGeolocation(this Schema schema, long id, string name, Partitioning partitioning, - GeolocationFieldProperties? properties = null) + public static Schema AddGeolocation( + this Schema schema, + long id, + string name, + Partitioning partitioning, + GeolocationFieldProperties? properties = null + ) { return schema.AddField(Geolocation(id, name, partitioning, properties)); } - public static Schema AddJson(this Schema schema, long id, string name, Partitioning partitioning, - JsonFieldProperties? properties = null) + public static Schema AddJson( + this Schema schema, + long id, + string name, + Partitioning partitioning, + JsonFieldProperties? properties = null + ) { return schema.AddField(Json(id, name, partitioning, properties)); } - public static Schema AddNumber(this Schema schema, long id, string name, Partitioning partitioning, - NumberFieldProperties? properties = null) + public static Schema AddNumber( + this Schema schema, + long id, + string name, + Partitioning partitioning, + NumberFieldProperties? properties = null + ) { return schema.AddField(Number(id, name, partitioning, properties)); } - public static Schema AddReferences(this Schema schema, long id, string name, Partitioning partitioning, - ReferencesFieldProperties? properties = null) + public static Schema AddReferences( + this Schema schema, + long id, + string name, + Partitioning partitioning, + ReferencesFieldProperties? properties = null + ) { return schema.AddField(References(id, name, partitioning, properties)); } - public static Schema AddRichText(this Schema schema, long id, string name, Partitioning partitioning, - RichTextFieldProperties? properties = null) + public static Schema AddRichText( + this Schema schema, + long id, + string name, + Partitioning partitioning, + RichTextFieldProperties? properties = null + ) { return schema.AddField(RichText(id, name, partitioning, properties)); } - public static Schema AddString(this Schema schema, long id, string name, Partitioning partitioning, - StringFieldProperties? properties = null) + public static Schema AddString( + this Schema schema, + long id, + string name, + Partitioning partitioning, + StringFieldProperties? properties = null + ) { return schema.AddField(String(id, name, partitioning, properties)); } - public static Schema AddTags(this Schema schema, long id, string name, Partitioning partitioning, - TagsFieldProperties? properties = null) + public static Schema AddTags( + this Schema schema, + long id, + string name, + Partitioning partitioning, + TagsFieldProperties? properties = null + ) { return schema.AddField(Tags(id, name, partitioning, properties)); } - public static Schema AddUI(this Schema schema, long id, string name, Partitioning partitioning, - UIFieldProperties? properties = null) + public static Schema AddUI( + this Schema schema, + long id, + string name, + Partitioning partitioning, + UIFieldProperties? properties = null + ) { return schema.AddField(UI(id, name, partitioning, properties)); } - public static ArrayField AddAssets(this ArrayField field, long id, string name, - AssetsFieldProperties? properties = null) + public static Schema AddUserInfo( + this Schema schema, + long id, + string name, + Partitioning partitioning, + UserInfoFieldProperties? properties = null + ) + { + return schema.AddField(UserInfo(id, name, partitioning, properties)); + } + + public static ArrayField AddAssets( + this ArrayField field, + long id, + string name, + AssetsFieldProperties? properties = null + ) + { + return field.AddUserInfo(Assets(id, name, properties)); + } + + public static ArrayField AddBoolean( + this ArrayField field, + long id, + string name, + BooleanFieldProperties? properties = null + ) { - return field.AddField(Assets(id, name, properties)); + return field.AddUserInfo(Boolean(id, name, properties)); } - public static ArrayField AddBoolean(this ArrayField field, long id, string name, - BooleanFieldProperties? properties = null) + public static ArrayField AddComponent( + this ArrayField field, + long id, + string name, + ComponentFieldProperties? properties = null + ) { - return field.AddField(Boolean(id, name, properties)); + return field.AddUserInfo(Component(id, name, properties)); } - public static ArrayField AddComponent(this ArrayField field, long id, string name, - ComponentFieldProperties? properties = null) + public static ArrayField AddComponents( + this ArrayField field, + long id, + string name, + ComponentsFieldProperties? properties = null + ) { - return field.AddField(Component(id, name, properties)); + return field.AddUserInfo(Components(id, name, properties)); } - public static ArrayField AddComponents(this ArrayField field, long id, string name, - ComponentsFieldProperties? properties = null) + public static ArrayField AddDateTime( + this ArrayField field, + long id, + string name, + DateTimeFieldProperties? properties = null + ) { - return field.AddField(Components(id, name, properties)); + return field.AddUserInfo(DateTime(id, name, properties)); } - public static ArrayField AddDateTime(this ArrayField field, long id, string name, - DateTimeFieldProperties? properties = null) + public static ArrayField AddGeolocation( + this ArrayField field, + long id, + string name, + GeolocationFieldProperties? properties = null + ) { - return field.AddField(DateTime(id, name, properties)); + return field.AddUserInfo(Geolocation(id, name, properties)); } - public static ArrayField AddGeolocation(this ArrayField field, long id, string name, - GeolocationFieldProperties? properties = null) + public static ArrayField AddJson( + this ArrayField field, + long id, + string name, + JsonFieldProperties? properties = null + ) { - return field.AddField(Geolocation(id, name, properties)); + return field.AddUserInfo(Json(id, name, properties)); } - public static ArrayField AddJson(this ArrayField field, long id, string name, - JsonFieldProperties? properties = null) + public static ArrayField AddNumber( + this ArrayField field, + long id, + string name, + NumberFieldProperties? properties = null + ) { - return field.AddField(Json(id, name, properties)); + return field.AddUserInfo(Number(id, name, properties)); } - public static ArrayField AddNumber(this ArrayField field, long id, string name, - NumberFieldProperties? properties = null) + public static ArrayField AddReferences( + this ArrayField field, + long id, + string name, + ReferencesFieldProperties? properties = null + ) { - return field.AddField(Number(id, name, properties)); + return field.AddUserInfo(References(id, name, properties)); } - public static ArrayField AddReferences(this ArrayField field, long id, string name, - ReferencesFieldProperties? properties = null) + public static ArrayField AddRichText( + this ArrayField field, + long id, + string name, + RichTextFieldProperties? properties = null + ) { - return field.AddField(References(id, name, properties)); + return field.AddUserInfo(RichText(id, name, properties)); } - public static ArrayField AddRichText(this ArrayField field, long id, string name, - RichTextFieldProperties? properties = null) + public static ArrayField AddString( + this ArrayField field, + long id, + string name, + StringFieldProperties? properties = null + ) { - return field.AddField(RichText(id, name, properties)); + return field.AddUserInfo(String(id, name, properties)); } - public static ArrayField AddString(this ArrayField field, long id, string name, - StringFieldProperties? properties = null) + public static ArrayField AddTags( + this ArrayField field, + long id, + string name, + TagsFieldProperties? properties = null + ) { - return field.AddField(String(id, name, properties)); + return field.AddUserInfo(Tags(id, name, properties)); } - public static ArrayField AddTags(this ArrayField field, long id, string name, - TagsFieldProperties? properties = null) + public static ArrayField AddUI( + this ArrayField field, + long id, + string name, + UIFieldProperties? properties = null + ) { - return field.AddField(Tags(id, name, properties)); + return field.AddUserInfo(UI(id, name, properties)); } - public static ArrayField AddUI(this ArrayField field, long id, string name, - UIFieldProperties? properties = null) + public static ArrayField AddUserInfo( + this ArrayField field, + long id, + string name, + UserInfoFieldProperties? properties = null + ) { - return field.AddField(UI(id, name, properties)); + return field.AddUserInfo(User(id, name, properties)); } } diff --git a/backend/src/Squidex.Domain.Apps.Core.Model/Schemas/IFieldPropertiesVisitor.cs b/backend/src/Squidex.Domain.Apps.Core.Model/Schemas/IFieldPropertiesVisitor.cs index 86fa16ccf..7b17610f1 100644 --- a/backend/src/Squidex.Domain.Apps.Core.Model/Schemas/IFieldPropertiesVisitor.cs +++ b/backend/src/Squidex.Domain.Apps.Core.Model/Schemas/IFieldPropertiesVisitor.cs @@ -36,4 +36,6 @@ public interface IFieldPropertiesVisitor T Visit(TagsFieldProperties properties, TArgs args); T Visit(UIFieldProperties properties, TArgs args); + + T Visit(UserInfoFieldProperties properties, TArgs args); } diff --git a/backend/src/Squidex.Domain.Apps.Core.Model/Schemas/IFieldVisitor.cs b/backend/src/Squidex.Domain.Apps.Core.Model/Schemas/IFieldVisitor.cs index decf75ff5..02401d54b 100644 --- a/backend/src/Squidex.Domain.Apps.Core.Model/Schemas/IFieldVisitor.cs +++ b/backend/src/Squidex.Domain.Apps.Core.Model/Schemas/IFieldVisitor.cs @@ -36,4 +36,6 @@ public interface IFieldVisitor T Visit(IField field, TArgs args); T Visit(IField field, TArgs args); + + T Visit(IField field, TArgs args); } diff --git a/backend/src/Squidex.Domain.Apps.Core.Model/Schemas/UserInfoFieldProperties.cs b/backend/src/Squidex.Domain.Apps.Core.Model/Schemas/UserInfoFieldProperties.cs new file mode 100644 index 000000000..f97135ebe --- /dev/null +++ b/backend/src/Squidex.Domain.Apps.Core.Model/Schemas/UserInfoFieldProperties.cs @@ -0,0 +1,33 @@ +// ========================================================================== +// Squidex Headless CMS +// ========================================================================== +// Copyright (c) Squidex UG (haftungsbeschraenkt) +// All rights reserved. Licensed under the MIT license. +// ========================================================================== + +namespace Squidex.Domain.Apps.Core.Schemas; + +public record class UserInfoFieldProperties : FieldProperties +{ + public string? DefaultRole { get; init; } + + public override T Accept(IFieldPropertiesVisitor visitor, TArgs args) + { + return visitor.Visit(this, args); + } + + public override T Accept(IFieldVisitor visitor, IField field, TArgs args) + { + return visitor.Visit((IField)field, args); + } + + public override RootField CreateRootField(long id, string name, Partitioning partitioning) + { + return Fields.UserInfo(id, name, partitioning, this); + } + + public override NestedField CreateNestedField(long id, string name) + { + return Fields.User(id, name, this); + } +} diff --git a/backend/src/Squidex.Domain.Apps.Core.Operations/ConvertContent/AddDefaultValues.cs b/backend/src/Squidex.Domain.Apps.Core.Operations/ConvertContent/AddDefaultValues.cs index 6768cdd85..f896ea6c3 100644 --- a/backend/src/Squidex.Domain.Apps.Core.Operations/ConvertContent/AddDefaultValues.cs +++ b/backend/src/Squidex.Domain.Apps.Core.Operations/ConvertContent/AddDefaultValues.cs @@ -88,7 +88,6 @@ public sealed class AddDefaultValues(PartitionResolver partitionResolver, IClock } var defaultValue = DefaultValueFactory.CreateDefaultValue(field, GetNow(), key); - if (defaultValue == default) { return; diff --git a/backend/src/Squidex.Domain.Apps.Core.Operations/ConvertContent/ContentConverter.cs b/backend/src/Squidex.Domain.Apps.Core.Operations/ConvertContent/ContentConverter.cs index c0573ebe3..4d66827e7 100644 --- a/backend/src/Squidex.Domain.Apps.Core.Operations/ConvertContent/ContentConverter.cs +++ b/backend/src/Squidex.Domain.Apps.Core.Operations/ConvertContent/ContentConverter.cs @@ -67,7 +67,6 @@ public sealed class ContentConverter(ResolvedComponents components, Schema schem // Some conversions are faster to do upfront, e.g. to remove hidden fields. var newData = ConvertField(field, fieldData); - if (newData == null) { continue; @@ -98,7 +97,6 @@ public sealed class ContentConverter(ResolvedComponents components, Schema schem foreach (var converter in fieldConverters) { var newData = converter.ConvertFieldBefore(field, data); - if (newData == null) { return null; @@ -115,7 +113,6 @@ public sealed class ContentConverter(ResolvedComponents components, Schema schem foreach (var converter in fieldConverters) { var newData = converter.ConvertFieldAfter(field, data); - if (newData == null) { return null; @@ -157,7 +154,6 @@ public sealed class ContentConverter(ResolvedComponents components, Schema schem var oldValue = array[i]; var (removed, newValue) = ConvertArrayItem(field, oldValue); - if (removed) { array.RemoveAt(i); @@ -184,7 +180,6 @@ public sealed class ContentConverter(ResolvedComponents components, Schema schem var oldValue = array[i]; var (removed, newValue) = ConvertComponent(oldValue, parent); - if (removed) { array.RemoveAt(i); diff --git a/backend/src/Squidex.Domain.Apps.Core.Operations/ConvertContent/DefaultValueChecker.cs b/backend/src/Squidex.Domain.Apps.Core.Operations/ConvertContent/DefaultValueChecker.cs index 2c5a69071..7cb459636 100644 --- a/backend/src/Squidex.Domain.Apps.Core.Operations/ConvertContent/DefaultValueChecker.cs +++ b/backend/src/Squidex.Domain.Apps.Core.Operations/ConvertContent/DefaultValueChecker.cs @@ -94,4 +94,9 @@ internal sealed class DefaultValueChecker : IFieldPropertiesVisitor { return false; } + + public bool Visit(UserInfoFieldProperties properties, None args) + { + return !string.IsNullOrWhiteSpace(properties.DefaultRole); + } } diff --git a/backend/src/Squidex.Domain.Apps.Core.Operations/ConvertContent/DefaultValueFactory.cs b/backend/src/Squidex.Domain.Apps.Core.Operations/ConvertContent/DefaultValueFactory.cs index 93ada0126..c0d8ec28b 100644 --- a/backend/src/Squidex.Domain.Apps.Core.Operations/ConvertContent/DefaultValueFactory.cs +++ b/backend/src/Squidex.Domain.Apps.Core.Operations/ConvertContent/DefaultValueFactory.cs @@ -7,6 +7,7 @@ using System.Globalization; using NodaTime; +using Squidex.Domain.Apps.Core.Contents; using Squidex.Domain.Apps.Core.Schemas; using Squidex.Infrastructure.Json.Objects; @@ -118,6 +119,16 @@ public sealed class DefaultValueFactory : IFieldPropertiesVisitor"; } + public string Visit(UserInfoFieldProperties properties, Args args) + { + return "[User]"; + } + public string Visit(NumberFieldProperties properties, Args args) { return args.Value.ToString(); diff --git a/backend/src/Squidex.Domain.Apps.Core.Operations/ExtractReferenceIds/ReferencesCleaner.cs b/backend/src/Squidex.Domain.Apps.Core.Operations/ExtractReferenceIds/ReferencesCleaner.cs index d56c811f3..2c5809e3b 100644 --- a/backend/src/Squidex.Domain.Apps.Core.Operations/ExtractReferenceIds/ReferencesCleaner.cs +++ b/backend/src/Squidex.Domain.Apps.Core.Operations/ExtractReferenceIds/ReferencesCleaner.cs @@ -100,6 +100,11 @@ internal sealed class ReferencesCleaner : IFieldPropertiesVisitor field, Args args) + { + return FilterSchema.Any; + } + public FilterSchema? Visit(IField field, Args args) { if (args.Level >= MaxDepth) diff --git a/backend/src/Squidex.Domain.Apps.Core.Operations/GenerateJsonSchema/JsonTypeVisitor.cs b/backend/src/Squidex.Domain.Apps.Core.Operations/GenerateJsonSchema/JsonTypeVisitor.cs index b2c4a13ba..aedbb2640 100644 --- a/backend/src/Squidex.Domain.Apps.Core.Operations/GenerateJsonSchema/JsonTypeVisitor.cs +++ b/backend/src/Squidex.Domain.Apps.Core.Operations/GenerateJsonSchema/JsonTypeVisitor.cs @@ -257,6 +257,21 @@ internal sealed class JsonTypeVisitor : IFieldVisitor field, Args args) + { + var scheme = JsonTypeBuilder.Object(); + + scheme.Properties.Add( + "apiKey", + JsonTypeBuilder.StringProperty(FieldDescriptions.UserInfoApiKey, true)); + + scheme.Properties.Add( + "role", + JsonTypeBuilder.StringProperty(FieldDescriptions.UserInfoRole, true)); + + return JsonTypeBuilder.ObjectProperty(scheme); + } + private static void BuildComponent(JsonSchema jsonSchema, ReadonlyList? schemaIds, Args args) { if (args.WithComponents) diff --git a/backend/src/Squidex.Domain.Apps.Core.Operations/Scripting/ContentScriptVars.cs b/backend/src/Squidex.Domain.Apps.Core.Operations/Scripting/ContentScriptVars.cs index c91080ad0..c521182f1 100644 --- a/backend/src/Squidex.Domain.Apps.Core.Operations/Scripting/ContentScriptVars.cs +++ b/backend/src/Squidex.Domain.Apps.Core.Operations/Scripting/ContentScriptVars.cs @@ -111,7 +111,7 @@ public sealed class ContentScriptVars : DataScriptVars } [FieldDescription(nameof(FieldDescriptions.EntityCreated))] - public Instant Created + public Instant Created { set => SetInitial(value); } diff --git a/backend/src/Squidex.Domain.Apps.Core.Operations/Scripting/ScriptVars.cs b/backend/src/Squidex.Domain.Apps.Core.Operations/Scripting/ScriptVars.cs index 02e6a1886..d3ddfde99 100644 --- a/backend/src/Squidex.Domain.Apps.Core.Operations/Scripting/ScriptVars.cs +++ b/backend/src/Squidex.Domain.Apps.Core.Operations/Scripting/ScriptVars.cs @@ -59,7 +59,7 @@ public class ScriptVars : IDictionary } public void CopyTo(KeyValuePair[] array, int arrayIndex) - { + { Guard.NotNull(array); ((IDictionary)values).CopyTo(array, arrayIndex); } diff --git a/backend/src/Squidex.Domain.Apps.Core.Operations/ValidateContent/DefaultFieldValueValidatorsFactory.cs b/backend/src/Squidex.Domain.Apps.Core.Operations/ValidateContent/DefaultFieldValueValidatorsFactory.cs index dd9f7a35c..63664ea43 100644 --- a/backend/src/Squidex.Domain.Apps.Core.Operations/ValidateContent/DefaultFieldValueValidatorsFactory.cs +++ b/backend/src/Squidex.Domain.Apps.Core.Operations/ValidateContent/DefaultFieldValueValidatorsFactory.cs @@ -263,6 +263,16 @@ internal sealed class DefaultFieldValueValidatorsFactory : IFieldVisitor Visit(IField field, Args args) + { + var properties = field.Properties; + + if (IsRequired(properties, args.Context, out _)) + { + yield return new RequiredValidator(); + } + } + private static bool IsRequired(FieldProperties properties, ValidationContext context, out bool result) { var isRequired = properties.IsRequired; @@ -277,7 +287,7 @@ internal sealed class DefaultFieldValueValidatorsFactory : IFieldVisitor { diff --git a/backend/src/Squidex.Domain.Apps.Core.Operations/ValidateContent/JsonValueConverter.cs b/backend/src/Squidex.Domain.Apps.Core.Operations/ValidateContent/JsonValueConverter.cs index 802a0ec65..e7d1d4af5 100644 --- a/backend/src/Squidex.Domain.Apps.Core.Operations/ValidateContent/JsonValueConverter.cs +++ b/backend/src/Squidex.Domain.Apps.Core.Operations/ValidateContent/JsonValueConverter.cs @@ -155,6 +155,23 @@ public sealed class JsonValueConverter : IFieldPropertiesVisitor<(object? Result } } + public (object? Result, JsonError? Error) Visit(UserInfoFieldProperties properties, Args args) + { + var result = UserInfoValue.TryParse(args.Value, out var value); + + switch (result) + { + case UserInfoParseResult.InvalidApiKey: + return (null, new JsonError(T.Get("contents.invalidUserInfoApiKey"))); + case UserInfoParseResult.InvalidRole: + return (null, new JsonError(T.Get("contents.invalidUserInfoRole"))); + case UserInfoParseResult.InvalidValue: + return (null, new JsonError(T.Get("contents.invalidUserInfo"))); + default: + return (value, null); + } + } + private static (object? Result, JsonError? Error) ConvertToIdList(JsonValue value) { if (value.Value is JsonArray a) diff --git a/backend/src/Squidex.Domain.Apps.Core.Operations/ValidateContent/JsonValueValidator.cs b/backend/src/Squidex.Domain.Apps.Core.Operations/ValidateContent/JsonValueValidator.cs index 48839094d..f5f3ed241 100644 --- a/backend/src/Squidex.Domain.Apps.Core.Operations/ValidateContent/JsonValueValidator.cs +++ b/backend/src/Squidex.Domain.Apps.Core.Operations/ValidateContent/JsonValueValidator.cs @@ -75,9 +75,7 @@ public sealed class JsonValueValidator : IFieldPropertiesVisitor field, FieldInfo args) + { + return Scalars.Json; + } } diff --git a/backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/Contents/FieldVisitor.cs b/backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/Contents/FieldVisitor.cs index 5239e3088..f945f890e 100644 --- a/backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/Contents/FieldVisitor.cs +++ b/backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/Contents/FieldVisitor.cs @@ -266,6 +266,11 @@ internal sealed class FieldVisitor(Builder builder) : IFieldVisitor field, FieldInfo args) + { + return new (Scalars.Json, JsonPath, ContentActions.Json.Arguments); + } + private IGraphType? ResolveReferences(FieldInfo fieldInfo, ReadonlyList? schemaIds) { IGraphType? contentType = null; diff --git a/backend/src/Squidex.Domain.Apps.Entities/Contents/Text/ApiKeyQuery.cs b/backend/src/Squidex.Domain.Apps.Entities/Contents/Text/ApiKeyQuery.cs new file mode 100644 index 000000000..5e5ac9759 --- /dev/null +++ b/backend/src/Squidex.Domain.Apps.Entities/Contents/Text/ApiKeyQuery.cs @@ -0,0 +1,14 @@ +// ========================================================================== +// Squidex Headless CMS +// ========================================================================== +// Copyright (c) Squidex UG (haftungsbeschraenkt) +// All rights reserved. Licensed under the MIT license. +// ========================================================================== + +namespace Squidex.Domain.Apps.Entities.Contents.Text; + +#pragma warning disable SA1313 // Parameter names should begin with lower-case letter + +public sealed record ApiKeyQuery(string ApiKey) +{ +} diff --git a/backend/src/Squidex.Domain.Apps.Entities/Contents/Text/Extensions.cs b/backend/src/Squidex.Domain.Apps.Entities/Contents/Text/Extensions.cs index 9541ff618..4c3690f45 100644 --- a/backend/src/Squidex.Domain.Apps.Entities/Contents/Text/Extensions.cs +++ b/backend/src/Squidex.Domain.Apps.Entities/Contents/Text/Extensions.cs @@ -41,6 +41,30 @@ public static class Extensions return result; } + public static List? ToUserInfos(this ContentData data) + { + List? result = null; + + foreach (var (field, value) in data) + { + if (value != null) + { + foreach (var (key, jsonValue) in value) + { + UserInfoValue.TryParse(jsonValue, out var userInfo); + + if (userInfo != null) + { + result ??= []; + result.Add(userInfo); + } + } + } + } + + return result; + } + public static Dictionary? ToTexts(this ContentData data) { Dictionary? result = null; diff --git a/backend/src/Squidex.Domain.Apps.Entities/Contents/Text/ITextIndex.cs b/backend/src/Squidex.Domain.Apps.Entities/Contents/Text/ITextIndex.cs index 70c0cd578..36a686225 100644 --- a/backend/src/Squidex.Domain.Apps.Entities/Contents/Text/ITextIndex.cs +++ b/backend/src/Squidex.Domain.Apps.Entities/Contents/Text/ITextIndex.cs @@ -8,8 +8,13 @@ using Squidex.Domain.Apps.Core.Apps; using Squidex.Infrastructure; +#pragma warning disable MA0048 // File name must match type name +#pragma warning disable SA1313 // Parameter names should begin with lower-case letter + namespace Squidex.Domain.Apps.Entities.Contents.Text; +public record class UserInfoResult(DomainId ContentId, string Role); + public interface ITextIndex { Task?> SearchAsync(App app, TextQuery query, SearchScope scope, @@ -18,6 +23,9 @@ public interface ITextIndex Task?> SearchAsync(App app, GeoQuery query, SearchScope scope, CancellationToken ct = default); + Task FindUserInfo(App app, ApiKeyQuery query, SearchScope scope, + CancellationToken ct = default); + Task ClearAsync( CancellationToken ct = default); diff --git a/backend/src/Squidex.Domain.Apps.Entities/Contents/Text/TextIndexingProcess.cs b/backend/src/Squidex.Domain.Apps.Entities/Contents/Text/TextIndexingProcess.cs index d39d5304a..3a75bdb4f 100644 --- a/backend/src/Squidex.Domain.Apps.Entities/Contents/Text/TextIndexingProcess.cs +++ b/backend/src/Squidex.Domain.Apps.Entities/Contents/Text/TextIndexingProcess.cs @@ -106,6 +106,7 @@ public sealed class TextIndexingProcess( ServeAll = true, ServePublished = false, Texts = data.ToTexts(), + UserInfos = data.ToUserInfos(), }); states[state.UniqueContentId] = state; diff --git a/backend/src/Squidex.Domain.Apps.Entities/Contents/Text/UpsertIndexEntry.cs b/backend/src/Squidex.Domain.Apps.Entities/Contents/Text/UpsertIndexEntry.cs index 495541123..9431dbd79 100644 --- a/backend/src/Squidex.Domain.Apps.Entities/Contents/Text/UpsertIndexEntry.cs +++ b/backend/src/Squidex.Domain.Apps.Entities/Contents/Text/UpsertIndexEntry.cs @@ -6,6 +6,7 @@ // ========================================================================== using NetTopologySuite.Geometries; +using Squidex.Domain.Apps.Core.Contents; namespace Squidex.Domain.Apps.Entities.Contents.Text; @@ -15,6 +16,8 @@ public sealed class UpsertIndexEntry : IndexCommand public Dictionary? Texts { get; set; } + public List? UserInfos { get; set; } + public bool ServeAll { get; set; } public bool ServePublished { get; set; } diff --git a/backend/src/Squidex.Domain.Apps.Entities/Schemas/DomainObject/Guards/FieldPropertiesValidator.cs b/backend/src/Squidex.Domain.Apps.Entities/Schemas/DomainObject/Guards/FieldPropertiesValidator.cs index 597bfdde3..91e0845cc 100644 --- a/backend/src/Squidex.Domain.Apps.Entities/Schemas/DomainObject/Guards/FieldPropertiesValidator.cs +++ b/backend/src/Squidex.Domain.Apps.Entities/Schemas/DomainObject/Guards/FieldPropertiesValidator.cs @@ -316,6 +316,11 @@ public sealed class FieldPropertiesValidator : IFieldPropertiesVisitor Visit(UserInfoFieldProperties properties, None args) + { + yield break; + } + private static bool IsMaxGreaterThanMin(T? min, T? max) where T : struct, IComparable { return max.HasValue && min.HasValue && min.Value.CompareTo(max.Value) < 0; diff --git a/backend/src/Squidex.Domain.Apps.Entities/Schemas/DomainObject/SchemaDomainObject.State.cs b/backend/src/Squidex.Domain.Apps.Entities/Schemas/DomainObject/SchemaDomainObject.State.cs index f67e3a165..eace08b0d 100644 --- a/backend/src/Squidex.Domain.Apps.Entities/Schemas/DomainObject/SchemaDomainObject.State.cs +++ b/backend/src/Squidex.Domain.Apps.Entities/Schemas/DomainObject/SchemaDomainObject.State.cs @@ -37,7 +37,7 @@ public partial class SchemaDomainObject { var field = e.Properties.CreateNestedField(e.FieldId.Id, e.Name); - newSnapshot = newSnapshot.UpdateField(e.ParentFieldId.Id, x => ((ArrayField)x).AddField(field)); + newSnapshot = newSnapshot.UpdateField(e.ParentFieldId.Id, x => ((ArrayField)x).AddUserInfo(field)); } else { diff --git a/backend/src/Squidex.Shared/Texts.de.resx b/backend/src/Squidex.Shared/Texts.de.resx index 7b6ca4e64..781073a04 100644 --- a/backend/src/Squidex.Shared/Texts.de.resx +++ b/backend/src/Squidex.Shared/Texts.de.resx @@ -502,6 +502,15 @@ Ungültiger JSON-Typ, Zeichenfolge erwartet. + + Invalid json type, expected apiKey+role object. + + + ApiKey must be defined. + + + Role must be defined. + {count} Referenz(en) diff --git a/backend/src/Squidex.Shared/Texts.fr.resx b/backend/src/Squidex.Shared/Texts.fr.resx index 2ab7f9b1f..60a13a758 100644 --- a/backend/src/Squidex.Shared/Texts.fr.resx +++ b/backend/src/Squidex.Shared/Texts.fr.resx @@ -502,6 +502,15 @@ Type json non valide, chaîne attendue. + + Invalid json type, expected apiKey+role object. + + + ApiKey must be defined. + + + Role must be defined. + {count} Les références) diff --git a/backend/src/Squidex.Shared/Texts.it.resx b/backend/src/Squidex.Shared/Texts.it.resx index b006c3a2d..974684eef 100644 --- a/backend/src/Squidex.Shared/Texts.it.resx +++ b/backend/src/Squidex.Shared/Texts.it.resx @@ -502,6 +502,15 @@ Errore nel json, atteso una string. + + Invalid json type, expected apiKey+role object. + + + ApiKey must be defined. + + + Role must be defined. + {count} Collegamenti(s) diff --git a/backend/src/Squidex.Shared/Texts.nl.resx b/backend/src/Squidex.Shared/Texts.nl.resx index 842aa8491..d1b5a36e2 100644 --- a/backend/src/Squidex.Shared/Texts.nl.resx +++ b/backend/src/Squidex.Shared/Texts.nl.resx @@ -502,6 +502,15 @@ Ongeldig json-type, verwachte string. + + Invalid json type, expected apiKey+role object. + + + ApiKey must be defined. + + + Role must be defined. + {count} referentie (s) diff --git a/backend/src/Squidex.Shared/Texts.pt.resx b/backend/src/Squidex.Shared/Texts.pt.resx index 0e9ea9abd..598e5f9d6 100644 --- a/backend/src/Squidex.Shared/Texts.pt.resx +++ b/backend/src/Squidex.Shared/Texts.pt.resx @@ -502,6 +502,15 @@ Json type inválido, esperado texto. + + Invalid json type, expected apiKey+role object. + + + ApiKey must be defined. + + + Role must be defined. + {count} Referencia(s) diff --git a/backend/src/Squidex.Shared/Texts.resx b/backend/src/Squidex.Shared/Texts.resx index 7f74a020a..6ae445772 100644 --- a/backend/src/Squidex.Shared/Texts.resx +++ b/backend/src/Squidex.Shared/Texts.resx @@ -502,6 +502,15 @@ Invalid json type, expected string. + + Invalid json type, expected apiKey+role object. + + + ApiKey must be defined. + + + Role must be defined. + {count} Reference(s) diff --git a/backend/src/Squidex.Shared/Texts.zh.resx b/backend/src/Squidex.Shared/Texts.zh.resx index fcc7582ee..941243908 100644 --- a/backend/src/Squidex.Shared/Texts.zh.resx +++ b/backend/src/Squidex.Shared/Texts.zh.resx @@ -502,6 +502,15 @@ 无效的 json 类型,需要的字符串。 + + Invalid json type, expected apiKey+role object. + + + ApiKey must be defined. + + + Role must be defined. + {count} 个引用 diff --git a/backend/src/Squidex.Web/Constants.cs b/backend/src/Squidex.Web/Constants.cs index 8a738b540..065801a4a 100644 --- a/backend/src/Squidex.Web/Constants.cs +++ b/backend/src/Squidex.Web/Constants.cs @@ -32,6 +32,10 @@ public static class Constants public const string ScopeApi = "squidex-api"; + public const string ClaimTypeApp = "app/name"; + + public const string ClaimTypeRole = "app/role"; + public static readonly string ClientFrontendId = DefaultClients.Frontend; public static readonly string ClientInternalId = "squidex-internal"; diff --git a/backend/src/Squidex.Web/Extensions.cs b/backend/src/Squidex.Web/Extensions.cs index 19293aecb..944ee82a5 100644 --- a/backend/src/Squidex.Web/Extensions.cs +++ b/backend/src/Squidex.Web/Extensions.cs @@ -12,6 +12,14 @@ namespace Squidex.Web; public static class Extensions { + public static (string? UserId, string? App, string? Role) GetUserInfo(this ClaimsPrincipal principal) + { + return ( + principal.FindFirst(ClaimTypes.NameIdentifier)?.Value, + principal.FindFirst(Constants.ClaimTypeApp)?.Value, + principal.FindFirst(Constants.ClaimTypeRole)?.Value); + } + public static string? GetClientId(this ClaimsPrincipal principal) { var clientId = principal.FindFirst(OpenIdClaims.ClientId)?.Value; diff --git a/backend/src/Squidex.Web/Pipeline/ApiKeyAuthenticationBuilderExtensions.cs b/backend/src/Squidex.Web/Pipeline/ApiKeyAuthenticationBuilderExtensions.cs new file mode 100644 index 000000000..00a52d6a3 --- /dev/null +++ b/backend/src/Squidex.Web/Pipeline/ApiKeyAuthenticationBuilderExtensions.cs @@ -0,0 +1,20 @@ +// ========================================================================== +// Squidex Headless CMS +// ========================================================================== +// Copyright (c) Squidex UG (haftungsbeschraenkt) +// All rights reserved. Licensed under the MIT license. +// ========================================================================== + +using Squidex.Web.Pipeline; + +#pragma warning disable IDE0130 // Namespace does not match folder structure + +namespace Microsoft.AspNetCore.Authentication; + +public static class ApiKeyAuthenticationBuilderExtensions +{ + public static AuthenticationBuilder AddApiKey(this AuthenticationBuilder builder) + { + return builder.AddScheme(ApiKeyDefaults.AuthenticationScheme, _ => { }); + } +} diff --git a/backend/src/Squidex.Web/Pipeline/ApiKeyDefaults.cs b/backend/src/Squidex.Web/Pipeline/ApiKeyDefaults.cs new file mode 100644 index 000000000..7521365db --- /dev/null +++ b/backend/src/Squidex.Web/Pipeline/ApiKeyDefaults.cs @@ -0,0 +1,13 @@ +// ========================================================================== +// Squidex Headless CMS +// ========================================================================== +// Copyright (c) Squidex UG (haftungsbeschraenkt) +// All rights reserved. Licensed under the MIT license. +// ========================================================================== + +namespace Squidex.Web.Pipeline; + +public static class ApiKeyDefaults +{ + public const string AuthenticationScheme = "ApiKey"; +} diff --git a/backend/src/Squidex.Web/Pipeline/ApiKeyHandler.cs b/backend/src/Squidex.Web/Pipeline/ApiKeyHandler.cs new file mode 100644 index 000000000..dfc6ffc80 --- /dev/null +++ b/backend/src/Squidex.Web/Pipeline/ApiKeyHandler.cs @@ -0,0 +1,131 @@ +// ========================================================================== +// Squidex Headless CMS +// ========================================================================== +// Copyright (c) Squidex UG (haftungsbeschraenkt) +// All rights reserved. Licensed under the MIT license. +// ========================================================================== + +using System.Diagnostics.CodeAnalysis; +using System.Security.Claims; +using System.Text.Encodings.Web; +using Microsoft.AspNetCore.Authentication; +using Microsoft.AspNetCore.Http; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; +using Microsoft.Net.Http.Headers; +using Squidex.Domain.Apps.Entities; +using Squidex.Domain.Apps.Entities.Contents; +using Squidex.Domain.Apps.Entities.Contents.Text; + +namespace Squidex.Web.Pipeline; + +public sealed class ApiKeyHandler( + IAppProvider appProvider, + ITextIndex textIndex, + IOptionsMonitor options, + ILoggerFactory logger, + UrlEncoder encoder) + : AuthenticationHandler(options, logger, encoder) +{ + private const string ApiKeyPrefix = "ApiKey "; + private const string ApiKeyHeader = "ApiKey"; + private const string ApiKeyHeaderX = "X-ApiKey"; + private const string ApiKeyQuery = "api_key"; + + protected override async Task HandleAuthenticateAsync() + { + try + { + if (!IsApiKey(Request, out var apiKey)) + { + return AuthenticateResult.NoResult(); + } + + var keyParts = apiKey.Split(':', StringSplitOptions.RemoveEmptyEntries); + if (keyParts.Length != 2) + { + return AuthenticateResult.Fail("Invalid API Key"); + } + + var app = await appProvider.GetAppAsync(keyParts[0], true, Context.RequestAborted); + if (app == null) + { + return AuthenticateResult.Fail("Invalid API Key"); + } + + var user = + await textIndex.FindUserInfo( + app, + new ApiKeyQuery(keyParts[1]), + SearchScope.Published, + Context.RequestAborted); + if (user == null) + { + return AuthenticateResult.Fail("Invalid API Key"); + } + + var identity = new ClaimsIdentity( + [ + new Claim(ClaimTypes.NameIdentifier, user.ContentId.ToString()), + new Claim(Constants.ClaimTypeApp, app.Name), + new Claim(Constants.ClaimTypeRole, user.Role), + ], ApiKeyDefaults.AuthenticationScheme); + + return Success(identity); + } + catch (Exception ex) + { + Logger.LogError(ex, "Error while handling api key."); + + throw; + } + } + + private AuthenticateResult Success(ClaimsIdentity identity) + { + var principal = new ClaimsPrincipal(identity); + + var ticket = new AuthenticationTicket(principal, Scheme.Name); + + return AuthenticateResult.Success(ticket); + } + + public static bool IsApiKey(HttpRequest request, [MaybeNullWhen(false)] out string apiKey) + { + apiKey = null!; + string? authorizationHeader = request.Headers[HeaderNames.Authorization]; + + if (authorizationHeader?.StartsWith(ApiKeyPrefix, StringComparison.OrdinalIgnoreCase) == true) + { + var key = authorizationHeader[ApiKeyPrefix.Length..].Trim(); + if (!string.IsNullOrWhiteSpace(key)) + { + apiKey = key; + return true; + } + } + + string? apiKeyHeader = request.Headers[ApiKeyHeader]; + if (!string.IsNullOrWhiteSpace(apiKeyHeader)) + { + apiKey = apiKeyHeader; + return true; + } + + string? apiKeyHeaderX = request.Headers[ApiKeyHeaderX]; + if (!string.IsNullOrWhiteSpace(apiKeyHeaderX)) + { + apiKey = apiKeyHeaderX; + return true; + } + + string? apiKeyQuery = request.Query[ApiKeyQuery]; + if (!string.IsNullOrWhiteSpace(apiKeyQuery)) + { + apiKey = apiKeyQuery; + return true; + } + + return false; + } +} diff --git a/backend/src/Squidex.Web/Pipeline/ApiKeyOptions.cs b/backend/src/Squidex.Web/Pipeline/ApiKeyOptions.cs new file mode 100644 index 000000000..ebc1af134 --- /dev/null +++ b/backend/src/Squidex.Web/Pipeline/ApiKeyOptions.cs @@ -0,0 +1,14 @@ +// ========================================================================== +// Squidex Headless CMS +// ========================================================================== +// Copyright (c) Squidex UG (haftungsbeschraenkt) +// All rights reserved. Licensed under the MIT license. +// ========================================================================== + +using Microsoft.AspNetCore.Authentication; + +namespace Squidex.Web.Pipeline; + +public sealed class ApiKeyOptions : AuthenticationSchemeOptions +{ +} diff --git a/backend/src/Squidex.Web/Pipeline/AppResolver.cs b/backend/src/Squidex.Web/Pipeline/AppResolver.cs index 4e7f0b836..0c4f43281 100644 --- a/backend/src/Squidex.Web/Pipeline/AppResolver.cs +++ b/backend/src/Squidex.Web/Pipeline/AppResolver.cs @@ -28,7 +28,6 @@ public sealed class AppResolver(IAppProvider appProvider) : IAsyncActionFilter if (context.RouteData.Values.TryGetValue("app", out var appValue)) { var appName = appValue?.ToString(); - if (string.IsNullOrWhiteSpace(appName)) { context.Result = new NotFoundResult(); @@ -51,12 +50,16 @@ public sealed class AppResolver(IAppProvider appProvider) : IAsyncActionFilter string? clientId = null; var (role, permissions) = FindByOpenIdSubject(app, user, isFrontend); - if (permissions == null) { (clientId, role, permissions) = FindByOpenIdClient(app, user, isFrontend); } + if (permissions == null) + { + (role, permissions) = FindByUserInfo(app, user, isFrontend); + } + if (permissions == null) { (clientId, role, permissions) = FindAnonymousClient(app, isFrontend); @@ -125,7 +128,6 @@ public sealed class AppResolver(IAppProvider appProvider) : IAsyncActionFilter private static (string?, string?, PermissionSet?) FindByOpenIdClient(App app, ClaimsPrincipal user, bool isFrontend) { var (appName, clientId) = user.GetClient(); - if (app.Name != appName || clientId == null) { return default; @@ -139,10 +141,25 @@ public sealed class AppResolver(IAppProvider appProvider) : IAsyncActionFilter return default; } + private static (string?, PermissionSet?) FindByUserInfo(App app, ClaimsPrincipal user, bool isFrontend) + { + var (_, appName, roleName) = user.GetUserInfo(); + if (app.Name != appName || roleName == null) + { + return default; + } + + if (app.TryGetRole(roleName, isFrontend, out var role)) + { + return (role.Name, role.Permissions); + } + + return default; + } + private static (string?, string?, PermissionSet?) FindAnonymousClient(App app, bool isFrontend) { var client = app.Clients.FirstOrDefault(x => x.Value.AllowAnonymous); - if (client.Value == null) { return default; @@ -159,7 +176,6 @@ public sealed class AppResolver(IAppProvider appProvider) : IAsyncActionFilter private static (string?, PermissionSet?) FindByOpenIdSubject(App app, ClaimsPrincipal user, bool isFrontend) { var subjectId = user.OpenIdSubject(); - if (subjectId == null) { return default; diff --git a/backend/src/Squidex/Areas/Api/Controllers/Schemas/Models/Converters/FieldPropertiesDtoFactory.cs b/backend/src/Squidex/Areas/Api/Controllers/Schemas/Models/Converters/FieldPropertiesDtoFactory.cs index 2a78ed9d7..479299949 100644 --- a/backend/src/Squidex/Areas/Api/Controllers/Schemas/Models/Converters/FieldPropertiesDtoFactory.cs +++ b/backend/src/Squidex/Areas/Api/Controllers/Schemas/Models/Converters/FieldPropertiesDtoFactory.cs @@ -93,4 +93,9 @@ internal sealed class FieldPropertiesDtoFactory : IFieldPropertiesVisitor + /// The role to create a default value. + /// + public string? DefaultRole { get; init; } + + public static UserInfoFieldPropertiesDto FromDomain(UserInfoFieldProperties fieldProperties) + { + return SimpleMapper.Map(fieldProperties, new UserInfoFieldPropertiesDto()); + } + + public override FieldProperties ToProperties() + { + return SimpleMapper.Map(this, new UserInfoFieldProperties()); + } +} diff --git a/backend/src/Squidex/Config/Authentication/AuthenticationServices.cs b/backend/src/Squidex/Config/Authentication/AuthenticationServices.cs index 6f0250b9e..165f20cbe 100644 --- a/backend/src/Squidex/Config/Authentication/AuthenticationServices.cs +++ b/backend/src/Squidex/Config/Authentication/AuthenticationServices.cs @@ -6,7 +6,9 @@ // ========================================================================== using Microsoft.AspNetCore.Authentication; +using OpenIddict.Validation.AspNetCore; using Squidex.Hosting.Web; +using Squidex.Web.Pipeline; namespace Squidex.Config.Authentication; @@ -18,6 +20,7 @@ public static class AuthenticationServices services.AddAuthentication() .AddSquidexCookies(config) + .AddApiKey() .AddSquidexExternalGithubAuthentication(identityOptions) .AddSquidexExternalGoogleAuthentication(identityOptions) .AddSquidexExternalMicrosoftAuthentication(identityOptions) diff --git a/backend/src/Squidex/Config/Authentication/IdentityServerServices.cs b/backend/src/Squidex/Config/Authentication/IdentityServerServices.cs index adee79922..849d37b78 100644 --- a/backend/src/Squidex/Config/Authentication/IdentityServerServices.cs +++ b/backend/src/Squidex/Config/Authentication/IdentityServerServices.cs @@ -11,6 +11,7 @@ using Microsoft.AspNetCore.Authentication.OpenIdConnect; using OpenIddict.Validation.AspNetCore; using Squidex.Hosting; using Squidex.Web; +using Squidex.Web.Pipeline; using static OpenIddict.Abstractions.OpenIddictConstants; namespace Squidex.Config.Authentication; @@ -19,8 +20,9 @@ public static class IdentityServerServices { public static AuthenticationBuilder AddSquidexIdentityServerAuthentication(this AuthenticationBuilder authBuilder, MyIdentityOptions identityOptions, IConfiguration config) { - var useCustomAuthorityUrl = !string.IsNullOrWhiteSpace(identityOptions.AuthorityUrl); + var defaultScheme = OpenIddictValidationAspNetCoreDefaults.AuthenticationScheme; + var useCustomAuthorityUrl = !string.IsNullOrWhiteSpace(identityOptions.AuthorityUrl); if (useCustomAuthorityUrl) { const string ExternalIdentityServerSchema = nameof(ExternalIdentityServerSchema); @@ -34,21 +36,23 @@ public static class IdentityServerServices options.Scope.Add(Constants.ScopeApi); }); - authBuilder.AddPolicyScheme(Constants.ApiSecurityScheme, Constants.ApiSecurityScheme, options => - { - options.ForwardDefaultSelector = context => ExternalIdentityServerSchema; - }); + defaultScheme = ExternalIdentityServerSchema; } - else - { - authBuilder.AddPolicyScheme(Constants.ApiSecurityScheme, Constants.ApiSecurityScheme, options => + + authBuilder.AddPolicyScheme(Constants.ApiSecurityScheme, null, options => { - options.ForwardDefaultSelector = _ => OpenIddictValidationAspNetCoreDefaults.AuthenticationScheme; + options.ForwardDefaultSelector = context => + { + if (ApiKeyHandler.IsApiKey(context.Request, out _)) + { + return ApiKeyDefaults.AuthenticationScheme; + } + + return defaultScheme; + }; }); - } authBuilder.AddOpenIdConnect(); - authBuilder.Services.AddOptions(OpenIdConnectDefaults.AuthenticationScheme) .Configure((options, urlGenerator) => { diff --git a/backend/tests/Squidex.Data.Tests/EntityFramework/Domain/Contents/Text/EFTextIndexTests.cs b/backend/tests/Squidex.Data.Tests/EntityFramework/Domain/Contents/Text/EFTextIndexTests.cs index f6889fcf0..d50f31157 100644 --- a/backend/tests/Squidex.Data.Tests/EntityFramework/Domain/Contents/Text/EFTextIndexTests.cs +++ b/backend/tests/Squidex.Data.Tests/EntityFramework/Domain/Contents/Text/EFTextIndexTests.cs @@ -17,6 +17,8 @@ public abstract class EFTextIndexTests(ISqlFixture fixture) { public override bool SupportsQuerySyntax => false; + public override bool SupportsGeo => true; + public override async Task CreateSutAsync() { var sut = new EFTextIndex(fixture.DbContextFactory); diff --git a/backend/tests/Squidex.Domain.Apps.Core.Tests/Model/Schemas/ArrayFieldTests.cs b/backend/tests/Squidex.Domain.Apps.Core.Tests/Model/Schemas/ArrayFieldTests.cs index a1f471ae0..89d66214e 100644 --- a/backend/tests/Squidex.Domain.Apps.Core.Tests/Model/Schemas/ArrayFieldTests.cs +++ b/backend/tests/Squidex.Domain.Apps.Core.Tests/Model/Schemas/ArrayFieldTests.cs @@ -20,7 +20,7 @@ public class ArrayfieldTests { var field = CreateField(1); - var parent_1 = parent_0.AddField(field); + var parent_1 = parent_0.AddUserInfo(field); Assert.Empty(parent_0.Fields); Assert.Equal(field, parent_1.FieldsById[1]); @@ -29,7 +29,7 @@ public class ArrayfieldTests [Fact] public void Should_throw_exception_if_adding_field_with_name_that_already_exists() { - var parent_1 = parent_0.AddField(CreateField(1)); + var parent_1 = parent_0.AddUserInfo(CreateField(1)); Assert.Throws(() => parent_1.AddNumber(2, "myField1")); } @@ -37,7 +37,7 @@ public class ArrayfieldTests [Fact] public void Should_throw_exception_if_adding_field_with_id_that_already_exists() { - var parent_1 = parent_0.AddField(CreateField(1)); + var parent_1 = parent_0.AddUserInfo(CreateField(1)); Assert.Throws(() => parent_1.AddNumber(1, "myField2")); } @@ -45,7 +45,7 @@ public class ArrayfieldTests [Fact] public void Should_hide_field() { - var parent_1 = parent_0.AddField(CreateField(1)); + var parent_1 = parent_0.AddUserInfo(CreateField(1)); var parent_2 = parent_1.UpdateField(1, f => f.Hide()); var parent_3 = parent_2.UpdateField(1, f => f.Hide()); @@ -67,7 +67,7 @@ public class ArrayfieldTests [Fact] public void Should_show_field() { - var parent_1 = parent_0.AddField(CreateField(1)); + var parent_1 = parent_0.AddUserInfo(CreateField(1)); var parent_2 = parent_1.UpdateField(1, f => f.Hide()); var parent_3 = parent_2.UpdateField(1, f => f.Show()); @@ -90,7 +90,7 @@ public class ArrayfieldTests [Fact] public void Should_disable_field() { - var parent_1 = parent_0.AddField(CreateField(1)); + var parent_1 = parent_0.AddUserInfo(CreateField(1)); var parent_2 = parent_1.UpdateField(1, f => f.Disable()); var parent_3 = parent_2.UpdateField(1, f => f.Disable()); @@ -112,7 +112,7 @@ public class ArrayfieldTests [Fact] public void Should_enable_field() { - var parent_1 = parent_0.AddField(CreateField(1)); + var parent_1 = parent_0.AddUserInfo(CreateField(1)); var parent_2 = parent_1.UpdateField(1, f => f.Disable()); var parent_3 = parent_2.UpdateField(1, f => f.Enable()); @@ -144,7 +144,7 @@ public class ArrayfieldTests MinValue = 10, }; - var parent_1 = parent_0.AddField(CreateField(1)); + var parent_1 = parent_0.AddUserInfo(CreateField(1)); var parent_2 = parent_1.UpdateField(1, f => f.Update(properties1)); var parent_3 = parent_2.UpdateField(1, f => f.Update(properties2)); @@ -157,7 +157,7 @@ public class ArrayfieldTests [Fact] public void Should_throw_exception_if_updating_with_invalid_properties_type() { - var parent_1 = parent_0.AddField(CreateField(1)); + var parent_1 = parent_0.AddUserInfo(CreateField(1)); Assert.Throws(() => parent_1.UpdateField(1, f => f.Update(new StringFieldProperties()))); } @@ -173,7 +173,7 @@ public class ArrayfieldTests [Fact] public void Should_delete_field() { - var parent_1 = parent_0.AddField(CreateField(1)); + var parent_1 = parent_0.AddUserInfo(CreateField(1)); var parent_2 = parent_1.DeleteField(1); var parent_3 = parent_2.DeleteField(1); @@ -197,9 +197,9 @@ public class ArrayfieldTests var field2 = CreateField(2); var field3 = CreateField(3); - var parent_1 = parent_0.AddField(field1); - var parent_2 = parent_1.AddField(field2); - var parent_3 = parent_2.AddField(field3); + var parent_1 = parent_0.AddUserInfo(field1); + var parent_2 = parent_1.AddUserInfo(field2); + var parent_3 = parent_2.AddUserInfo(field3); var parent_4 = parent_3.ReorderFields([3, 2, 1]); var parent_5 = parent_4.ReorderFields([3, 2, 1]); @@ -214,8 +214,8 @@ public class ArrayfieldTests var field1 = CreateField(1); var field2 = CreateField(2); - var parent_1 = parent_0.AddField(field1); - var parent_2 = parent_1.AddField(field2); + var parent_1 = parent_0.AddUserInfo(field1); + var parent_2 = parent_1.AddUserInfo(field2); Assert.Throws(() => parent_2.ReorderFields([1])); } @@ -226,8 +226,8 @@ public class ArrayfieldTests var field1 = CreateField(1); var field2 = CreateField(2); - var parent_1 = parent_0.AddField(field1); - var parent_2 = parent_1.AddField(field2); + var parent_1 = parent_0.AddUserInfo(field1); + var parent_2 = parent_1.AddUserInfo(field2); Assert.Throws(() => parent_2.ReorderFields([1, 4])); } diff --git a/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/ConvertContent/DefaultValueFactoryTests.cs b/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/ConvertContent/DefaultValueFactoryTests.cs index 1f948bfae..20f9add33 100644 --- a/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/ConvertContent/DefaultValueFactoryTests.cs +++ b/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/ConvertContent/DefaultValueFactoryTests.cs @@ -316,6 +316,26 @@ public class DefaultValueFactoryTests Assert.Equal(new JsonArray(), DefaultValueFactory.CreateDefaultValue(field, now, language.Iso2Code)); } + [Fact] + public void Should_get_default_value_from_userinfo_field_if_role_is_not_set() + { + var field = + Fields.UserInfo(1, "1", Partitioning.Invariant, + new UserInfoFieldProperties()); + + Assert.Equal(JsonValue.Null, DefaultValueFactory.CreateDefaultValue(field, now, language.Iso2Code)); + } + + [Fact] + public void Should_get_default_value_from_userinfo_field_if_role_is_set() + { + var field = + Fields.UserInfo(1, "1", Partitioning.Invariant, + new UserInfoFieldProperties { DefaultRole = "myRole" }); + + Assert.IsType(DefaultValueFactory.CreateDefaultValue(field, now, language.Iso2Code).Value); + } + private Instant FutureDays(int days) { return now.WithoutMs().Plus(Duration.FromDays(days)); diff --git a/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/ValidateContent/GeolocationFieldTests.cs b/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/ValidateContent/GeolocationFieldTests.cs index a3dfb6d32..dc9051cef 100644 --- a/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/ValidateContent/GeolocationFieldTests.cs +++ b/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/ValidateContent/GeolocationFieldTests.cs @@ -61,6 +61,17 @@ public class GeolocationFieldTests : IClassFixture Assert.Empty(errors); } + [Fact] + public async Task Should_add_error_if_geolocation_is_not_an_object() + { + var sut = Field(new GeolocationFieldProperties { IsRequired = true }); + + await sut.ValidateAsync(JsonValue.True, errors); + + errors.Should().BeEquivalentTo( + ["Invalid json type, expected latitude/longitude object."]); + } + [Fact] public async Task Should_add_error_if_geolocation_has_invalid_latitude() { diff --git a/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/ValidateContent/UserInfoFieldPropertiesTests.cs b/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/ValidateContent/UserInfoFieldPropertiesTests.cs new file mode 100644 index 000000000..7bf8d34b3 --- /dev/null +++ b/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/ValidateContent/UserInfoFieldPropertiesTests.cs @@ -0,0 +1,99 @@ +// ========================================================================== +// Squidex Headless CMS +// ========================================================================== +// Copyright (c) Squidex UG (haftungsbeschraenkt) +// All rights reserved. Licensed under the MIT license. +// ========================================================================== + +using Squidex.Domain.Apps.Core.Schemas; +using Squidex.Domain.Apps.Core.TestHelpers; +using Squidex.Infrastructure.Json.Objects; + +namespace Squidex.Domain.Apps.Core.Operations.ValidateContent; + +public class UserInfoFieldPropertiesTests : IClassFixture +{ + private readonly List errors = []; + + [Fact] + public void Should_instantiate_field() + { + var sut = Field(new UserInfoFieldProperties()); + + Assert.Equal("myUserInfo", sut.Name); + } + + [Fact] + public async Task Should_not_add_error_if_userinfo_is_valid_null() + { + var sut = Field(new UserInfoFieldProperties()); + + await sut.ValidateAsync(JsonValue.Null, errors); + + Assert.Empty(errors); + } + + [Fact] + public async Task Should_not_add_error_if_userinfo_is_valid() + { + var sut = Field(new UserInfoFieldProperties()); + + await sut.ValidateAsync(CreateValue("Key", "Role"), errors); + + Assert.Empty(errors); + } + + [Fact] + public async Task Should_add_error_if_userinfo_is_not_an_object() + { + var sut = Field(new UserInfoFieldProperties { IsRequired = true }); + + await sut.ValidateAsync(JsonValue.True, errors); + + errors.Should().BeEquivalentTo( + ["Invalid json type, expected apiKey+role object."]); + } + + [Fact] + public async Task Should_add_error_if_userinfo_has_invalid_role() + { + var sut = Field(new UserInfoFieldProperties { IsRequired = true }); + + await sut.ValidateAsync(CreateValue("Key", null), errors); + + errors.Should().BeEquivalentTo( + ["Role must be defined."]); + } + + [Fact] + public async Task Should_add_error_if_userinfo_has_invalid_apiKey() + { + var sut = Field(new UserInfoFieldProperties { IsRequired = true }); + + await sut.ValidateAsync(CreateValue(null, "Role"), errors); + + errors.Should().BeEquivalentTo( + ["ApiKey must be defined."]); + } + + [Fact] + public async Task Should_add_error_if_userinfo_is_required() + { + var sut = Field(new UserInfoFieldProperties { IsRequired = true }); + + await sut.ValidateAsync(JsonValue.Null, errors); + + errors.Should().BeEquivalentTo( + ["Field is required."]); + } + + private static JsonValue CreateValue(string? apiKey, string? role) + { + return JsonValue.Object().Add("apiKey", apiKey).Add("role", role); + } + + private static RootField Field(UserInfoFieldProperties properties) + { + return Fields.UserInfo(1, "myUserInfo", Partitioning.Invariant, properties); + } +} diff --git a/backend/tests/Squidex.Domain.Apps.Entities.Tests/Contents/GraphQL/TestContent.cs b/backend/tests/Squidex.Domain.Apps.Entities.Tests/Contents/GraphQL/TestContent.cs index 7193e0cd2..ce14e684d 100644 --- a/backend/tests/Squidex.Domain.Apps.Entities.Tests/Contents/GraphQL/TestContent.cs +++ b/backend/tests/Squidex.Domain.Apps.Entities.Tests/Contents/GraphQL/TestContent.cs @@ -136,6 +136,9 @@ public static class TestContent text } } + myUserInfo { + iv + } }"; public const string AllFlatFields = @" @@ -225,6 +228,7 @@ public static class TestContent markdown text } + myUserInfo }"; public static EnrichedContent Create(DomainId id, ContentData? data = null) @@ -340,7 +344,12 @@ public static class TestContent .Add("content", JsonValue.Array( JsonValue.Object() .Add("type", "text") - .Add("text", "Rich Text"))))); + .Add("text", "Rich Text"))))) + .AddField("my-user-info", + new ContentFieldData() + .AddInvariant(JsonValue.Object() + .Add("apiKey", "MyKey") + .Add("role", "MyRole"))); var content = new EnrichedContent { @@ -621,6 +630,10 @@ public static class TestContent }, }, }, + ["myUserInfo"] = new + { + iv = new { apiKey = "MyKey", role = "MyRole" }, + }, }; return actual; @@ -814,6 +827,10 @@ public static class TestContent text = "Rich Text", }, }, + ["myUserInfo"] = new + { + iv = new { apiKey = "MyKey", role = "MyRole" }, + }, }; return actual; @@ -956,6 +973,7 @@ public static class TestContent markdown = "# Rich Text", text = "Rich Text", }, + ["myUserInfo"] = new { apiKey = "MyKey", role = "MyRole" }, }; return actual; diff --git a/backend/tests/Squidex.Domain.Apps.Entities.Tests/Contents/GraphQL/TestSchemas.cs b/backend/tests/Squidex.Domain.Apps.Entities.Tests/Contents/GraphQL/TestSchemas.cs index 0bf89e295..903d1350c 100644 --- a/backend/tests/Squidex.Domain.Apps.Entities.Tests/Contents/GraphQL/TestSchemas.cs +++ b/backend/tests/Squidex.Domain.Apps.Entities.Tests/Contents/GraphQL/TestSchemas.cs @@ -136,6 +136,8 @@ public static class TestSchemas new StringFieldProperties { IsEmbeddable = true, SchemaIds = ReadonlyList.Create(Reference1.Id, Reference2.Id) }) .AddRichText(18, "my-richtext", Partitioning.Invariant, new RichTextFieldProperties { SchemaIds = ReadonlyList.Create(Reference1.Id, Reference2.Id) }) + .AddUserInfo(19, "my-user-info", Partitioning.Invariant, + new UserInfoFieldProperties()) .AddArray(100, "my-array", Partitioning.Invariant, f => f .AddBoolean(121, "nested-boolean", new BooleanFieldProperties()) diff --git a/backend/tests/Squidex.Domain.Apps.Entities.Tests/Contents/Text/TextIndexerTests.cs b/backend/tests/Squidex.Domain.Apps.Entities.Tests/Contents/Text/TextIndexerTests.cs index c534cc718..5f3fae479 100644 --- a/backend/tests/Squidex.Domain.Apps.Entities.Tests/Contents/Text/TextIndexerTests.cs +++ b/backend/tests/Squidex.Domain.Apps.Entities.Tests/Contents/Text/TextIndexerTests.cs @@ -114,6 +114,24 @@ public abstract class TextIndexerTests : GivenContext await SearchGeo(expected: null, "other.iv", 51.48596429889613, 12.102629469505713); } + [Fact] + public async Task Should_search_by_userinfo() + { + var field = Guid.NewGuid().ToString(); + + // With same ApiKey + await CreateUserInfoAsync(Ids1[0], field, "Key1", "Role1"); + + // Other ApiKey + await CreateUserInfoAsync(Ids2[0], field, "Key2", "Role2"); + + // With same ApiKey + await SearchApiKey(Ids1[0], "Key1"); + + // Wrong ApiKey + await SearchApiKey(null, "Key3"); + } + [Fact] public async Task Should_search_by_app() { @@ -356,6 +374,13 @@ public abstract class TextIndexerTests : GivenContext return UpdateAsync(id, new ContentCreated { Data = data }); } + protected Task CreateUserInfoAsync(DomainId id, string field, string apiKey, string role) + { + var data = UserInfoData(field, apiKey, role); + + return UpdateAsync(id, new ContentCreated { Data = data }); + } + protected Task UpdateTextAsync(DomainId id, string language, string text) { var data = TextData(language, text); @@ -422,6 +447,14 @@ public abstract class TextIndexerTests : GivenContext .AddInvariant(JsonValue.Object().Add("latitude", latitude).Add("longitude", longitude))); } + private static ContentData UserInfoData(string field, string apiKey, string role) + { + return new ContentData() + .AddField(field, + new ContentFieldData() + .AddInvariant(JsonValue.Object().Add("apiKey", apiKey).Add("role", role))); + } + private static ContentData GeoJsonData(string field, double latitude, double longitude) { return new ContentData() @@ -435,18 +468,34 @@ public abstract class TextIndexerTests : GivenContext .Add(latitude)))); } - protected async Task SearchGeo(List? expected, string field, double latitude, double longitude, SearchScope target = SearchScope.All) + protected async Task SearchApiKey( + DomainId? expected, + string apiKey, + SearchScope target = SearchScope.All) { - var query = new GeoQuery(SchemaId.Id, field, latitude, longitude, 1000, 1000) - { - SchemaId = SchemaId.Id, - }; + var query = new ApiKeyQuery(apiKey); + + var actual = await SearchAsync(i => i.FindUserInfo(App, query, target, default), x => x?.ContentId == expected); + Assert.Equal(expected, actual?.ContentId); + } + + protected async Task SearchGeo( + List? expected, + string field, + double latitude, + double longitude, + SearchScope target = SearchScope.All) + { + var query = new GeoQuery(SchemaId.Id, field, latitude, longitude, 1000, 1000); var actual = await SearchAsync(i => i.SearchAsync(App, query, target, default), x => IsExpected(x, expected)); AssertIds(actual, expected); } - protected async Task SearchText(List? expected, string text, SearchScope target = SearchScope.All) + protected async Task SearchText( + List? expected, + string text, + SearchScope target = SearchScope.All) { var query = new TextQuery(text, 1000) { diff --git a/frontend/cache.json b/frontend/cache.json new file mode 100644 index 000000000..42c22156b --- /dev/null +++ b/frontend/cache.json @@ -0,0 +1,23838 @@ +{ + "x-generator": "NSwag v14.1.0.0 (NJsonSchema v11.0.2.0 (Newtonsoft.Json v13.0.0.0))", + "openapi": "3.0.0", + "info": { + "title": "Squidex API", + "version": "1.0.0.0", + "x-logo": { + "url": "https://localhost:5001/images/logo-white.png", + "backgroundStyle": "", + "backgroundColor": "#3f83df" + } + }, + "servers": [ + { + "url": "https://localhost:5001" + } + ], + "paths": { + "/api/user-management": { + "get": { + "tags": [ + "UserManagement" + ], + "summary": "Get users by query.", + "operationId": "UserManagement_GetUsers", + "parameters": [ + { + "name": "query", + "in": "query", + "description": "Optional query to search by email address or username.", + "schema": { + "type": "string", + "nullable": true + }, + "x-position": 1 + }, + { + "name": "skip", + "in": "query", + "description": "The number of users to skip.", + "schema": { + "type": "integer", + "format": "int32", + "default": 0 + }, + "x-position": 2 + }, + { + "name": "take", + "in": "query", + "description": "The number of users to return.", + "schema": { + "type": "integer", + "format": "int32", + "default": 10 + }, + "x-position": 3 + } + ], + "responses": { + "200": { + "description": "Users returned.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UsersDto" + } + } + } + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.admin.users.read" + ] + } + ] + }, + "post": { + "tags": [ + "UserManagement" + ], + "summary": "Create a new user.", + "operationId": "UserManagement_PostUser", + "requestBody": { + "x-name": "request", + "description": "The user object that needs to be added.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateUserDto" + } + } + }, + "required": true, + "x-position": 1 + }, + "responses": { + "201": { + "description": "User created.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UserDto" + } + } + } + }, + "400": { + "description": "User request not valid.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.admin.users.create" + ] + } + ] + } + }, + "/api/user-management/{id}": { + "get": { + "tags": [ + "UserManagement" + ], + "summary": "Get a user by ID.", + "operationId": "UserManagement_GetUser", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "description": "The ID of the user.", + "schema": { + "type": "string" + }, + "x-position": 1 + } + ], + "responses": { + "200": { + "description": "User returned.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UserDto" + } + } + } + }, + "404": { + "description": "User not found." + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.admin.users.read" + ] + } + ] + }, + "put": { + "tags": [ + "UserManagement" + ], + "summary": "Update a user.", + "operationId": "UserManagement_PutUser", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "description": "The ID of the user.", + "schema": { + "type": "string" + }, + "x-position": 1 + } + ], + "requestBody": { + "x-name": "request", + "description": "The user object that needs to be updated.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateUserDto" + } + } + }, + "required": true, + "x-position": 2 + }, + "responses": { + "200": { + "description": "User created.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UserDto" + } + } + } + }, + "400": { + "description": "User request not valid.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + }, + "404": { + "description": "User not found." + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.admin.users.update" + ] + } + ] + }, + "delete": { + "tags": [ + "UserManagement" + ], + "summary": "Delete a User.", + "operationId": "UserManagement_DeleteUser", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "description": "The ID of the user to delete.", + "schema": { + "type": "string" + }, + "x-position": 1 + } + ], + "responses": { + "204": { + "description": "User deleted." + }, + "403": { + "description": "User is the current user.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + }, + "404": { + "description": "User not found." + }, + "400": { + "description": "Validation error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.admin.users.unlock" + ] + } + ] + } + }, + "/api/user-management/{id}/lock": { + "put": { + "tags": [ + "UserManagement" + ], + "summary": "Lock a user.", + "operationId": "UserManagement_LockUser", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "description": "The ID of the user to lock.", + "schema": { + "type": "string" + }, + "x-position": 1 + } + ], + "responses": { + "200": { + "description": "User locked.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UserDto" + } + } + } + }, + "403": { + "description": "User is the current user.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + }, + "404": { + "description": "User not found." + }, + "400": { + "description": "Validation error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.admin.users.lock" + ] + } + ] + } + }, + "/api/user-management/{id}/unlock": { + "put": { + "tags": [ + "UserManagement" + ], + "summary": "Unlock a user.", + "operationId": "UserManagement_UnlockUser", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "description": "The ID of the user to unlock.", + "schema": { + "type": "string" + }, + "x-position": 1 + } + ], + "responses": { + "200": { + "description": "User unlocked.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UserDto" + } + } + } + }, + "403": { + "description": "User is the current user.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + }, + "404": { + "description": "User not found." + }, + "400": { + "description": "Validation error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.admin.users.unlock" + ] + } + ] + } + }, + "/api": { + "get": { + "tags": [ + "Users" + ], + "summary": "Get the user resources.", + "operationId": "Users_GetUserResources", + "responses": { + "200": { + "description": "User resources returned.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ResourcesDto" + } + } + } + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [] + } + ] + } + }, + "/api/user": { + "post": { + "tags": [ + "Users" + ], + "summary": "Update the user profile.", + "operationId": "Users_PostUser", + "requestBody": { + "x-name": "request", + "description": "The values to update.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateProfileDto" + } + } + }, + "required": true, + "x-position": 1 + }, + "responses": { + "204": { + "description": "User updated." + }, + "400": { + "description": "Validation error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [] + } + ] + } + }, + "/api/users": { + "get": { + "tags": [ + "Users" + ], + "summary": "Get users by query.", + "description": "Search the user by query that contains the email address or the part of the email address.", + "operationId": "Users_GetUsers", + "parameters": [ + { + "name": "query", + "in": "query", + "description": "The query to search the user by email address. Case invariant.", + "schema": { + "type": "string" + }, + "x-position": 1 + } + ], + "responses": { + "200": { + "description": "Users returned.", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/UserDto" + } + } + } + } + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [] + } + ] + } + }, + "/api/users/{id}": { + "get": { + "tags": [ + "Users" + ], + "summary": "Get user by id.", + "operationId": "Users_GetUser", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "description": "The ID of the user (GUID).", + "schema": { + "type": "string" + }, + "x-position": 1 + } + ], + "responses": { + "200": { + "description": "User found.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UserDto" + } + } + } + }, + "404": { + "description": "User not found." + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [] + } + ] + } + }, + "/api/users/{id}/picture": { + "get": { + "tags": [ + "Users" + ], + "summary": "Get user picture by id.", + "operationId": "Users_GetUserPicture", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "description": "The ID of the user (GUID).", + "schema": { + "type": "string" + }, + "x-position": 1 + } + ], + "responses": { + "200": { + "description": "User found and image or fallback returned.", + "content": { + "application/octet-stream": { + "schema": { + "type": "string", + "format": "binary" + } + } + } + }, + "404": { + "description": "User not found." + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + } + } + }, + "/api/apps/{app}/translations": { + "post": { + "tags": [ + "Translations" + ], + "summary": "Translate a text.", + "operationId": "Translations_PostTranslation", + "parameters": [ + { + "name": "app", + "in": "path", + "required": true, + "description": "The name of the app.", + "schema": { + "type": "string" + }, + "x-position": 1 + } + ], + "requestBody": { + "x-name": "request", + "description": "The translation request.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TranslateDto" + } + } + }, + "required": true, + "x-position": 2 + }, + "responses": { + "200": { + "description": "Text translated.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TranslationDto" + } + } + } + }, + "400": { + "description": "Validation error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.apps.{app}.translate" + ] + } + ] + } + }, + "/api/templates": { + "get": { + "tags": [ + "Templates" + ], + "summary": "Get all templates.", + "operationId": "Templates_GetTemplates", + "parameters": [ + { + "name": "includeDetails", + "in": "query", + "description": "Also include the details.", + "schema": { + "type": "boolean" + }, + "x-position": 1 + } + ], + "responses": { + "200": { + "description": "Templates returned.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TemplatesDto" + } + } + } + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [] + } + ] + } + }, + "/api/templates/{name}": { + "get": { + "tags": [ + "Templates" + ], + "summary": "Get template details.", + "operationId": "Templates_GetTemplate", + "parameters": [ + { + "name": "name", + "in": "path", + "required": true, + "description": "The name of the template.", + "schema": { + "type": "string" + }, + "x-position": 1 + } + ], + "responses": { + "200": { + "description": "Template returned.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TemplateDetailsDto" + } + } + } + }, + "404": { + "description": "Template not found." + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [] + } + ] + } + }, + "/api/teams/{team}/contributors": { + "get": { + "tags": [ + "Teams" + ], + "summary": "Get team contributors.", + "operationId": "TeamContributors_GetContributors", + "parameters": [ + { + "name": "team", + "in": "path", + "required": true, + "description": "The ID of the team.", + "schema": { + "type": "string" + }, + "x-position": 1 + } + ], + "responses": { + "200": { + "description": "Contributors returned.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ContributorsDto" + } + } + } + }, + "404": { + "description": "Team not found." + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.teams.{team}.contributors.read" + ] + } + ] + }, + "post": { + "tags": [ + "Teams" + ], + "summary": "Assign contributor to team.", + "operationId": "TeamContributors_PostContributor", + "parameters": [ + { + "name": "team", + "in": "path", + "required": true, + "description": "The ID of the team.", + "schema": { + "type": "string" + }, + "x-position": 1 + } + ], + "requestBody": { + "x-name": "request", + "description": "Contributor object that needs to be added to the team.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AssignContributorDto" + } + } + }, + "required": true, + "x-position": 2 + }, + "responses": { + "201": { + "description": "Contributor assigned to team.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ContributorsDto" + } + } + } + }, + "400": { + "description": "Contributor request not valid.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + }, + "404": { + "description": "Team not found." + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.teams.{team}.contributors.assign" + ] + } + ] + } + }, + "/api/teams/{team}/contributors/me": { + "delete": { + "tags": [ + "Teams" + ], + "summary": "Remove yourself.", + "operationId": "TeamContributors_DeleteMyself", + "parameters": [ + { + "name": "team", + "in": "path", + "required": true, + "description": "The ID of the team.", + "schema": { + "type": "string" + }, + "x-position": 1 + } + ], + "responses": { + "200": { + "description": "Contributor removed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ContributorsDto" + } + } + } + }, + "404": { + "description": "Contributor or team not found." + }, + "400": { + "description": "Validation error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [] + } + ] + } + }, + "/api/teams/{team}/contributors/{id}": { + "delete": { + "tags": [ + "Teams" + ], + "summary": "Remove contributor.", + "operationId": "TeamContributors_DeleteContributor", + "parameters": [ + { + "name": "team", + "in": "path", + "required": true, + "description": "The ID of the team.", + "schema": { + "type": "string" + }, + "x-position": 1 + }, + { + "name": "id", + "in": "path", + "required": true, + "description": "The ID of the contributor.", + "schema": { + "type": "string" + }, + "x-position": 2 + } + ], + "responses": { + "200": { + "description": "Contributor removed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ContributorsDto" + } + } + } + }, + "404": { + "description": "Contributor or team not found." + }, + "400": { + "description": "Validation error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.teams.{team}.contributors.revoke" + ] + } + ] + } + }, + "/api/teams": { + "get": { + "tags": [ + "Teams" + ], + "summary": "Get your teams.", + "description": "You can only retrieve the list of teams when you are authenticated as a user (OpenID implicit flow).\nYou will retrieve all teams, where you are assigned as a contributor.", + "operationId": "Teams_GetTeams", + "responses": { + "200": { + "description": "Teams returned.", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/TeamDto" + } + } + } + } + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [] + } + ] + }, + "post": { + "tags": [ + "Teams" + ], + "summary": "Create a new team.", + "description": "You can only create an team when you are authenticated as a user (OpenID implicit flow).\nYou will be assigned as owner of the new team automatically.", + "operationId": "Teams_PostTeam", + "requestBody": { + "x-name": "request", + "description": "The team object that needs to be added to Squidex.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateTeamDto" + } + } + }, + "required": true, + "x-position": 1 + }, + "responses": { + "201": { + "description": "Team created.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TeamDto" + } + } + } + }, + "400": { + "description": "Team request not valid.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [] + } + ] + } + }, + "/api/teams/{team}": { + "get": { + "tags": [ + "Teams" + ], + "summary": "Get an team by ID.", + "operationId": "Teams_GetTeam", + "parameters": [ + { + "name": "team", + "in": "path", + "required": true, + "description": "The ID of the team.", + "schema": { + "type": "string" + }, + "x-position": 1 + } + ], + "responses": { + "200": { + "description": "Teams returned.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TeamDto" + } + } + } + }, + "404": { + "description": "Team not found." + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [] + } + ] + }, + "put": { + "tags": [ + "Teams" + ], + "summary": "Update the team.", + "operationId": "Teams_PutTeam", + "parameters": [ + { + "name": "team", + "in": "path", + "required": true, + "description": "The ID of the team to update.", + "schema": { + "type": "string" + }, + "x-position": 1 + } + ], + "requestBody": { + "x-name": "request", + "description": "The values to update.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateTeamDto" + } + } + }, + "required": true, + "x-position": 2 + }, + "responses": { + "200": { + "description": "Team updated.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TeamDto" + } + } + } + }, + "400": { + "description": "Team request not valid.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + }, + "404": { + "description": "Team not found." + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.teams.{team}.update" + ] + } + ] + }, + "delete": { + "tags": [ + "Teams" + ], + "summary": "Delete the team.", + "operationId": "Teams_DeleteTeam", + "parameters": [ + { + "name": "team", + "in": "path", + "required": true, + "description": "The ID of the team to delete.", + "schema": { + "type": "string" + }, + "x-position": 1 + } + ], + "responses": { + "204": { + "description": "Team deleted." + }, + "404": { + "description": "Team not found." + }, + "400": { + "description": "Validation error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.teams.{team}.delete" + ] + } + ] + } + }, + "/api/teams/{team}/auth": { + "get": { + "tags": [ + "Teams" + ], + "summary": "Get the team auth settings.", + "operationId": "Teams_GetTeamAuth", + "parameters": [ + { + "name": "team", + "in": "path", + "required": true, + "description": "The ID of the team.", + "schema": { + "type": "string" + }, + "x-position": 1 + } + ], + "responses": { + "200": { + "description": "Teams returned.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AuthSchemeResponseDto" + } + } + } + }, + "404": { + "description": "Team not found." + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.teams.{team}.auth.read" + ] + } + ] + }, + "put": { + "tags": [ + "Teams" + ], + "summary": "Update the team auth.", + "operationId": "Teams_PutTeamAuth", + "parameters": [ + { + "name": "team", + "in": "path", + "required": true, + "description": "The ID of the team to update.", + "schema": { + "type": "string" + }, + "x-position": 1 + } + ], + "requestBody": { + "x-name": "request", + "description": "The values to update.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AuthSchemeValueDto" + } + } + }, + "required": true, + "x-position": 2 + }, + "responses": { + "200": { + "description": "Team updated.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AuthSchemeResponseDto" + } + } + } + }, + "400": { + "description": "Team request not valid.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + }, + "404": { + "description": "Team not found." + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.teams.{team}.auth.change" + ] + } + ] + } + }, + "/api/apps/{app}/usages/log": { + "get": { + "tags": [ + "Statistics" + ], + "summary": "Get api calls as log file.", + "operationId": "Usages_GetLog", + "parameters": [ + { + "name": "app", + "in": "path", + "required": true, + "description": "The name of the app.", + "schema": { + "type": "string" + }, + "x-position": 1 + } + ], + "responses": { + "200": { + "description": "Usage tracking results returned.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/LogDownloadDto" + } + } + } + }, + "404": { + "description": "App not found." + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.apps.{app}.usage" + ] + } + ] + } + }, + "/api/apps/{app}/usages/calls/{fromDate}/{toDate}": { + "get": { + "tags": [ + "Statistics" + ], + "summary": "Get api calls in date range for app.", + "operationId": "Usages_GetUsages", + "parameters": [ + { + "name": "app", + "in": "path", + "required": true, + "description": "The name of the app.", + "schema": { + "type": "string" + }, + "x-position": 1 + }, + { + "name": "fromDate", + "in": "path", + "required": true, + "description": "The from date.", + "schema": { + "type": "string", + "format": "date" + }, + "x-position": 2 + }, + { + "name": "toDate", + "in": "path", + "required": true, + "description": "The to date.", + "schema": { + "type": "string", + "format": "date" + }, + "x-position": 3 + } + ], + "responses": { + "200": { + "description": "API call returned.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CallsUsageDto" + } + } + } + }, + "404": { + "description": "App not found." + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.apps.{app}.usage" + ] + } + ] + } + }, + "/api/teams/{team}/usages/calls/{fromDate}/{toDate}": { + "get": { + "tags": [ + "Statistics" + ], + "summary": "Get api calls in date range for team.", + "operationId": "Usages_GetUsagesForTeam", + "parameters": [ + { + "name": "team", + "in": "path", + "required": true, + "description": "The name of the team.", + "schema": { + "type": "string" + }, + "x-position": 1 + }, + { + "name": "fromDate", + "in": "path", + "required": true, + "description": "The from date.", + "schema": { + "type": "string", + "format": "date" + }, + "x-position": 2 + }, + { + "name": "toDate", + "in": "path", + "required": true, + "description": "The to date.", + "schema": { + "type": "string", + "format": "date" + }, + "x-position": 3 + } + ], + "responses": { + "200": { + "description": "API call returned.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CallsUsageDto" + } + } + } + }, + "404": { + "description": "Team not found." + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.teams.{team}.usage" + ] + } + ] + } + }, + "/api/apps/{app}/usages/storage/today": { + "get": { + "tags": [ + "Statistics" + ], + "summary": "Get total asset size for app.", + "operationId": "Usages_GetCurrentStorageSize", + "parameters": [ + { + "name": "app", + "in": "path", + "required": true, + "description": "The name of the app.", + "schema": { + "type": "string" + }, + "x-position": 1 + } + ], + "responses": { + "200": { + "description": "Storage usage returned.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CurrentStorageDto" + } + } + } + }, + "404": { + "description": "App not found." + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.apps.{app}.usage" + ] + } + ] + } + }, + "/api/teams/{team}/usages/storage/today": { + "get": { + "tags": [ + "Statistics" + ], + "summary": "Get total asset size for team.", + "operationId": "Usages_GetTeamCurrentStorageSizeForTeam", + "parameters": [ + { + "name": "team", + "in": "path", + "required": true, + "description": "The ID of the team.", + "schema": { + "type": "string" + }, + "x-position": 1 + } + ], + "responses": { + "200": { + "description": "Storage usage returned.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CurrentStorageDto" + } + } + } + }, + "404": { + "description": "Team not found." + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.teams.{team}.usage" + ] + } + ] + } + }, + "/api/apps/{app}/usages/storage/{fromDate}/{toDate}": { + "get": { + "tags": [ + "Statistics" + ], + "summary": "Get asset usage by date for app.", + "operationId": "Usages_GetStorageSizes", + "parameters": [ + { + "name": "app", + "in": "path", + "required": true, + "description": "The name of the app.", + "schema": { + "type": "string" + }, + "x-position": 1 + }, + { + "name": "fromDate", + "in": "path", + "required": true, + "description": "The from date.", + "schema": { + "type": "string", + "format": "date" + }, + "x-position": 2 + }, + { + "name": "toDate", + "in": "path", + "required": true, + "description": "The to date.", + "schema": { + "type": "string", + "format": "date" + }, + "x-position": 3 + } + ], + "responses": { + "200": { + "description": "Storage usage returned.", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/StorageUsagePerDateDto" + } + } + } + } + }, + "404": { + "description": "App not found." + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.apps.{app}.usage" + ] + } + ] + } + }, + "/api/teams/{team}/usages/storage/{fromDate}/{toDate}": { + "get": { + "tags": [ + "Statistics" + ], + "summary": "Get asset usage by date for team.", + "operationId": "Usages_GetStorageSizesForTeam", + "parameters": [ + { + "name": "team", + "in": "path", + "required": true, + "description": "The ID of the team.", + "schema": { + "type": "string" + }, + "x-position": 1 + }, + { + "name": "fromDate", + "in": "path", + "required": true, + "description": "The from date.", + "schema": { + "type": "string", + "format": "date" + }, + "x-position": 2 + }, + { + "name": "toDate", + "in": "path", + "required": true, + "description": "The to date.", + "schema": { + "type": "string", + "format": "date" + }, + "x-position": 3 + } + ], + "responses": { + "200": { + "description": "Storage usage returned.", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/StorageUsagePerDateDto" + } + } + } + } + }, + "404": { + "description": "Team not found." + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.teams.{team}.usage" + ] + } + ] + } + }, + "/api/apps/{app}/search": { + "get": { + "tags": [ + "Search" + ], + "summary": "Get search results.", + "operationId": "Search_GetSearchResults", + "parameters": [ + { + "name": "app", + "in": "path", + "required": true, + "description": "The name of the app.", + "schema": { + "type": "string" + }, + "x-position": 1 + }, + { + "name": "query", + "in": "query", + "description": "The search query.", + "schema": { + "type": "string", + "nullable": true + }, + "x-position": 2 + } + ], + "responses": { + "200": { + "description": "Search results returned.", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/SearchResultDto" + } + } + } + } + }, + "404": { + "description": "App not found." + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.apps.{app}.search" + ] + } + ] + } + }, + "/api/apps/{app}/schemas/{schema}/fields": { + "post": { + "tags": [ + "Schemas" + ], + "summary": "Add a schema field.", + "operationId": "SchemaFields_PostField", + "parameters": [ + { + "name": "app", + "in": "path", + "required": true, + "description": "The name of the app.", + "schema": { + "type": "string" + }, + "x-position": 1 + }, + { + "name": "schema", + "in": "path", + "required": true, + "description": "The name of the schema.", + "schema": { + "type": "string" + }, + "x-position": 2 + } + ], + "requestBody": { + "x-name": "request", + "description": "The field object that needs to be added to the schema.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AddFieldDto" + } + } + }, + "required": true, + "x-position": 3 + }, + "responses": { + "201": { + "description": "Schema field created.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SchemaDto" + } + } + } + }, + "400": { + "description": "Schema request not valid.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + }, + "404": { + "description": "Schema or app not found." + }, + "409": { + "description": "Schema field name already in use.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.apps.{app}.schemas.{schema}.update" + ] + } + ] + } + }, + "/api/apps/{app}/schemas/{schema}/fields/{parentId}/nested": { + "post": { + "tags": [ + "Schemas" + ], + "summary": "Add a nested field.", + "operationId": "SchemaFields_PostNestedField", + "parameters": [ + { + "name": "app", + "in": "path", + "required": true, + "description": "The name of the app.", + "schema": { + "type": "string" + }, + "x-position": 1 + }, + { + "name": "schema", + "in": "path", + "required": true, + "description": "The name of the schema.", + "schema": { + "type": "string" + }, + "x-position": 2 + }, + { + "name": "parentId", + "in": "path", + "required": true, + "description": "The parent field id.", + "schema": { + "type": "integer", + "format": "int64" + }, + "x-position": 3 + } + ], + "requestBody": { + "x-name": "request", + "description": "The field object that needs to be added to the schema.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AddFieldDto" + } + } + }, + "required": true, + "x-position": 4 + }, + "responses": { + "201": { + "description": "Schema field created.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SchemaDto" + } + } + } + }, + "400": { + "description": "Schema request not valid.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + }, + "409": { + "description": "Schema field name already in use.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + }, + "404": { + "description": "Schema, field or app not found." + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.apps.{app}.schemas.{schema}.update" + ] + } + ] + } + }, + "/api/apps/{app}/schemas/{schema}/fields/ui": { + "put": { + "tags": [ + "Schemas" + ], + "summary": "Configure UI fields.", + "operationId": "SchemaFields_PutSchemaUIFields", + "parameters": [ + { + "name": "app", + "in": "path", + "required": true, + "description": "The name of the app.", + "schema": { + "type": "string" + }, + "x-position": 1 + }, + { + "name": "schema", + "in": "path", + "required": true, + "description": "The name of the schema.", + "schema": { + "type": "string" + }, + "x-position": 2 + } + ], + "requestBody": { + "x-name": "request", + "description": "The request that contains the field names.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ConfigureUIFieldsDto" + } + } + }, + "required": true, + "x-position": 3 + }, + "responses": { + "200": { + "description": "Schema UI fields defined.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SchemaDto" + } + } + } + }, + "400": { + "description": "Schema request not valid.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + }, + "404": { + "description": "Schema or app not found." + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.apps.{app}.schemas.{schema}.update" + ] + } + ] + } + }, + "/api/apps/{app}/schemas/{schema}/fields/ordering": { + "put": { + "tags": [ + "Schemas" + ], + "summary": "Reorder all fields.", + "operationId": "SchemaFields_PutSchemaFieldOrdering", + "parameters": [ + { + "name": "app", + "in": "path", + "required": true, + "description": "The name of the app.", + "schema": { + "type": "string" + }, + "x-position": 1 + }, + { + "name": "schema", + "in": "path", + "required": true, + "description": "The name of the schema.", + "schema": { + "type": "string" + }, + "x-position": 2 + } + ], + "requestBody": { + "x-name": "request", + "description": "The request that contains the field ids.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ReorderFieldsDto" + } + } + }, + "required": true, + "x-position": 3 + }, + "responses": { + "200": { + "description": "Schema fields reordered.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SchemaDto" + } + } + } + }, + "400": { + "description": "Schema request not valid.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + }, + "404": { + "description": "Schema or app not found." + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.apps.{app}.schemas.{schema}.update" + ] + } + ] + } + }, + "/api/apps/{app}/schemas/{schema}/fields/{parentId}/nested/ordering": { + "put": { + "tags": [ + "Schemas" + ], + "summary": "Reorder all nested fields.", + "operationId": "SchemaFields_PutNestedFieldOrdering", + "parameters": [ + { + "name": "app", + "in": "path", + "required": true, + "description": "The name of the app.", + "schema": { + "type": "string" + }, + "x-position": 1 + }, + { + "name": "schema", + "in": "path", + "required": true, + "description": "The name of the schema.", + "schema": { + "type": "string" + }, + "x-position": 2 + }, + { + "name": "parentId", + "in": "path", + "required": true, + "description": "The parent field id.", + "schema": { + "type": "integer", + "format": "int64" + }, + "x-position": 3 + } + ], + "requestBody": { + "x-name": "request", + "description": "The request that contains the field ids.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ReorderFieldsDto" + } + } + }, + "required": true, + "x-position": 4 + }, + "responses": { + "200": { + "description": "Schema fields reordered.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SchemaDto" + } + } + } + }, + "400": { + "description": "Schema field request not valid.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + }, + "404": { + "description": "Schema, field or app not found." + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.apps.{app}.schemas.{schema}.update" + ] + } + ] + } + }, + "/api/apps/{app}/schemas/{schema}/fields/{id}": { + "put": { + "tags": [ + "Schemas" + ], + "summary": "Update a schema field.", + "operationId": "SchemaFields_PutField", + "parameters": [ + { + "name": "app", + "in": "path", + "required": true, + "description": "The name of the app.", + "schema": { + "type": "string" + }, + "x-position": 1 + }, + { + "name": "schema", + "in": "path", + "required": true, + "description": "The name of the schema.", + "schema": { + "type": "string" + }, + "x-position": 2 + }, + { + "name": "id", + "in": "path", + "required": true, + "description": "The ID of the field to update.", + "schema": { + "type": "integer", + "format": "int64" + }, + "x-position": 3 + } + ], + "requestBody": { + "x-name": "request", + "description": "The field object that needs to be added to the schema.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateFieldDto" + } + } + }, + "required": true, + "x-position": 4 + }, + "responses": { + "200": { + "description": "Schema field updated.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SchemaDto" + } + } + } + }, + "400": { + "description": "Schema field request not valid.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + }, + "404": { + "description": "Schema, field or app not found." + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.apps.{app}.schemas.{schema}.update" + ] + } + ] + }, + "delete": { + "tags": [ + "Schemas" + ], + "summary": "Delete a schema field.", + "operationId": "SchemaFields_DeleteField", + "parameters": [ + { + "name": "app", + "in": "path", + "required": true, + "description": "The name of the app.", + "schema": { + "type": "string" + }, + "x-position": 1 + }, + { + "name": "schema", + "in": "path", + "required": true, + "description": "The name of the schema.", + "schema": { + "type": "string" + }, + "x-position": 2 + }, + { + "name": "id", + "in": "path", + "required": true, + "description": "The ID of the field to disable.", + "schema": { + "type": "integer", + "format": "int64" + }, + "x-position": 3 + } + ], + "responses": { + "200": { + "description": "Schema field deleted.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SchemaDto" + } + } + } + }, + "400": { + "description": "Schema field request not valid or field locked.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + }, + "404": { + "description": "Schema, field or app not found." + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.apps.{app}.schemas.{schema}.update" + ] + } + ] + } + }, + "/api/apps/{app}/schemas/{schema}/fields/{parentId}/nested/{id}": { + "put": { + "tags": [ + "Schemas" + ], + "summary": "Update a nested field.", + "operationId": "SchemaFields_PutNestedField", + "parameters": [ + { + "name": "app", + "in": "path", + "required": true, + "description": "The name of the app.", + "schema": { + "type": "string" + }, + "x-position": 1 + }, + { + "name": "schema", + "in": "path", + "required": true, + "description": "The name of the schema.", + "schema": { + "type": "string" + }, + "x-position": 2 + }, + { + "name": "parentId", + "in": "path", + "required": true, + "description": "The parent field id.", + "schema": { + "type": "integer", + "format": "int64" + }, + "x-position": 3 + }, + { + "name": "id", + "in": "path", + "required": true, + "description": "The ID of the field to update.", + "schema": { + "type": "integer", + "format": "int64" + }, + "x-position": 4 + } + ], + "requestBody": { + "x-name": "request", + "description": "The field object that needs to be added to the schema.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateFieldDto" + } + } + }, + "required": true, + "x-position": 5 + }, + "responses": { + "200": { + "description": "Schema field updated.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SchemaDto" + } + } + } + }, + "400": { + "description": "Schema field request not valid or field locked.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + }, + "404": { + "description": "Schema, field or app not found." + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.apps.{app}.schemas.{schema}.update" + ] + } + ] + }, + "delete": { + "tags": [ + "Schemas" + ], + "summary": "Delete a nested field.", + "operationId": "SchemaFields_DeleteNestedField", + "parameters": [ + { + "name": "app", + "in": "path", + "required": true, + "description": "The name of the app.", + "schema": { + "type": "string" + }, + "x-position": 1 + }, + { + "name": "schema", + "in": "path", + "required": true, + "description": "The name of the schema.", + "schema": { + "type": "string" + }, + "x-position": 2 + }, + { + "name": "parentId", + "in": "path", + "required": true, + "description": "The parent field id.", + "schema": { + "type": "integer", + "format": "int64" + }, + "x-position": 3 + }, + { + "name": "id", + "in": "path", + "required": true, + "description": "The ID of the field to disable.", + "schema": { + "type": "integer", + "format": "int64" + }, + "x-position": 4 + } + ], + "responses": { + "200": { + "description": "Schema field deleted.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SchemaDto" + } + } + } + }, + "400": { + "description": "Schema field request not valid or field locked.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + }, + "404": { + "description": "Schema, field or app not found." + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.apps.{app}.schemas.{schema}.update" + ] + } + ] + } + }, + "/api/apps/{app}/schemas/{schema}/fields/{id}/lock": { + "put": { + "tags": [ + "Schemas" + ], + "summary": "Lock a schema field.", + "description": "A locked field cannot be updated or deleted.", + "operationId": "SchemaFields_LockField", + "parameters": [ + { + "name": "app", + "in": "path", + "required": true, + "description": "The name of the app.", + "schema": { + "type": "string" + }, + "x-position": 1 + }, + { + "name": "schema", + "in": "path", + "required": true, + "description": "The name of the schema.", + "schema": { + "type": "string" + }, + "x-position": 2 + }, + { + "name": "id", + "in": "path", + "required": true, + "description": "The ID of the field to lock.", + "schema": { + "type": "integer", + "format": "int64" + }, + "x-position": 3 + } + ], + "responses": { + "200": { + "description": "Schema field shown.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SchemaDto" + } + } + } + }, + "400": { + "description": "Schema field request not valid or field locked.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + }, + "404": { + "description": "Schema, field or app not found." + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.apps.{app}.schemas.{schema}.update" + ] + } + ] + } + }, + "/api/apps/{app}/schemas/{schema}/fields/{parentId}/nested/{id}/lock": { + "put": { + "tags": [ + "Schemas" + ], + "summary": "Lock a nested field.", + "description": "A locked field cannot be edited or deleted.", + "operationId": "SchemaFields_LockNestedField", + "parameters": [ + { + "name": "app", + "in": "path", + "required": true, + "description": "The name of the app.", + "schema": { + "type": "string" + }, + "x-position": 1 + }, + { + "name": "schema", + "in": "path", + "required": true, + "description": "The name of the schema.", + "schema": { + "type": "string" + }, + "x-position": 2 + }, + { + "name": "parentId", + "in": "path", + "required": true, + "description": "The parent field id.", + "schema": { + "type": "integer", + "format": "int64" + }, + "x-position": 3 + }, + { + "name": "id", + "in": "path", + "required": true, + "description": "The ID of the field to lock.", + "schema": { + "type": "integer", + "format": "int64" + }, + "x-position": 4 + } + ], + "responses": { + "200": { + "description": "Schema field hidden.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SchemaDto" + } + } + } + }, + "400": { + "description": "Schema field request not valid or field locked.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + }, + "404": { + "description": "Field, schema, or app not found." + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.apps.{app}.schemas.{schema}.update" + ] + } + ] + } + }, + "/api/apps/{app}/schemas/{schema}/fields/{id}/hide": { + "put": { + "tags": [ + "Schemas" + ], + "summary": "Hide a schema field.", + "description": "A hidden field is not part of the API response, but can still be edited in the portal.", + "operationId": "SchemaFields_HideField", + "parameters": [ + { + "name": "app", + "in": "path", + "required": true, + "description": "The name of the app.", + "schema": { + "type": "string" + }, + "x-position": 1 + }, + { + "name": "schema", + "in": "path", + "required": true, + "description": "The name of the schema.", + "schema": { + "type": "string" + }, + "x-position": 2 + }, + { + "name": "id", + "in": "path", + "required": true, + "description": "The ID of the field to hide.", + "schema": { + "type": "integer", + "format": "int64" + }, + "x-position": 3 + } + ], + "responses": { + "200": { + "description": "Schema field hidden.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SchemaDto" + } + } + } + }, + "400": { + "description": "Schema field request not valid or field locked.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + }, + "404": { + "description": "Schema, field or app not found." + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.apps.{app}.schemas.{schema}.update" + ] + } + ] + } + }, + "/api/apps/{app}/schemas/{schema}/fields/{parentId}/nested/{id}/hide": { + "put": { + "tags": [ + "Schemas" + ], + "summary": "Hide a nested field.", + "description": "A hidden field is not part of the API response, but can still be edited in the portal.", + "operationId": "SchemaFields_HideNestedField", + "parameters": [ + { + "name": "app", + "in": "path", + "required": true, + "description": "The name of the app.", + "schema": { + "type": "string" + }, + "x-position": 1 + }, + { + "name": "schema", + "in": "path", + "required": true, + "description": "The name of the schema.", + "schema": { + "type": "string" + }, + "x-position": 2 + }, + { + "name": "parentId", + "in": "path", + "required": true, + "description": "The parent field id.", + "schema": { + "type": "integer", + "format": "int64" + }, + "x-position": 3 + }, + { + "name": "id", + "in": "path", + "required": true, + "description": "The ID of the field to hide.", + "schema": { + "type": "integer", + "format": "int64" + }, + "x-position": 4 + } + ], + "responses": { + "200": { + "description": "Schema field hidden.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SchemaDto" + } + } + } + }, + "400": { + "description": "Schema field request not valid or field locked.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + }, + "404": { + "description": "Field, schema, or app not found." + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.apps.{app}.schemas.{schema}.update" + ] + } + ] + } + }, + "/api/apps/{app}/schemas/{schema}/fields/{id}/show": { + "put": { + "tags": [ + "Schemas" + ], + "summary": "Show a schema field.", + "description": "A hidden field is not part of the API response, but can still be edited in the portal.", + "operationId": "SchemaFields_ShowField", + "parameters": [ + { + "name": "app", + "in": "path", + "required": true, + "description": "The name of the app.", + "schema": { + "type": "string" + }, + "x-position": 1 + }, + { + "name": "schema", + "in": "path", + "required": true, + "description": "The name of the schema.", + "schema": { + "type": "string" + }, + "x-position": 2 + }, + { + "name": "id", + "in": "path", + "required": true, + "description": "The ID of the field to show.", + "schema": { + "type": "integer", + "format": "int64" + }, + "x-position": 3 + } + ], + "responses": { + "200": { + "description": "Schema field shown.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SchemaDto" + } + } + } + }, + "400": { + "description": "Schema field request not valid or field locked.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + }, + "404": { + "description": "Schema, field or app not found." + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.apps.{app}.schemas.{schema}.update" + ] + } + ] + } + }, + "/api/apps/{app}/schemas/{schema}/fields/{parentId}/nested/{id}/show": { + "put": { + "tags": [ + "Schemas" + ], + "summary": "Show a nested field.", + "description": "A hidden field is not part of the API response, but can still be edited in the portal.", + "operationId": "SchemaFields_ShowNestedField", + "parameters": [ + { + "name": "app", + "in": "path", + "required": true, + "description": "The name of the app.", + "schema": { + "type": "string" + }, + "x-position": 1 + }, + { + "name": "schema", + "in": "path", + "required": true, + "description": "The name of the schema.", + "schema": { + "type": "string" + }, + "x-position": 2 + }, + { + "name": "parentId", + "in": "path", + "required": true, + "description": "The parent field id.", + "schema": { + "type": "integer", + "format": "int64" + }, + "x-position": 3 + }, + { + "name": "id", + "in": "path", + "required": true, + "description": "The ID of the field to show.", + "schema": { + "type": "integer", + "format": "int64" + }, + "x-position": 4 + } + ], + "responses": { + "200": { + "description": "Schema field shown.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SchemaDto" + } + } + } + }, + "400": { + "description": "Schema field request not valid or field locked.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + }, + "404": { + "description": "Schema, field or app not found." + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.apps.{app}.schemas.{schema}.update" + ] + } + ] + } + }, + "/api/apps/{app}/schemas/{schema}/fields/{id}/enable": { + "put": { + "tags": [ + "Schemas" + ], + "summary": "Enable a schema field.", + "description": "A disabled field cannot not be edited in the squidex portal anymore, but will be part of the API response.", + "operationId": "SchemaFields_EnableField", + "parameters": [ + { + "name": "app", + "in": "path", + "required": true, + "description": "The name of the app.", + "schema": { + "type": "string" + }, + "x-position": 1 + }, + { + "name": "schema", + "in": "path", + "required": true, + "description": "The name of the schema.", + "schema": { + "type": "string" + }, + "x-position": 2 + }, + { + "name": "id", + "in": "path", + "required": true, + "description": "The ID of the field to enable.", + "schema": { + "type": "integer", + "format": "int64" + }, + "x-position": 3 + } + ], + "responses": { + "200": { + "description": "Schema field enabled.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SchemaDto" + } + } + } + }, + "400": { + "description": "Schema field request not valid or field locked.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + }, + "404": { + "description": "Schema, field or app not found." + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.apps.{app}.schemas.{schema}.update" + ] + } + ] + } + }, + "/api/apps/{app}/schemas/{schema}/fields/{parentId}/nested/{id}/enable": { + "put": { + "tags": [ + "Schemas" + ], + "summary": "Enable a nested field.", + "description": "A disabled field cannot not be edited in the squidex portal anymore, but will be part of the API response.", + "operationId": "SchemaFields_EnableNestedField", + "parameters": [ + { + "name": "app", + "in": "path", + "required": true, + "description": "The name of the app.", + "schema": { + "type": "string" + }, + "x-position": 1 + }, + { + "name": "schema", + "in": "path", + "required": true, + "description": "The name of the schema.", + "schema": { + "type": "string" + }, + "x-position": 2 + }, + { + "name": "parentId", + "in": "path", + "required": true, + "description": "The parent field id.", + "schema": { + "type": "integer", + "format": "int64" + }, + "x-position": 3 + }, + { + "name": "id", + "in": "path", + "required": true, + "description": "The ID of the field to enable.", + "schema": { + "type": "integer", + "format": "int64" + }, + "x-position": 4 + } + ], + "responses": { + "200": { + "description": "Schema field enabled.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SchemaDto" + } + } + } + }, + "400": { + "description": "Schema field request not valid or field locked.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + }, + "404": { + "description": "Schema, field or app not found." + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.apps.{app}.schemas.{schema}.update" + ] + } + ] + } + }, + "/api/apps/{app}/schemas/{schema}/fields/{id}/disable": { + "put": { + "tags": [ + "Schemas" + ], + "summary": "Disable a schema field.", + "description": "A disabled field cannot not be edited in the squidex portal anymore, but will be part of the API response.", + "operationId": "SchemaFields_DisableField", + "parameters": [ + { + "name": "app", + "in": "path", + "required": true, + "description": "The name of the app.", + "schema": { + "type": "string" + }, + "x-position": 1 + }, + { + "name": "schema", + "in": "path", + "required": true, + "description": "The name of the schema.", + "schema": { + "type": "string" + }, + "x-position": 2 + }, + { + "name": "id", + "in": "path", + "required": true, + "description": "The ID of the field to disable.", + "schema": { + "type": "integer", + "format": "int64" + }, + "x-position": 3 + } + ], + "responses": { + "200": { + "description": "Schema field disabled.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SchemaDto" + } + } + } + }, + "400": { + "description": "Schema field request not valid or field locked.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + }, + "404": { + "description": "Schema, field or app not found." + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.apps.{app}.schemas.{schema}.update" + ] + } + ] + } + }, + "/api/apps/{app}/schemas/{schema}/fields/{parentId}/nested/{id}/disable": { + "put": { + "tags": [ + "Schemas" + ], + "summary": "Disable a nested field.", + "description": "A disabled field cannot not be edited in the squidex portal anymore, but will be part of the API response.", + "operationId": "SchemaFields_DisableNestedField", + "parameters": [ + { + "name": "app", + "in": "path", + "required": true, + "description": "The name of the app.", + "schema": { + "type": "string" + }, + "x-position": 1 + }, + { + "name": "schema", + "in": "path", + "required": true, + "description": "The name of the schema.", + "schema": { + "type": "string" + }, + "x-position": 2 + }, + { + "name": "parentId", + "in": "path", + "required": true, + "description": "The parent field id.", + "schema": { + "type": "integer", + "format": "int64" + }, + "x-position": 3 + }, + { + "name": "id", + "in": "path", + "required": true, + "description": "The ID of the field to disable.", + "schema": { + "type": "integer", + "format": "int64" + }, + "x-position": 4 + } + ], + "responses": { + "200": { + "description": "Schema field disabled.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SchemaDto" + } + } + } + }, + "400": { + "description": "Schema field request not valid or field locked.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + }, + "404": { + "description": "Schema, field or app not found." + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.apps.{app}.schemas.{schema}.update" + ] + } + ] + } + }, + "/api/apps/{app}/schemas/{schema}/indexes": { + "get": { + "tags": [ + "Schemas" + ], + "summary": "Gets the schema indexes.", + "operationId": "SchemaIndexes_GetIndexes", + "parameters": [ + { + "name": "app", + "in": "path", + "required": true, + "description": "The name of the app.", + "schema": { + "type": "string" + }, + "x-position": 1 + }, + { + "name": "schema", + "in": "path", + "required": true, + "description": "The name of the schema.", + "schema": { + "type": "string" + }, + "x-position": 2 + } + ], + "responses": { + "200": { + "description": "Schema indexes returned.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/IndexesDto" + } + } + } + }, + "404": { + "description": "Schema or app not found." + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.apps.{app}.schemas.{schema}.indexes" + ] + } + ] + }, + "post": { + "tags": [ + "Schemas" + ], + "summary": "Create a schema indexes.", + "operationId": "SchemaIndexes_PostIndex", + "parameters": [ + { + "name": "app", + "in": "path", + "required": true, + "description": "The name of the app.", + "schema": { + "type": "string" + }, + "x-position": 1 + }, + { + "name": "schema", + "in": "path", + "required": true, + "description": "The name of the schema.", + "schema": { + "type": "string" + }, + "x-position": 2 + } + ], + "requestBody": { + "x-name": "request", + "description": "The request object that represents an index.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateIndexDto" + } + } + }, + "required": true, + "x-position": 3 + }, + "responses": { + "204": { + "description": "" + }, + "404": { + "description": "Schema or app not found." + }, + "400": { + "description": "Validation error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.apps.{app}.schemas.{schema}.indexes" + ] + } + ] + } + }, + "/api/apps/{app}/schemas/{schema}/indexes/{name}": { + "delete": { + "tags": [ + "Schemas" + ], + "summary": "Create a schema indexes.", + "operationId": "SchemaIndexes_DeleteIndex", + "parameters": [ + { + "name": "app", + "in": "path", + "required": true, + "description": "The name of the app.", + "schema": { + "type": "string" + }, + "x-position": 1 + }, + { + "name": "schema", + "in": "path", + "required": true, + "description": "The name of the schema.", + "schema": { + "type": "string" + }, + "x-position": 2 + }, + { + "name": "name", + "in": "path", + "required": true, + "description": "The name of the index.", + "schema": { + "type": "string" + }, + "x-position": 3 + } + ], + "responses": { + "204": { + "description": "Schema index deletion added to job queue." + }, + "404": { + "description": "Schema or app not found." + }, + "400": { + "description": "Validation error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.apps.{app}.schemas.{schema}.indexes" + ] + } + ] + } + }, + "/api/apps/{app}/schemas": { + "get": { + "tags": [ + "Schemas" + ], + "summary": "Get schemas.", + "operationId": "Schemas_GetSchemas", + "parameters": [ + { + "name": "app", + "in": "path", + "required": true, + "description": "The name of the app.", + "schema": { + "type": "string" + }, + "x-position": 1 + } + ], + "responses": { + "200": { + "description": "Schemas returned.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SchemasDto" + } + } + } + }, + "404": { + "description": "App not found." + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.apps.{app}.schemas.read" + ] + } + ] + }, + "post": { + "tags": [ + "Schemas" + ], + "summary": "Create a new schema.", + "operationId": "Schemas_PostSchema", + "parameters": [ + { + "name": "app", + "in": "path", + "required": true, + "description": "The name of the app.", + "schema": { + "type": "string" + }, + "x-position": 1 + } + ], + "requestBody": { + "x-name": "request", + "description": "The schema object that needs to be added to the app.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateSchemaDto" + } + } + }, + "required": true, + "x-position": 2 + }, + "responses": { + "201": { + "description": "Schema created.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SchemaDto" + } + } + } + }, + "400": { + "description": "Schema request not valid.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + }, + "409": { + "description": "Schema name already in use.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.apps.{app}.schemas.create" + ] + } + ] + } + }, + "/api/apps/{app}/schemas/{schema}": { + "get": { + "tags": [ + "Schemas" + ], + "summary": "Get a schema by name.", + "operationId": "Schemas_GetSchema", + "parameters": [ + { + "name": "app", + "in": "path", + "required": true, + "description": "The name of the app.", + "schema": { + "type": "string" + }, + "x-position": 1 + }, + { + "name": "schema", + "in": "path", + "required": true, + "description": "The name of the schema to retrieve.", + "schema": { + "type": "string" + }, + "x-position": 2 + } + ], + "responses": { + "200": { + "description": "Schema found.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SchemaDto" + } + } + } + }, + "404": { + "description": "Schema or app not found." + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.apps.{app}.schemas.read" + ] + } + ] + }, + "put": { + "tags": [ + "Schemas" + ], + "summary": "Update a schema.", + "operationId": "Schemas_PutSchema", + "parameters": [ + { + "name": "app", + "in": "path", + "required": true, + "description": "The name of the app.", + "schema": { + "type": "string" + }, + "x-position": 1 + }, + { + "name": "schema", + "in": "path", + "required": true, + "description": "The name of the schema.", + "schema": { + "type": "string" + }, + "x-position": 2 + } + ], + "requestBody": { + "x-name": "request", + "description": "The schema object that needs to updated.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateSchemaDto" + } + } + }, + "required": true, + "x-position": 3 + }, + "responses": { + "200": { + "description": "Schema updated.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SchemaDto" + } + } + } + }, + "400": { + "description": "Schema request not valid.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + }, + "404": { + "description": "Schema or app not found." + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.apps.{app}.schemas.{schema}.update" + ] + } + ] + }, + "delete": { + "tags": [ + "Schemas" + ], + "summary": "Delete a schema.", + "operationId": "Schemas_DeleteSchema", + "parameters": [ + { + "name": "app", + "in": "path", + "required": true, + "description": "The name of the app.", + "schema": { + "type": "string" + }, + "x-position": 1 + }, + { + "name": "schema", + "in": "path", + "required": true, + "description": "The name of the schema to delete.", + "schema": { + "type": "string" + }, + "x-position": 2 + }, + { + "name": "permanent", + "in": "query", + "description": "True to delete the schema and the contents permanently.", + "schema": { + "type": "boolean" + }, + "x-position": 3 + } + ], + "responses": { + "204": { + "description": "Schema deleted." + }, + "404": { + "description": "Schema or app not found." + }, + "400": { + "description": "Validation error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.apps.{app}.schemas.{schema}.delete" + ] + } + ] + } + }, + "/api/apps/{app}/schemas/generate": { + "post": { + "tags": [ + "Schemas" + ], + "summary": "Generate a new schema.", + "operationId": "Schemas_PostSchemaGenerate", + "parameters": [ + { + "name": "app", + "in": "path", + "required": true, + "description": "The name of the app.", + "schema": { + "type": "string" + }, + "x-position": 1 + } + ], + "requestBody": { + "x-name": "request", + "description": "The schema object that needs to be added to the app.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GenerateSchemaDto" + } + } + }, + "required": true, + "x-position": 2 + }, + "responses": { + "201": { + "description": "Schema created.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GenerateSchemaResponseDto" + } + } + } + }, + "400": { + "description": "Schema request not valid.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + }, + "409": { + "description": "Schema name already in use.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.apps.{app}.schemas.create" + ] + } + ] + } + }, + "/api/apps/{app}/schemas/{schema}/sync": { + "put": { + "tags": [ + "Schemas" + ], + "summary": "Synchronize a schema.", + "operationId": "Schemas_PutSchemaSync", + "parameters": [ + { + "name": "app", + "in": "path", + "required": true, + "description": "The name of the app.", + "schema": { + "type": "string" + }, + "x-position": 1 + }, + { + "name": "schema", + "in": "path", + "required": true, + "description": "The name of the schema.", + "schema": { + "type": "string" + }, + "x-position": 2 + } + ], + "requestBody": { + "x-name": "request", + "description": "The schema object that needs to updated.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SynchronizeSchemaDto" + } + } + }, + "required": true, + "x-position": 3 + }, + "responses": { + "200": { + "description": "Schema updated.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SchemaDto" + } + } + } + }, + "400": { + "description": "Schema request not valid.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + }, + "404": { + "description": "Schema or app not found." + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.apps.{app}.schemas.{schema}.update" + ] + } + ] + } + }, + "/api/apps/{app}/schemas/{schema}/category": { + "put": { + "tags": [ + "Schemas" + ], + "summary": "Update a schema category.", + "operationId": "Schemas_PutCategory", + "parameters": [ + { + "name": "app", + "in": "path", + "required": true, + "description": "The name of the app.", + "schema": { + "type": "string" + }, + "x-position": 1 + }, + { + "name": "schema", + "in": "path", + "required": true, + "description": "The name of the schema.", + "schema": { + "type": "string" + }, + "x-position": 2 + } + ], + "requestBody": { + "x-name": "request", + "description": "The schema object that needs to updated.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ChangeCategoryDto" + } + } + }, + "required": true, + "x-position": 3 + }, + "responses": { + "200": { + "description": "Schema updated.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SchemaDto" + } + } + } + }, + "400": { + "description": "Schema request not valid.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + }, + "404": { + "description": "Schema or app not found." + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.apps.{app}.schemas.{schema}.update" + ] + } + ] + } + }, + "/api/apps/{app}/schemas/{schema}/preview-urls": { + "put": { + "tags": [ + "Schemas" + ], + "summary": "Update the preview urls.", + "operationId": "Schemas_PutPreviewUrls", + "parameters": [ + { + "name": "app", + "in": "path", + "required": true, + "description": "The name of the app.", + "schema": { + "type": "string" + }, + "x-position": 1 + }, + { + "name": "schema", + "in": "path", + "required": true, + "description": "The name of the schema.", + "schema": { + "type": "string" + }, + "x-position": 2 + } + ], + "requestBody": { + "x-name": "request", + "description": "The preview urls for the schema.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ConfigurePreviewUrlsDto" + } + } + }, + "required": true, + "x-position": 3 + }, + "responses": { + "200": { + "description": "Schema updated.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SchemaDto" + } + } + } + }, + "400": { + "description": "Schema request not valid.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + }, + "404": { + "description": "Schema or app not found." + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.apps.{app}.schemas.{schema}.update" + ] + } + ] + } + }, + "/api/apps/{app}/schemas/{schema}/scripts": { + "put": { + "tags": [ + "Schemas" + ], + "summary": "Update the scripts.", + "operationId": "Schemas_PutScripts", + "parameters": [ + { + "name": "app", + "in": "path", + "required": true, + "description": "The name of the app.", + "schema": { + "type": "string" + }, + "x-position": 1 + }, + { + "name": "schema", + "in": "path", + "required": true, + "description": "The name of the schema.", + "schema": { + "type": "string" + }, + "x-position": 2 + } + ], + "requestBody": { + "x-name": "request", + "description": "The schema scripts object that needs to updated.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SchemaScriptsDto" + } + } + }, + "required": true, + "x-position": 3 + }, + "responses": { + "200": { + "description": "Schema updated.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SchemaDto" + } + } + } + }, + "400": { + "description": "Schema request not valid.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + }, + "404": { + "description": "Schema or app not found." + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.apps.{app}.schemas.{schema}.scripts" + ] + } + ] + } + }, + "/api/apps/{app}/schemas/{schema}/rules": { + "put": { + "tags": [ + "Schemas" + ], + "summary": "Update the rules.", + "operationId": "Schemas_PutRules", + "parameters": [ + { + "name": "app", + "in": "path", + "required": true, + "description": "The name of the app.", + "schema": { + "type": "string" + }, + "x-position": 1 + }, + { + "name": "schema", + "in": "path", + "required": true, + "description": "The name of the schema.", + "schema": { + "type": "string" + }, + "x-position": 2 + } + ], + "requestBody": { + "x-name": "request", + "description": "The schema rules object that needs to updated.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ConfigureFieldRulesDto" + } + } + }, + "required": true, + "x-position": 3 + }, + "responses": { + "200": { + "description": "Schema updated.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SchemaDto" + } + } + } + }, + "400": { + "description": "Schema request not valid.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + }, + "404": { + "description": "Schema or app not found." + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.apps.{app}.schemas.{schema}.update" + ] + } + ] + } + }, + "/api/apps/{app}/schemas/{schema}/publish": { + "put": { + "tags": [ + "Schemas" + ], + "summary": "Publish a schema.", + "operationId": "Schemas_PublishSchema", + "parameters": [ + { + "name": "app", + "in": "path", + "required": true, + "description": "The name of the app.", + "schema": { + "type": "string" + }, + "x-position": 1 + }, + { + "name": "schema", + "in": "path", + "required": true, + "description": "The name of the schema to publish.", + "schema": { + "type": "string" + }, + "x-position": 2 + } + ], + "responses": { + "200": { + "description": "Schema published.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SchemaDto" + } + } + } + }, + "404": { + "description": "Schema or app not found." + }, + "400": { + "description": "Validation error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.apps.{app}.schemas.{schema}.publish" + ] + } + ] + } + }, + "/api/apps/{app}/schemas/{schema}/unpublish": { + "put": { + "tags": [ + "Schemas" + ], + "summary": "Unpublish a schema.", + "operationId": "Schemas_UnpublishSchema", + "parameters": [ + { + "name": "app", + "in": "path", + "required": true, + "description": "The name of the app.", + "schema": { + "type": "string" + }, + "x-position": 1 + }, + { + "name": "schema", + "in": "path", + "required": true, + "description": "The name of the schema to unpublish.", + "schema": { + "type": "string" + }, + "x-position": 2 + } + ], + "responses": { + "200": { + "description": "Schema unpublished.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SchemaDto" + } + } + } + }, + "404": { + "description": "Schema or app not found." + }, + "400": { + "description": "Validation error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.apps.{app}.schemas.{schema}.publish" + ] + } + ] + } + }, + "/api/rules/steps": { + "get": { + "tags": [ + "Rules" + ], + "summary": "Get supported rule steps.", + "operationId": "Rules_GetSteps", + "responses": { + "200": { + "description": "Rule actions returned.", + "content": { + "application/json": { + "schema": { + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/RuleElementDto" + } + } + } + } + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [] + } + ] + } + }, + "/api/apps/{app}/rules": { + "get": { + "tags": [ + "Rules" + ], + "summary": "Get rules.", + "operationId": "Rules_GetRules", + "parameters": [ + { + "name": "app", + "in": "path", + "required": true, + "description": "The name of the app.", + "schema": { + "type": "string" + }, + "x-position": 1 + } + ], + "responses": { + "200": { + "description": "Rules returned.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RulesDto" + } + } + } + }, + "404": { + "description": "App not found." + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.apps.{app}.rules.read" + ] + } + ] + }, + "post": { + "tags": [ + "Rules" + ], + "summary": "Create a new rule.", + "operationId": "Rules_PostRule", + "parameters": [ + { + "name": "app", + "in": "path", + "required": true, + "description": "The name of the app.", + "schema": { + "type": "string" + }, + "x-position": 1 + } + ], + "requestBody": { + "x-name": "request", + "description": "The rule object that needs to be added to the app.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateRuleDto" + } + } + }, + "required": true, + "x-position": 2 + }, + "responses": { + "201": { + "description": "Rule created.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RuleDto" + } + } + } + }, + "400": { + "description": "Rule request not valid.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + }, + "404": { + "description": "App not found." + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.apps.{app}.rules.create" + ] + } + ] + } + }, + "/api/apps/{app}/rules/run": { + "delete": { + "tags": [ + "Rules" + ], + "summary": "Cancel the current run.", + "operationId": "Rules_DeleteRuleRun", + "parameters": [ + { + "name": "app", + "in": "path", + "required": true, + "description": "The name of the app.", + "schema": { + "type": "string" + }, + "x-position": 1 + } + ], + "responses": { + "204": { + "description": "Rule run cancelled." + }, + "400": { + "description": "Validation error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.apps.{app}.rules.events.update" + ] + } + ] + } + }, + "/api/apps/{app}/rules/{id}": { + "put": { + "tags": [ + "Rules" + ], + "summary": "Update a rule.", + "operationId": "Rules_PutRule", + "parameters": [ + { + "name": "app", + "in": "path", + "required": true, + "description": "The name of the app.", + "schema": { + "type": "string" + }, + "x-position": 1 + }, + { + "name": "id", + "in": "path", + "required": true, + "description": "The ID of the rule to update.", + "schema": { + "type": "string" + }, + "x-position": 2 + } + ], + "requestBody": { + "x-name": "request", + "description": "The rule object that needs to be added to the app.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateRuleDto" + } + } + }, + "required": true, + "x-position": 3 + }, + "responses": { + "200": { + "description": "Rule updated.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RuleDto" + } + } + } + }, + "400": { + "description": "Rule request not valid.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + }, + "404": { + "description": "Rule or app not found." + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.apps.{app}.rules.update" + ] + } + ] + }, + "delete": { + "tags": [ + "Rules" + ], + "summary": "Delete a rule.", + "operationId": "Rules_DeleteRule", + "parameters": [ + { + "name": "app", + "in": "path", + "required": true, + "description": "The name of the app.", + "schema": { + "type": "string" + }, + "x-position": 1 + }, + { + "name": "id", + "in": "path", + "required": true, + "description": "The ID of the rule to delete.", + "schema": { + "type": "string" + }, + "x-position": 2 + } + ], + "responses": { + "204": { + "description": "Rule deleted." + }, + "404": { + "description": "Rule or app not found." + }, + "400": { + "description": "Validation error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.apps.{app}.rules.delete" + ] + } + ] + } + }, + "/api/apps/{app}/rules/{id}/enable": { + "put": { + "tags": [ + "Rules" + ], + "summary": "Enable a rule.", + "operationId": "Rules_EnableRule", + "parameters": [ + { + "name": "app", + "in": "path", + "required": true, + "description": "The name of the app.", + "schema": { + "type": "string" + }, + "x-position": 1 + }, + { + "name": "id", + "in": "path", + "required": true, + "description": "The ID of the rule to enable.", + "schema": { + "type": "string" + }, + "x-position": 2 + } + ], + "responses": { + "200": { + "description": "Rule enabled.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RuleDto" + } + } + } + }, + "404": { + "description": "Rule or app not found." + }, + "400": { + "description": "Validation error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.apps.{app}.rules.disable" + ] + } + ] + } + }, + "/api/apps/{app}/rules/{id}/disable": { + "put": { + "tags": [ + "Rules" + ], + "summary": "Disable a rule.", + "operationId": "Rules_DisableRule", + "parameters": [ + { + "name": "app", + "in": "path", + "required": true, + "description": "The name of the app.", + "schema": { + "type": "string" + }, + "x-position": 1 + }, + { + "name": "id", + "in": "path", + "required": true, + "description": "The ID of the rule to disable.", + "schema": { + "type": "string" + }, + "x-position": 2 + } + ], + "responses": { + "200": { + "description": "Rule disabled.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RuleDto" + } + } + } + }, + "404": { + "description": "Rule or app not found." + }, + "400": { + "description": "Validation error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.apps.{app}.rules.disable" + ] + } + ] + } + }, + "/api/apps/{app}/rules/{id}/trigger": { + "put": { + "tags": [ + "Rules" + ], + "summary": "Trigger a rule.", + "operationId": "Rules_TriggerRule", + "parameters": [ + { + "name": "app", + "in": "path", + "required": true, + "description": "The name of the app.", + "schema": { + "type": "string" + }, + "x-position": 1 + }, + { + "name": "id", + "in": "path", + "required": true, + "description": "The ID of the rule to disable.", + "schema": { + "type": "string" + }, + "x-position": 2 + } + ], + "requestBody": { + "x-name": "request", + "description": "The arguments for the rule flow.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TriggerRuleDto" + } + } + }, + "required": true, + "x-position": 3 + }, + "responses": { + "204": { + "description": "Rule triggered." + }, + "404": { + "description": "Rule or app not found." + }, + "400": { + "description": "Validation error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.apps.{app}.rules.events.run" + ] + } + ] + } + }, + "/api/apps/{app}/rules/{id}/run": { + "put": { + "tags": [ + "Rules" + ], + "summary": "Run a rule.", + "operationId": "Rules_PutRuleRun", + "parameters": [ + { + "name": "app", + "in": "path", + "required": true, + "description": "The name of the app.", + "schema": { + "type": "string" + }, + "x-position": 1 + }, + { + "name": "id", + "in": "path", + "required": true, + "description": "The ID of the rule to run.", + "schema": { + "type": "string" + }, + "x-position": 2 + }, + { + "name": "fromSnapshots", + "in": "query", + "description": "Runs the rule from snapeshots if possible.", + "schema": { + "type": "boolean", + "default": false + }, + "x-position": 3 + } + ], + "responses": { + "204": { + "description": "Rule started." + }, + "400": { + "description": "Validation error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.apps.{app}.rules.events.run" + ] + } + ] + } + }, + "/api/apps/{app}/rules/{id}/events": { + "delete": { + "tags": [ + "Rules" + ], + "summary": "Cancels all rule events.", + "operationId": "Rules_DeleteRuleEvents", + "parameters": [ + { + "name": "app", + "in": "path", + "required": true, + "description": "The name of the app.", + "schema": { + "type": "string" + }, + "x-position": 1 + }, + { + "name": "id", + "in": "path", + "required": true, + "description": "The ID of the rule to cancel.", + "schema": { + "type": "string" + }, + "x-position": 2 + } + ], + "responses": { + "204": { + "description": "Rule events cancelled." + }, + "400": { + "description": "Validation error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.apps.{app}.rules.events.delete" + ] + } + ] + } + }, + "/api/apps/{app}/rules/validate/trigger": { + "post": { + "tags": [ + "Rules" + ], + "summary": "Validates a rule trigger.", + "operationId": "Rules_ValidateTrigger", + "parameters": [ + { + "name": "app", + "in": "path", + "required": true, + "description": "The name of the app.", + "schema": { + "type": "string" + }, + "x-position": 1 + } + ], + "requestBody": { + "x-name": "request", + "description": "The rule trigger that needs to be validate.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RuleTriggerDto" + } + } + }, + "required": true, + "x-position": 2 + }, + "responses": { + "204": { + "description": "Rule trigger validated." + }, + "400": { + "description": "Rule trigger not valid.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + }, + "404": { + "description": "Rule or app not found." + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [] + } + ] + } + }, + "/api/apps/{app}/rules/validate/step": { + "post": { + "tags": [ + "Rules" + ], + "summary": "Validates a rule step.", + "operationId": "Rules_ValidateStep", + "parameters": [ + { + "name": "app", + "in": "path", + "required": true, + "description": "The name of the app.", + "schema": { + "type": "string" + }, + "x-position": 1 + } + ], + "requestBody": { + "x-name": "request", + "description": "The rule step that needs to be validate.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/FlowStepDto" + } + } + }, + "required": true, + "x-position": 2 + }, + "responses": { + "204": { + "description": "Rule step validated." + }, + "400": { + "description": "Rule step not valid.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + }, + "404": { + "description": "Rule or app not found." + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [] + } + ] + } + }, + "/api/apps/{app}/rules/simulate": { + "post": { + "tags": [ + "Rules" + ], + "summary": "Simulate a rule.", + "operationId": "Rules_SimulatePOST", + "parameters": [ + { + "name": "app", + "in": "path", + "required": true, + "description": "The name of the app.", + "schema": { + "type": "string" + }, + "x-position": 1 + } + ], + "requestBody": { + "x-name": "request", + "description": "The rule to simulate.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateRuleDto" + } + } + }, + "required": true, + "x-position": 2 + }, + "responses": { + "200": { + "description": "Rule simulated.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SimulatedRuleEventsDto" + } + } + } + }, + "404": { + "description": "Rule or app not found." + }, + "400": { + "description": "Validation error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.apps.{app}.rules.events.read" + ] + } + ] + } + }, + "/api/apps/{app}/rules/{id}/simulate": { + "get": { + "tags": [ + "Rules" + ], + "summary": "Simulate a rule.", + "operationId": "Rules_SimulateGET", + "parameters": [ + { + "name": "app", + "in": "path", + "required": true, + "description": "The name of the app.", + "schema": { + "type": "string" + }, + "x-position": 1 + }, + { + "name": "id", + "in": "path", + "required": true, + "description": "The ID of the rule to simulate.", + "schema": { + "type": "string" + }, + "x-position": 2 + } + ], + "responses": { + "200": { + "description": "Rule simulated.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SimulatedRuleEventsDto" + } + } + } + }, + "404": { + "description": "Rule or app not found." + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.apps.{app}.rules.events.read" + ] + } + ] + } + }, + "/api/apps/{app}/rules/events": { + "get": { + "tags": [ + "Rules" + ], + "summary": "Get rule events.", + "operationId": "Rules_GetEvents", + "parameters": [ + { + "name": "app", + "in": "path", + "required": true, + "description": "The name of the app.", + "schema": { + "type": "string" + }, + "x-position": 1 + }, + { + "name": "ruleId", + "in": "query", + "description": "The optional rule id to filter to events.", + "schema": { + "type": "string", + "nullable": true + }, + "x-position": 2 + }, + { + "name": "skip", + "in": "query", + "description": "The number of events to skip.", + "schema": { + "type": "integer", + "format": "int32", + "default": 0 + }, + "x-position": 3 + }, + { + "name": "take", + "in": "query", + "description": "The number of events to take.", + "schema": { + "type": "integer", + "format": "int32", + "default": 20 + }, + "x-position": 4 + } + ], + "responses": { + "200": { + "description": "Rule events returned.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RuleEventsDto" + } + } + } + }, + "404": { + "description": "App not found." + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.apps.{app}.rules.events.read" + ] + } + ] + }, + "delete": { + "tags": [ + "Rules" + ], + "summary": "Cancels all events.", + "operationId": "Rules_DeleteEvents", + "parameters": [ + { + "name": "app", + "in": "path", + "required": true, + "description": "The name of the app.", + "schema": { + "type": "string" + }, + "x-position": 1 + } + ], + "responses": { + "204": { + "description": "Events cancelled." + }, + "400": { + "description": "Validation error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.apps.{app}.rules.events.delete" + ] + } + ] + } + }, + "/api/apps/{app}/rules/events/{id}": { + "put": { + "tags": [ + "Rules" + ], + "summary": "Retry the event immediately.", + "operationId": "Rules_PutEvent", + "parameters": [ + { + "name": "app", + "in": "path", + "required": true, + "description": "The name of the app.", + "schema": { + "type": "string" + }, + "x-position": 1 + }, + { + "name": "id", + "in": "path", + "required": true, + "description": "The event to enqueue.", + "schema": { + "type": "string", + "format": "guid" + }, + "x-position": 2 + } + ], + "responses": { + "204": { + "description": "Rule enqueued." + }, + "404": { + "description": "App or rule event not found." + }, + "400": { + "description": "Validation error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.apps.{app}.rules.events.update" + ] + } + ] + }, + "delete": { + "tags": [ + "Rules" + ], + "summary": "Cancels an event.", + "operationId": "Rules_DeleteEvent", + "parameters": [ + { + "name": "app", + "in": "path", + "required": true, + "description": "The name of the app.", + "schema": { + "type": "string" + }, + "x-position": 1 + }, + { + "name": "id", + "in": "path", + "required": true, + "description": "The event to cancel.", + "schema": { + "type": "string", + "format": "guid" + }, + "x-position": 2 + } + ], + "responses": { + "204": { + "description": "Rule event cancelled." + }, + "404": { + "description": "App or rule event not found." + }, + "400": { + "description": "Validation error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [] + } + ] + } + }, + "/api/rules/eventtypes": { + "get": { + "tags": [ + "Rules" + ], + "summary": "Provide a list of all event types that are used in rules.", + "operationId": "Rules_GetEventTypes", + "responses": { + "200": { + "description": "Rule events returned.", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "type": "string" + } + } + } + } + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + } + } + }, + "/api/rules/eventtypes/{type}": { + "get": { + "tags": [ + "Rules" + ], + "summary": "Provide the json schema for the event with the specified name.", + "operationId": "Rules_GetEventSchema", + "parameters": [ + { + "name": "type", + "in": "path", + "required": true, + "description": "The type name of the event.", + "schema": { + "type": "string" + }, + "x-position": 1 + } + ], + "responses": { + "200": { + "description": "Rule event type found.", + "content": { + "application/json": { + "schema": {} + } + } + }, + "404": { + "description": "Rule event not found." + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + } + } + }, + "/api/apps/{app}/plans": { + "get": { + "tags": [ + "Plans" + ], + "summary": "Get app plan information.", + "operationId": "AppPlans_GetPlans", + "parameters": [ + { + "name": "app", + "in": "path", + "required": true, + "description": "The name of the app.", + "schema": { + "type": "string" + }, + "x-position": 1 + } + ], + "responses": { + "200": { + "description": "App plan information returned.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PlansDto" + } + } + } + }, + "404": { + "description": "App not found." + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.apps.{app}.plans.read" + ] + } + ] + } + }, + "/api/apps/{app}/plan": { + "put": { + "tags": [ + "Plans" + ], + "summary": "Change the app plan.", + "operationId": "AppPlans_PutPlan", + "parameters": [ + { + "name": "app", + "in": "path", + "required": true, + "description": "The name of the app.", + "schema": { + "type": "string" + }, + "x-position": 1 + } + ], + "requestBody": { + "x-name": "request", + "description": "Plan object that needs to be changed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ChangePlanDto" + } + } + }, + "required": true, + "x-position": 2 + }, + "responses": { + "200": { + "description": "Plan changed or redirect url returned.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PlanChangedDto" + } + } + } + }, + "400": { + "description": "Plan not owned by user.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + }, + "404": { + "description": "App not found." + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.apps.{app}.plans.change" + ] + } + ] + } + }, + "/api/teams/{team}/plans": { + "get": { + "tags": [ + "Plans" + ], + "summary": "Get team plan information.", + "operationId": "TeamPlans_GetTeamPlans", + "parameters": [ + { + "name": "team", + "in": "path", + "required": true, + "description": "The name of the team.", + "schema": { + "type": "string" + }, + "x-position": 1 + } + ], + "responses": { + "200": { + "description": "Team plan information returned.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PlansDto" + } + } + } + }, + "404": { + "description": "Team not found." + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.teams.{team}.plans.read" + ] + } + ] + } + }, + "/api/teams/{team}/plan": { + "put": { + "tags": [ + "Plans" + ], + "summary": "Change the team plan.", + "operationId": "TeamPlans_PutTeamPlan", + "parameters": [ + { + "name": "team", + "in": "path", + "required": true, + "description": "The name of the team.", + "schema": { + "type": "string" + }, + "x-position": 1 + } + ], + "requestBody": { + "x-name": "request", + "description": "Plan object that needs to be changed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ChangePlanDto" + } + } + }, + "required": true, + "x-position": 2 + }, + "responses": { + "200": { + "description": "Plan changed or redirect url returned.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PlanChangedDto" + } + } + } + }, + "404": { + "description": "Team not found." + }, + "400": { + "description": "Validation error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.teams.{team}.plans.change" + ] + } + ] + } + }, + "/api/info": { + "get": { + "tags": [ + "Ping" + ], + "summary": "Get API information.", + "operationId": "Ping_GetInfo", + "responses": { + "200": { + "description": "Infos returned.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ExposedValues" + } + } + } + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + } + } + }, + "/api/ping": { + "get": { + "tags": [ + "Ping" + ], + "summary": "Get ping status of the API.", + "description": "Can be used to test, if the Squidex API is alive and responding.", + "operationId": "Ping_GetPing", + "responses": { + "204": { + "description": "Service ping successful." + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + } + } + }, + "/api/ping/{app}": { + "get": { + "tags": [ + "Ping" + ], + "summary": "Get ping status.", + "description": "Can be used to test, if the Squidex API is alive and responding.", + "operationId": "Ping_GetAppPing", + "parameters": [ + { + "name": "app", + "in": "path", + "required": true, + "description": "The name of the app.", + "schema": { + "type": "string" + }, + "x-position": 1 + } + ], + "responses": { + "204": { + "description": "Service ping successful." + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.apps.{app}.ping" + ] + } + ] + } + }, + "/api/news/features": { + "get": { + "tags": [ + "News" + ], + "summary": "Get features since version.", + "operationId": "News_GetNews", + "parameters": [ + { + "name": "version", + "in": "query", + "description": "The latest received version.", + "schema": { + "type": "integer", + "format": "int32", + "default": 0 + }, + "x-position": 1 + } + ], + "responses": { + "200": { + "description": "Latest features returned.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/FeaturesDto" + } + } + } + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [] + } + ] + } + }, + "/api/languages": { + "get": { + "tags": [ + "Languages" + ], + "summary": "Get supported languages.", + "description": "Provide a list of supported language codes, following the ISO2Code standard.", + "operationId": "Languages_GetLanguages", + "responses": { + "200": { + "description": "Supported language codes returned.", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/LanguageDto" + } + } + } + } + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [] + } + ] + } + }, + "/api/apps/jobs/{id}": { + "get": { + "tags": [ + "Jobs" + ], + "summary": "Get the job content.", + "operationId": "JobsContent_GetJobContent", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "description": "The ID of the job.", + "schema": { + "type": "string" + }, + "x-position": 1 + }, + { + "name": "appId", + "in": "query", + "description": "The ID of the app.", + "schema": { + "type": "string" + }, + "x-position": 2 + } + ], + "responses": { + "200": { + "description": "Job found and content returned.", + "content": { + "application/octet-stream": { + "schema": { + "type": "string", + "format": "binary" + } + } + } + }, + "404": { + "description": "Job or app not found." + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + } + } + }, + "/api/apps/{app}/jobs": { + "get": { + "tags": [ + "Jobs" + ], + "summary": "Get all jobs.", + "operationId": "Jobs_GetJobs", + "parameters": [ + { + "name": "app", + "in": "path", + "required": true, + "description": "The name of the app.", + "schema": { + "type": "string" + }, + "x-position": 1 + } + ], + "responses": { + "200": { + "description": "Jobs returned.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/JobsDto" + } + } + } + }, + "404": { + "description": "App not found." + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.apps.{app}.jobs.read" + ] + } + ] + } + }, + "/api/apps/{app}/jobs/{id}": { + "delete": { + "tags": [ + "Jobs" + ], + "summary": "Delete a job.", + "operationId": "Jobs_DeleteJob", + "parameters": [ + { + "name": "app", + "in": "path", + "required": true, + "description": "The name of the app.", + "schema": { + "type": "string" + }, + "x-position": 1 + }, + { + "name": "id", + "in": "path", + "required": true, + "description": "The ID of the jobs to delete.", + "schema": { + "type": "string" + }, + "x-position": 2 + } + ], + "responses": { + "204": { + "description": "Job deleted." + }, + "404": { + "description": "Job or app not found." + }, + "400": { + "description": "Validation error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.apps.{app}.jobs.delete" + ] + } + ] + } + }, + "/api/apps/{app}/history": { + "get": { + "tags": [ + "History" + ], + "summary": "Get the app history.", + "operationId": "History_GetAppHistory", + "parameters": [ + { + "name": "app", + "in": "path", + "required": true, + "description": "The name of the app.", + "schema": { + "type": "string" + }, + "x-position": 1 + }, + { + "name": "channel", + "in": "query", + "description": "The name of the channel.", + "schema": { + "type": "string" + }, + "x-position": 2 + } + ], + "responses": { + "200": { + "description": "Events returned.", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/HistoryEventDto" + } + } + } + } + }, + "404": { + "description": "App not found." + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.apps.{app}.history" + ] + } + ] + } + }, + "/api/teams/{team}/history": { + "get": { + "tags": [ + "History" + ], + "summary": "Get the team history.", + "operationId": "History_GetTeamHistory", + "parameters": [ + { + "name": "team", + "in": "path", + "required": true, + "description": "The ID of the team.", + "schema": { + "type": "string" + }, + "x-position": 1 + }, + { + "name": "channel", + "in": "query", + "description": "The name of the channel.", + "schema": { + "type": "string" + }, + "x-position": 2 + } + ], + "responses": { + "200": { + "description": "Events returned.", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/HistoryEventDto" + } + } + } + } + }, + "404": { + "description": "Team not found." + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.teams.{team}.history" + ] + } + ] + } + }, + "/api/event-consumers": { + "get": { + "tags": [ + "EventConsumers" + ], + "summary": "Get event consumers.", + "operationId": "EventConsumers_GetEventConsumers", + "responses": { + "200": { + "description": "Event consumers returned.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/EventConsumersDto" + } + } + } + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.admin.events.read" + ] + } + ] + } + }, + "/api/event-consumers/{consumerName}/start": { + "put": { + "tags": [ + "EventConsumers" + ], + "summary": "Start an event consumer.", + "operationId": "EventConsumers_StartEventConsumer", + "parameters": [ + { + "name": "consumerName", + "in": "path", + "required": true, + "description": "The name of the event consumer.", + "schema": { + "type": "string" + }, + "x-position": 1 + } + ], + "responses": { + "200": { + "description": "Event consumer started asynchronously.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/EventConsumerDto" + } + } + } + }, + "404": { + "description": "Event consumer not found." + }, + "400": { + "description": "Validation error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.admin.events.manage" + ] + } + ] + } + }, + "/api/event-consumers/{consumerName}/stop": { + "put": { + "tags": [ + "EventConsumers" + ], + "summary": "Stop an event consumer.", + "operationId": "EventConsumers_StopEventConsumer", + "parameters": [ + { + "name": "consumerName", + "in": "path", + "required": true, + "description": "The name of the event consumer.", + "schema": { + "type": "string" + }, + "x-position": 1 + } + ], + "responses": { + "200": { + "description": "Event consumer stopped asynchronously.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/EventConsumerDto" + } + } + } + }, + "404": { + "description": "Event consumer not found." + }, + "400": { + "description": "Validation error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.admin.events.manage" + ] + } + ] + } + }, + "/api/event-consumers/{consumerName}/reset": { + "put": { + "tags": [ + "EventConsumers" + ], + "summary": "Reset an event consumer.", + "operationId": "EventConsumers_ResetEventConsumer", + "parameters": [ + { + "name": "consumerName", + "in": "path", + "required": true, + "description": "The name of the event consumer.", + "schema": { + "type": "string" + }, + "x-position": 1 + } + ], + "responses": { + "200": { + "description": "Event consumer resetted asynchronously.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/EventConsumerDto" + } + } + } + }, + "404": { + "description": "Event consumer not found." + }, + "400": { + "description": "Validation error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.admin.events.manage" + ] + } + ] + } + }, + "/api/diagnostics/dump": { + "get": { + "tags": [ + "Diagnostics" + ], + "summary": "Creates a dump and writes it into storage..", + "operationId": "Diagnostics_GetDump", + "responses": { + "204": { + "description": "Dump created successful." + }, + "501": { + "description": "Not configured.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.admin.*" + ] + } + ] + } + }, + "/api/diagnostics/gcdump": { + "get": { + "tags": [ + "Diagnostics" + ], + "summary": "Creates a gc dump and writes it into storage.", + "operationId": "Diagnostics_GetGCDump", + "responses": { + "204": { + "description": "Dump created successful." + }, + "501": { + "description": "Not configured.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.admin.*" + ] + } + ] + } + }, + "/api/content/{app}/{schema}": { + "get": { + "tags": [ + "Contents" + ], + "summary": "Queries contents.", + "description": "You can read the generated documentation for your app at /api/content/{appName}/docs.", + "operationId": "Contents_GetContents", + "parameters": [ + { + "name": "app", + "in": "path", + "required": true, + "description": "The name of the app.", + "schema": { + "type": "string" + }, + "x-position": 0 + }, + { + "name": "schema", + "in": "path", + "required": true, + "description": "The name of the schema.", + "schema": { + "type": "string" + }, + "x-position": 1 + }, + { + "name": "ids", + "in": "query", + "description": "The optional ids of the content to fetch.", + "schema": { + "type": "string", + "nullable": true + }, + "x-position": 2 + }, + { + "name": "q", + "in": "query", + "description": "The optional json query.", + "schema": { + "type": "string", + "nullable": true + }, + "x-position": 3 + }, + { + "name": "$search", + "in": "query", + "description": "Optional number of items to skip.", + "schema": { + "type": "string" + }, + "x-position": 4 + }, + { + "name": "$top", + "in": "query", + "description": "Optional number of items to take.", + "schema": { + "type": "number" + }, + "x-position": 5 + }, + { + "name": "$skip", + "in": "query", + "description": "Optional number of items to skip.", + "schema": { + "type": "number" + }, + "x-position": 6 + }, + { + "name": "$orderby", + "in": "query", + "description": "Optional OData order definition.", + "schema": { + "type": "string" + }, + "x-position": 7 + }, + { + "name": "$filter", + "in": "query", + "description": "Optional OData filter.", + "schema": { + "type": "string" + }, + "x-position": 8 + }, + { + "name": "X-Fields", + "in": "header", + "description": "The list of content fields (comma-separated).", + "schema": { + "type": "string" + }, + "x-position": 9 + }, + { + "name": "X-Flatten", + "in": "header", + "description": "Provide the data as flat object.", + "schema": { + "type": "boolean" + }, + "x-position": 10 + }, + { + "name": "X-Languages", + "in": "header", + "description": "The list of languages to resolve (comma-separated).", + "schema": { + "type": "string" + }, + "x-position": 11 + }, + { + "name": "X-NoSlowTotal", + "in": "header", + "description": "Do not return the total amount, if it would be slow.", + "schema": { + "type": "boolean" + }, + "x-position": 12 + }, + { + "name": "X-NoTotal", + "in": "header", + "description": "Do not return the total amount.", + "schema": { + "type": "boolean" + }, + "x-position": 13 + }, + { + "name": "X-Unpublished", + "in": "header", + "description": "Return unpublished content items.", + "schema": { + "type": "boolean" + }, + "x-position": 14 + } + ], + "responses": { + "200": { + "description": "Contents returned.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ContentsDto" + } + } + } + }, + "404": { + "description": "Schema or app not found." + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [] + } + ] + }, + "post": { + "tags": [ + "Contents" + ], + "summary": "Create a content item.", + "description": "You can read the generated documentation for your app at /api/content/{appName}/docs.", + "operationId": "Contents_PostContent", + "parameters": [ + { + "name": "app", + "in": "path", + "required": true, + "description": "The name of the app.", + "schema": { + "type": "string" + }, + "x-position": 0 + }, + { + "name": "schema", + "in": "path", + "required": true, + "description": "The name of the schema.", + "schema": { + "type": "string" + }, + "x-position": 1 + }, + { + "name": "status", + "in": "query", + "description": "The initial status.", + "schema": { + "type": "string", + "nullable": true + }, + "x-position": 3 + }, + { + "name": "id", + "in": "query", + "description": "The optional custom content id.", + "schema": { + "type": "string", + "nullable": true + }, + "x-position": 4 + }, + { + "name": "publish", + "in": "query", + "description": "True to automatically publish the content.", + "schema": { + "type": "boolean" + }, + "x-position": 5 + }, + { + "name": "X-Unpublished", + "in": "header", + "description": "Return unpublished content items.", + "schema": { + "type": "boolean" + }, + "x-position": 6 + }, + { + "name": "X-Languages", + "in": "header", + "description": "The list of languages to resolve (comma-separated).", + "schema": { + "type": "string" + }, + "x-position": 7 + } + ], + "requestBody": { + "x-name": "Data", + "description": "The full data for the content item.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ContentData" + } + } + }, + "required": true, + "x-position": 2 + }, + "responses": { + "201": { + "description": "Content created.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ContentDto" + } + } + } + }, + "400": { + "description": "Content request not valid.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + }, + "404": { + "description": "Content, schema or app not found." + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.apps.{app}.contents.{schema}.create" + ] + } + ] + } + }, + "/api/content/{app}/{schema}/query": { + "post": { + "tags": [ + "Contents" + ], + "summary": "Queries contents.", + "description": "You can read the generated documentation for your app at /api/content/{appName}/docs.", + "operationId": "Contents_GetContentsPost", + "parameters": [ + { + "name": "app", + "in": "path", + "required": true, + "description": "The name of the app.", + "schema": { + "type": "string" + }, + "x-position": 0 + }, + { + "name": "schema", + "in": "path", + "required": true, + "description": "The name of the schema.", + "schema": { + "type": "string" + }, + "x-position": 1 + }, + { + "name": "X-Fields", + "in": "header", + "description": "The list of content fields (comma-separated).", + "schema": { + "type": "string" + }, + "x-position": 3 + }, + { + "name": "X-Flatten", + "in": "header", + "description": "Provide the data as flat object.", + "schema": { + "type": "boolean" + }, + "x-position": 4 + }, + { + "name": "X-Languages", + "in": "header", + "description": "The list of languages to resolve (comma-separated).", + "schema": { + "type": "string" + }, + "x-position": 5 + }, + { + "name": "X-NoSlowTotal", + "in": "header", + "description": "Do not return the total amount, if it would be slow.", + "schema": { + "type": "boolean" + }, + "x-position": 6 + }, + { + "name": "X-NoTotal", + "in": "header", + "description": "Do not return the total amount.", + "schema": { + "type": "boolean" + }, + "x-position": 7 + }, + { + "name": "X-Unpublished", + "in": "header", + "description": "Return unpublished content items.", + "schema": { + "type": "boolean" + }, + "x-position": 8 + } + ], + "requestBody": { + "x-name": "query", + "description": "The required query object.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/QueryDto" + } + } + }, + "required": true, + "x-position": 2 + }, + "responses": { + "200": { + "description": "Contents returned.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ContentsDto" + } + } + } + }, + "404": { + "description": "Schema or app not found." + }, + "400": { + "description": "Validation error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [] + } + ] + } + }, + "/api/content/{app}/{schema}/{id}": { + "get": { + "tags": [ + "Contents" + ], + "summary": "Get a content item.", + "description": "You can read the generated documentation for your app at /api/content/{appName}/docs.", + "operationId": "Contents_GetContent", + "parameters": [ + { + "name": "app", + "in": "path", + "required": true, + "description": "The name of the app.", + "schema": { + "type": "string" + }, + "x-position": 0 + }, + { + "name": "schema", + "in": "path", + "required": true, + "description": "The name of the schema.", + "schema": { + "type": "string" + }, + "x-position": 1 + }, + { + "name": "id", + "in": "path", + "required": true, + "description": "The ID of the content to fetch.", + "schema": { + "type": "string" + }, + "x-position": 2 + }, + { + "name": "version", + "in": "query", + "description": "The optional version.", + "schema": { + "type": "integer", + "format": "int64", + "default": -2 + }, + "x-position": 3 + }, + { + "name": "X-Fields", + "in": "header", + "description": "The list of content fields (comma-separated).", + "schema": { + "type": "string" + }, + "x-position": 4 + }, + { + "name": "X-Flatten", + "in": "header", + "description": "Provide the data as flat object.", + "schema": { + "type": "boolean" + }, + "x-position": 5 + }, + { + "name": "X-Languages", + "in": "header", + "description": "The list of languages to resolve (comma-separated).", + "schema": { + "type": "string" + }, + "x-position": 6 + }, + { + "name": "X-Unpublished", + "in": "header", + "description": "Return unpublished content items.", + "schema": { + "type": "boolean" + }, + "x-position": 7 + } + ], + "responses": { + "200": { + "description": "Content returned.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ContentDto" + } + } + } + }, + "404": { + "description": "Content, schema or app not found." + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [] + } + ] + }, + "post": { + "tags": [ + "Contents" + ], + "summary": "Upsert a content item.", + "description": "You can read the generated documentation for your app at /api/content/{appName}/docs.", + "operationId": "Contents_PostUpsertContent", + "parameters": [ + { + "name": "app", + "in": "path", + "required": true, + "description": "The name of the app.", + "schema": { + "type": "string" + }, + "x-position": 0 + }, + { + "name": "schema", + "in": "path", + "required": true, + "description": "The name of the schema.", + "schema": { + "type": "string" + }, + "x-position": 1 + }, + { + "name": "id", + "in": "path", + "required": true, + "description": "The ID of the content item to update.", + "schema": { + "type": "string" + }, + "x-position": 2 + }, + { + "name": "status", + "in": "query", + "description": "The initial status.", + "schema": { + "type": "string", + "nullable": true + }, + "x-position": 4 + }, + { + "name": "patch", + "in": "query", + "description": "Makes the update as patch.", + "schema": { + "type": "boolean" + }, + "x-position": 5 + }, + { + "name": "enrichDefaults", + "in": "query", + "description": "Enrich the content with defaults.", + "schema": { + "type": "boolean" + }, + "x-position": 6 + }, + { + "name": "publish", + "in": "query", + "description": "True to automatically publish the content.", + "schema": { + "type": "boolean" + }, + "x-position": 7 + }, + { + "name": "X-Unpublished", + "in": "header", + "description": "Return unpublished content items.", + "schema": { + "type": "boolean" + }, + "x-position": 8 + }, + { + "name": "X-Languages", + "in": "header", + "description": "The list of languages to resolve (comma-separated).", + "schema": { + "type": "string" + }, + "x-position": 9 + } + ], + "requestBody": { + "x-name": "Data", + "description": "The full data for the content item.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ContentData" + } + } + }, + "required": true, + "x-position": 3 + }, + "responses": { + "200": { + "description": "Content created or updated.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ContentDto" + } + } + } + }, + "400": { + "description": "Content request not valid.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + }, + "404": { + "description": "Content references, schema or app not found." + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.apps.{app}.contents.{schema}.upsert" + ] + } + ] + }, + "put": { + "tags": [ + "Contents" + ], + "summary": "Update a content item.", + "description": "You can read the generated documentation for your app at /api/content/{appName}/docs.", + "operationId": "Contents_PutContent", + "parameters": [ + { + "name": "app", + "in": "path", + "required": true, + "description": "The name of the app.", + "schema": { + "type": "string" + }, + "x-position": 0 + }, + { + "name": "schema", + "in": "path", + "required": true, + "description": "The name of the schema.", + "schema": { + "type": "string" + }, + "x-position": 1 + }, + { + "name": "id", + "in": "path", + "required": true, + "description": "The ID of the content item to update.", + "schema": { + "type": "string" + }, + "x-position": 2 + }, + { + "name": "enrichDefaults", + "in": "query", + "description": "Enrich the content with defaults.", + "schema": { + "type": "boolean" + }, + "x-position": 4 + }, + { + "name": "X-Unpublished", + "in": "header", + "description": "Return unpublished content items.", + "schema": { + "type": "boolean" + }, + "x-position": 5 + }, + { + "name": "X-Languages", + "in": "header", + "description": "The list of languages to resolve (comma-separated).", + "schema": { + "type": "string" + }, + "x-position": 6 + } + ], + "requestBody": { + "x-name": "Data", + "description": "The full data for the content item.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ContentData" + } + } + }, + "required": true, + "x-position": 3 + }, + "responses": { + "200": { + "description": "Content updated.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ContentDto" + } + } + } + }, + "400": { + "description": "Content request not valid.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + }, + "404": { + "description": "Content references, schema or app not found." + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.apps.{app}.contents.{schema}.update.own" + ] + } + ] + }, + "patch": { + "tags": [ + "Contents" + ], + "summary": "Patchs a content item.", + "description": "You can read the generated documentation for your app at /api/content/{appName}/docs.", + "operationId": "Contents_PatchContent", + "parameters": [ + { + "name": "app", + "in": "path", + "required": true, + "description": "The name of the app.", + "schema": { + "type": "string" + }, + "x-position": 0 + }, + { + "name": "schema", + "in": "path", + "required": true, + "description": "The name of the schema.", + "schema": { + "type": "string" + }, + "x-position": 1 + }, + { + "name": "id", + "in": "path", + "required": true, + "description": "The ID of the content item to patch.", + "schema": { + "type": "string" + }, + "x-position": 2 + }, + { + "name": "X-Unpublished", + "in": "header", + "description": "Return unpublished content items.", + "schema": { + "type": "boolean" + }, + "x-position": 4 + }, + { + "name": "X-Languages", + "in": "header", + "description": "The list of languages to resolve (comma-separated).", + "schema": { + "type": "string" + }, + "x-position": 5 + } + ], + "requestBody": { + "x-name": "request", + "description": "The patch for the content item.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ContentData" + } + } + }, + "required": true, + "x-position": 3 + }, + "responses": { + "200": { + "description": "Content patched.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ContentDto" + } + } + } + }, + "400": { + "description": "Content request not valid.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + }, + "404": { + "description": "Content, schema or app not found." + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.apps.{app}.contents.{schema}.update.own" + ] + } + ] + }, + "delete": { + "tags": [ + "Contents" + ], + "summary": "Delete a content item.", + "description": "You can create an generated documentation for your app at /api/content/{appName}/docs.", + "operationId": "Contents_DeleteContent", + "parameters": [ + { + "name": "app", + "in": "path", + "required": true, + "description": "The name of the app.", + "schema": { + "type": "string" + }, + "x-position": 1 + }, + { + "name": "schema", + "in": "path", + "required": true, + "description": "The name of the schema.", + "schema": { + "type": "string" + }, + "x-position": 2 + }, + { + "name": "id", + "in": "path", + "required": true, + "description": "The ID of the content item to delete.", + "schema": { + "type": "string" + }, + "x-position": 3 + }, + { + "name": "checkReferrers", + "in": "query", + "description": "True to check referrers of this content.", + "schema": { + "type": "boolean" + }, + "x-position": 4 + }, + { + "name": "permanent", + "in": "query", + "description": "True to delete the content permanently.", + "schema": { + "type": "boolean" + }, + "x-position": 5 + } + ], + "responses": { + "204": { + "description": "Content deleted." + }, + "400": { + "description": "Content cannot be deleted.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + }, + "404": { + "description": "Content, schema or app not found." + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.apps.{app}.contents.{schema}.delete.own" + ] + } + ] + } + }, + "/api/content/{app}/{schema}/{id}/validity": { + "get": { + "tags": [ + "Contents" + ], + "summary": "Get a content item validity.", + "description": "You can read the generated documentation for your app at /api/content/{appName}/docs.", + "operationId": "Contents_GetContentValidity", + "parameters": [ + { + "name": "app", + "in": "path", + "required": true, + "description": "The name of the app.", + "schema": { + "type": "string" + }, + "x-position": 1 + }, + { + "name": "schema", + "in": "path", + "required": true, + "description": "The name of the schema.", + "schema": { + "type": "string" + }, + "x-position": 2 + }, + { + "name": "id", + "in": "path", + "required": true, + "description": "The ID of the content to fetch.", + "schema": { + "type": "string" + }, + "x-position": 3 + } + ], + "responses": { + "204": { + "description": "Content is valid." + }, + "400": { + "description": "Content not valid.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + }, + "404": { + "description": "Content, schema or app not found." + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [] + } + ] + } + }, + "/api/content/{app}/{schema}/{id}/references": { + "get": { + "tags": [ + "Contents" + ], + "summary": "Get all references of a content.", + "description": "You can read the generated documentation for your app at /api/content/{appName}/docs.", + "operationId": "Contents_GetReferences", + "parameters": [ + { + "name": "app", + "in": "path", + "required": true, + "description": "The name of the app.", + "schema": { + "type": "string" + }, + "x-position": 0 + }, + { + "name": "schema", + "in": "path", + "required": true, + "description": "The name of the schema.", + "schema": { + "type": "string" + }, + "x-position": 1 + }, + { + "name": "id", + "in": "path", + "required": true, + "description": "The ID of the content to fetch.", + "schema": { + "type": "string" + }, + "x-position": 2 + }, + { + "name": "q", + "in": "query", + "description": "The optional json query.", + "schema": { + "type": "string", + "nullable": true + }, + "x-position": 3 + }, + { + "name": "X-Fields", + "in": "header", + "description": "The list of content fields (comma-separated).", + "schema": { + "type": "string" + }, + "x-position": 4 + }, + { + "name": "X-Flatten", + "in": "header", + "description": "Provide the data as flat object.", + "schema": { + "type": "boolean" + }, + "x-position": 5 + }, + { + "name": "X-Languages", + "in": "header", + "description": "The list of languages to resolve (comma-separated).", + "schema": { + "type": "string" + }, + "x-position": 6 + }, + { + "name": "X-Unpublished", + "in": "header", + "description": "Return unpublished content items.", + "schema": { + "type": "boolean" + }, + "x-position": 7 + }, + { + "name": "X-NoSlowTotal", + "in": "header", + "description": "Do not return the total amount, if it would be slow.", + "schema": { + "type": "boolean" + }, + "x-position": 8 + }, + { + "name": "X-NoTotal", + "in": "header", + "description": "Do not return the total amount.", + "schema": { + "type": "boolean" + }, + "x-position": 9 + } + ], + "responses": { + "200": { + "description": "Contents returned.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ContentsDto" + } + } + } + }, + "404": { + "description": "Content, schema or app not found." + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [] + } + ] + } + }, + "/api/content/{app}/{schema}/{id}/referencing": { + "get": { + "tags": [ + "Contents" + ], + "summary": "Get a referencing contents of a content item.", + "description": "You can read the generated documentation for your app at /api/content/{appName}/docs.", + "operationId": "Contents_GetReferencing", + "parameters": [ + { + "name": "app", + "in": "path", + "required": true, + "description": "The name of the app.", + "schema": { + "type": "string" + }, + "x-position": 0 + }, + { + "name": "schema", + "in": "path", + "required": true, + "description": "The name of the schema.", + "schema": { + "type": "string" + }, + "x-position": 1 + }, + { + "name": "id", + "in": "path", + "required": true, + "description": "The ID of the content to fetch.", + "schema": { + "type": "string" + }, + "x-position": 2 + }, + { + "name": "q", + "in": "query", + "description": "The optional json query.", + "schema": { + "type": "string", + "nullable": true + }, + "x-position": 3 + }, + { + "name": "X-Fields", + "in": "header", + "description": "The list of content fields (comma-separated).", + "schema": { + "type": "string" + }, + "x-position": 4 + }, + { + "name": "X-Flatten", + "in": "header", + "description": "Provide the data as flat object.", + "schema": { + "type": "boolean" + }, + "x-position": 5 + }, + { + "name": "X-Languages", + "in": "header", + "description": "The list of languages to resolve (comma-separated).", + "schema": { + "type": "string" + }, + "x-position": 6 + }, + { + "name": "X-Unpublished", + "in": "header", + "description": "Return unpublished content items.", + "schema": { + "type": "boolean" + }, + "x-position": 7 + }, + { + "name": "X-NoSlowTotal", + "in": "header", + "description": "Do not return the total amount, if it would be slow.", + "schema": { + "type": "boolean" + }, + "x-position": 8 + }, + { + "name": "X-NoTotal", + "in": "header", + "description": "Do not return the total amount.", + "schema": { + "type": "boolean" + }, + "x-position": 9 + } + ], + "responses": { + "200": { + "description": "Content returned.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ContentsDto" + } + } + } + }, + "404": { + "description": "Content, schema or app not found." + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [] + } + ] + } + }, + "/api/content/{app}/{schema}/{id}/{version}": { + "get": { + "tags": [ + "Contents" + ], + "summary": "Get a content by version.", + "description": "You can read the generated documentation for your app at /api/content/{appName}/docs.", + "operationId": "Contents_GetContentVersion", + "parameters": [ + { + "name": "app", + "in": "path", + "required": true, + "description": "The name of the app.", + "schema": { + "type": "string" + }, + "x-position": 0 + }, + { + "name": "schema", + "in": "path", + "required": true, + "description": "The name of the schema.", + "schema": { + "type": "string" + }, + "x-position": 1 + }, + { + "name": "id", + "in": "path", + "required": true, + "description": "The ID of the content to fetch.", + "schema": { + "type": "string" + }, + "x-position": 2 + }, + { + "name": "version", + "in": "path", + "required": true, + "description": "The version fo the content to fetch.", + "schema": { + "type": "integer", + "format": "int32" + }, + "x-position": 3 + }, + { + "name": "X-Unpublished", + "in": "header", + "description": "Return unpublished content items.", + "schema": { + "type": "boolean" + }, + "x-position": 4 + }, + { + "name": "X-Languages", + "in": "header", + "description": "The list of languages to resolve (comma-separated).", + "schema": { + "type": "string" + }, + "x-position": 5 + } + ], + "responses": { + "200": { + "description": "Content version returned.", + "content": { + "application/octet-stream": { + "schema": { + "type": "string", + "format": "binary" + } + } + } + }, + "404": { + "description": "Content, schema or app not found." + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "deprecated": true, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.apps.{app}.contents.{schema}.read.own" + ] + } + ] + } + }, + "/api/content/{app}/{schema}/import": { + "post": { + "tags": [ + "Contents" + ], + "summary": "Import content items.", + "description": "You can read the generated documentation for your app at /api/content/{appName}/docs.", + "operationId": "Contents_PostContents", + "parameters": [ + { + "name": "app", + "in": "path", + "required": true, + "description": "The name of the app.", + "schema": { + "type": "string" + }, + "x-position": 1 + }, + { + "name": "schema", + "in": "path", + "required": true, + "description": "The name of the schema.", + "schema": { + "type": "string" + }, + "x-position": 2 + } + ], + "requestBody": { + "x-name": "request", + "description": "The import request.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ImportContentsDto" + } + } + }, + "required": true, + "x-position": 3 + }, + "responses": { + "200": { + "description": "Contents created.", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/BulkResultDto" + } + } + } + } + }, + "400": { + "description": "Content request not valid.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + }, + "404": { + "description": "Content references, schema or app not found." + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "deprecated": true, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.apps.{app}.contents.{schema}.create" + ] + } + ] + } + }, + "/api/content/{app}/{schema}/bulk": { + "post": { + "tags": [ + "Contents" + ], + "summary": "Bulk update content items.", + "description": "You can read the generated documentation for your app at /api/content/{appName}/docs.", + "operationId": "Contents_BulkUpdateContents", + "parameters": [ + { + "name": "app", + "in": "path", + "required": true, + "description": "The name of the app.", + "schema": { + "type": "string" + }, + "x-position": 1 + }, + { + "name": "schema", + "in": "path", + "required": true, + "description": "The name of the schema.", + "schema": { + "type": "string" + }, + "x-position": 2 + } + ], + "requestBody": { + "x-name": "request", + "description": "The bulk update request.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/BulkUpdateContentsDto" + } + } + }, + "required": true, + "x-position": 3 + }, + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/BulkResultDto" + } + } + } + } + }, + "400": { + "description": "Contents request not valid.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + }, + "404": { + "description": "Contents references, schema or app not found." + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.apps.{app}.contents.{schema}.read.own" + ] + } + ] + } + }, + "/api/content/{app}/{schema}/{id}/defaults": { + "put": { + "tags": [ + "Contents" + ], + "summary": "Enrich a content item with defaults.", + "description": "You can read the generated documentation for your app at /api/content/{appName}/docs.", + "operationId": "Contents_PutContentDefaults", + "parameters": [ + { + "name": "app", + "in": "path", + "required": true, + "description": "The name of the app.", + "schema": { + "type": "string" + }, + "x-position": 0 + }, + { + "name": "schema", + "in": "path", + "required": true, + "description": "The name of the schema.", + "schema": { + "type": "string" + }, + "x-position": 1 + }, + { + "name": "id", + "in": "path", + "required": true, + "description": "The ID of the content item to update.", + "schema": { + "type": "string" + }, + "x-position": 2 + }, + { + "name": "enrichRequiredFields", + "in": "query", + "description": "True, to also enrich required fields. Default: false.", + "schema": { + "type": "boolean" + }, + "x-position": 3 + }, + { + "name": "X-Unpublished", + "in": "header", + "description": "Return unpublished content items.", + "schema": { + "type": "boolean" + }, + "x-position": 4 + }, + { + "name": "X-Languages", + "in": "header", + "description": "The list of languages to resolve (comma-separated).", + "schema": { + "type": "string" + }, + "x-position": 5 + } + ], + "responses": { + "200": { + "description": "Content updated.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ContentDto" + } + } + } + }, + "404": { + "description": "Content references, schema or app not found." + }, + "400": { + "description": "Validation error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.apps.{app}.contents.{schema}.update.own" + ] + } + ] + } + }, + "/api/content/{app}/{schema}/{id}/status": { + "put": { + "tags": [ + "Contents" + ], + "summary": "Change status of a content item.", + "description": "You can read the generated documentation for your app at /api/content/{appName}/docs.", + "operationId": "Contents_PutContentStatus", + "parameters": [ + { + "name": "app", + "in": "path", + "required": true, + "description": "The name of the app.", + "schema": { + "type": "string" + }, + "x-position": 0 + }, + { + "name": "schema", + "in": "path", + "required": true, + "description": "The name of the schema.", + "schema": { + "type": "string" + }, + "x-position": 1 + }, + { + "name": "id", + "in": "path", + "required": true, + "description": "The ID of the content item to change.", + "schema": { + "type": "string" + }, + "x-position": 2 + }, + { + "name": "X-Unpublished", + "in": "header", + "description": "Return unpublished content items.", + "schema": { + "type": "boolean" + }, + "x-position": 4 + }, + { + "name": "X-Languages", + "in": "header", + "description": "The list of languages to resolve (comma-separated).", + "schema": { + "type": "string" + }, + "x-position": 5 + } + ], + "requestBody": { + "x-name": "request", + "description": "The status request.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ChangeStatusDto" + } + } + }, + "required": true, + "x-position": 3 + }, + "responses": { + "200": { + "description": "Content status changed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ContentDto" + } + } + } + }, + "400": { + "description": "Content request not valid.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + }, + "404": { + "description": "Content, schema or app not found." + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.apps.{app}.contents.{schema}.changestatus.own" + ] + } + ] + }, + "delete": { + "tags": [ + "Contents" + ], + "summary": "Cancel status change of a content item.", + "description": "You can read the generated documentation for your app at /api/content/{appName}/docs.", + "operationId": "Contents_DeleteContentStatus", + "parameters": [ + { + "name": "app", + "in": "path", + "required": true, + "description": "The name of the app.", + "schema": { + "type": "string" + }, + "x-position": 0 + }, + { + "name": "schema", + "in": "path", + "required": true, + "description": "The name of the schema.", + "schema": { + "type": "string" + }, + "x-position": 1 + }, + { + "name": "id", + "in": "path", + "required": true, + "description": "The ID of the content item to cancel.", + "schema": { + "type": "string" + }, + "x-position": 2 + }, + { + "name": "X-Unpublished", + "in": "header", + "description": "Return unpublished content items.", + "schema": { + "type": "boolean" + }, + "x-position": 3 + }, + { + "name": "X-Languages", + "in": "header", + "description": "The list of languages to resolve (comma-separated).", + "schema": { + "type": "string" + }, + "x-position": 4 + } + ], + "responses": { + "200": { + "description": "Content status change cancelled.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ContentDto" + } + } + } + }, + "400": { + "description": "Content request not valid.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + }, + "404": { + "description": "Content, schema or app not found." + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.apps.{app}.contents.{schema}.changestatus.own" + ] + } + ] + } + }, + "/api/content/{app}/{schema}/{id}/draft": { + "post": { + "tags": [ + "Contents" + ], + "summary": "Create a new draft version.", + "description": "You can read the generated documentation for your app at /api/content/{appName}/docs.", + "operationId": "Contents_CreateDraft", + "parameters": [ + { + "name": "app", + "in": "path", + "required": true, + "description": "The name of the app.", + "schema": { + "type": "string" + }, + "x-position": 0 + }, + { + "name": "schema", + "in": "path", + "required": true, + "description": "The name of the schema.", + "schema": { + "type": "string" + }, + "x-position": 1 + }, + { + "name": "id", + "in": "path", + "required": true, + "description": "The ID of the content item to create the draft for.", + "schema": { + "type": "string" + }, + "x-position": 2 + }, + { + "name": "X-Unpublished", + "in": "header", + "description": "Return unpublished content items.", + "schema": { + "type": "boolean" + }, + "x-position": 3 + }, + { + "name": "X-Languages", + "in": "header", + "description": "The list of languages to resolve (comma-separated).", + "schema": { + "type": "string" + }, + "x-position": 4 + } + ], + "responses": { + "200": { + "description": "Content draft created.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ContentDto" + } + } + } + }, + "404": { + "description": "Content, schema or app not found." + }, + "400": { + "description": "Validation error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.apps.{app}.contents.{schema}.version.create.own" + ] + } + ] + }, + "delete": { + "tags": [ + "Contents" + ], + "summary": "Delete the draft version.", + "description": "You can read the generated documentation for your app at /api/content/{appName}/docs.", + "operationId": "Contents_DeleteVersion", + "parameters": [ + { + "name": "app", + "in": "path", + "required": true, + "description": "The name of the app.", + "schema": { + "type": "string" + }, + "x-position": 0 + }, + { + "name": "schema", + "in": "path", + "required": true, + "description": "The name of the schema.", + "schema": { + "type": "string" + }, + "x-position": 1 + }, + { + "name": "id", + "in": "path", + "required": true, + "description": "The ID of the content item to delete the draft from.", + "schema": { + "type": "string" + }, + "x-position": 2 + }, + { + "name": "X-Unpublished", + "in": "header", + "description": "Return unpublished content items.", + "schema": { + "type": "boolean" + }, + "x-position": 3 + }, + { + "name": "X-Languages", + "in": "header", + "description": "The list of languages to resolve (comma-separated).", + "schema": { + "type": "string" + }, + "x-position": 4 + } + ], + "responses": { + "200": { + "description": "Content draft deleted.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ContentDto" + } + } + } + }, + "404": { + "description": "Content, schema or app not found." + }, + "400": { + "description": "Validation error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.apps.{app}.contents.{schema}.version.delete.own" + ] + } + ] + } + }, + "/api/content/{app}/graphql": { + "get": { + "tags": [ + "Contents" + ], + "summary": "GraphQL endpoint.", + "description": "You can read the generated documentation for your app at /api/content/{appName}/docs.", + "operationId": "ContentsShared_GetGraphQL", + "parameters": [ + { + "name": "app", + "in": "path", + "required": true, + "description": "The name of the app.", + "schema": { + "type": "string" + }, + "x-position": 0 + }, + { + "name": "The query string", + "in": "query", + "description": "The optional version of the asset.", + "schema": { + "type": "string" + }, + "x-position": 1 + }, + { + "name": "variables", + "in": "query", + "description": "The optional operation variables.", + "schema": { + "type": "string", + "nullable": true + }, + "x-position": 2 + }, + { + "name": "operationName", + "in": "query", + "description": "The optional operation name.", + "schema": { + "type": "string", + "nullable": true + }, + "x-position": 3 + }, + { + "name": "X-Unpublished", + "in": "header", + "description": "Return unpublished content items.", + "schema": { + "type": "boolean" + }, + "x-position": 4 + } + ], + "responses": { + "200": { + "description": "Contents returned or mutated.", + "content": { + "application/json": { + "schema": {} + } + } + }, + "404": { + "description": "App not found." + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [] + } + ] + }, + "post": { + "tags": [ + "Contents" + ], + "summary": "GraphQL endpoint.", + "description": "You can read the generated documentation for your app at /api/content/{appName}/docs.", + "operationId": "ContentsShared_PostGraphQL", + "parameters": [ + { + "name": "app", + "in": "path", + "required": true, + "description": "The name of the app.", + "schema": { + "type": "string" + }, + "x-position": 0 + }, + { + "name": "X-Unpublished", + "in": "header", + "description": "Return unpublished content items.", + "schema": { + "type": "boolean" + }, + "x-position": 2 + } + ], + "requestBody": { + "x-name": "request", + "description": "The graphql request.", + "content": { + "application/json": { + "schema": {} + } + }, + "x-position": 1 + }, + "responses": { + "200": { + "description": "Contents returned or mutated.", + "content": { + "application/json": { + "schema": {} + } + } + }, + "404": { + "description": "App not found." + }, + "400": { + "description": "Validation error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [] + } + ] + } + }, + "/api/content/{app}/graphql/batch": { + "get": { + "tags": [ + "Contents" + ], + "summary": "GraphQL batch endpoint.", + "description": "You can read the generated documentation for your app at /api/content/{appName}/docs.", + "operationId": "ContentsShared_GetGraphQLBatch", + "parameters": [ + { + "name": "app", + "in": "path", + "required": true, + "description": "The name of the app.", + "schema": { + "type": "string" + }, + "x-position": 0 + }, + { + "name": "The query string", + "in": "query", + "description": "The optional version of the asset.", + "schema": { + "type": "string" + }, + "x-position": 1 + }, + { + "name": "variables", + "in": "query", + "description": "The optional operation variables.", + "schema": { + "type": "string", + "nullable": true + }, + "x-position": 2 + }, + { + "name": "operationName", + "in": "query", + "description": "The optional operation name.", + "schema": { + "type": "string", + "nullable": true + }, + "x-position": 3 + }, + { + "name": "X-Unpublished", + "in": "header", + "description": "Return unpublished content items.", + "schema": { + "type": "boolean" + }, + "x-position": 4 + } + ], + "responses": { + "200": { + "description": "Contents returned or mutated.", + "content": { + "application/json": { + "schema": {} + } + } + }, + "404": { + "description": "App not found." + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [] + } + ] + }, + "post": { + "tags": [ + "Contents" + ], + "summary": "GraphQL batch endpoint.", + "description": "You can read the generated documentation for your app at /api/content/{appName}/docs.", + "operationId": "ContentsShared_PostGraphQLBatch", + "parameters": [ + { + "name": "app", + "in": "path", + "required": true, + "description": "The name of the app.", + "schema": { + "type": "string" + }, + "x-position": 0 + }, + { + "name": "X-Unpublished", + "in": "header", + "description": "Return unpublished content items.", + "schema": { + "type": "boolean" + }, + "x-position": 2 + } + ], + "requestBody": { + "x-name": "request", + "description": "The graphql request.", + "content": { + "application/json": { + "schema": {} + } + }, + "x-position": 1 + }, + "responses": { + "200": { + "description": "Contents returned or mutated.", + "content": { + "application/json": { + "schema": {} + } + } + }, + "404": { + "description": "App not found." + }, + "400": { + "description": "Validation error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [] + } + ] + } + }, + "/api/content/{app}": { + "get": { + "tags": [ + "Contents" + ], + "summary": "Queries contents.", + "description": "You can read the generated documentation for your app at /api/content/{appName}/docs.", + "operationId": "ContentsShared_GetAllContents", + "parameters": [ + { + "name": "app", + "in": "path", + "required": true, + "description": "The name of the app.", + "schema": { + "type": "string" + }, + "x-position": 0 + }, + { + "name": "ids", + "in": "query", + "description": "The list of ids to query.", + "schema": { + "type": "string", + "nullable": true + }, + "x-position": 1 + }, + { + "name": "scheduledFrom", + "in": "query", + "description": "The start time of the scheduled content period (see scheduledTo).", + "schema": { + "type": "string", + "format": "date-time", + "nullable": true + }, + "x-position": 2 + }, + { + "name": "scheduledTo", + "in": "query", + "description": "The end time of the scheduled content period (see scheduledFrom).", + "schema": { + "type": "string", + "format": "date-time", + "nullable": true + }, + "x-position": 3 + }, + { + "name": "referencing", + "in": "query", + "description": "The ID of the referencing content item.", + "schema": { + "type": "string", + "nullable": true + }, + "x-position": 4 + }, + { + "name": "references", + "in": "query", + "description": "The ID of the reference content item.", + "schema": { + "type": "string", + "nullable": true + }, + "x-position": 5 + }, + { + "name": "q", + "in": "query", + "description": "The optional json query.", + "schema": { + "type": "string", + "nullable": true + }, + "x-position": 6 + }, + { + "name": "X-Fields", + "in": "header", + "description": "The list of content fields (comma-separated).", + "schema": { + "type": "string" + }, + "x-position": 7 + }, + { + "name": "X-Flatten", + "in": "header", + "description": "Provide the data as flat object.", + "schema": { + "type": "boolean" + }, + "x-position": 8 + }, + { + "name": "X-Languages", + "in": "header", + "description": "The list of languages to resolve (comma-separated).", + "schema": { + "type": "string" + }, + "x-position": 9 + }, + { + "name": "X-NoSlowTotal", + "in": "header", + "description": "Do not return the total amount, if it would be slow.", + "schema": { + "type": "boolean" + }, + "x-position": 10 + }, + { + "name": "X-NoTotal", + "in": "header", + "description": "Do not return the total amount.", + "schema": { + "type": "boolean" + }, + "x-position": 11 + }, + { + "name": "X-Unpublished", + "in": "header", + "description": "Return unpublished content items.", + "schema": { + "type": "boolean" + }, + "x-position": 12 + } + ], + "responses": { + "200": { + "description": "Contents returned.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ContentsDto" + } + } + } + }, + "404": { + "description": "App not found." + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [] + } + ] + }, + "post": { + "tags": [ + "Contents" + ], + "summary": "Queries contents.", + "description": "You can read the generated documentation for your app at /api/content/{appName}/docs.", + "operationId": "ContentsShared_GetAllContentsPost", + "parameters": [ + { + "name": "app", + "in": "path", + "required": true, + "description": "The name of the app.", + "schema": { + "type": "string" + }, + "x-position": 0 + }, + { + "name": "X-Fields", + "in": "header", + "description": "The list of content fields (comma-separated).", + "schema": { + "type": "string" + }, + "x-position": 2 + }, + { + "name": "X-Flatten", + "in": "header", + "description": "Provide the data as flat object.", + "schema": { + "type": "boolean" + }, + "x-position": 3 + }, + { + "name": "X-Languages", + "in": "header", + "description": "The list of languages to resolve (comma-separated).", + "schema": { + "type": "string" + }, + "x-position": 4 + }, + { + "name": "X-NoSlowTotal", + "in": "header", + "description": "Do not return the total amount, if it would be slow.", + "schema": { + "type": "boolean" + }, + "x-position": 5 + }, + { + "name": "X-NoTotal", + "in": "header", + "description": "Do not return the total amount.", + "schema": { + "type": "boolean" + }, + "x-position": 6 + }, + { + "name": "X-Unpublished", + "in": "header", + "description": "Return unpublished content items.", + "schema": { + "type": "boolean" + }, + "x-position": 7 + } + ], + "requestBody": { + "x-name": "query", + "description": "The required query object.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AllContentsByPostDto" + } + } + }, + "required": true, + "x-position": 1 + }, + "responses": { + "200": { + "description": "Contents returned.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ContentsDto" + } + } + } + }, + "404": { + "description": "App not found." + }, + "400": { + "description": "Validation error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [] + } + ] + } + }, + "/api/content/{app}/bulk": { + "post": { + "tags": [ + "Contents" + ], + "summary": "Bulk update content items.", + "description": "You can read the generated documentation for your app at /api/content/{appName}/docs.", + "operationId": "ContentsShared_BulkUpdateAllContents", + "parameters": [ + { + "name": "app", + "in": "path", + "required": true, + "description": "The name of the app.", + "schema": { + "type": "string" + }, + "x-position": 1 + }, + { + "name": "schema", + "in": "query", + "description": "The name of the schema.", + "schema": { + "type": "string" + }, + "x-position": 2 + } + ], + "requestBody": { + "x-name": "request", + "description": "The bulk update request.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/BulkUpdateContentsDto" + } + } + }, + "required": true, + "x-position": 3 + }, + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/BulkResultDto" + } + } + } + } + }, + "400": { + "description": "Contents request not valid.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + }, + "404": { + "description": "Contents references, schema or app not found." + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.apps.{app}.contents.{schema}.read.own" + ] + } + ] + } + }, + "/api/apps/{app}/backups/{id}": { + "get": { + "tags": [ + "Backups" + ], + "summary": "Get the backup content.", + "operationId": "BackupContent_GetBackupContent", + "parameters": [ + { + "name": "app", + "in": "path", + "required": true, + "description": "The name of the app.", + "schema": { + "type": "string" + }, + "x-position": 1 + }, + { + "name": "id", + "in": "path", + "required": true, + "description": "The ID of the backup.", + "schema": { + "type": "string" + }, + "x-position": 2 + } + ], + "responses": { + "200": { + "description": "Backup found and content returned.", + "content": { + "application/octet-stream": { + "schema": { + "type": "string", + "format": "binary" + } + } + } + }, + "404": { + "description": "Backup or app not found." + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "deprecated": true + }, + "delete": { + "tags": [ + "Backups" + ], + "summary": "Delete a backup.", + "operationId": "Backups_DeleteBackup", + "parameters": [ + { + "name": "app", + "in": "path", + "required": true, + "description": "The name of the app.", + "schema": { + "type": "string" + }, + "x-position": 1 + }, + { + "name": "id", + "in": "path", + "required": true, + "description": "The ID of the backup to delete.", + "schema": { + "type": "string" + }, + "x-position": 2 + } + ], + "responses": { + "204": { + "description": "Backup deleted." + }, + "404": { + "description": "Backup or app not found." + }, + "400": { + "description": "Validation error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "deprecated": true, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.apps.{app}.jobs.delete" + ] + } + ] + } + }, + "/api/apps/backups/{id}": { + "get": { + "tags": [ + "Backups" + ], + "summary": "Get the backup content.", + "operationId": "BackupContent_GetBackupContentV2", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "description": "The ID of the backup.", + "schema": { + "type": "string" + }, + "x-position": 1 + }, + { + "name": "appId", + "in": "query", + "description": "The ID of the app.", + "schema": { + "type": "string" + }, + "x-position": 2 + }, + { + "name": "app", + "in": "query", + "description": "The name of the app.", + "schema": { + "type": "string", + "default": "" + }, + "x-position": 3 + } + ], + "responses": { + "200": { + "description": "Backup found and content returned.", + "content": { + "application/octet-stream": { + "schema": { + "type": "string", + "format": "binary" + } + } + } + }, + "404": { + "description": "Backup or app not found." + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "deprecated": true + } + }, + "/api/apps/{app}/backups": { + "get": { + "tags": [ + "Backups" + ], + "summary": "Get all backup jobs.", + "operationId": "Backups_GetBackups", + "parameters": [ + { + "name": "app", + "in": "path", + "required": true, + "description": "The name of the app.", + "schema": { + "type": "string" + }, + "x-position": 1 + } + ], + "responses": { + "200": { + "description": "Backups returned.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/BackupJobsDto" + } + } + } + }, + "404": { + "description": "App not found." + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "deprecated": true, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.apps.{app}.jobs.read" + ] + } + ] + }, + "post": { + "tags": [ + "Backups" + ], + "summary": "Start a new backup.", + "operationId": "Backups_PostBackup", + "parameters": [ + { + "name": "app", + "in": "path", + "required": true, + "description": "The name of the app.", + "schema": { + "type": "string" + }, + "x-position": 1 + } + ], + "responses": { + "204": { + "description": "Backup started." + }, + "400": { + "description": "Backup contingent reached.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + }, + "404": { + "description": "App not found." + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.apps.{app}.jobs.create" + ] + } + ] + } + }, + "/api/apps/restore": { + "get": { + "tags": [ + "Backups" + ], + "summary": "Get current restore status.", + "operationId": "Restore_GetRestoreJob", + "responses": { + "200": { + "description": "Status returned.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RestoreJobDto" + } + } + } + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.admin.restore" + ] + } + ] + }, + "post": { + "tags": [ + "Backups" + ], + "summary": "Restore a backup.", + "operationId": "Restore_PostRestoreJob", + "requestBody": { + "x-name": "request", + "description": "The backup to restore.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RestoreRequestDto" + } + } + }, + "required": true, + "x-position": 1 + }, + "responses": { + "204": { + "description": "Restore operation started." + }, + "400": { + "description": "Validation error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.admin.restore" + ] + } + ] + } + }, + "/api/assets/{app}/{idOrSlug}/{more}": { + "get": { + "tags": [ + "Assets" + ], + "summary": "Get the asset content.", + "operationId": "AssetContent_GetAssetContentBySlug", + "parameters": [ + { + "name": "app", + "in": "path", + "required": true, + "description": "The name of the app.", + "schema": { + "type": "string" + }, + "x-position": 1 + }, + { + "name": "idOrSlug", + "in": "path", + "required": true, + "description": "The id or slug of the asset.", + "schema": { + "type": "string" + }, + "x-position": 2 + }, + { + "name": "version", + "in": "query", + "description": "The optional version of the asset.", + "schema": { + "type": "integer", + "format": "int64" + }, + "x-position": 3 + }, + { + "name": "cache", + "in": "query", + "description": "The cache duration in seconds.", + "schema": { + "type": "integer", + "format": "int64" + }, + "x-position": 4 + }, + { + "name": "download", + "in": "query", + "description": "Set it to 0 to prevent download.", + "schema": { + "type": "integer", + "format": "int32" + }, + "x-position": 5 + }, + { + "name": "width", + "in": "query", + "description": "The target width of the asset, if it is an image.", + "schema": { + "type": "integer", + "format": "int32", + "nullable": true + }, + "x-position": 6 + }, + { + "name": "height", + "in": "query", + "description": "The target height of the asset, if it is an image.", + "schema": { + "type": "integer", + "format": "int32", + "nullable": true + }, + "x-position": 7 + }, + { + "name": "quality", + "in": "query", + "description": "Optional image quality, it is is an jpeg image.", + "schema": { + "type": "integer", + "format": "int32", + "nullable": true + }, + "x-position": 8 + }, + { + "name": "mode", + "in": "query", + "description": "The resize mode when the width and height is defined.", + "schema": { + "nullable": true, + "$ref": "#/components/schemas/ResizeMode" + }, + "x-position": 9 + }, + { + "name": "bg", + "in": "query", + "description": "Optional background color.", + "schema": { + "type": "string", + "nullable": true + }, + "x-position": 10 + }, + { + "name": "focusX", + "in": "query", + "description": "Override the y focus point.", + "schema": { + "type": "number", + "format": "float", + "nullable": true + }, + "x-position": 11 + }, + { + "name": "focusY", + "in": "query", + "description": "Override the x focus point.", + "schema": { + "type": "number", + "format": "float", + "nullable": true + }, + "x-position": 12 + }, + { + "name": "nofocus", + "in": "query", + "description": "True to ignore the asset focus point if any.", + "schema": { + "type": "boolean" + }, + "x-position": 13 + }, + { + "name": "auto", + "in": "query", + "description": "True to use auto format.", + "schema": { + "type": "boolean" + }, + "x-position": 14 + }, + { + "name": "force", + "in": "query", + "description": "True to force a new resize even if it already stored.", + "schema": { + "type": "boolean" + }, + "x-position": 15 + }, + { + "name": "deleted", + "in": "query", + "description": "Also return deleted content items.", + "schema": { + "type": "boolean" + }, + "x-position": 16 + }, + { + "name": "format", + "in": "query", + "description": "True to force a new resize even if it already stored.", + "schema": { + "nullable": true, + "$ref": "#/components/schemas/ImageFormat" + }, + "x-position": 17 + }, + { + "name": "watermarkUrl", + "in": "query", + "description": "Adds the image with the given URL on to of your image. If the watermark cannot be loaded or found, the watermark is just ignored.", + "schema": { + "type": "string", + "nullable": true + }, + "x-position": 18 + }, + { + "name": "watermarkOpacity", + "in": "query", + "description": "The opacity of the watermark image.", + "schema": { + "type": "number", + "format": "float" + }, + "x-position": 19 + }, + { + "name": "watermarkAnchor", + "in": "query", + "description": "The anchor where the watermark should be placed.", + "schema": { + "$ref": "#/components/schemas/WatermarkAnchor" + }, + "x-position": 20 + }, + { + "name": "more", + "in": "path", + "required": true, + "description": "Optional suffix that can be used to seo-optimize the link to the image Has not effect.", + "schema": { + "type": "string" + }, + "x-position": 21 + } + ], + "responses": { + "200": { + "description": "Asset found and content or (resized) image returned.", + "content": { + "application/octet-stream": { + "schema": { + "type": "string", + "format": "binary" + } + } + } + }, + "404": { + "description": "Asset or app not found." + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [] + } + ] + } + }, + "/api/assets/{id}": { + "get": { + "tags": [ + "Assets" + ], + "summary": "Get the asset content.", + "operationId": "AssetContent_GetAssetContent", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "description": "The ID of the asset.", + "schema": { + "type": "string" + }, + "x-position": 1 + }, + { + "name": "version", + "in": "query", + "description": "The optional version of the asset.", + "schema": { + "type": "integer", + "format": "int64" + }, + "x-position": 2 + }, + { + "name": "cache", + "in": "query", + "description": "The cache duration in seconds.", + "schema": { + "type": "integer", + "format": "int64" + }, + "x-position": 3 + }, + { + "name": "download", + "in": "query", + "description": "Set it to 0 to prevent download.", + "schema": { + "type": "integer", + "format": "int32" + }, + "x-position": 4 + }, + { + "name": "width", + "in": "query", + "description": "The target width of the asset, if it is an image.", + "schema": { + "type": "integer", + "format": "int32", + "nullable": true + }, + "x-position": 5 + }, + { + "name": "height", + "in": "query", + "description": "The target height of the asset, if it is an image.", + "schema": { + "type": "integer", + "format": "int32", + "nullable": true + }, + "x-position": 6 + }, + { + "name": "quality", + "in": "query", + "description": "Optional image quality, it is is an jpeg image.", + "schema": { + "type": "integer", + "format": "int32", + "nullable": true + }, + "x-position": 7 + }, + { + "name": "mode", + "in": "query", + "description": "The resize mode when the width and height is defined.", + "schema": { + "nullable": true, + "$ref": "#/components/schemas/ResizeMode" + }, + "x-position": 8 + }, + { + "name": "bg", + "in": "query", + "description": "Optional background color.", + "schema": { + "type": "string", + "nullable": true + }, + "x-position": 9 + }, + { + "name": "focusX", + "in": "query", + "description": "Override the y focus point.", + "schema": { + "type": "number", + "format": "float", + "nullable": true + }, + "x-position": 10 + }, + { + "name": "focusY", + "in": "query", + "description": "Override the x focus point.", + "schema": { + "type": "number", + "format": "float", + "nullable": true + }, + "x-position": 11 + }, + { + "name": "nofocus", + "in": "query", + "description": "True to ignore the asset focus point if any.", + "schema": { + "type": "boolean" + }, + "x-position": 12 + }, + { + "name": "auto", + "in": "query", + "description": "True to use auto format.", + "schema": { + "type": "boolean" + }, + "x-position": 13 + }, + { + "name": "force", + "in": "query", + "description": "True to force a new resize even if it already stored.", + "schema": { + "type": "boolean" + }, + "x-position": 14 + }, + { + "name": "deleted", + "in": "query", + "description": "Also return deleted content items.", + "schema": { + "type": "boolean" + }, + "x-position": 15 + }, + { + "name": "format", + "in": "query", + "description": "True to force a new resize even if it already stored.", + "schema": { + "nullable": true, + "$ref": "#/components/schemas/ImageFormat" + }, + "x-position": 16 + }, + { + "name": "watermarkUrl", + "in": "query", + "description": "Adds the image with the given URL on to of your image. If the watermark cannot be loaded or found, the watermark is just ignored.", + "schema": { + "type": "string", + "nullable": true + }, + "x-position": 17 + }, + { + "name": "watermarkOpacity", + "in": "query", + "description": "The opacity of the watermark image.", + "schema": { + "type": "number", + "format": "float" + }, + "x-position": 18 + }, + { + "name": "watermarkAnchor", + "in": "query", + "description": "The anchor where the watermark should be placed.", + "schema": { + "$ref": "#/components/schemas/WatermarkAnchor" + }, + "x-position": 19 + } + ], + "responses": { + "200": { + "description": "Asset found and content or (resized) image returned.", + "content": { + "application/octet-stream": { + "schema": { + "type": "string", + "format": "binary" + } + } + } + }, + "404": { + "description": "Asset or app not found." + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "deprecated": true, + "security": [ + { + "squidex-oauth-auth": [] + } + ] + } + }, + "/api/apps/{app}/assets/folders": { + "get": { + "tags": [ + "Assets" + ], + "summary": "Get asset folders.", + "description": "Get all asset folders for the app.", + "operationId": "AssetFolders_GetAssetFolders", + "parameters": [ + { + "name": "app", + "in": "path", + "required": true, + "description": "The name of the app.", + "schema": { + "type": "string" + }, + "x-position": 1 + }, + { + "name": "parentId", + "in": "query", + "description": "The optional parent folder id.", + "schema": { + "type": "string", + "nullable": true + }, + "x-position": 2 + }, + { + "name": "scope", + "in": "query", + "description": "The scope of the query.", + "schema": { + "default": "PathAndItems", + "$ref": "#/components/schemas/AssetFolderScope" + }, + "x-position": 3 + } + ], + "responses": { + "200": { + "description": "Asset folders returned.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AssetFoldersDto" + } + } + } + }, + "404": { + "description": "App not found." + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.apps.{app}.assets.read" + ] + } + ] + }, + "post": { + "tags": [ + "Assets" + ], + "summary": "Create an asset folder.", + "operationId": "AssetFolders_PostAssetFolder", + "parameters": [ + { + "name": "app", + "in": "path", + "required": true, + "description": "The name of the app.", + "schema": { + "type": "string" + }, + "x-position": 1 + } + ], + "requestBody": { + "x-name": "request", + "description": "The asset folder object that needs to be added to the App.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateAssetFolderDto" + } + } + }, + "required": true, + "x-position": 2 + }, + "responses": { + "201": { + "description": "Asset folder created.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AssetFolderDto" + } + } + } + }, + "400": { + "description": "Asset folder request not valid.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + }, + "404": { + "description": "App not found." + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.apps.{app}.assets.folders.create" + ] + } + ] + } + }, + "/api/apps/{app}/assets/folders/{id}": { + "put": { + "tags": [ + "Assets" + ], + "summary": "Update an asset folder.", + "operationId": "AssetFolders_PutAssetFolder", + "parameters": [ + { + "name": "app", + "in": "path", + "required": true, + "description": "The name of the app.", + "schema": { + "type": "string" + }, + "x-position": 1 + }, + { + "name": "id", + "in": "path", + "required": true, + "description": "The ID of the asset folder.", + "schema": { + "type": "string" + }, + "x-position": 2 + } + ], + "requestBody": { + "x-name": "request", + "description": "The asset folder object that needs to updated.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RenameAssetFolderDto" + } + } + }, + "required": true, + "x-position": 3 + }, + "responses": { + "200": { + "description": "Asset folder updated.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AssetFolderDto" + } + } + } + }, + "400": { + "description": "Asset folder request not valid.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + }, + "404": { + "description": "Asset folder or app not found." + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.apps.{app}.assets.folders.update" + ] + } + ] + }, + "delete": { + "tags": [ + "Assets" + ], + "summary": "Delete an asset folder.", + "operationId": "AssetFolders_DeleteAssetFolder", + "parameters": [ + { + "name": "app", + "in": "path", + "required": true, + "description": "The name of the app.", + "schema": { + "type": "string" + }, + "x-position": 1 + }, + { + "name": "id", + "in": "path", + "required": true, + "description": "The ID of the asset folder to delete.", + "schema": { + "type": "string" + }, + "x-position": 2 + } + ], + "responses": { + "204": { + "description": "Asset folder deleted." + }, + "404": { + "description": "Asset folder or app not found." + }, + "400": { + "description": "Validation error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.apps.{app}.assets.folders.delete" + ] + } + ] + } + }, + "/api/apps/{app}/assets/folders/{id}/parent": { + "put": { + "tags": [ + "Assets" + ], + "summary": "Move an asset folder.", + "operationId": "AssetFolders_PutAssetFolderParent", + "parameters": [ + { + "name": "app", + "in": "path", + "required": true, + "description": "The name of the app.", + "schema": { + "type": "string" + }, + "x-position": 1 + }, + { + "name": "id", + "in": "path", + "required": true, + "description": "The ID of the asset folder.", + "schema": { + "type": "string" + }, + "x-position": 2 + } + ], + "requestBody": { + "x-name": "request", + "description": "The asset folder object that needs to updated.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/MoveAssetFolderDto" + } + } + }, + "required": true, + "x-position": 3 + }, + "responses": { + "200": { + "description": "Asset folder moved.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AssetFolderDto" + } + } + } + }, + "400": { + "description": "Asset folder request not valid.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + }, + "404": { + "description": "Asset folder or app not found." + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.apps.{app}.assets.folders.update" + ] + } + ] + } + }, + "/api/apps/{app}/assets/tags": { + "get": { + "tags": [ + "Assets" + ], + "summary": "Get assets tags.", + "description": "Get all tags for assets.", + "operationId": "Assets_GetTags", + "parameters": [ + { + "name": "app", + "in": "path", + "required": true, + "description": "The name of the app.", + "schema": { + "type": "string" + }, + "x-position": 1 + } + ], + "responses": { + "200": { + "description": "Assets tags returned.", + "content": { + "application/json": { + "schema": { + "type": "object", + "additionalProperties": { + "type": "integer", + "format": "int32" + } + } + } + } + }, + "404": { + "description": "App not found." + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.apps.{app}.assets.read" + ] + } + ] + } + }, + "/api/apps/{app}/assets/tags/{name}": { + "put": { + "tags": [ + "Assets" + ], + "summary": "Rename an asset tag.", + "operationId": "Assets_PutTag", + "parameters": [ + { + "name": "app", + "in": "path", + "required": true, + "description": "The name of the app.", + "schema": { + "type": "string" + }, + "x-position": 1 + }, + { + "name": "name", + "in": "path", + "required": true, + "description": "The tag to return.", + "schema": { + "type": "string" + }, + "x-position": 2 + } + ], + "requestBody": { + "x-name": "request", + "description": "The required request object.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RenameTagDto" + } + } + }, + "required": true, + "x-position": 3 + }, + "responses": { + "200": { + "description": "Asset tag renamed and new tags returned.", + "content": { + "application/json": { + "schema": { + "type": "object", + "additionalProperties": { + "type": "integer", + "format": "int32" + } + } + } + } + }, + "404": { + "description": "App not found." + }, + "400": { + "description": "Validation error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.apps.{app}.assets.update" + ] + } + ] + } + }, + "/api/apps/{app}/assets": { + "get": { + "tags": [ + "Assets" + ], + "summary": "Get assets.", + "description": "Get all assets for the app.", + "operationId": "Assets_GetAssets", + "parameters": [ + { + "name": "app", + "in": "path", + "required": true, + "description": "The name of the app.", + "schema": { + "type": "string" + }, + "x-position": 0 + }, + { + "name": "parentId", + "in": "query", + "description": "The optional parent folder id.", + "schema": { + "type": "string", + "nullable": true + }, + "x-position": 1 + }, + { + "name": "ids", + "in": "query", + "description": "The optional asset ids.", + "schema": { + "type": "string", + "nullable": true + }, + "x-position": 2 + }, + { + "name": "q", + "in": "query", + "description": "The optional json query.", + "schema": { + "type": "string", + "nullable": true + }, + "x-position": 3 + }, + { + "name": "$top", + "in": "query", + "description": "Optional number of items to take.", + "schema": { + "type": "number" + }, + "x-position": 4 + }, + { + "name": "$skip", + "in": "query", + "description": "Optional number of items to skip.", + "schema": { + "type": "number" + }, + "x-position": 5 + }, + { + "name": "$orderby", + "in": "query", + "description": "Optional OData order definition.", + "schema": { + "type": "string" + }, + "x-position": 6 + }, + { + "name": "$filter", + "in": "query", + "description": "Optional OData filter.", + "schema": { + "type": "string" + }, + "x-position": 7 + }, + { + "name": "X-NoTotal", + "in": "header", + "description": "Do not return the total amount.", + "schema": { + "type": "boolean" + }, + "x-position": 8 + }, + { + "name": "X-NoSlowTotal", + "in": "header", + "description": "Do not return the total amount, if it would be slow.", + "schema": { + "type": "boolean" + }, + "x-position": 9 + } + ], + "responses": { + "200": { + "description": "Assets returned.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AssetsDto" + } + } + } + }, + "404": { + "description": "App not found." + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.apps.{app}.assets.read" + ] + } + ] + }, + "post": { + "tags": [ + "Assets" + ], + "summary": "Upload a new asset.", + "description": "You can only upload one file at a time. The mime type of the file is not calculated by Squidex and is required correctly.", + "operationId": "Assets_PostAsset", + "parameters": [ + { + "name": "app", + "in": "path", + "required": true, + "description": "The name of the app.", + "schema": { + "type": "string" + }, + "x-position": 1 + }, + { + "name": "ParentId", + "in": "query", + "description": "The optional parent folder id.", + "schema": { + "type": "string" + }, + "x-position": 2 + }, + { + "name": "id", + "in": "query", + "description": "The optional custom asset id.", + "schema": { + "type": "string", + "nullable": true + }, + "x-position": 3 + }, + { + "name": "duplicate", + "in": "query", + "description": "True to duplicate the asset, event if the file has been uploaded.", + "schema": { + "type": "boolean" + }, + "x-position": 4 + } + ], + "requestBody": { + "content": { + "multipart/form-data": { + "schema": { + "type": "object", + "properties": { + "file": { + "type": "string", + "format": "binary" + }, + "url": { + "type": "string" + }, + "name": { + "type": "string" + } + } + } + } + } + }, + "responses": { + "201": { + "description": "Asset created.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AssetDto" + } + } + } + }, + "400": { + "description": "Asset request not valid.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + }, + "413": { + "description": "Asset exceeds the maximum upload size.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + }, + "404": { + "description": "App not found." + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.apps.{app}.assets.create" + ] + } + ] + } + }, + "/api/apps/{app}/assets/query": { + "post": { + "tags": [ + "Assets" + ], + "summary": "Get assets.", + "description": "Get all assets for the app.", + "operationId": "Assets_GetAssetsPost", + "parameters": [ + { + "name": "app", + "in": "path", + "required": true, + "description": "The name of the app.", + "schema": { + "type": "string" + }, + "x-position": 0 + }, + { + "name": "X-NoTotal", + "in": "header", + "description": "Do not return the total amount.", + "schema": { + "type": "boolean" + }, + "x-position": 2 + }, + { + "name": "X-NoSlowTotal", + "in": "header", + "description": "Do not return the total amount, if it would be slow.", + "schema": { + "type": "boolean" + }, + "x-position": 3 + } + ], + "requestBody": { + "x-name": "query", + "description": "The required query object.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/QueryDto" + } + } + }, + "required": true, + "x-position": 1 + }, + "responses": { + "200": { + "description": "Assets returned.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AssetsDto" + } + } + } + }, + "404": { + "description": "App not found." + }, + "400": { + "description": "Validation error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.apps.{app}.assets.read" + ] + } + ] + } + }, + "/api/apps/{app}/assets/{id}": { + "get": { + "tags": [ + "Assets" + ], + "summary": "Get an asset by id.", + "operationId": "Assets_GetAsset", + "parameters": [ + { + "name": "app", + "in": "path", + "required": true, + "description": "The name of the app.", + "schema": { + "type": "string" + }, + "x-position": 1 + }, + { + "name": "id", + "in": "path", + "required": true, + "description": "The ID of the asset to retrieve.", + "schema": { + "type": "string" + }, + "x-position": 2 + } + ], + "responses": { + "200": { + "description": "Asset found.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AssetDto" + } + } + } + }, + "404": { + "description": "Asset or app not found." + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.apps.{app}.assets.read" + ] + } + ] + }, + "post": { + "tags": [ + "Assets" + ], + "summary": "Upsert an asset.", + "description": "You can only upload one file at a time. The mime type of the file is not calculated by Squidex and is required correctly.", + "operationId": "Assets_PostUpsertAsset", + "parameters": [ + { + "name": "app", + "in": "path", + "required": true, + "description": "The name of the app.", + "schema": { + "type": "string" + }, + "x-position": 1 + }, + { + "name": "id", + "in": "path", + "required": true, + "description": "The optional custom asset id.", + "schema": { + "type": "string" + }, + "x-position": 2 + }, + { + "name": "parentId", + "in": "query", + "description": "The optional parent folder id.", + "schema": { + "type": "string" + }, + "x-position": 3 + }, + { + "name": "duplicate", + "in": "query", + "description": "True to duplicate the asset, event if the file has been uploaded.", + "schema": { + "type": "boolean" + }, + "x-position": 4 + } + ], + "requestBody": { + "content": { + "multipart/form-data": { + "schema": { + "type": "object", + "properties": { + "file": { + "type": "string", + "format": "binary" + }, + "url": { + "type": "string" + }, + "name": { + "type": "string" + } + } + } + } + } + }, + "responses": { + "200": { + "description": "Asset created or updated.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AssetDto" + } + } + } + }, + "400": { + "description": "Asset request not valid.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + }, + "413": { + "description": "Asset exceeds the maximum upload size.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + }, + "404": { + "description": "App not found." + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.apps.{app}.assets.create" + ] + } + ] + }, + "put": { + "tags": [ + "Assets" + ], + "summary": "Update an asset.", + "operationId": "Assets_PutAsset", + "parameters": [ + { + "name": "app", + "in": "path", + "required": true, + "description": "The name of the app.", + "schema": { + "type": "string" + }, + "x-position": 1 + }, + { + "name": "id", + "in": "path", + "required": true, + "description": "The ID of the asset.", + "schema": { + "type": "string" + }, + "x-position": 2 + } + ], + "requestBody": { + "x-name": "request", + "description": "The asset object that needs to updated.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AnnotateAssetDto" + } + } + }, + "required": true, + "x-position": 3 + }, + "responses": { + "200": { + "description": "Asset updated.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AssetDto" + } + } + } + }, + "400": { + "description": "Asset request not valid.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + }, + "404": { + "description": "Asset or app not found." + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.apps.{app}.assets.update" + ] + } + ] + }, + "delete": { + "tags": [ + "Assets" + ], + "summary": "Delete an asset.", + "operationId": "Assets_DeleteAsset", + "parameters": [ + { + "name": "app", + "in": "path", + "required": true, + "description": "The name of the app.", + "schema": { + "type": "string" + }, + "x-position": 1 + }, + { + "name": "id", + "in": "path", + "required": true, + "description": "The ID of the asset to delete.", + "schema": { + "type": "string" + }, + "x-position": 2 + }, + { + "name": "checkReferrers", + "in": "query", + "description": "True to check referrers of this asset.", + "schema": { + "type": "boolean" + }, + "x-position": 3 + }, + { + "name": "permanent", + "in": "query", + "description": "True to delete the asset permanently.", + "schema": { + "type": "boolean" + }, + "x-position": 4 + } + ], + "responses": { + "204": { + "description": "Asset deleted." + }, + "404": { + "description": "Asset or app not found." + }, + "400": { + "description": "Validation error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.apps.{app}.assets.delete" + ] + } + ] + } + }, + "/api/apps/{app}/assets/bulk": { + "post": { + "tags": [ + "Assets" + ], + "summary": "Bulk update assets.", + "operationId": "Assets_BulkUpdateAssets", + "parameters": [ + { + "name": "app", + "in": "path", + "required": true, + "description": "The name of the app.", + "schema": { + "type": "string" + }, + "x-position": 1 + } + ], + "requestBody": { + "x-name": "request", + "description": "The bulk update request.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/BulkUpdateAssetsDto" + } + } + }, + "required": true, + "x-position": 2 + }, + "responses": { + "200": { + "description": "Assets created, update or delete.", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/BulkResultDto" + } + } + } + } + }, + "400": { + "description": "Assets request not valid.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + }, + "404": { + "description": "App not found." + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.apps.{app}.assets.read" + ] + } + ] + } + }, + "/api/apps/{app}/assets/{id}/content": { + "put": { + "tags": [ + "Assets" + ], + "summary": "Replace asset content.", + "description": "Use multipart request to upload an asset.", + "operationId": "Assets_PutAssetContent", + "parameters": [ + { + "name": "app", + "in": "path", + "required": true, + "description": "The name of the app.", + "schema": { + "type": "string" + }, + "x-position": 1 + }, + { + "name": "id", + "in": "path", + "required": true, + "description": "The ID of the asset.", + "schema": { + "type": "string" + }, + "x-position": 2 + } + ], + "requestBody": { + "content": { + "multipart/form-data": { + "schema": { + "type": "object", + "properties": { + "file": { + "type": "string", + "format": "binary" + }, + "url": { + "type": "string" + }, + "name": { + "type": "string" + } + } + } + } + } + }, + "responses": { + "200": { + "description": "Asset updated.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AssetDto" + } + } + } + }, + "400": { + "description": "Asset request not valid.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + }, + "413": { + "description": "Asset exceeds the maximum upload size.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + }, + "404": { + "description": "Asset or app not found." + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.apps.{app}.assets.upload" + ] + } + ] + } + }, + "/api/apps/{app}/assets/{id}/parent": { + "put": { + "tags": [ + "Assets" + ], + "summary": "Moves the asset.", + "operationId": "Assets_PutAssetParent", + "parameters": [ + { + "name": "app", + "in": "path", + "required": true, + "description": "The name of the app.", + "schema": { + "type": "string" + }, + "x-position": 1 + }, + { + "name": "id", + "in": "path", + "required": true, + "description": "The ID of the asset.", + "schema": { + "type": "string" + }, + "x-position": 2 + } + ], + "requestBody": { + "x-name": "request", + "description": "The asset object that needs to updated.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/MoveAssetDto" + } + } + }, + "required": true, + "x-position": 3 + }, + "responses": { + "200": { + "description": "Asset moved.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AssetDto" + } + } + } + }, + "400": { + "description": "Asset request not valid.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + }, + "404": { + "description": "Asset or app not found." + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.apps.{app}.assets.update" + ] + } + ] + } + }, + "/api/apps/{app}/assets/scripts": { + "get": { + "tags": [ + "Apps" + ], + "summary": "Get the app asset scripts.", + "operationId": "AppAssets_GetAssetScripts", + "parameters": [ + { + "name": "app", + "in": "path", + "required": true, + "description": "The name of the app to get the asset scripts for.", + "schema": { + "type": "string" + }, + "x-position": 1 + } + ], + "responses": { + "200": { + "description": "Asset scripts returned.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AssetScriptsDto" + } + } + } + }, + "404": { + "description": "App not found." + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.apps.{app}.asset-scripts.read" + ] + } + ] + }, + "put": { + "tags": [ + "Apps" + ], + "summary": "Update the asset scripts.", + "operationId": "AppAssets_PutAssetScripts", + "parameters": [ + { + "name": "app", + "in": "path", + "required": true, + "description": "The name of the app to update.", + "schema": { + "type": "string" + }, + "x-position": 1 + } + ], + "requestBody": { + "x-name": "request", + "description": "The values to update.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateAssetScriptsDto" + } + } + }, + "required": true, + "x-position": 2 + }, + "responses": { + "200": { + "description": "Asset scripts updated.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AssetScriptsDto" + } + } + } + }, + "400": { + "description": "Asset request not valid.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + }, + "404": { + "description": "App not found." + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.apps.{app}.asset-scripts.update" + ] + } + ] + } + }, + "/api/apps/{app}/clients": { + "get": { + "tags": [ + "Apps" + ], + "summary": "Get app clients.", + "description": "Gets all configured clients for the app with the specified name.", + "operationId": "AppClients_GetClients", + "parameters": [ + { + "name": "app", + "in": "path", + "required": true, + "description": "The name of the app.", + "schema": { + "type": "string" + }, + "x-position": 1 + } + ], + "responses": { + "200": { + "description": "Clients returned.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ClientsDto" + } + } + } + }, + "404": { + "description": "App not found." + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.apps.{app}.clients.read" + ] + } + ] + }, + "post": { + "tags": [ + "Apps" + ], + "summary": "Create a new app client.", + "description": "Create a new client for the app with the specified name.\nThe client secret is auto generated on the server and returned. The client does not expire, the access token is valid for 30 days.", + "operationId": "AppClients_PostClient", + "parameters": [ + { + "name": "app", + "in": "path", + "required": true, + "description": "The name of the app.", + "schema": { + "type": "string" + }, + "x-position": 1 + } + ], + "requestBody": { + "x-name": "request", + "description": "Client object that needs to be added to the app.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateClientDto" + } + } + }, + "required": true, + "x-position": 2 + }, + "responses": { + "201": { + "description": "Client created.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ClientsDto" + } + } + } + }, + "400": { + "description": "Client request not valid.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + }, + "404": { + "description": "App not found." + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.apps.{app}.clients.create" + ] + } + ] + } + }, + "/api/apps/{app}/clients/{id}": { + "put": { + "tags": [ + "Apps" + ], + "summary": "Updates an app client.", + "description": "Only the display name can be changed, create a new client if necessary.", + "operationId": "AppClients_PutClient", + "parameters": [ + { + "name": "app", + "in": "path", + "required": true, + "description": "The name of the app.", + "schema": { + "type": "string" + }, + "x-position": 1 + }, + { + "name": "id", + "in": "path", + "required": true, + "description": "The ID of the client that must be updated.", + "schema": { + "type": "string" + }, + "x-position": 2 + } + ], + "requestBody": { + "x-name": "request", + "description": "Client object that needs to be updated.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateClientDto" + } + } + }, + "required": true, + "x-position": 3 + }, + "responses": { + "200": { + "description": "Client updated.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ClientsDto" + } + } + } + }, + "400": { + "description": "Client request not valid.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + }, + "404": { + "description": "Client or app not found." + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.apps.{app}.clients.update" + ] + } + ] + }, + "delete": { + "tags": [ + "Apps" + ], + "summary": "Revoke an app client.", + "description": "The application that uses this client credentials cannot access the API after it has been revoked.", + "operationId": "AppClients_DeleteClient", + "parameters": [ + { + "name": "app", + "in": "path", + "required": true, + "description": "The name of the app.", + "schema": { + "type": "string" + }, + "x-position": 1 + }, + { + "name": "id", + "in": "path", + "required": true, + "description": "The ID of the client that must be deleted.", + "schema": { + "type": "string" + }, + "x-position": 2 + } + ], + "responses": { + "200": { + "description": "Client deleted.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ClientsDto" + } + } + } + }, + "404": { + "description": "Client or app not found." + }, + "400": { + "description": "Validation error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.apps.{app}.clients.delete" + ] + } + ] + } + }, + "/api/apps/{app}/contributors": { + "get": { + "tags": [ + "Apps" + ], + "summary": "Get app contributors.", + "operationId": "AppContributors_GetContributors", + "parameters": [ + { + "name": "app", + "in": "path", + "required": true, + "description": "The name of the app.", + "schema": { + "type": "string" + }, + "x-position": 1 + } + ], + "responses": { + "200": { + "description": "Contributors returned.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ContributorsDto" + } + } + } + }, + "404": { + "description": "App not found." + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.apps.{app}.contributors.read" + ] + } + ] + }, + "post": { + "tags": [ + "Apps" + ], + "summary": "Assign contributor to app.", + "operationId": "AppContributors_PostContributor", + "parameters": [ + { + "name": "app", + "in": "path", + "required": true, + "description": "The name of the app.", + "schema": { + "type": "string" + }, + "x-position": 1 + } + ], + "requestBody": { + "x-name": "request", + "description": "Contributor object that needs to be added to the app.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AssignContributorDto" + } + } + }, + "required": true, + "x-position": 2 + }, + "responses": { + "201": { + "description": "Contributor assigned to app.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ContributorsDto" + } + } + } + }, + "400": { + "description": "Contributor request not valid.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + }, + "404": { + "description": "App not found." + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.apps.{app}.contributors.assign" + ] + } + ] + } + }, + "/api/apps/{app}/contributors/me": { + "delete": { + "tags": [ + "Apps" + ], + "summary": "Remove yourself.", + "operationId": "AppContributors_DeleteMyself", + "parameters": [ + { + "name": "app", + "in": "path", + "required": true, + "description": "The name of the app.", + "schema": { + "type": "string" + }, + "x-position": 1 + } + ], + "responses": { + "200": { + "description": "Contributor removed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ContributorsDto" + } + } + } + }, + "404": { + "description": "Contributor or app not found." + }, + "400": { + "description": "Validation error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [] + } + ] + } + }, + "/api/apps/{app}/contributors/{id}": { + "delete": { + "tags": [ + "Apps" + ], + "summary": "Remove contributor.", + "operationId": "AppContributors_DeleteContributor", + "parameters": [ + { + "name": "app", + "in": "path", + "required": true, + "description": "The name of the app.", + "schema": { + "type": "string" + }, + "x-position": 1 + }, + { + "name": "id", + "in": "path", + "required": true, + "description": "The ID of the contributor.", + "schema": { + "type": "string" + }, + "x-position": 2 + } + ], + "responses": { + "200": { + "description": "Contributor removed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ContributorsDto" + } + } + } + }, + "404": { + "description": "Contributor or app not found." + }, + "400": { + "description": "Validation error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.apps.{app}.contributors.revoke" + ] + } + ] + } + }, + "/api/apps/{app}/image": { + "get": { + "tags": [ + "Apps" + ], + "summary": "Get the app image.", + "operationId": "AppImage_GetImage", + "parameters": [ + { + "name": "app", + "in": "path", + "required": true, + "description": "The name of the app.", + "schema": { + "type": "string" + }, + "x-position": 1 + } + ], + "responses": { + "200": { + "description": "App image found and content or (resized) image returned.", + "content": { + "application/octet-stream": { + "schema": { + "type": "string", + "format": "binary" + } + } + } + }, + "404": { + "description": "App not found." + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + } + }, + "post": { + "tags": [ + "Apps" + ], + "summary": "Upload the app image.", + "operationId": "Apps_UploadImage", + "parameters": [ + { + "name": "app", + "in": "path", + "required": true, + "description": "The name of the app to update.", + "schema": { + "type": "string" + }, + "x-position": 1 + } + ], + "requestBody": { + "content": { + "multipart/form-data": { + "schema": { + "type": "object", + "properties": { + "file": { + "type": "string", + "format": "binary" + }, + "url": { + "type": "string" + }, + "name": { + "type": "string" + } + } + } + } + } + }, + "responses": { + "200": { + "description": "App image uploaded.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AppDto" + } + } + } + }, + "400": { + "description": "App request not valid.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + }, + "404": { + "description": "App not found." + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.apps.{app}.image" + ] + } + ] + }, + "delete": { + "tags": [ + "Apps" + ], + "summary": "Remove the app image.", + "operationId": "Apps_DeleteImage", + "parameters": [ + { + "name": "app", + "in": "path", + "required": true, + "description": "The name of the app to update.", + "schema": { + "type": "string" + }, + "x-position": 1 + } + ], + "responses": { + "200": { + "description": "App image removed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AppDto" + } + } + } + }, + "404": { + "description": "App not found." + }, + "400": { + "description": "Validation error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.apps.{app}.image" + ] + } + ] + } + }, + "/api/apps/{app}/languages": { + "get": { + "tags": [ + "Apps" + ], + "summary": "Get app languages.", + "operationId": "AppLanguages_GetLanguages", + "parameters": [ + { + "name": "app", + "in": "path", + "required": true, + "description": "The name of the app.", + "schema": { + "type": "string" + }, + "x-position": 1 + } + ], + "responses": { + "200": { + "description": "Languages returned.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AppLanguagesDto" + } + } + } + }, + "404": { + "description": "App not found." + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.apps.{app}.languages.read" + ] + } + ] + }, + "post": { + "tags": [ + "Apps" + ], + "summary": "Add an app language.", + "operationId": "AppLanguages_PostLanguage", + "parameters": [ + { + "name": "app", + "in": "path", + "required": true, + "description": "The name of the app.", + "schema": { + "type": "string" + }, + "x-position": 1 + } + ], + "requestBody": { + "x-name": "request", + "description": "The language to add to the app.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AddLanguageDto" + } + } + }, + "required": true, + "x-position": 2 + }, + "responses": { + "201": { + "description": "Language created.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AppLanguagesDto" + } + } + } + }, + "400": { + "description": "Language request not valid.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + }, + "404": { + "description": "App not found." + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.apps.{app}.languages.create" + ] + } + ] + } + }, + "/api/apps/{app}/languages/{language}": { + "put": { + "tags": [ + "Apps" + ], + "summary": "Updates an app language.", + "operationId": "AppLanguages_PutLanguage", + "parameters": [ + { + "name": "app", + "in": "path", + "required": true, + "description": "The name of the app.", + "schema": { + "type": "string" + }, + "x-position": 1 + }, + { + "name": "language", + "in": "path", + "required": true, + "description": "The language to update.", + "schema": { + "type": "string" + }, + "x-position": 2 + } + ], + "requestBody": { + "x-name": "request", + "description": "The language object.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateLanguageDto" + } + } + }, + "required": true, + "x-position": 3 + }, + "responses": { + "200": { + "description": "Language updated.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AppLanguagesDto" + } + } + } + }, + "400": { + "description": "Language request not valid.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + }, + "404": { + "description": "Language or app not found." + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.apps.{app}.languages.update" + ] + } + ] + }, + "delete": { + "tags": [ + "Apps" + ], + "summary": "Deletes an app language.", + "operationId": "AppLanguages_DeleteLanguage", + "parameters": [ + { + "name": "app", + "in": "path", + "required": true, + "description": "The name of the app.", + "schema": { + "type": "string" + }, + "x-position": 1 + }, + { + "name": "language", + "in": "path", + "required": true, + "description": "The language to delete from the app.", + "schema": { + "type": "string" + }, + "x-position": 2 + } + ], + "responses": { + "200": { + "description": "Language deleted.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AppLanguagesDto" + } + } + } + }, + "400": { + "description": "Language is master language.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + }, + "404": { + "description": "Language or app not found." + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.apps.{app}.languages.delete" + ] + } + ] + } + }, + "/api/apps/{app}/roles": { + "get": { + "tags": [ + "Apps" + ], + "summary": "Get app roles.", + "operationId": "AppRoles_GetRoles", + "parameters": [ + { + "name": "app", + "in": "path", + "required": true, + "description": "The name of the app.", + "schema": { + "type": "string" + }, + "x-position": 1 + } + ], + "responses": { + "200": { + "description": "Roles returned.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RolesDto" + } + } + } + }, + "404": { + "description": "App not found." + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.apps.{app}.roles.read" + ] + } + ] + }, + "post": { + "tags": [ + "Apps" + ], + "summary": "Add role to app.", + "operationId": "AppRoles_PostRole", + "parameters": [ + { + "name": "app", + "in": "path", + "required": true, + "description": "The name of the app.", + "schema": { + "type": "string" + }, + "x-position": 1 + } + ], + "requestBody": { + "x-name": "request", + "description": "Role object that needs to be added to the app.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AddRoleDto" + } + } + }, + "required": true, + "x-position": 2 + }, + "responses": { + "201": { + "description": "Role created.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RolesDto" + } + } + } + }, + "400": { + "description": "Role request not valid.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + }, + "404": { + "description": "App not found." + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.apps.{app}.roles.create" + ] + } + ] + } + }, + "/api/apps/{app}/roles/permissions": { + "get": { + "tags": [ + "Apps" + ], + "summary": "Get app permissions.", + "operationId": "AppRoles_GetPermissions", + "parameters": [ + { + "name": "app", + "in": "path", + "required": true, + "description": "The name of the app.", + "schema": { + "type": "string" + }, + "x-position": 1 + } + ], + "responses": { + "200": { + "description": "App permissions returned.", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "type": "string" + } + } + } + } + }, + "404": { + "description": "App not found." + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.apps.{app}.roles.read" + ] + } + ] + } + }, + "/api/apps/{app}/roles/{roleName}": { + "put": { + "tags": [ + "Apps" + ], + "summary": "Update an app role.", + "operationId": "AppRoles_PutRole", + "parameters": [ + { + "name": "app", + "in": "path", + "required": true, + "description": "The name of the app.", + "schema": { + "type": "string" + }, + "x-position": 1 + }, + { + "name": "roleName", + "in": "path", + "required": true, + "description": "The name of the role to be updated.", + "schema": { + "type": "string" + }, + "x-position": 2 + } + ], + "requestBody": { + "x-name": "request", + "description": "Role to be updated for the app.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateRoleDto" + } + } + }, + "required": true, + "x-position": 3 + }, + "responses": { + "200": { + "description": "Role updated.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RolesDto" + } + } + } + }, + "400": { + "description": "Role request not valid.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + }, + "404": { + "description": "Role or app not found." + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.apps.{app}.roles.update" + ] + } + ] + }, + "delete": { + "tags": [ + "Apps" + ], + "summary": "Remove role from app.", + "operationId": "AppRoles_DeleteRole", + "parameters": [ + { + "name": "app", + "in": "path", + "required": true, + "description": "The name of the app.", + "schema": { + "type": "string" + }, + "x-position": 1 + }, + { + "name": "roleName", + "in": "path", + "required": true, + "description": "The name of the role.", + "schema": { + "type": "string" + }, + "x-position": 2 + } + ], + "responses": { + "200": { + "description": "Role deleted.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RolesDto" + } + } + } + }, + "400": { + "description": "Role is in use by contributor or client or a default role.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + }, + "404": { + "description": "Role or app not found." + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.apps.{app}.roles.delete" + ] + } + ] + } + }, + "/api/apps": { + "get": { + "tags": [ + "Apps" + ], + "summary": "Get your apps.", + "description": "You can only retrieve the list of apps when you are authenticated as a user (OpenID implicit flow).\nYou will retrieve all apps, where you are assigned as a contributor.", + "operationId": "Apps_GetApps", + "responses": { + "200": { + "description": "Apps returned.", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/AppDto" + } + } + } + } + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [] + } + ] + }, + "post": { + "tags": [ + "Apps" + ], + "summary": "Create a new app.", + "description": "You can only create an app when you are authenticated as a user (OpenID implicit flow).\nYou will be assigned as owner of the new app automatically.", + "operationId": "Apps_PostApp", + "requestBody": { + "x-name": "request", + "description": "The app object that needs to be added to Squidex.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateAppDto" + } + } + }, + "required": true, + "x-position": 1 + }, + "responses": { + "201": { + "description": "App created.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AppDto" + } + } + } + }, + "400": { + "description": "App request not valid.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + }, + "409": { + "description": "App name is already in use.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [] + } + ] + } + }, + "/api/teams/{team}/apps": { + "get": { + "tags": [ + "Apps" + ], + "summary": "Get team apps.", + "description": "You can only retrieve the list of apps when you are authenticated as a user (OpenID implicit flow).\nYou will retrieve all apps, where you are assigned as a contributor.", + "operationId": "Apps_GetTeamApps", + "parameters": [ + { + "name": "team", + "in": "path", + "required": true, + "description": "The ID of the team.", + "schema": { + "type": "string" + }, + "x-position": 1 + } + ], + "responses": { + "200": { + "description": "Apps returned.", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/AppDto" + } + } + } + } + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [] + } + ] + } + }, + "/api/apps/{app}": { + "get": { + "tags": [ + "Apps" + ], + "summary": "Get an app by name.", + "operationId": "Apps_GetApp", + "parameters": [ + { + "name": "app", + "in": "path", + "required": true, + "description": "The name of the app.", + "schema": { + "type": "string" + }, + "x-position": 1 + } + ], + "responses": { + "200": { + "description": "Apps returned.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AppDto" + } + } + } + }, + "404": { + "description": "App not found." + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [] + } + ] + }, + "put": { + "tags": [ + "Apps" + ], + "summary": "Update the app.", + "operationId": "Apps_PutApp", + "parameters": [ + { + "name": "app", + "in": "path", + "required": true, + "description": "The name of the app to update.", + "schema": { + "type": "string" + }, + "x-position": 1 + } + ], + "requestBody": { + "x-name": "request", + "description": "The values to update.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateAppDto" + } + } + }, + "required": true, + "x-position": 2 + }, + "responses": { + "200": { + "description": "App updated.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AppDto" + } + } + } + }, + "400": { + "description": "App request not valid.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + }, + "404": { + "description": "App not found." + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.apps.{app}.update" + ] + } + ] + }, + "delete": { + "tags": [ + "Apps" + ], + "summary": "Delete the app.", + "operationId": "Apps_DeleteApp", + "parameters": [ + { + "name": "app", + "in": "path", + "required": true, + "description": "The name of the app to delete.", + "schema": { + "type": "string" + }, + "x-position": 1 + }, + { + "name": "permanent", + "in": "query", + "description": "True to delete the app permanently.", + "schema": { + "type": "boolean" + }, + "x-position": 2 + } + ], + "responses": { + "204": { + "description": "App deleted." + }, + "404": { + "description": "App not found." + }, + "400": { + "description": "Validation error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.apps.{app}.delete" + ] + } + ] + } + }, + "/api/apps/{app}/team": { + "put": { + "tags": [ + "Apps" + ], + "summary": "Transfer the app.", + "operationId": "Apps_PutAppTeam", + "parameters": [ + { + "name": "app", + "in": "path", + "required": true, + "description": "The name of the app to update.", + "schema": { + "type": "string" + }, + "x-position": 1 + } + ], + "requestBody": { + "x-name": "request", + "description": "The team information.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TransferToTeamDto" + } + } + }, + "required": true, + "x-position": 2 + }, + "responses": { + "200": { + "description": "App transferred.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AppDto" + } + } + } + }, + "400": { + "description": "App request not valid.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + }, + "404": { + "description": "App not found." + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.apps.{app}.transfer" + ] + } + ] + } + }, + "/api/apps/{app}/settings": { + "get": { + "tags": [ + "Apps" + ], + "summary": "Get the app settings.", + "operationId": "AppSettings_GetSettings", + "parameters": [ + { + "name": "app", + "in": "path", + "required": true, + "description": "The name of the app to get the settings for.", + "schema": { + "type": "string" + }, + "x-position": 1 + } + ], + "responses": { + "200": { + "description": "App settings returned.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AppSettingsDto" + } + } + } + }, + "404": { + "description": "App not found." + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [] + } + ] + }, + "put": { + "tags": [ + "Apps" + ], + "summary": "Update the settings.", + "operationId": "AppSettings_PutSettings", + "parameters": [ + { + "name": "app", + "in": "path", + "required": true, + "description": "The name of the app to update.", + "schema": { + "type": "string" + }, + "x-position": 1 + } + ], + "requestBody": { + "x-name": "request", + "description": "The values to update.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateAppSettingsDto" + } + } + }, + "required": true, + "x-position": 2 + }, + "responses": { + "200": { + "description": "App updated.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AppSettingsDto" + } + } + } + }, + "400": { + "description": "App request not valid.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + }, + "404": { + "description": "App not found." + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.apps.{app}.settings" + ] + } + ] + } + }, + "/api/apps/{app}/workflows": { + "get": { + "tags": [ + "Apps" + ], + "summary": "Get app workflow.", + "operationId": "AppWorkflows_GetWorkflows", + "parameters": [ + { + "name": "app", + "in": "path", + "required": true, + "description": "The name of the app.", + "schema": { + "type": "string" + }, + "x-position": 1 + } + ], + "responses": { + "200": { + "description": "Workflows returned.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WorkflowsDto" + } + } + } + }, + "404": { + "description": "App not found." + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.apps.{app}.workflows.read" + ] + } + ] + }, + "post": { + "tags": [ + "Apps" + ], + "summary": "Create a workflow.", + "operationId": "AppWorkflows_PostWorkflow", + "parameters": [ + { + "name": "app", + "in": "path", + "required": true, + "description": "The name of the app.", + "schema": { + "type": "string" + }, + "x-position": 1 + } + ], + "requestBody": { + "x-name": "request", + "description": "The new workflow.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AddWorkflowDto" + } + } + }, + "required": true, + "x-position": 2 + }, + "responses": { + "200": { + "description": "Workflow created.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WorkflowsDto" + } + } + } + }, + "400": { + "description": "Workflow request not valid.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + }, + "404": { + "description": "Workflow or app not found." + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.apps.{app}.workflows.update" + ] + } + ] + } + }, + "/api/apps/{app}/workflows/{id}": { + "put": { + "tags": [ + "Apps" + ], + "summary": "Update a workflow.", + "operationId": "AppWorkflows_PutWorkflow", + "parameters": [ + { + "name": "app", + "in": "path", + "required": true, + "description": "The name of the app.", + "schema": { + "type": "string" + }, + "x-position": 1 + }, + { + "name": "id", + "in": "path", + "required": true, + "description": "The ID of the workflow to update.", + "schema": { + "type": "string" + }, + "x-position": 2 + } + ], + "requestBody": { + "x-name": "request", + "description": "The new workflow.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateWorkflowDto" + } + } + }, + "required": true, + "x-position": 3 + }, + "responses": { + "200": { + "description": "Workflow updated.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WorkflowsDto" + } + } + } + }, + "400": { + "description": "Workflow request not valid.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + }, + "404": { + "description": "Workflow or app not found." + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.apps.{app}.workflows.update" + ] + } + ] + }, + "delete": { + "tags": [ + "Apps" + ], + "summary": "Delete a workflow.", + "operationId": "AppWorkflows_DeleteWorkflow", + "parameters": [ + { + "name": "app", + "in": "path", + "required": true, + "description": "The name of the app.", + "schema": { + "type": "string" + }, + "x-position": 1 + }, + { + "name": "id", + "in": "path", + "required": true, + "description": "The ID of the workflow to update.", + "schema": { + "type": "string" + }, + "x-position": 2 + } + ], + "responses": { + "200": { + "description": "Workflow deleted.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WorkflowsDto" + } + } + } + }, + "404": { + "description": "Workflow or app not found." + }, + "400": { + "description": "Validation error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + }, + "500": { + "description": "Operation failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorDto" + } + } + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex.apps.{app}.workflows.update" + ] + } + ] + } + } + }, + "components": { + "schemas": { + "ErrorDto": { + "type": "object", + "additionalProperties": false, + "required": [ + "message", + "statusCode" + ], + "properties": { + "message": { + "type": "string", + "description": "Error message.", + "minLength": 1 + }, + "errorCode": { + "type": "string", + "description": "The error code.", + "nullable": true + }, + "traceId": { + "type": "string", + "description": "The optional trace id.", + "nullable": true + }, + "type": { + "type": "string", + "description": "Link to the error details.", + "nullable": true + }, + "details": { + "type": "array", + "description": "Detailed error messages.", + "nullable": true, + "items": { + "type": "string" + } + }, + "statusCode": { + "type": "integer", + "description": "Status code of the http response.", + "format": "int32" + } + } + }, + "UserProperty": { + "type": "object", + "additionalProperties": false, + "required": [ + "name", + "value" + ], + "properties": { + "name": { + "type": "string", + "minLength": 1 + }, + "value": { + "type": "string", + "minLength": 1 + } + } + }, + "UpdateSettingDto": { + "type": "object", + "additionalProperties": false, + "required": [ + "value" + ], + "properties": { + "value": { + "description": "The value for the setting." + } + } + }, + "UsersDto": { + "allOf": [ + { + "$ref": "#/components/schemas/Resource" + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "total", + "items" + ], + "properties": { + "total": { + "type": "integer", + "description": "The total number of users.", + "format": "int64" + }, + "items": { + "type": "array", + "description": "The users.", + "items": { + "$ref": "#/components/schemas/UserDto" + } + } + } + } + ] + }, + "UserDto": { + "allOf": [ + { + "$ref": "#/components/schemas/Resource" + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "id", + "email", + "displayName", + "isLocked", + "permissions" + ], + "properties": { + "id": { + "type": "string", + "description": "The ID of the user." + }, + "email": { + "type": "string", + "description": "The email of the user. Unique value." + }, + "displayName": { + "type": "string", + "description": "The display name (usually first name and last name) of the user." + }, + "isLocked": { + "type": "boolean", + "description": "Determines if the user is locked." + }, + "permissions": { + "type": "array", + "description": "Additional permissions for the user.", + "items": { + "type": "string" + } + } + } + } + ] + }, + "Resource": { + "type": "object", + "x-abstract": true, + "additionalProperties": false, + "required": [ + "_links" + ], + "properties": { + "_links": { + "type": "object", + "description": "The links.", + "additionalProperties": { + "$ref": "#/components/schemas/ResourceLink" + } + } + } + }, + "ResourceLink": { + "type": "object", + "additionalProperties": false, + "required": [ + "href", + "method" + ], + "properties": { + "href": { + "type": "string", + "description": "The link url.", + "minLength": 1 + }, + "method": { + "type": "string", + "description": "The link method.", + "minLength": 1 + }, + "metadata": { + "type": "string", + "description": "Additional data about the link.", + "nullable": true + } + } + }, + "CreateUserDto": { + "type": "object", + "additionalProperties": false, + "required": [ + "email", + "displayName", + "password", + "permissions" + ], + "properties": { + "email": { + "type": "string", + "description": "The email of the user. Unique value.", + "minLength": 1 + }, + "displayName": { + "type": "string", + "description": "The display name (usually first name and last name) of the user.", + "minLength": 1 + }, + "password": { + "type": "string", + "description": "The password of the user.", + "minLength": 1 + }, + "permissions": { + "type": "array", + "description": "Additional permissions for the user.", + "items": { + "type": "string" + } + } + } + }, + "UpdateUserDto": { + "type": "object", + "additionalProperties": false, + "required": [ + "email", + "displayName", + "permissions" + ], + "properties": { + "email": { + "type": "string", + "description": "The email of the user. Unique value.", + "minLength": 1 + }, + "displayName": { + "type": "string", + "description": "The display name (usually first name and last name) of the user.", + "minLength": 1 + }, + "password": { + "type": "string", + "description": "The password of the user.", + "nullable": true + }, + "permissions": { + "type": "array", + "description": "Additional permissions for the user.", + "items": { + "type": "string" + } + } + } + }, + "ResourcesDto": { + "allOf": [ + { + "$ref": "#/components/schemas/Resource" + }, + { + "type": "object", + "additionalProperties": false + } + ] + }, + "UpdateProfileDto": { + "type": "object", + "additionalProperties": false, + "properties": { + "answers": { + "type": "object", + "description": "The answers from a questionaire.", + "nullable": true, + "additionalProperties": { + "type": "string", + "nullable": true + } + } + } + }, + "TranslationDto": { + "type": "object", + "additionalProperties": false, + "required": [ + "status", + "result" + ], + "properties": { + "status": { + "description": "The result of the translation.", + "$ref": "#/components/schemas/TranslationStatus" + }, + "result": { + "description": "The result of the translation.", + "deprecated": true, + "x-deprecatedMessage": "Use Status property now.", + "$ref": "#/components/schemas/TranslationStatus" + }, + "text": { + "type": "string", + "description": "The translated text.", + "nullable": true + } + } + }, + "TranslationStatus": { + "type": "string", + "description": "", + "x-enumNames": [ + "Translated", + "LanguageNotSupported", + "NotTranslated", + "NotConfigured", + "Unauthorized", + "Failed" + ], + "enum": [ + "Translated", + "LanguageNotSupported", + "NotTranslated", + "NotConfigured", + "Unauthorized", + "Failed" + ] + }, + "TranslateDto": { + "type": "object", + "additionalProperties": false, + "required": [ + "text", + "targetLanguage" + ], + "properties": { + "text": { + "type": "string", + "description": "The text to translate.", + "minLength": 1 + }, + "targetLanguage": { + "type": "string", + "description": "The target language." + }, + "sourceLanguage": { + "type": "string", + "description": "The optional source language." + } + } + }, + "TemplatesDto": { + "allOf": [ + { + "$ref": "#/components/schemas/Resource" + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "items" + ], + "properties": { + "items": { + "type": "array", + "description": "The event consumers.", + "items": { + "$ref": "#/components/schemas/TemplateDto" + } + } + } + } + ] + }, + "TemplateDto": { + "allOf": [ + { + "$ref": "#/components/schemas/Resource" + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "name", + "title", + "description", + "details", + "isStarter" + ], + "properties": { + "name": { + "type": "string", + "description": "The name of the template." + }, + "title": { + "type": "string", + "description": "The title of the template." + }, + "description": { + "type": "string", + "description": "The description of the template." + }, + "details": { + "type": "string", + "description": "The details of the template." + }, + "isStarter": { + "type": "boolean", + "description": "True, if the template is a starter." + }, + "logo": { + "type": "string", + "description": "The optional logo.", + "nullable": true + } + } + } + ] + }, + "TemplateDetailsDto": { + "allOf": [ + { + "$ref": "#/components/schemas/Resource" + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "details" + ], + "properties": { + "details": { + "type": "string", + "description": "The details of the template." + } + } + } + ] + }, + "ContributorsDto": { + "allOf": [ + { + "$ref": "#/components/schemas/Resource" + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "items", + "maxContributors" + ], + "properties": { + "items": { + "type": "array", + "description": "The contributors.", + "items": { + "$ref": "#/components/schemas/ContributorDto" + } + }, + "maxContributors": { + "type": "integer", + "description": "The maximum number of allowed contributors.", + "format": "int64" + }, + "_meta": { + "description": "The metadata to provide information about this request.", + "nullable": true, + "$ref": "#/components/schemas/ContributorsMetadata" + } + } + } + ] + }, + "ContributorDto": { + "allOf": [ + { + "$ref": "#/components/schemas/Resource" + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "contributorId", + "contributorName", + "contributorEmail" + ], + "properties": { + "contributorId": { + "type": "string", + "description": "The ID of the user that contributes to the app." + }, + "contributorName": { + "type": "string", + "description": "The display name." + }, + "contributorEmail": { + "type": "string", + "description": "The email address." + }, + "role": { + "type": "string", + "description": "The role of the contributor.", + "nullable": true + } + } + } + ] + }, + "ContributorsMetadata": { + "type": "object", + "additionalProperties": false, + "required": [ + "isInvited" + ], + "properties": { + "isInvited": { + "type": "string", + "description": "Indicates whether the user has been invited." + } + } + }, + "AssignContributorDto": { + "type": "object", + "additionalProperties": false, + "required": [ + "contributorId" + ], + "properties": { + "contributorId": { + "type": "string", + "description": "The id or email of the user to add to the app.", + "minLength": 1 + }, + "role": { + "type": "string", + "description": "The role of the contributor.", + "nullable": true + }, + "invite": { + "type": "boolean", + "description": "Set to true to invite the user if he does not exist." + } + } + }, + "TeamDto": { + "allOf": [ + { + "$ref": "#/components/schemas/Resource" + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "id", + "name", + "version", + "created", + "lastModified" + ], + "properties": { + "id": { + "type": "string", + "description": "The ID of the team." + }, + "name": { + "type": "string", + "description": "The name of the team." + }, + "version": { + "type": "integer", + "description": "The version of the team.", + "format": "int64" + }, + "created": { + "type": "string", + "description": "The timestamp when the team has been created.", + "format": "date-time" + }, + "lastModified": { + "type": "string", + "description": "The timestamp when the team has been modified last.", + "format": "date-time" + }, + "roleName": { + "type": "string", + "description": "The role name of the user.", + "nullable": true + } + } + } + ] + }, + "CreateTeamDto": { + "type": "object", + "additionalProperties": false, + "required": [ + "name" + ], + "properties": { + "name": { + "type": "string", + "description": "The name of the team.", + "minLength": 1 + } + } + }, + "UpdateTeamDto": { + "type": "object", + "additionalProperties": false, + "required": [ + "name" + ], + "properties": { + "name": { + "type": "string", + "description": "The name of the team.", + "minLength": 1 + } + } + }, + "AuthSchemeResponseDto": { + "allOf": [ + { + "$ref": "#/components/schemas/Resource" + }, + { + "type": "object", + "additionalProperties": false, + "properties": { + "scheme": { + "description": "The auth scheme if configured.", + "nullable": true, + "$ref": "#/components/schemas/AuthSchemeDto" + } + } + } + ] + }, + "AuthSchemeDto": { + "type": "object", + "additionalProperties": false, + "required": [ + "domain", + "displayName", + "clientId", + "clientSecret", + "authority" + ], + "properties": { + "domain": { + "type": "string", + "description": "The domain name of your user accounts.", + "minLength": 1 + }, + "displayName": { + "type": "string", + "description": "The display name for buttons.", + "minLength": 1 + }, + "clientId": { + "type": "string", + "description": "The client ID.", + "minLength": 1 + }, + "clientSecret": { + "type": "string", + "description": "The client secret.", + "minLength": 1 + }, + "authority": { + "type": "string", + "description": "The authority URL.", + "minLength": 1 + }, + "signoutRedirectUrl": { + "type": "string", + "description": "The URL to redirect after a signout.", + "nullable": true + } + } + }, + "AuthSchemeValueDto": { + "type": "object", + "additionalProperties": false, + "properties": { + "scheme": { + "description": "The auth scheme if configured.", + "nullable": true, + "$ref": "#/components/schemas/AuthSchemeDto" + } + } + }, + "LogDownloadDto": { + "type": "object", + "additionalProperties": false, + "properties": { + "downloadUrl": { + "type": "string", + "description": "The url to download the log.", + "nullable": true + } + } + }, + "CallsUsageDto": { + "type": "object", + "additionalProperties": false, + "required": [ + "totalCalls", + "totalBytes", + "monthCalls", + "monthBytes", + "blockingApiCalls", + "allowedBytes", + "allowedCalls", + "averageElapsedMs", + "details" + ], + "properties": { + "totalCalls": { + "type": "integer", + "description": "The total number of API calls.", + "format": "int64" + }, + "totalBytes": { + "type": "integer", + "description": "The total number of bytes transferred.", + "format": "int64" + }, + "monthCalls": { + "type": "integer", + "description": "The total number of API calls this month.", + "format": "int64" + }, + "monthBytes": { + "type": "integer", + "description": "The total number of bytes transferred this month.", + "format": "int64" + }, + "blockingApiCalls": { + "type": "integer", + "description": "The amount of calls that will block the app.", + "format": "int64" + }, + "allowedBytes": { + "type": "integer", + "description": "The included API traffic.", + "format": "int64" + }, + "allowedCalls": { + "type": "integer", + "description": "The included API calls.", + "format": "int64" + }, + "averageElapsedMs": { + "type": "number", + "description": "The average duration in milliseconds.", + "format": "double" + }, + "details": { + "type": "object", + "description": "The statistics by date and group.", + "additionalProperties": { + "type": "array", + "items": { + "$ref": "#/components/schemas/CallsUsagePerDateDto" + } + } + } + } + }, + "CallsUsagePerDateDto": { + "type": "object", + "additionalProperties": false, + "required": [ + "date", + "totalCalls", + "totalBytes", + "averageElapsedMs" + ], + "properties": { + "date": { + "type": "string", + "description": "The date when the usage was tracked.", + "format": "date" + }, + "totalCalls": { + "type": "integer", + "description": "The total number of API calls.", + "format": "int64" + }, + "totalBytes": { + "type": "integer", + "description": "The total number of bytes transferred.", + "format": "int64" + }, + "averageElapsedMs": { + "type": "number", + "description": "The average duration in milliseconds.", + "format": "double" + } + } + }, + "CurrentStorageDto": { + "type": "object", + "additionalProperties": false, + "required": [ + "size", + "maxAllowed" + ], + "properties": { + "size": { + "type": "integer", + "description": "The size in bytes.", + "format": "int64" + }, + "maxAllowed": { + "type": "integer", + "description": "The maximum allowed asset size.", + "format": "int64" + } + } + }, + "StorageUsagePerDateDto": { + "type": "object", + "additionalProperties": false, + "required": [ + "date", + "totalCount", + "totalSize" + ], + "properties": { + "date": { + "type": "string", + "description": "The date when the usage was tracked.", + "format": "date" + }, + "totalCount": { + "type": "integer", + "description": "The number of assets.", + "format": "int64" + }, + "totalSize": { + "type": "integer", + "description": "The size in bytes.", + "format": "int64" + } + } + }, + "SearchResultDto": { + "allOf": [ + { + "$ref": "#/components/schemas/Resource" + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "name", + "type" + ], + "properties": { + "name": { + "type": "string", + "description": "The name of the search result." + }, + "type": { + "description": "The type of the search result.", + "$ref": "#/components/schemas/SearchResultType" + }, + "label": { + "type": "string", + "description": "An optional label.", + "nullable": true + } + } + } + ] + }, + "SearchResultType": { + "type": "string", + "description": "", + "x-enumNames": [ + "Asset", + "Content", + "Dashboard", + "Setting", + "Rule", + "Schema" + ], + "enum": [ + "Asset", + "Content", + "Dashboard", + "Setting", + "Rule", + "Schema" + ] + }, + "SchemaDto": { + "allOf": [ + { + "$ref": "#/components/schemas/Resource" + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "createdBy", + "lastModifiedBy", + "name", + "properties", + "scripts", + "previewUrls", + "fieldsInLists", + "fieldsInReferences", + "fields", + "id", + "type", + "isSingleton", + "isPublished", + "created", + "lastModified", + "version", + "fieldRules" + ], + "properties": { + "id": { + "type": "string", + "description": "The ID of the schema." + }, + "createdBy": { + "type": "string", + "description": "The user that has created the schema." + }, + "lastModifiedBy": { + "type": "string", + "description": "The user that has updated the schema." + }, + "name": { + "type": "string", + "description": "The name of the schema. Unique within the app.", + "minLength": 1, + "pattern": "^[a-z0-9]+(\\-[a-z0-9]+)*$" + }, + "type": { + "description": "The type of the schema.", + "$ref": "#/components/schemas/SchemaType" + }, + "category": { + "type": "string", + "description": "The name of the category.", + "nullable": true + }, + "properties": { + "description": "The schema properties.", + "$ref": "#/components/schemas/SchemaPropertiesDto" + }, + "isSingleton": { + "type": "boolean", + "description": "Indicates if the schema is a singleton.", + "deprecated": true, + "x-deprecatedMessage": "Use 'type' field now." + }, + "isPublished": { + "type": "boolean", + "description": "Indicates if the schema is published." + }, + "created": { + "type": "string", + "description": "The date and time when the schema has been created.", + "format": "date-time" + }, + "lastModified": { + "type": "string", + "description": "The date and time when the schema has been modified last.", + "format": "date-time" + }, + "version": { + "type": "integer", + "description": "The version of the schema.", + "format": "int64" + }, + "scripts": { + "description": "The scripts.", + "$ref": "#/components/schemas/SchemaScriptsDto" + }, + "previewUrls": { + "type": "object", + "description": "The preview Urls.", + "additionalProperties": { + "type": "string" + } + }, + "fieldsInLists": { + "type": "array", + "description": "The name of fields that are used in content lists.", + "items": { + "type": "string" + } + }, + "fieldsInReferences": { + "type": "array", + "description": "The name of fields that are used in content references.", + "items": { + "type": "string" + } + }, + "fieldRules": { + "type": "array", + "description": "The field rules.", + "items": { + "$ref": "#/components/schemas/FieldRuleDto" + } + }, + "fields": { + "type": "array", + "description": "The list of fields.", + "items": { + "$ref": "#/components/schemas/FieldDto" + } + } + } + } + ] + }, + "SchemaType": { + "type": "string", + "description": "", + "x-enumNames": [ + "Default", + "Singleton", + "Component" + ], + "enum": [ + "Default", + "Singleton", + "Component" + ] + }, + "SchemaPropertiesDto": { + "type": "object", + "additionalProperties": false, + "required": [ + "validateOnPublish" + ], + "properties": { + "label": { + "type": "string", + "description": "Optional label for the editor.", + "maxLength": 100, + "minLength": 0, + "nullable": true + }, + "hints": { + "type": "string", + "description": "Hints to describe the schema.", + "maxLength": 1000, + "minLength": 0, + "nullable": true + }, + "contentsSidebarUrl": { + "type": "string", + "description": "The url to a the sidebar plugin for content lists.", + "nullable": true + }, + "contentSidebarUrl": { + "type": "string", + "description": "The url to a the sidebar plugin for content items.", + "nullable": true + }, + "contentEditorUrl": { + "type": "string", + "description": "The url to the editor plugin.", + "nullable": true + }, + "contentsEditorUrl": { + "type": "string", + "description": "The url to the editor plugin.", + "nullable": true + }, + "contentsListUrl": { + "type": "string", + "description": "The url to the content list plugin.", + "nullable": true + }, + "validateOnPublish": { + "type": "boolean", + "description": "True to validate the content items on publish." + }, + "tags": { + "type": "array", + "description": "Tags for automation processes.", + "nullable": true, + "items": { + "type": "string" + } + } + } + }, + "SchemaScriptsDto": { + "type": "object", + "additionalProperties": false, + "properties": { + "query": { + "type": "string", + "description": "The script that is executed for each content when querying contents.", + "nullable": true + }, + "queryPre": { + "type": "string", + "description": "The script that is executed for all contents when querying contents.", + "nullable": true + }, + "create": { + "type": "string", + "description": "The script that is executed when creating a content.", + "nullable": true + }, + "update": { + "type": "string", + "description": "The script that is executed when updating a content.", + "nullable": true + }, + "delete": { + "type": "string", + "description": "The script that is executed when deleting a content.", + "nullable": true + }, + "change": { + "type": "string", + "description": "The script that is executed when change a content status.", + "nullable": true + } + } + }, + "FieldRuleDto": { + "type": "object", + "additionalProperties": false, + "required": [ + "action", + "field" + ], + "properties": { + "action": { + "description": "The action to perform when the condition is met.", + "$ref": "#/components/schemas/FieldRuleAction" + }, + "field": { + "type": "string", + "description": "The field to update.", + "minLength": 1 + }, + "condition": { + "type": "string", + "description": "The condition.", + "nullable": true + } + } + }, + "FieldRuleAction": { + "type": "string", + "description": "", + "x-enumNames": [ + "Disable", + "Hide", + "Require" + ], + "enum": [ + "Disable", + "Hide", + "Require" + ] + }, + "FieldDto": { + "allOf": [ + { + "$ref": "#/components/schemas/Resource" + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "name", + "partitioning", + "properties", + "fieldId", + "isHidden", + "isLocked", + "isDisabled" + ], + "properties": { + "fieldId": { + "type": "integer", + "description": "The ID of the field.", + "format": "int64" + }, + "name": { + "type": "string", + "description": "The name of the field. Must be unique within the schema.", + "minLength": 1, + "pattern": "^[a-z0-9]+(\\-[a-z0-9]+)*$" + }, + "isHidden": { + "type": "boolean", + "description": "Defines if the field is hidden." + }, + "isLocked": { + "type": "boolean", + "description": "Defines if the field is locked." + }, + "isDisabled": { + "type": "boolean", + "description": "Defines if the field is disabled." + }, + "partitioning": { + "type": "string", + "description": "Defines the partitioning of the field.", + "minLength": 1 + }, + "properties": { + "description": "The field properties.", + "$ref": "#/components/schemas/FieldPropertiesDto" + }, + "nested": { + "type": "array", + "description": "The nested fields.", + "nullable": true, + "items": { + "$ref": "#/components/schemas/NestedFieldDto" + } + } + } + } + ] + }, + "FieldPropertiesDto": { + "type": "object", + "discriminator": { + "propertyName": "fieldType", + "mapping": { + "Array": "#/components/schemas/ArrayFieldPropertiesDto", + "Assets": "#/components/schemas/AssetsFieldPropertiesDto", + "Boolean": "#/components/schemas/BooleanFieldPropertiesDto", + "Component": "#/components/schemas/ComponentFieldPropertiesDto", + "Components": "#/components/schemas/ComponentsFieldPropertiesDto", + "DateTime": "#/components/schemas/DateTimeFieldPropertiesDto", + "Geolocation": "#/components/schemas/GeolocationFieldPropertiesDto", + "Json": "#/components/schemas/JsonFieldPropertiesDto", + "Number": "#/components/schemas/NumberFieldPropertiesDto", + "References": "#/components/schemas/ReferencesFieldPropertiesDto", + "RichText": "#/components/schemas/RichTextFieldPropertiesDto", + "String": "#/components/schemas/StringFieldPropertiesDto", + "Tags": "#/components/schemas/TagsFieldPropertiesDto", + "UI": "#/components/schemas/UIFieldPropertiesDto", + "UserInfo": "#/components/schemas/UserInfoFieldPropertiesDto" + } + }, + "x-abstract": true, + "additionalProperties": false, + "required": [ + "fieldType" + ], + "properties": { + "label": { + "type": "string", + "description": "Optional label for the editor.", + "maxLength": 100, + "minLength": 0, + "nullable": true + }, + "hints": { + "type": "string", + "description": "Hints to describe the field.", + "maxLength": 1000, + "minLength": 0, + "nullable": true + }, + "placeholder": { + "type": "string", + "description": "Placeholder to show when no value has been entered.", + "maxLength": 100, + "minLength": 0, + "nullable": true + }, + "isRequired": { + "type": "boolean", + "description": "Indicates if the field is required." + }, + "isRequiredOnPublish": { + "type": "boolean", + "description": "Indicates if the field is required when publishing." + }, + "isHalfWidth": { + "type": "boolean", + "description": "Indicates if the field should be rendered with half width only." + }, + "isCreateOnly": { + "type": "boolean", + "description": "Indicates if the field can only be created and not modified." + }, + "editorUrl": { + "type": "string", + "description": "Optional url to the editor.", + "nullable": true + }, + "tags": { + "type": "array", + "description": "Tags for automation processes.", + "nullable": true, + "items": { + "type": "string" + } + }, + "fieldType": { + "type": "string" + } + } + }, + "ArrayFieldPropertiesDto": { + "allOf": [ + { + "$ref": "#/components/schemas/FieldPropertiesDto" + }, + { + "type": "object", + "additionalProperties": false, + "properties": { + "minItems": { + "type": "integer", + "description": "The minimum allowed items for the field value.", + "format": "int32", + "nullable": true + }, + "maxItems": { + "type": "integer", + "description": "The maximum allowed items for the field value.", + "format": "int32", + "nullable": true + }, + "calculatedDefaultValue": { + "description": "The calculated default value for the field value.", + "$ref": "#/components/schemas/ArrayCalculatedDefaultValue" + }, + "uniqueFields": { + "type": "array", + "description": "The fields that must be unique.", + "nullable": true, + "items": { + "type": "string" + } + } + } + } + ] + }, + "ArrayCalculatedDefaultValue": { + "type": "string", + "description": "", + "x-enumNames": [ + "EmptyArray", + "Null" + ], + "enum": [ + "EmptyArray", + "Null" + ] + }, + "AssetsFieldPropertiesDto": { + "allOf": [ + { + "$ref": "#/components/schemas/FieldPropertiesDto" + }, + { + "type": "object", + "additionalProperties": false, + "properties": { + "previewMode": { + "description": "The preview mode for the asset.", + "$ref": "#/components/schemas/AssetPreviewMode" + }, + "defaultValues": { + "description": "The language specific default value as a list of asset ids.", + "nullable": true, + "$ref": "#/components/schemas/LocalizedValueOfReadonlyListOfString" + }, + "defaultValue": { + "type": "array", + "description": "The default value as a list of asset ids.", + "nullable": true, + "items": { + "type": "string" + } + }, + "folderId": { + "type": "string", + "description": "The initial id to the folder.", + "nullable": true + }, + "previewFormat": { + "type": "string", + "description": "The preview format.", + "nullable": true + }, + "minItems": { + "type": "integer", + "description": "The minimum allowed items for the field value.", + "format": "int32", + "nullable": true + }, + "maxItems": { + "type": "integer", + "description": "The maximum allowed items for the field value.", + "format": "int32", + "nullable": true + }, + "minSize": { + "type": "integer", + "description": "The minimum file size in bytes.", + "format": "int32", + "nullable": true + }, + "maxSize": { + "type": "integer", + "description": "The maximum file size in bytes.", + "format": "int32", + "nullable": true + }, + "minWidth": { + "type": "integer", + "description": "The minimum image width in pixels.", + "format": "int32", + "nullable": true + }, + "maxWidth": { + "type": "integer", + "description": "The maximum image width in pixels.", + "format": "int32", + "nullable": true + }, + "minHeight": { + "type": "integer", + "description": "The minimum image height in pixels.", + "format": "int32", + "nullable": true + }, + "maxHeight": { + "type": "integer", + "description": "The maximum image height in pixels.", + "format": "int32", + "nullable": true + }, + "aspectWidth": { + "type": "integer", + "description": "The image aspect width in pixels.", + "format": "int32", + "nullable": true + }, + "aspectHeight": { + "type": "integer", + "description": "The image aspect height in pixels.", + "format": "int32", + "nullable": true + }, + "expectedType": { + "description": "The expected type.", + "nullable": true, + "$ref": "#/components/schemas/AssetType" + }, + "resolveFirst": { + "type": "boolean", + "description": "True to resolve first asset in the content list." + }, + "mustBeImage": { + "type": "boolean", + "description": "True to resolve first image in the content list.", + "deprecated": true, + "x-deprecatedMessage": "Use 'expectedType' field now" + }, + "resolveImage": { + "type": "boolean", + "description": "True to resolve first image in the content list.", + "deprecated": true, + "x-deprecatedMessage": "Use 'resolveFirst' field now" + }, + "allowedExtensions": { + "type": "array", + "description": "The allowed file extensions.", + "nullable": true, + "items": { + "type": "string" + } + }, + "allowDuplicates": { + "type": "boolean", + "description": "True, if duplicate values are allowed." + } + } + } + ] + }, + "AssetPreviewMode": { + "type": "string", + "description": "", + "x-enumNames": [ + "ImageAndFileName", + "Image", + "FileName" + ], + "enum": [ + "ImageAndFileName", + "Image", + "FileName" + ] + }, + "LocalizedValueOfReadonlyListOfString": { + "type": "object", + "additionalProperties": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "AssetType": { + "type": "string", + "description": "", + "x-enumNames": [ + "Unknown", + "Image", + "Audio", + "Video" + ], + "enum": [ + "Unknown", + "Image", + "Audio", + "Video" + ] + }, + "BooleanFieldPropertiesDto": { + "allOf": [ + { + "$ref": "#/components/schemas/FieldPropertiesDto" + }, + { + "type": "object", + "additionalProperties": false, + "properties": { + "defaultValues": { + "description": "The language specific default value for the field value.", + "nullable": true, + "$ref": "#/components/schemas/LocalizedValueOfNullableBoolean" + }, + "defaultValue": { + "type": "boolean", + "description": "The default value for the field value.", + "nullable": true + }, + "inlineEditable": { + "type": "boolean", + "description": "Indicates that the inline editor is enabled for this field." + }, + "editor": { + "description": "The editor that is used to manage this field.", + "$ref": "#/components/schemas/BooleanFieldEditor" + } + } + } + ] + }, + "LocalizedValueOfNullableBoolean": { + "type": "object", + "additionalProperties": { + "type": "boolean", + "nullable": true + } + }, + "BooleanFieldEditor": { + "type": "string", + "description": "", + "x-enumNames": [ + "Checkbox", + "Toggle" + ], + "enum": [ + "Checkbox", + "Toggle" + ] + }, + "ComponentFieldPropertiesDto": { + "allOf": [ + { + "$ref": "#/components/schemas/FieldPropertiesDto" + }, + { + "type": "object", + "additionalProperties": false, + "properties": { + "schemaIds": { + "type": "array", + "description": "The ID of the embedded schemas.", + "nullable": true, + "items": { + "type": "string" + } + } + } + } + ] + }, + "ComponentsFieldPropertiesDto": { + "allOf": [ + { + "$ref": "#/components/schemas/FieldPropertiesDto" + }, + { + "type": "object", + "additionalProperties": false, + "properties": { + "minItems": { + "type": "integer", + "description": "The minimum allowed items for the field value.", + "format": "int32", + "nullable": true + }, + "maxItems": { + "type": "integer", + "description": "The maximum allowed items for the field value.", + "format": "int32", + "nullable": true + }, + "calculatedDefaultValue": { + "description": "The calculated default value for the field value.", + "$ref": "#/components/schemas/ArrayCalculatedDefaultValue" + }, + "schemaIds": { + "type": "array", + "description": "The ID of the embedded schemas.", + "nullable": true, + "items": { + "type": "string" + } + }, + "uniqueFields": { + "type": "array", + "description": "The fields that must be unique.", + "nullable": true, + "items": { + "type": "string" + } + } + } + } + ] + }, + "DateTimeFieldPropertiesDto": { + "allOf": [ + { + "$ref": "#/components/schemas/FieldPropertiesDto" + }, + { + "type": "object", + "additionalProperties": false, + "properties": { + "defaultValues": { + "description": "The language specific default value for the field value.", + "nullable": true, + "$ref": "#/components/schemas/LocalizedValueOfNullableInstant" + }, + "defaultValue": { + "type": "string", + "description": "The default value for the field value.", + "format": "date-time", + "nullable": true + }, + "maxValue": { + "type": "string", + "description": "The maximum allowed value for the field value.", + "format": "date-time", + "nullable": true + }, + "minValue": { + "type": "string", + "description": "The minimum allowed value for the field value.", + "format": "date-time", + "nullable": true + }, + "format": { + "type": "string", + "description": "The format pattern when displayed in the UI.", + "nullable": true + }, + "editor": { + "description": "The editor that is used to manage this field.", + "$ref": "#/components/schemas/DateTimeFieldEditor" + }, + "calculatedDefaultValue": { + "description": "The calculated default value for the field value.", + "nullable": true, + "$ref": "#/components/schemas/DateTimeCalculatedDefaultValue" + } + } + } + ] + }, + "LocalizedValueOfNullableInstant": { + "type": "object", + "additionalProperties": { + "type": "string", + "format": "date-time", + "nullable": true + } + }, + "DateTimeFieldEditor": { + "type": "string", + "description": "", + "x-enumNames": [ + "Date", + "DateTime" + ], + "enum": [ + "Date", + "DateTime" + ] + }, + "DateTimeCalculatedDefaultValue": { + "type": "string", + "description": "", + "x-enumNames": [ + "Now", + "Today" + ], + "enum": [ + "Now", + "Today" + ] + }, + "GeolocationFieldPropertiesDto": { + "allOf": [ + { + "$ref": "#/components/schemas/FieldPropertiesDto" + }, + { + "type": "object", + "additionalProperties": false, + "properties": { + "editor": { + "description": "The editor that is used to manage this field.", + "$ref": "#/components/schemas/GeolocationFieldEditor" + } + } + } + ] + }, + "GeolocationFieldEditor": { + "type": "string", + "description": "", + "x-enumNames": [ + "Map" + ], + "enum": [ + "Map" + ] + }, + "JsonFieldPropertiesDto": { + "allOf": [ + { + "$ref": "#/components/schemas/FieldPropertiesDto" + }, + { + "type": "object", + "additionalProperties": false, + "properties": { + "graphQLSchema": { + "type": "string", + "description": "The GraphQL schema.", + "nullable": true + } + } + } + ] + }, + "NumberFieldPropertiesDto": { + "allOf": [ + { + "$ref": "#/components/schemas/FieldPropertiesDto" + }, + { + "type": "object", + "additionalProperties": false, + "properties": { + "defaultValues": { + "description": "The language specific default value for the field value.", + "nullable": true, + "$ref": "#/components/schemas/LocalizedValueOfNullableDouble" + }, + "defaultValue": { + "type": "number", + "description": "The default value for the field value.", + "format": "double", + "nullable": true + }, + "maxValue": { + "type": "number", + "description": "The maximum allowed value for the field value.", + "format": "double", + "nullable": true + }, + "minValue": { + "type": "number", + "description": "The minimum allowed value for the field value.", + "format": "double", + "nullable": true + }, + "allowedValues": { + "type": "array", + "description": "The allowed values for the field value.", + "nullable": true, + "items": { + "type": "number", + "format": "double" + } + }, + "isUnique": { + "type": "boolean", + "description": "Indicates if the field value must be unique. Ignored for nested fields and localized fields." + }, + "inlineEditable": { + "type": "boolean", + "description": "Indicates that the inline editor is enabled for this field." + }, + "editor": { + "description": "The editor that is used to manage this field.", + "$ref": "#/components/schemas/NumberFieldEditor" + } + } + } + ] + }, + "LocalizedValueOfNullableDouble": { + "type": "object", + "additionalProperties": { + "type": "number", + "format": "double", + "nullable": true + } + }, + "NumberFieldEditor": { + "type": "string", + "description": "", + "x-enumNames": [ + "Input", + "Radio", + "Dropdown", + "Stars" + ], + "enum": [ + "Input", + "Radio", + "Dropdown", + "Stars" + ] + }, + "ReferencesFieldPropertiesDto": { + "allOf": [ + { + "$ref": "#/components/schemas/FieldPropertiesDto" + }, + { + "type": "object", + "additionalProperties": false, + "properties": { + "defaultValues": { + "description": "The language specific default value as a list of content ids.", + "nullable": true, + "$ref": "#/components/schemas/LocalizedValueOfReadonlyListOfString" + }, + "defaultValue": { + "type": "array", + "description": "The default value as a list of content ids.", + "nullable": true, + "items": { + "type": "string" + } + }, + "minItems": { + "type": "integer", + "description": "The minimum allowed items for the field value.", + "format": "int32", + "nullable": true + }, + "maxItems": { + "type": "integer", + "description": "The maximum allowed items for the field value.", + "format": "int32", + "nullable": true + }, + "allowDuplicates": { + "type": "boolean", + "description": "True, if duplicate values are allowed." + }, + "resolveReference": { + "type": "boolean", + "description": "True to resolve references in the content list." + }, + "mustBePublished": { + "type": "boolean", + "description": "True when all references must be published." + }, + "query": { + "type": "string", + "description": "The initial query that is applied in the UI.", + "nullable": true + }, + "editor": { + "description": "The editor that is used to manage this field.", + "$ref": "#/components/schemas/ReferencesFieldEditor" + }, + "schemaIds": { + "type": "array", + "description": "The ID of the referenced schemas.", + "nullable": true, + "items": { + "type": "string" + } + } + } + } + ] + }, + "ReferencesFieldEditor": { + "type": "string", + "description": "", + "x-enumNames": [ + "List", + "Dropdown", + "Tags", + "Checkboxes", + "Input", + "Radio" + ], + "enum": [ + "List", + "Dropdown", + "Tags", + "Checkboxes", + "Input", + "Radio" + ] + }, + "RichTextFieldPropertiesDto": { + "allOf": [ + { + "$ref": "#/components/schemas/FieldPropertiesDto" + }, + { + "type": "object", + "additionalProperties": false, + "properties": { + "folderId": { + "type": "string", + "description": "The initial id to the folder when the control supports file uploads.", + "nullable": true + }, + "minLength": { + "type": "integer", + "description": "The minimum allowed length for the field value.", + "format": "int32", + "nullable": true + }, + "maxLength": { + "type": "integer", + "description": "The maximum allowed length for the field value.", + "format": "int32", + "nullable": true + }, + "minCharacters": { + "type": "integer", + "description": "The minimum allowed of normal characters for the field value.", + "format": "int32", + "nullable": true + }, + "maxCharacters": { + "type": "integer", + "description": "The maximum allowed of normal characters for the field value.", + "format": "int32", + "nullable": true + }, + "minWords": { + "type": "integer", + "description": "The minimum allowed number of words for the field value.", + "format": "int32", + "nullable": true + }, + "maxWords": { + "type": "integer", + "description": "The maximum allowed number of words for the field value.", + "format": "int32", + "nullable": true + }, + "classNames": { + "type": "array", + "description": "The class names for the editor.", + "nullable": true, + "items": { + "type": "string" + } + }, + "schemaIds": { + "type": "array", + "description": "The allowed schema ids that can be embedded.", + "nullable": true, + "items": { + "type": "string" + } + } + } + } + ] + }, + "StringFieldPropertiesDto": { + "allOf": [ + { + "$ref": "#/components/schemas/FieldPropertiesDto" + }, + { + "type": "object", + "additionalProperties": false, + "properties": { + "defaultValues": { + "description": "The language specific default value for the field value.", + "nullable": true, + "$ref": "#/components/schemas/LocalizedValueOfString" + }, + "defaultValue": { + "type": "string", + "description": "The default value for the field value.", + "nullable": true + }, + "pattern": { + "type": "string", + "description": "The pattern to enforce a specific format for the field value.", + "nullable": true + }, + "patternMessage": { + "type": "string", + "description": "The validation message for the pattern.", + "nullable": true + }, + "folderId": { + "type": "string", + "description": "The initial id to the folder when the control supports file uploads.", + "nullable": true + }, + "minLength": { + "type": "integer", + "description": "The minimum allowed length for the field value.", + "format": "int32", + "nullable": true + }, + "maxLength": { + "type": "integer", + "description": "The maximum allowed length for the field value.", + "format": "int32", + "nullable": true + }, + "minCharacters": { + "type": "integer", + "description": "The minimum allowed of normal characters for the field value.", + "format": "int32", + "nullable": true + }, + "maxCharacters": { + "type": "integer", + "description": "The maximum allowed of normal characters for the field value.", + "format": "int32", + "nullable": true + }, + "minWords": { + "type": "integer", + "description": "The minimum allowed number of words for the field value.", + "format": "int32", + "nullable": true + }, + "maxWords": { + "type": "integer", + "description": "The maximum allowed number of words for the field value.", + "format": "int32", + "nullable": true + }, + "classNames": { + "type": "array", + "description": "The class names for the editor.", + "nullable": true, + "items": { + "type": "string" + } + }, + "allowedValues": { + "type": "array", + "description": "The allowed values for the field value.", + "nullable": true, + "items": { + "type": "string" + } + }, + "schemaIds": { + "type": "array", + "description": "The allowed schema ids that can be embedded.", + "nullable": true, + "items": { + "type": "string" + } + }, + "isUnique": { + "type": "boolean", + "description": "Indicates if the field value must be unique. Ignored for nested fields and localized fields." + }, + "isEmbeddable": { + "type": "boolean", + "description": "Indicates that other content items or references are embedded." + }, + "inlineEditable": { + "type": "boolean", + "description": "Indicates that the inline editor is enabled for this field." + }, + "createEnum": { + "type": "boolean", + "description": "Indicates whether GraphQL Enum should be created." + }, + "contentType": { + "description": "How the string content should be interpreted.", + "$ref": "#/components/schemas/StringContentType" + }, + "editor": { + "description": "The editor that is used to manage this field.", + "$ref": "#/components/schemas/StringFieldEditor" + } + } + } + ] + }, + "LocalizedValueOfString": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "StringContentType": { + "type": "string", + "description": "", + "x-enumNames": [ + "Unspecified", + "Html", + "Markdown" + ], + "enum": [ + "Unspecified", + "Html", + "Markdown" + ] + }, + "StringFieldEditor": { + "type": "string", + "description": "", + "x-enumNames": [ + "Input", + "Color", + "Markdown", + "Dropdown", + "Html", + "Radio", + "RichText", + "Slug", + "StockPhoto", + "TextArea" + ], + "enum": [ + "Input", + "Color", + "Markdown", + "Dropdown", + "Html", + "Radio", + "RichText", + "Slug", + "StockPhoto", + "TextArea" + ] + }, + "TagsFieldPropertiesDto": { + "allOf": [ + { + "$ref": "#/components/schemas/FieldPropertiesDto" + }, + { + "type": "object", + "additionalProperties": false, + "properties": { + "defaultValues": { + "description": "The language specific default value for the field value.", + "nullable": true, + "$ref": "#/components/schemas/LocalizedValueOfReadonlyListOfString" + }, + "defaultValue": { + "type": "array", + "description": "The default value.", + "nullable": true, + "items": { + "type": "string" + } + }, + "minItems": { + "type": "integer", + "description": "The minimum allowed items for the field value.", + "format": "int32", + "nullable": true + }, + "maxItems": { + "type": "integer", + "description": "The maximum allowed items for the field value.", + "format": "int32", + "nullable": true + }, + "allowedValues": { + "type": "array", + "description": "The allowed values for the field value.", + "nullable": true, + "items": { + "type": "string" + } + }, + "createEnum": { + "type": "boolean", + "description": "Indicates whether GraphQL Enum should be created." + }, + "editor": { + "description": "The editor that is used to manage this field.", + "$ref": "#/components/schemas/TagsFieldEditor" + } + } + } + ] + }, + "TagsFieldEditor": { + "type": "string", + "description": "", + "x-enumNames": [ + "Tags", + "Checkboxes", + "Dropdown" + ], + "enum": [ + "Tags", + "Checkboxes", + "Dropdown" + ] + }, + "UIFieldPropertiesDto": { + "allOf": [ + { + "$ref": "#/components/schemas/FieldPropertiesDto" + }, + { + "type": "object", + "additionalProperties": false, + "properties": { + "editor": { + "description": "The editor that is used to manage this field.", + "$ref": "#/components/schemas/UIFieldEditor" + } + } + } + ] + }, + "UIFieldEditor": { + "type": "string", + "description": "", + "x-enumNames": [ + "Separator" + ], + "enum": [ + "Separator" + ] + }, + "UserInfoFieldPropertiesDto": { + "allOf": [ + { + "$ref": "#/components/schemas/FieldPropertiesDto" + }, + { + "type": "object", + "additionalProperties": false, + "properties": { + "defaultRole": { + "type": "string", + "description": "The role to create a default value.", + "nullable": true + } + } + } + ] + }, + "NestedFieldDto": { + "allOf": [ + { + "$ref": "#/components/schemas/Resource" + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "name", + "properties", + "fieldId", + "isHidden", + "isLocked", + "isDisabled" + ], + "properties": { + "fieldId": { + "type": "integer", + "description": "The ID of the field.", + "format": "int64" + }, + "name": { + "type": "string", + "description": "The name of the field. Must be unique within the schema.", + "minLength": 1, + "pattern": "^[a-z0-9]+(\\-[a-z0-9]+)*$" + }, + "isHidden": { + "type": "boolean", + "description": "Defines if the field is hidden." + }, + "isLocked": { + "type": "boolean", + "description": "Defines if the field is locked." + }, + "isDisabled": { + "type": "boolean", + "description": "Defines if the field is disabled." + }, + "properties": { + "description": "The field properties.", + "$ref": "#/components/schemas/FieldPropertiesDto" + } + } + } + ] + }, + "AddFieldDto": { + "type": "object", + "additionalProperties": false, + "required": [ + "name", + "properties" + ], + "properties": { + "name": { + "type": "string", + "description": "The name of the field. Must be unique within the schema.", + "minLength": 1, + "pattern": "^[a-zA-Z0-9]+(\\-[a-zA-Z0-9]+)*$" + }, + "partitioning": { + "type": "string", + "description": "Determines the optional partitioning of the field.", + "nullable": true + }, + "properties": { + "description": "The field properties.", + "$ref": "#/components/schemas/FieldPropertiesDto" + } + } + }, + "ConfigureUIFieldsDto": { + "type": "object", + "additionalProperties": false, + "properties": { + "fieldsInLists": { + "type": "array", + "description": "The name of fields that are used in content lists.", + "nullable": true, + "items": { + "type": "string" + } + }, + "fieldsInReferences": { + "type": "array", + "description": "The name of fields that are used in content references.", + "nullable": true, + "items": { + "type": "string" + } + } + } + }, + "ReorderFieldsDto": { + "type": "object", + "additionalProperties": false, + "required": [ + "fieldIds" + ], + "properties": { + "fieldIds": { + "type": "array", + "description": "The field ids in the target order.", + "items": { + "type": "integer", + "format": "int64" + } + } + } + }, + "UpdateFieldDto": { + "type": "object", + "additionalProperties": false, + "required": [ + "properties" + ], + "properties": { + "properties": { + "description": "The field properties.", + "$ref": "#/components/schemas/FieldPropertiesDto" + } + } + }, + "IndexesDto": { + "allOf": [ + { + "$ref": "#/components/schemas/Resource" + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "items" + ], + "properties": { + "items": { + "type": "array", + "description": "The indexes.", + "items": { + "$ref": "#/components/schemas/IndexDto" + } + } + } + } + ] + }, + "IndexDto": { + "allOf": [ + { + "$ref": "#/components/schemas/Resource" + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "name", + "fields" + ], + "properties": { + "name": { + "type": "string", + "description": "The name of the index.", + "minLength": 1 + }, + "fields": { + "type": "array", + "description": "The index fields.", + "items": { + "$ref": "#/components/schemas/IndexFieldDto" + } + } + } + } + ] + }, + "IndexFieldDto": { + "type": "object", + "additionalProperties": false, + "required": [ + "name", + "order" + ], + "properties": { + "name": { + "type": "string", + "description": "The name of the field.", + "minLength": 1 + }, + "order": { + "description": "The sort order of the field.", + "$ref": "#/components/schemas/SortOrder" + } + } + }, + "SortOrder": { + "type": "string", + "description": "", + "x-enumNames": [ + "Ascending", + "Descending" + ], + "enum": [ + "Ascending", + "Descending" + ] + }, + "CreateIndexDto": { + "type": "object", + "additionalProperties": false, + "required": [ + "fields" + ], + "properties": { + "fields": { + "type": "array", + "description": "The index fields.", + "items": { + "$ref": "#/components/schemas/IndexFieldDto" + } + } + } + }, + "SchemasDto": { + "allOf": [ + { + "$ref": "#/components/schemas/Resource" + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "items" + ], + "properties": { + "items": { + "type": "array", + "description": "The schemas.", + "items": { + "$ref": "#/components/schemas/SchemaDto" + } + } + } + } + ] + }, + "CreateSchemaDto": { + "allOf": [ + { + "$ref": "#/components/schemas/UpsertSchemaDto" + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "name" + ], + "properties": { + "name": { + "type": "string", + "description": "The name of the schema.", + "minLength": 1, + "pattern": "^[a-z0-9]+(\\-[a-z0-9]+)*$" + }, + "type": { + "description": "The type of the schema.", + "$ref": "#/components/schemas/SchemaType" + }, + "isSingleton": { + "type": "boolean", + "description": "Set to true to allow a single content item only.", + "deprecated": true, + "x-deprecatedMessage": "Use 'type' field now." + } + } + } + ] + }, + "UpsertSchemaDto": { + "type": "object", + "x-abstract": true, + "additionalProperties": false, + "properties": { + "properties": { + "description": "The optional properties.", + "nullable": true, + "$ref": "#/components/schemas/SchemaPropertiesDto" + }, + "scripts": { + "description": "The optional scripts.", + "nullable": true, + "$ref": "#/components/schemas/SchemaScriptsDto" + }, + "fieldsInReferences": { + "type": "array", + "description": "The names of the fields that should be used in references.", + "nullable": true, + "items": { + "type": "string" + } + }, + "fieldsInLists": { + "type": "array", + "description": "The names of the fields that should be shown in lists, including meta fields.", + "nullable": true, + "items": { + "type": "string" + } + }, + "fields": { + "type": "array", + "description": "Optional fields.", + "nullable": true, + "items": { + "$ref": "#/components/schemas/UpsertSchemaFieldDto" + } + }, + "previewUrls": { + "type": "object", + "description": "The optional preview urls.", + "nullable": true, + "additionalProperties": { + "type": "string" + } + }, + "fieldRules": { + "type": "array", + "description": "The optional field Rules.", + "nullable": true, + "items": { + "$ref": "#/components/schemas/FieldRuleDto" + } + }, + "category": { + "type": "string", + "description": "The category.", + "nullable": true + }, + "isPublished": { + "type": "boolean", + "description": "Set it to true to autopublish the schema." + } + } + }, + "UpsertSchemaFieldDto": { + "type": "object", + "additionalProperties": false, + "required": [ + "name", + "properties" + ], + "properties": { + "name": { + "type": "string", + "description": "The name of the field. Must be unique within the schema.", + "minLength": 1, + "pattern": "^[a-zA-Z0-9]+(\\-[a-zA-Z0-9]+)*$" + }, + "isHidden": { + "type": "boolean", + "description": "Defines if the field is hidden." + }, + "isLocked": { + "type": "boolean", + "description": "Defines if the field is locked." + }, + "isDisabled": { + "type": "boolean", + "description": "Defines if the field is disabled." + }, + "partitioning": { + "type": "string", + "description": "Determines the optional partitioning of the field.", + "nullable": true + }, + "properties": { + "description": "The field properties.", + "$ref": "#/components/schemas/FieldPropertiesDto" + }, + "nested": { + "type": "array", + "description": "The nested fields.", + "nullable": true, + "items": { + "$ref": "#/components/schemas/UpsertSchemaNestedFieldDto" + } + } + } + }, + "UpsertSchemaNestedFieldDto": { + "type": "object", + "additionalProperties": false, + "required": [ + "name", + "properties" + ], + "properties": { + "name": { + "type": "string", + "description": "The name of the field. Must be unique within the schema.", + "minLength": 1, + "pattern": "^[a-zA-Z0-9]+(\\-[a-zA-Z0-9]+)*$" + }, + "isHidden": { + "type": "boolean", + "description": "Defines if the field is hidden." + }, + "isLocked": { + "type": "boolean", + "description": "Defines if the field is locked." + }, + "isDisabled": { + "type": "boolean", + "description": "Defines if the field is disabled." + }, + "properties": { + "description": "The field properties.", + "$ref": "#/components/schemas/FieldPropertiesDto" + } + } + }, + "GenerateSchemaResponseDto": { + "type": "object", + "additionalProperties": false, + "required": [ + "log" + ], + "properties": { + "log": { + "type": "array", + "description": "The status log.", + "items": { + "type": "string" + } + }, + "schemaName": { + "type": "string", + "description": "The name of the created schema.", + "nullable": true + } + } + }, + "GenerateSchemaDto": { + "type": "object", + "additionalProperties": false, + "required": [ + "prompt", + "execute", + "numberOfContentItems" + ], + "properties": { + "prompt": { + "type": "string", + "description": "The prompt to generate.", + "minLength": 1 + }, + "execute": { + "type": "boolean", + "description": "Indicates if the schema should actually be generated." + }, + "numberOfContentItems": { + "type": "integer", + "description": "The number of content items to generate.", + "format": "int32" + } + } + }, + "UpdateSchemaDto": { + "type": "object", + "additionalProperties": false, + "properties": { + "label": { + "type": "string", + "description": "Optional label for the editor.", + "maxLength": 100, + "minLength": 0, + "nullable": true + }, + "hints": { + "type": "string", + "description": "Hints to describe the schema.", + "maxLength": 1000, + "minLength": 0, + "nullable": true + }, + "contentsSidebarUrl": { + "type": "string", + "description": "The url to a the sidebar plugin for content lists.", + "nullable": true + }, + "contentSidebarUrl": { + "type": "string", + "description": "The url to a the sidebar plugin for content items.", + "nullable": true + }, + "contentsListUrl": { + "type": "string", + "description": "The url to the content list plugin.", + "nullable": true + }, + "validateOnPublish": { + "type": "boolean", + "description": "True to validate the content items on publish." + }, + "tags": { + "type": "array", + "description": "Tags for automation processes.", + "nullable": true, + "items": { + "type": "string" + } + } + } + }, + "SynchronizeSchemaDto": { + "allOf": [ + { + "$ref": "#/components/schemas/UpsertSchemaDto" + }, + { + "type": "object", + "additionalProperties": false, + "properties": { + "noFieldDeletion": { + "type": "boolean", + "description": "True, when fields should not be deleted." + }, + "noFieldRecreation": { + "type": "boolean", + "description": "True, when fields with different types should not be recreated." + } + } + } + ] + }, + "ChangeCategoryDto": { + "type": "object", + "additionalProperties": false, + "properties": { + "name": { + "type": "string", + "description": "The name of the category.", + "nullable": true + } + } + }, + "ConfigurePreviewUrlsDto": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "ConfigureFieldRulesDto": { + "type": "object", + "additionalProperties": false, + "properties": { + "fieldRules": { + "type": "array", + "description": "The field rules to configure.", + "nullable": true, + "items": { + "$ref": "#/components/schemas/FieldRuleDto" + } + } + } + }, + "RuleElementDto": { + "type": "object", + "additionalProperties": false, + "required": [ + "description", + "display", + "properties" + ], + "properties": { + "description": { + "type": "string", + "description": "Describes the action or trigger type." + }, + "display": { + "type": "string", + "description": "The label for the action or trigger type." + }, + "title": { + "type": "string", + "description": "Optional title.", + "nullable": true + }, + "iconColor": { + "type": "string", + "description": "The color for the icon.", + "nullable": true + }, + "iconImage": { + "type": "string", + "description": "The image for the icon.", + "nullable": true + }, + "readMore": { + "type": "string", + "description": "The optional link to the product that is integrated.", + "nullable": true + }, + "properties": { + "type": "array", + "description": "The properties.", + "items": { + "$ref": "#/components/schemas/RuleElementPropertyDto" + } + } + } + }, + "RuleElementPropertyDto": { + "type": "object", + "additionalProperties": false, + "required": [ + "editor", + "name", + "display", + "isFormattable", + "isRequired" + ], + "properties": { + "editor": { + "type": "string", + "description": "The html editor." + }, + "name": { + "type": "string", + "description": "The name of the editor." + }, + "display": { + "type": "string", + "description": "The label to use." + }, + "options": { + "type": "array", + "description": "The options, if the editor is a dropdown.", + "nullable": true, + "items": { + "type": "string" + } + }, + "description": { + "type": "string", + "description": "The optional description.", + "nullable": true + }, + "isFormattable": { + "type": "boolean", + "description": "Indicates if the property is formattable." + }, + "isRequired": { + "type": "boolean", + "description": "Indicates if the property is required." + } + } + }, + "RulesDto": { + "allOf": [ + { + "$ref": "#/components/schemas/Resource" + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "items" + ], + "properties": { + "items": { + "type": "array", + "description": "The rules.", + "items": { + "$ref": "#/components/schemas/RuleDto" + } + }, + "runningRuleId": { + "type": "string", + "description": "The ID of the rule that is currently rerunning.", + "nullable": true + } + } + } + ] + }, + "RuleDto": { + "allOf": [ + { + "$ref": "#/components/schemas/Resource" + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "id", + "createdBy", + "lastModifiedBy", + "created", + "lastModified", + "version", + "isEnabled", + "trigger", + "flow", + "action", + "numSucceeded", + "numFailed" + ], + "properties": { + "id": { + "type": "string", + "description": "The ID of the rule." + }, + "createdBy": { + "type": "string", + "description": "The user that has created the rule." + }, + "lastModifiedBy": { + "type": "string", + "description": "The user that has updated the rule." + }, + "created": { + "type": "string", + "description": "The date and time when the rule has been created.", + "format": "date-time" + }, + "lastModified": { + "type": "string", + "description": "The date and time when the rule has been modified last.", + "format": "date-time" + }, + "version": { + "type": "integer", + "description": "The version of the rule.", + "format": "int64" + }, + "isEnabled": { + "type": "boolean", + "description": "Determines if the rule is enabled." + }, + "name": { + "type": "string", + "description": "Optional rule name.", + "nullable": true + }, + "trigger": { + "description": "The trigger properties.", + "$ref": "#/components/schemas/RuleTriggerDto" + }, + "flow": { + "description": "The flow to describe the sequence of actions to perform.", + "$ref": "#/components/schemas/FlowDefinitionDto" + }, + "action": { + "description": "The action properties.", + "deprecated": true, + "x-deprecatedMessage": "Use the new 'Flow' property to define actions. Can be null if the flow cannot be converted.", + "$ref": "#/components/schemas/RuleActionDto" + }, + "numSucceeded": { + "type": "integer", + "description": "The number of completed executions.", + "format": "int64" + }, + "numFailed": { + "type": "integer", + "description": "The number of failed executions.", + "format": "int64" + }, + "lastExecuted": { + "type": "string", + "description": "The date and time when the rule was executed the last time.", + "format": "date-time", + "deprecated": true, + "x-deprecatedMessage": "Removed when migrated to new rule statistics.", + "nullable": true + } + } + } + ] + }, + "RuleTriggerDto": { + "type": "object", + "discriminator": { + "propertyName": "triggerType", + "mapping": { + "AssetChanged": "#/components/schemas/AssetChangedRuleTriggerDto", + "Comment": "#/components/schemas/CommentRuleTriggerDto", + "ContentChanged": "#/components/schemas/ContentChangedRuleTriggerDto", + "CronJob": "#/components/schemas/CronJobRuleTriggerDto", + "Manual": "#/components/schemas/ManualRuleTriggerDto", + "SchemaChanged": "#/components/schemas/SchemaChangedRuleTriggerDto", + "Usage": "#/components/schemas/UsageRuleTriggerDto" + } + }, + "x-abstract": true, + "additionalProperties": false, + "required": [ + "triggerType" + ], + "properties": { + "triggerType": { + "type": "string" + } + } + }, + "AssetChangedRuleTriggerDto": { + "allOf": [ + { + "$ref": "#/components/schemas/RuleTriggerDto" + }, + { + "type": "object", + "additionalProperties": false, + "properties": { + "condition": { + "type": "string", + "description": "Javascript condition when to trigger.", + "nullable": true + } + } + } + ] + }, + "CommentRuleTriggerDto": { + "allOf": [ + { + "$ref": "#/components/schemas/RuleTriggerDto" + }, + { + "type": "object", + "additionalProperties": false, + "properties": { + "condition": { + "type": "string", + "description": "Javascript condition when to trigger.", + "nullable": true + } + } + } + ] + }, + "ContentChangedRuleTriggerDto": { + "allOf": [ + { + "$ref": "#/components/schemas/RuleTriggerDto" + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "handleAll" + ], + "properties": { + "schemas": { + "type": "array", + "description": "The schema settings.", + "nullable": true, + "items": { + "$ref": "#/components/schemas/SchemaCondition" + } + }, + "referencedSchemas": { + "type": "array", + "description": "The schema references.", + "nullable": true, + "items": { + "$ref": "#/components/schemas/SchemaCondition" + } + }, + "handleAll": { + "type": "boolean", + "description": "Determines whether the trigger should handle all content changes events." + } + } + } + ] + }, + "SchemaCondition": { + "type": "object", + "additionalProperties": false, + "required": [ + "schemaId" + ], + "properties": { + "schemaId": { + "type": "string" + }, + "condition": { + "type": "string", + "nullable": true + } + } + }, + "CronJobRuleTriggerDto": { + "allOf": [ + { + "$ref": "#/components/schemas/RuleTriggerDto" + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "cronExpression", + "value" + ], + "properties": { + "cronExpression": { + "type": "string", + "description": "The cron expression that defines the interval.", + "minLength": 1 + }, + "cronTimezone": { + "type": "string", + "description": "The optional timezone.", + "nullable": true + }, + "value": { + "description": "The value sent to the flow." + } + } + } + ] + }, + "ManualRuleTriggerDto": { + "allOf": [ + { + "$ref": "#/components/schemas/RuleTriggerDto" + }, + { + "type": "object", + "additionalProperties": false + } + ] + }, + "SchemaChangedRuleTriggerDto": { + "allOf": [ + { + "$ref": "#/components/schemas/RuleTriggerDto" + }, + { + "type": "object", + "additionalProperties": false, + "properties": { + "condition": { + "type": "string", + "description": "Javascript condition when to trigger.", + "nullable": true + } + } + } + ] + }, + "UsageRuleTriggerDto": { + "allOf": [ + { + "$ref": "#/components/schemas/RuleTriggerDto" + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "limit" + ], + "properties": { + "limit": { + "type": "integer", + "description": "The number of monthly api calls.", + "format": "int32" + }, + "numDays": { + "type": "integer", + "description": "The number of days to check or null for the current month.", + "format": "int32", + "maximum": 30.0, + "minimum": 1.0, + "nullable": true + } + } + } + ] + }, + "FlowDefinitionDto": { + "type": "object", + "additionalProperties": false, + "required": [ + "initialStepId", + "steps" + ], + "properties": { + "initialStepId": { + "type": "string", + "description": "The ID of the initial step.", + "format": "guid", + "minLength": 1 + }, + "steps": { + "type": "object", + "description": "The steps.", + "additionalProperties": { + "$ref": "#/components/schemas/FlowStepDefinitionDto" + } + } + } + }, + "FlowStepDefinitionDto": { + "type": "object", + "additionalProperties": false, + "required": [ + "step" + ], + "properties": { + "step": { + "description": "The actual step.", + "$ref": "#/components/schemas/FlowStepDto" + }, + "name": { + "type": "string", + "description": "The optional descriptive name.", + "nullable": true + }, + "nextStepId": { + "type": "string", + "description": "The next step.", + "format": "guid", + "nullable": true + }, + "ignoreError": { + "type": "boolean", + "description": "Indicates if errors should be ignored." + } + } + }, + "FlowStepDto": { + "type": "object", + "discriminator": { + "propertyName": "stepType", + "mapping": { + "Algolia": "#/components/schemas/AlgoliaFlowStepDto", + "AzureQueue": "#/components/schemas/AzureQueueFlowStepDto", + "Comment": "#/components/schemas/CommentFlowStepDto", + "CreateContent": "#/components/schemas/CreateContentFlowStepDto", + "Delay": "#/components/schemas/DelayFlowStepDto", + "Discourse": "#/components/schemas/DiscourseFlowStepDto", + "ElasticSearch": "#/components/schemas/ElasticSearchFlowStepDto", + "Email": "#/components/schemas/EmailFlowStepDto", + "Fastly": "#/components/schemas/FastlyFlowStepDto", + "If": "#/components/schemas/IfFlowStepDto", + "Medium": "#/components/schemas/MediumFlowStepDto", + "Notification": "#/components/schemas/NotificationFlowStepDto", + "OpenSearch": "#/components/schemas/OpenSearchFlowStepDto", + "Prerender": "#/components/schemas/PrerenderFlowStepDto", + "Script": "#/components/schemas/ScriptFlowStepDto", + "SignalR": "#/components/schemas/SignalRFlowStepDto", + "Slack": "#/components/schemas/SlackFlowStepDto", + "Tweet": "#/components/schemas/TweetFlowStepDto", + "Typesense": "#/components/schemas/TypesenseFlowStepDto", + "Webhook": "#/components/schemas/WebhookFlowStepDto" + } + }, + "x-abstract": true, + "additionalProperties": false, + "required": [ + "stepType" + ], + "properties": { + "stepType": { + "type": "string" + } + } + }, + "AlgoliaFlowStepDto": { + "allOf": [ + { + "$ref": "#/components/schemas/FlowStepDto" + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "appId", + "apiKey", + "indexName" + ], + "properties": { + "appId": { + "title": "Application Id", + "type": "string", + "description": "The application ID.", + "minLength": 1 + }, + "apiKey": { + "title": "Api Key", + "type": "string", + "description": "The API key to grant access to Squidex.", + "minLength": 1 + }, + "indexName": { + "title": "Index Name", + "type": "string", + "description": "The name of the index.", + "minLength": 1 + }, + "document": { + "title": "Document", + "type": "string", + "description": "The optional custom document.", + "nullable": true + }, + "delete": { + "title": "Deletion", + "type": "string", + "description": "The condition when to delete the entry.", + "nullable": true + } + } + } + ] + }, + "AzureQueueFlowStepDto": { + "allOf": [ + { + "$ref": "#/components/schemas/FlowStepDto" + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "connectionString", + "queue" + ], + "properties": { + "connectionString": { + "title": "Connection", + "type": "string", + "description": "The connection string to the storage account.", + "minLength": 1 + }, + "queue": { + "title": "Queue", + "type": "string", + "description": "The name of the queue.", + "minLength": 1 + }, + "payload": { + "title": "Payload (Optional)", + "type": "string", + "description": "Leave it empty to use the full event as body.", + "nullable": true + } + } + } + ] + }, + "CommentFlowStepDto": { + "allOf": [ + { + "$ref": "#/components/schemas/FlowStepDto" + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "text" + ], + "properties": { + "text": { + "title": "Text", + "type": "string", + "description": "The comment text.", + "minLength": 1 + }, + "client": { + "title": "Client", + "type": "string", + "description": "An optional client name.", + "nullable": true + } + } + } + ] + }, + "CreateContentFlowStepDto": { + "allOf": [ + { + "$ref": "#/components/schemas/FlowStepDto" + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "data", + "schema", + "publish" + ], + "properties": { + "data": { + "title": "Data", + "type": "string", + "description": "The content data.", + "minLength": 1 + }, + "schema": { + "title": "Schema", + "type": "string", + "description": "The name of the schema.", + "minLength": 1 + }, + "client": { + "title": "Client", + "type": "string", + "description": "An optional client name.", + "nullable": true + }, + "publish": { + "title": "Publish", + "type": "boolean", + "description": "Publish the content." + } + } + } + ] + }, + "DelayFlowStepDto": { + "allOf": [ + { + "$ref": "#/components/schemas/FlowStepDto" + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "delayInSec" + ], + "properties": { + "delayInSec": { + "title": "Delay", + "type": "integer", + "description": "The delay in seconds.", + "format": "int32" + } + } + } + ] + }, + "DiscourseFlowStepDto": { + "allOf": [ + { + "$ref": "#/components/schemas/FlowStepDto" + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "url", + "apiKey", + "apiUsername", + "text" + ], + "properties": { + "url": { + "title": "Server Url", + "type": "string", + "description": "The url to the discourse server.", + "format": "uri", + "minLength": 1 + }, + "apiKey": { + "title": "Api Key", + "type": "string", + "description": "The api key to authenticate to your discourse server.", + "minLength": 1 + }, + "apiUsername": { + "title": "Api User", + "type": "string", + "description": "The api username to authenticate to your discourse server.", + "minLength": 1 + }, + "text": { + "title": "Text", + "type": "string", + "description": "The text as markdown.", + "minLength": 1 + }, + "title": { + "title": "Title", + "type": "string", + "description": "The optional title when creating new topics.", + "nullable": true + }, + "topic": { + "title": "Topic", + "type": "integer", + "description": "The optional topic id.", + "format": "int32", + "nullable": true + }, + "category": { + "title": "Category", + "type": "integer", + "description": "The optional category id.", + "format": "int32", + "nullable": true + } + } + } + ] + }, + "ElasticSearchFlowStepDto": { + "allOf": [ + { + "$ref": "#/components/schemas/FlowStepDto" + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "host", + "indexName" + ], + "properties": { + "host": { + "title": "Server Url", + "type": "string", + "description": "The url to the instance or cluster.", + "format": "uri", + "minLength": 1 + }, + "indexName": { + "title": "Index Name", + "type": "string", + "description": "The name of the index.", + "minLength": 1 + }, + "username": { + "title": "Username", + "type": "string", + "description": "The optional username.", + "nullable": true + }, + "password": { + "title": "Password", + "type": "string", + "description": "The optional password.", + "nullable": true + }, + "document": { + "title": "Document", + "type": "string", + "description": "The optional custom document.", + "nullable": true + }, + "delete": { + "title": "Deletion", + "type": "string", + "description": "The condition when to delete the document.", + "nullable": true + } + } + } + ] + }, + "EmailFlowStepDto": { + "allOf": [ + { + "$ref": "#/components/schemas/FlowStepDto" + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "serverHost", + "serverPort", + "messageFrom", + "messageTo", + "messageSubject", + "messageBody", + "serverUsername", + "serverPassword" + ], + "properties": { + "serverHost": { + "title": "Server Host", + "type": "string", + "description": "The IP address or host to the SMTP server.", + "minLength": 1 + }, + "serverPort": { + "title": "Server Port", + "type": "integer", + "description": "The port to the SMTP server.", + "format": "int32" + }, + "serverUsername": { + "title": "Username", + "type": "string", + "description": "The username for the SMTP server." + }, + "serverPassword": { + "title": "Password", + "type": "string", + "description": "The password for the SMTP server." + }, + "messageFrom": { + "title": "From Address", + "type": "string", + "description": "The email sending address.", + "minLength": 1 + }, + "messageTo": { + "title": "To Address", + "type": "string", + "description": "The email message will be sent to.", + "minLength": 1 + }, + "messageSubject": { + "title": "Subject", + "type": "string", + "description": "The subject line for this email message.", + "minLength": 1 + }, + "messageBody": { + "title": "Body", + "type": "string", + "description": "The message body.", + "minLength": 1 + } + } + } + ] + }, + "FastlyFlowStepDto": { + "allOf": [ + { + "$ref": "#/components/schemas/FlowStepDto" + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "apiKey", + "serviceId" + ], + "properties": { + "apiKey": { + "title": "Api Key", + "type": "string", + "description": "The API key to grant access to Squidex.", + "minLength": 1 + }, + "serviceId": { + "title": "Service Id", + "type": "string", + "description": "The ID of the fastly service.", + "minLength": 1 + } + } + } + ] + }, + "IfFlowStepDto": { + "allOf": [ + { + "$ref": "#/components/schemas/FlowStepDto" + }, + { + "type": "object", + "additionalProperties": false, + "properties": { + "branches": { + "title": "Branches", + "type": "array", + "description": "The delay in seconds.", + "nullable": true, + "items": { + "$ref": "#/components/schemas/IfFlowBranch" + } + }, + "elseStepId": { + "type": "string", + "format": "guid", + "nullable": true + } + } + } + ] + }, + "IfFlowBranch": { + "type": "object", + "additionalProperties": false, + "properties": { + "condition": { + "type": "string", + "nullable": true + }, + "nextStepId": { + "type": "string", + "format": "guid", + "nullable": true + } + } + }, + "MediumFlowStepDto": { + "allOf": [ + { + "$ref": "#/components/schemas/FlowStepDto" + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "accessToken", + "title", + "content", + "isHtml" + ], + "properties": { + "accessToken": { + "title": "Access Token", + "type": "string", + "description": "The self issued access token.", + "minLength": 1 + }, + "title": { + "title": "Title", + "type": "string", + "description": "The title, used for the url.", + "minLength": 1 + }, + "content": { + "title": "Content", + "type": "string", + "description": "The content, either html or markdown.", + "minLength": 1 + }, + "canonicalUrl": { + "title": "Canonical Url", + "type": "string", + "description": "The original home of this content, if it was originally published elsewhere.", + "nullable": true + }, + "tags": { + "title": "Tags", + "type": "string", + "description": "The optional comma separated list of tags.", + "nullable": true + }, + "publicationId": { + "title": "Publication Id", + "type": "string", + "description": "Optional publication id.", + "nullable": true + }, + "isHtml": { + "title": "Is Html", + "type": "boolean", + "description": "Indicates whether the content is markdown or html." + } + } + } + ] + }, + "NotificationFlowStepDto": { + "allOf": [ + { + "$ref": "#/components/schemas/FlowStepDto" + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "user", + "text" + ], + "properties": { + "user": { + "title": "User", + "type": "string", + "description": "The user id or email.", + "minLength": 1 + }, + "text": { + "title": "Title", + "type": "string", + "description": "The text to send.", + "minLength": 1 + }, + "url": { + "title": "Url", + "type": "string", + "description": "The optional url to attach to the notification.", + "nullable": true + }, + "client": { + "title": "Client", + "type": "string", + "description": "An optional client name.", + "nullable": true + } + } + } + ] + }, + "OpenSearchFlowStepDto": { + "allOf": [ + { + "$ref": "#/components/schemas/FlowStepDto" + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "host", + "indexName" + ], + "properties": { + "host": { + "title": "Server Url", + "type": "string", + "description": "The url to the instance or cluster.", + "format": "uri", + "minLength": 1 + }, + "indexName": { + "title": "Index Name", + "type": "string", + "description": "The name of the index.", + "minLength": 1 + }, + "username": { + "title": "Username", + "type": "string", + "description": "The optional username.", + "nullable": true + }, + "password": { + "title": "Password", + "type": "string", + "description": "The optional password.", + "nullable": true + }, + "document": { + "title": "Document", + "type": "string", + "description": "The optional custom document.", + "nullable": true + }, + "delete": { + "title": "Deletion", + "type": "string", + "description": "The condition when to delete the document.", + "nullable": true + } + } + } + ] + }, + "PrerenderFlowStepDto": { + "allOf": [ + { + "$ref": "#/components/schemas/FlowStepDto" + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "token", + "url" + ], + "properties": { + "token": { + "title": "Token", + "type": "string", + "description": "The prerender token from your account.", + "minLength": 1 + }, + "url": { + "title": "Url", + "type": "string", + "description": "The url to recache.", + "minLength": 1 + } + } + } + ] + }, + "ScriptFlowStepDto": { + "allOf": [ + { + "$ref": "#/components/schemas/FlowStepDto" + }, + { + "type": "object", + "additionalProperties": false, + "properties": { + "script": { + "title": "Script", + "type": "string", + "description": "The script to execute.", + "nullable": true + } + } + } + ] + }, + "SignalRFlowStepDto": { + "allOf": [ + { + "$ref": "#/components/schemas/FlowStepDto" + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "connectionString", + "hubName", + "action" + ], + "properties": { + "connectionString": { + "title": "Connection", + "type": "string", + "description": "The connection string to the Azure SignalR.", + "minLength": 1 + }, + "hubName": { + "title": "Hub Name", + "type": "string", + "description": "The name of the hub.", + "minLength": 1 + }, + "action": { + "title": "Action", + "description": "* Broadcast = send to all users.\n * User = send to all target users(s).\n * Group = send to all target group(s).", + "$ref": "#/components/schemas/SignalRActionType" + }, + "methodName": { + "title": "Methode Name", + "type": "string", + "description": "Set the Name of the hub method received by the customer.", + "nullable": true + }, + "target": { + "title": "Target (Optional)", + "type": "string", + "description": "Define target users or groups by id or name. One item per line. Not needed for Broadcast action.", + "nullable": true + }, + "payload": { + "title": "Payload (Optional)", + "type": "string", + "description": "Leave it empty to use the full event as body.", + "nullable": true + } + } + } + ] + }, + "SignalRActionType": { + "type": "string", + "description": "", + "x-enumNames": [ + "Broadcast", + "User", + "Group" + ], + "enum": [ + "Broadcast", + "User", + "Group" + ] + }, + "SlackFlowStepDto": { + "allOf": [ + { + "$ref": "#/components/schemas/FlowStepDto" + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "webhookUrl", + "text" + ], + "properties": { + "webhookUrl": { + "title": "Webhook Url", + "type": "string", + "description": "The slack webhook url.", + "format": "uri", + "minLength": 1 + }, + "text": { + "title": "Text", + "type": "string", + "description": "The text that is sent as message to slack.", + "minLength": 1 + } + } + } + ] + }, + "TweetFlowStepDto": { + "allOf": [ + { + "$ref": "#/components/schemas/FlowStepDto" + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "accessToken", + "accessSecret", + "text" + ], + "properties": { + "accessToken": { + "title": "Access Token", + "type": "string", + "description": " The generated access token.", + "minLength": 1 + }, + "accessSecret": { + "title": "Access Secret", + "type": "string", + "description": " The generated access secret.", + "minLength": 1 + }, + "text": { + "title": "Text", + "type": "string", + "description": "The text that is sent as tweet to twitter.", + "minLength": 1 + } + } + } + ] + }, + "TypesenseFlowStepDto": { + "allOf": [ + { + "$ref": "#/components/schemas/FlowStepDto" + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "host", + "indexName", + "apiKey" + ], + "properties": { + "host": { + "title": "Server Url", + "type": "string", + "description": "The url to the instance or cluster.", + "format": "uri", + "minLength": 1 + }, + "indexName": { + "title": "Index Name", + "type": "string", + "description": "The name of the index.", + "minLength": 1 + }, + "apiKey": { + "title": "Api Key", + "type": "string", + "description": "The api key.", + "minLength": 1 + }, + "document": { + "title": "Document", + "type": "string", + "description": "The optional custom document.", + "nullable": true + }, + "delete": { + "title": "Deletion", + "type": "string", + "description": "The condition when to delete the document.", + "nullable": true + } + } + } + ] + }, + "WebhookFlowStepDto": { + "allOf": [ + { + "$ref": "#/components/schemas/FlowStepDto" + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "method", + "url" + ], + "properties": { + "method": { + "title": "Method", + "description": "The type of the request.", + "$ref": "#/components/schemas/WebhookMethod" + }, + "url": { + "title": "Url", + "type": "string", + "description": "The URL to the webhook.", + "minLength": 1 + }, + "payload": { + "title": "Payload (Optional)", + "type": "string", + "description": "Leave it empty to use the full event as body.", + "nullable": true + }, + "headers": { + "title": "Headers (Optional)", + "type": "string", + "description": "The message headers in the format '[Key]=[Value]', one entry per line.", + "nullable": true + }, + "payloadType": { + "title": "Payload Type", + "type": "string", + "description": "The mime type of the payload.", + "nullable": true + }, + "sharedSecret": { + "title": "Shared Secret", + "type": "string", + "description": "The shared secret that is used to calculate the payload signature.", + "nullable": true + } + } + } + ] + }, + "WebhookMethod": { + "type": "string", + "description": "", + "x-enumNames": [ + "POST", + "PUT", + "GET", + "DELETE", + "PATCH" + ], + "enum": [ + "POST", + "PUT", + "GET", + "DELETE", + "PATCH" + ] + }, + "RuleActionDto": { + "type": "object", + "discriminator": { + "propertyName": "actionType", + "mapping": { + "Algolia": "#/components/schemas/AlgoliaRuleActionDto", + "AzureQueue": "#/components/schemas/AzureQueueRuleActionDto", + "Comment": "#/components/schemas/CommentRuleActionDto", + "CreateContent": "#/components/schemas/CreateContentRuleActionDto", + "Discourse": "#/components/schemas/DiscourseRuleActionDto", + "ElasticSearch": "#/components/schemas/ElasticSearchRuleActionDto", + "Email": "#/components/schemas/EmailRuleActionDto", + "Fastly": "#/components/schemas/FastlyRuleActionDto", + "Medium": "#/components/schemas/MediumRuleActionDto", + "Notification": "#/components/schemas/NotificationRuleActionDto", + "OpenSearch": "#/components/schemas/OpenSearchRuleActionDto", + "Prerender": "#/components/schemas/PrerenderRuleActionDto", + "Script": "#/components/schemas/ScriptRuleActionDto", + "SignalR": "#/components/schemas/SignalRRuleActionDto", + "Slack": "#/components/schemas/SlackRuleActionDto", + "Tweet": "#/components/schemas/TweetRuleActionDto", + "Typesense": "#/components/schemas/TypesenseRuleActionDto", + "Webhook": "#/components/schemas/WebhookRuleActionDto" + } + }, + "deprecated": true, + "x-deprecatedMessage": "Has been replaced by flows.", + "x-abstract": true, + "additionalProperties": false, + "required": [ + "actionType" + ], + "properties": { + "actionType": { + "type": "string" + } + } + }, + "AlgoliaRuleActionDto": { + "allOf": [ + { + "$ref": "#/components/schemas/RuleActionDto" + }, + { + "type": "object", + "deprecated": true, + "x-deprecatedMessage": "Has been replaced by flows.", + "additionalProperties": false, + "required": [ + "appId", + "apiKey", + "indexName" + ], + "properties": { + "appId": { + "type": "string", + "minLength": 1 + }, + "apiKey": { + "type": "string", + "minLength": 1 + }, + "indexName": { + "type": "string", + "minLength": 1 + }, + "document": { + "type": "string", + "nullable": true + }, + "delete": { + "type": "string", + "nullable": true + } + } + } + ] + }, + "AzureQueueRuleActionDto": { + "allOf": [ + { + "$ref": "#/components/schemas/RuleActionDto" + }, + { + "type": "object", + "deprecated": true, + "x-deprecatedMessage": "Has been replaced by flows.", + "additionalProperties": false, + "required": [ + "connectionString", + "queue" + ], + "properties": { + "connectionString": { + "type": "string", + "minLength": 1 + }, + "queue": { + "type": "string", + "minLength": 1 + }, + "payload": { + "type": "string", + "nullable": true + } + } + } + ] + }, + "CommentRuleActionDto": { + "allOf": [ + { + "$ref": "#/components/schemas/RuleActionDto" + }, + { + "type": "object", + "deprecated": true, + "x-deprecatedMessage": "Has been replaced by flows.", + "additionalProperties": false, + "required": [ + "text" + ], + "properties": { + "text": { + "type": "string", + "minLength": 1 + }, + "client": { + "type": "string", + "nullable": true + } + } + } + ] + }, + "CreateContentRuleActionDto": { + "allOf": [ + { + "$ref": "#/components/schemas/RuleActionDto" + }, + { + "type": "object", + "deprecated": true, + "x-deprecatedMessage": "Has been replaced by flows.", + "additionalProperties": false, + "required": [ + "data", + "schema", + "publish" + ], + "properties": { + "data": { + "type": "string", + "minLength": 1 + }, + "schema": { + "type": "string", + "minLength": 1 + }, + "client": { + "type": "string", + "nullable": true + }, + "publish": { + "type": "boolean" + } + } + } + ] + }, + "DiscourseRuleActionDto": { + "allOf": [ + { + "$ref": "#/components/schemas/RuleActionDto" + }, + { + "type": "object", + "deprecated": true, + "x-deprecatedMessage": "Has been replaced by flows.", + "additionalProperties": false, + "required": [ + "url", + "apiKey", + "apiUsername", + "text" + ], + "properties": { + "url": { + "type": "string", + "format": "uri", + "minLength": 1 + }, + "apiKey": { + "type": "string", + "minLength": 1 + }, + "apiUsername": { + "type": "string", + "minLength": 1 + }, + "text": { + "type": "string", + "minLength": 1 + }, + "title": { + "type": "string", + "nullable": true + }, + "topic": { + "type": "integer", + "format": "int32", + "nullable": true + }, + "category": { + "type": "integer", + "format": "int32", + "nullable": true + } + } + } + ] + }, + "ElasticSearchRuleActionDto": { + "allOf": [ + { + "$ref": "#/components/schemas/RuleActionDto" + }, + { + "type": "object", + "deprecated": true, + "x-deprecatedMessage": "Has been replaced by flows.", + "additionalProperties": false, + "required": [ + "host", + "indexName" + ], + "properties": { + "host": { + "type": "string", + "format": "uri", + "minLength": 1 + }, + "indexName": { + "type": "string", + "minLength": 1 + }, + "username": { + "type": "string", + "nullable": true + }, + "password": { + "type": "string", + "nullable": true + }, + "document": { + "type": "string", + "nullable": true + }, + "delete": { + "type": "string", + "nullable": true + } + } + } + ] + }, + "EmailRuleActionDto": { + "allOf": [ + { + "$ref": "#/components/schemas/RuleActionDto" + }, + { + "type": "object", + "deprecated": true, + "x-deprecatedMessage": "Has been replaced by flows.", + "additionalProperties": false, + "required": [ + "serverHost", + "serverPort", + "messageFrom", + "messageTo", + "messageSubject", + "messageBody", + "serverUsername", + "serverPassword" + ], + "properties": { + "serverHost": { + "type": "string", + "minLength": 1 + }, + "serverPort": { + "type": "integer", + "format": "int32" + }, + "messageFrom": { + "type": "string", + "minLength": 1 + }, + "messageTo": { + "type": "string", + "minLength": 1 + }, + "messageSubject": { + "type": "string", + "minLength": 1 + }, + "messageBody": { + "type": "string", + "minLength": 1 + }, + "serverUsername": { + "type": "string" + }, + "serverPassword": { + "type": "string" + } + } + } + ] + }, + "FastlyRuleActionDto": { + "allOf": [ + { + "$ref": "#/components/schemas/RuleActionDto" + }, + { + "type": "object", + "deprecated": true, + "x-deprecatedMessage": "Has been replaced by flows.", + "additionalProperties": false, + "required": [ + "apiKey", + "serviceId" + ], + "properties": { + "apiKey": { + "type": "string", + "minLength": 1 + }, + "serviceId": { + "type": "string", + "minLength": 1 + } + } + } + ] + }, + "MediumRuleActionDto": { + "allOf": [ + { + "$ref": "#/components/schemas/RuleActionDto" + }, + { + "type": "object", + "deprecated": true, + "x-deprecatedMessage": "Has been replaced by flows.", + "additionalProperties": false, + "required": [ + "accessToken", + "title", + "content", + "isHtml" + ], + "properties": { + "accessToken": { + "type": "string", + "minLength": 1 + }, + "title": { + "type": "string", + "minLength": 1 + }, + "content": { + "type": "string", + "minLength": 1 + }, + "canonicalUrl": { + "type": "string", + "nullable": true + }, + "tags": { + "type": "string", + "nullable": true + }, + "publicationId": { + "type": "string", + "nullable": true + }, + "isHtml": { + "type": "boolean" + } + } + } + ] + }, + "NotificationRuleActionDto": { + "allOf": [ + { + "$ref": "#/components/schemas/RuleActionDto" + }, + { + "type": "object", + "deprecated": true, + "x-deprecatedMessage": "Has been replaced by flows.", + "additionalProperties": false, + "required": [ + "user", + "text" + ], + "properties": { + "user": { + "type": "string", + "minLength": 1 + }, + "text": { + "type": "string", + "minLength": 1 + }, + "url": { + "type": "string", + "nullable": true + }, + "client": { + "type": "string", + "nullable": true + } + } + } + ] + }, + "OpenSearchRuleActionDto": { + "allOf": [ + { + "$ref": "#/components/schemas/RuleActionDto" + }, + { + "type": "object", + "deprecated": true, + "x-deprecatedMessage": "Has been replaced by flows.", + "additionalProperties": false, + "required": [ + "host", + "indexName" + ], + "properties": { + "host": { + "type": "string", + "format": "uri", + "minLength": 1 + }, + "indexName": { + "type": "string", + "minLength": 1 + }, + "username": { + "type": "string", + "nullable": true + }, + "password": { + "type": "string", + "nullable": true + }, + "document": { + "type": "string", + "nullable": true + }, + "delete": { + "type": "string", + "nullable": true + } + } + } + ] + }, + "PrerenderRuleActionDto": { + "allOf": [ + { + "$ref": "#/components/schemas/RuleActionDto" + }, + { + "type": "object", + "deprecated": true, + "x-deprecatedMessage": "Has been replaced by flows.", + "additionalProperties": false, + "required": [ + "token", + "url" + ], + "properties": { + "token": { + "type": "string", + "minLength": 1 + }, + "url": { + "type": "string", + "minLength": 1 + } + } + } + ] + }, + "ScriptRuleActionDto": { + "allOf": [ + { + "$ref": "#/components/schemas/RuleActionDto" + }, + { + "type": "object", + "deprecated": true, + "x-deprecatedMessage": "Has been replaced by flows.", + "additionalProperties": false, + "required": [ + "script" + ], + "properties": { + "script": { + "type": "string", + "minLength": 1 + } + } + } + ] + }, + "SignalRRuleActionDto": { + "allOf": [ + { + "$ref": "#/components/schemas/RuleActionDto" + }, + { + "type": "object", + "deprecated": true, + "x-deprecatedMessage": "Has been replaced by flows.", + "additionalProperties": false, + "required": [ + "connectionString", + "hubName", + "action" + ], + "properties": { + "connectionString": { + "type": "string", + "minLength": 1 + }, + "hubName": { + "type": "string", + "minLength": 1 + }, + "action": { + "$ref": "#/components/schemas/SignalRActionType" + }, + "methodName": { + "type": "string", + "nullable": true + }, + "target": { + "type": "string", + "nullable": true + }, + "payload": { + "type": "string", + "nullable": true + } + } + } + ] + }, + "SlackRuleActionDto": { + "allOf": [ + { + "$ref": "#/components/schemas/RuleActionDto" + }, + { + "type": "object", + "deprecated": true, + "x-deprecatedMessage": "Has been replaced by flows.", + "additionalProperties": false, + "required": [ + "webhookUrl", + "text" + ], + "properties": { + "webhookUrl": { + "type": "string", + "format": "uri", + "minLength": 1 + }, + "text": { + "type": "string", + "minLength": 1 + } + } + } + ] + }, + "TweetRuleActionDto": { + "allOf": [ + { + "$ref": "#/components/schemas/RuleActionDto" + }, + { + "type": "object", + "deprecated": true, + "x-deprecatedMessage": "Has been replaced by flows.", + "additionalProperties": false, + "required": [ + "accessToken", + "accessSecret", + "text" + ], + "properties": { + "accessToken": { + "type": "string", + "minLength": 1 + }, + "accessSecret": { + "type": "string", + "minLength": 1 + }, + "text": { + "type": "string", + "minLength": 1 + } + } + } + ] + }, + "TypesenseRuleActionDto": { + "allOf": [ + { + "$ref": "#/components/schemas/RuleActionDto" + }, + { + "type": "object", + "deprecated": true, + "x-deprecatedMessage": "Has been replaced by flows.", + "additionalProperties": false, + "required": [ + "host", + "indexName", + "apiKey" + ], + "properties": { + "host": { + "type": "string", + "format": "uri", + "minLength": 1 + }, + "indexName": { + "type": "string", + "minLength": 1 + }, + "apiKey": { + "type": "string" + }, + "document": { + "type": "string", + "nullable": true + }, + "delete": { + "type": "string", + "nullable": true + } + } + } + ] + }, + "WebhookRuleActionDto": { + "allOf": [ + { + "$ref": "#/components/schemas/RuleActionDto" + }, + { + "type": "object", + "deprecated": true, + "x-deprecatedMessage": "Has been replaced by flows.", + "additionalProperties": false, + "required": [ + "url", + "method" + ], + "properties": { + "url": { + "type": "string", + "format": "uri", + "minLength": 1 + }, + "method": { + "$ref": "#/components/schemas/WebhookMethod" + }, + "payload": { + "type": "string", + "nullable": true + }, + "payloadType": { + "type": "string", + "nullable": true + }, + "headers": { + "type": "string", + "nullable": true + }, + "sharedSecret": { + "type": "string", + "nullable": true + } + } + } + ] + }, + "CreateRuleDto": { + "type": "object", + "additionalProperties": false, + "required": [ + "trigger", + "flow" + ], + "properties": { + "name": { + "type": "string", + "description": "Optional rule name.", + "nullable": true + }, + "trigger": { + "description": "The trigger properties.", + "$ref": "#/components/schemas/RuleTriggerDto" + }, + "action": { + "description": "The action properties.", + "deprecated": true, + "x-deprecatedMessage": "Use the new 'Flow' property to define actions", + "nullable": true, + "$ref": "#/components/schemas/RuleActionDto" + }, + "flow": { + "description": "The flow to describe the sequence of actions to perform.", + "$ref": "#/components/schemas/FlowDefinitionDto" + }, + "isEnabled": { + "type": "boolean", + "description": "Enable or disable the rule.", + "nullable": true + } + } + }, + "UpdateRuleDto": { + "type": "object", + "additionalProperties": false, + "properties": { + "name": { + "type": "string", + "description": "Optional rule name.", + "nullable": true + }, + "trigger": { + "description": "The trigger properties.", + "nullable": true, + "$ref": "#/components/schemas/RuleTriggerDto" + }, + "action": { + "description": "The flow to describe the sequence of actions to perform.", + "deprecated": true, + "x-deprecatedMessage": "Use the new 'Flow' property to define actions", + "nullable": true, + "$ref": "#/components/schemas/RuleActionDto" + }, + "flow": { + "description": "The flow.", + "nullable": true, + "$ref": "#/components/schemas/FlowDefinitionDto" + }, + "isEnabled": { + "type": "boolean", + "description": "Enable or disable the rule.", + "nullable": true + } + } + }, + "TriggerRuleDto": { + "type": "object", + "additionalProperties": false, + "properties": { + "value": { + "description": "The optional value to send to the flow." + } + } + }, + "SimulatedRuleEventsDto": { + "allOf": [ + { + "$ref": "#/components/schemas/Resource" + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "total", + "items" + ], + "properties": { + "total": { + "type": "integer", + "description": "The total number of simulated rule events.", + "format": "int64" + }, + "items": { + "type": "array", + "description": "The simulated rule events.", + "items": { + "$ref": "#/components/schemas/SimulatedRuleEventDto" + } + } + } + } + ] + }, + "SimulatedRuleEventDto": { + "type": "object", + "additionalProperties": false, + "required": [ + "eventId", + "uniqueId", + "eventName", + "event", + "skipReasons" + ], + "properties": { + "eventId": { + "type": "string", + "description": "The unique event id.", + "format": "guid" + }, + "uniqueId": { + "type": "string", + "description": "The the unique id of the simulated event." + }, + "eventName": { + "type": "string", + "description": "The name of the event." + }, + "event": { + "description": "The source event." + }, + "enrichedEvent": { + "description": "The enriched event.", + "nullable": true + }, + "flowState": { + "description": "The flow state.", + "nullable": true, + "$ref": "#/components/schemas/FlowExecutionStateDto" + }, + "skipReasons": { + "type": "array", + "description": "The reason why the event has been skipped.", + "items": { + "$ref": "#/components/schemas/SkipReason" + } + } + } + }, + "FlowExecutionStateDto": { + "type": "object", + "additionalProperties": false, + "required": [ + "definition", + "context", + "description", + "steps", + "nextStepId", + "created", + "completed", + "status" + ], + "properties": { + "definition": { + "description": "The actual definition of the the steps to be executed.", + "$ref": "#/components/schemas/FlowDefinitionDto" + }, + "context": { + "description": "The context." + }, + "description": { + "type": "string", + "description": "The description of the execution state (usually the event name)." + }, + "steps": { + "type": "object", + "description": "The state of each step.", + "additionalProperties": { + "$ref": "#/components/schemas/FlowExecutionStepStateDto" + } + }, + "nextStepId": { + "type": "string", + "description": "The next step to be executed.", + "format": "guid" + }, + "nextRun": { + "type": "string", + "description": "THe time when the next step will be executed.", + "format": "date-time", + "nullable": true + }, + "created": { + "type": "string", + "description": "The creation time.", + "format": "date-time" + }, + "completed": { + "type": "string", + "description": "The completion time.", + "format": "date-time" + }, + "status": { + "description": "The overall status.", + "$ref": "#/components/schemas/FlowExecutionStatus" + } + } + }, + "FlowExecutionStepStateDto": { + "type": "object", + "additionalProperties": false, + "required": [ + "status", + "attempts" + ], + "properties": { + "status": { + "description": "The status of this step.", + "$ref": "#/components/schemas/FlowExecutionStatus" + }, + "attempts": { + "type": "array", + "description": "The different attempts.", + "items": { + "$ref": "#/components/schemas/FlowExecutionStepAttemptDto" + } + } + } + }, + "FlowExecutionStatus": { + "type": "string", + "description": "", + "x-enumNames": [ + "Pending", + "Scheduled", + "Completed", + "Failed", + "Running", + "Cancelled" + ], + "enum": [ + "Pending", + "Scheduled", + "Completed", + "Failed", + "Running", + "Cancelled" + ] + }, + "FlowExecutionStepAttemptDto": { + "type": "object", + "additionalProperties": false, + "required": [ + "log", + "started", + "completed" + ], + "properties": { + "log": { + "type": "array", + "description": "The log messages.", + "items": { + "$ref": "#/components/schemas/FlowExecutionStepLogEntryDto" + } + }, + "started": { + "type": "string", + "description": "The time when the attempt has been started.", + "format": "date-time" + }, + "completed": { + "type": "string", + "description": "The time when the attempt has been completed.", + "format": "date-time" + }, + "error": { + "type": "string", + "description": "The error, if there is any.", + "nullable": true + } + } + }, + "FlowExecutionStepLogEntryDto": { + "type": "object", + "additionalProperties": false, + "required": [ + "timestamp", + "message" + ], + "properties": { + "timestamp": { + "type": "string", + "description": "The timestamp.", + "format": "date-time" + }, + "message": { + "type": "string", + "description": "The log message." + }, + "dump": { + "type": "string", + "description": "A detailed dump.", + "nullable": true + } + } + }, + "SkipReason": { + "type": "string", + "description": "", + "x-enumFlags": true, + "x-enumNames": [ + "None", + "ConditionDoesNotMatch", + "ConditionPrecheckDoesNotMatch", + "Disabled", + "Failed", + "FromRule", + "NoTrigger", + "TooOld", + "WrongEvent", + "WrongEventForTrigger" + ], + "enum": [ + "None", + "ConditionDoesNotMatch", + "ConditionPrecheckDoesNotMatch", + "Disabled", + "Failed", + "FromRule", + "NoTrigger", + "TooOld", + "WrongEvent", + "WrongEventForTrigger" + ] + }, + "RuleEventsDto": { + "allOf": [ + { + "$ref": "#/components/schemas/Resource" + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "total", + "items" + ], + "properties": { + "total": { + "type": "integer", + "description": "The total number of rule events.", + "format": "int64" + }, + "items": { + "type": "array", + "description": "The rule events.", + "items": { + "$ref": "#/components/schemas/RuleEventDto" + } + } + } + } + ] + }, + "RuleEventDto": { + "allOf": [ + { + "$ref": "#/components/schemas/Resource" + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "id", + "flowState" + ], + "properties": { + "id": { + "type": "string", + "description": "The ID of the event.", + "format": "guid" + }, + "flowState": { + "description": "The flow state.", + "$ref": "#/components/schemas/FlowExecutionStateDto" + } + } + } + ] + }, + "PlansDto": { + "type": "object", + "additionalProperties": false, + "required": [ + "plans", + "locked" + ], + "properties": { + "plans": { + "type": "array", + "description": "The available plans.", + "items": { + "$ref": "#/components/schemas/PlanDto" + } + }, + "currentPlanId": { + "type": "string", + "description": "The current plan id.", + "nullable": true + }, + "planOwner": { + "type": "string", + "description": "The plan owner.", + "nullable": true + }, + "portalLink": { + "type": "string", + "description": "The link to the management portal.", + "format": "uri", + "nullable": true + }, + "referral": { + "description": "The referral management.", + "nullable": true, + "$ref": "#/components/schemas/ReferralInfo" + }, + "locked": { + "description": "The reason why the plan cannot be changed.", + "$ref": "#/components/schemas/PlansLockedReason" + } + } + }, + "PlanDto": { + "type": "object", + "additionalProperties": false, + "required": [ + "id", + "name", + "costs", + "maxApiBytes", + "maxApiCalls", + "maxAssetSize", + "maxContributors" + ], + "properties": { + "id": { + "type": "string", + "description": "The ID of the plan." + }, + "name": { + "type": "string", + "description": "The name of the plan." + }, + "costs": { + "type": "string", + "description": "The monthly costs of the plan." + }, + "confirmText": { + "type": "string", + "description": "An optional confirm text for the monthly subscription.", + "nullable": true + }, + "yearlyConfirmText": { + "type": "string", + "description": "An optional confirm text for the yearly subscription.", + "nullable": true + }, + "yearlyCosts": { + "type": "string", + "description": "The yearly costs of the plan.", + "nullable": true + }, + "yearlyId": { + "type": "string", + "description": "The yearly ID of the plan.", + "nullable": true + }, + "maxApiBytes": { + "type": "integer", + "description": "The maximum number of API traffic.", + "format": "int64" + }, + "maxApiCalls": { + "type": "integer", + "description": "The maximum number of API calls.", + "format": "int64" + }, + "maxAssetSize": { + "type": "integer", + "description": "The maximum allowed asset size.", + "format": "int64" + }, + "maxContributors": { + "type": "integer", + "description": "The maximum number of contributors.", + "format": "int32" + } + } + }, + "ReferralInfo": { + "type": "object", + "additionalProperties": false, + "required": [ + "code", + "earned", + "condition" + ], + "properties": { + "code": { + "type": "string" + }, + "earned": { + "type": "string" + }, + "condition": { + "type": "string" + } + } + }, + "PlansLockedReason": { + "type": "string", + "description": "", + "x-enumNames": [ + "None", + "NotOwner", + "NoPermission", + "ManagedByTeam" + ], + "enum": [ + "None", + "NotOwner", + "NoPermission", + "ManagedByTeam" + ] + }, + "PlanChangedDto": { + "type": "object", + "additionalProperties": false, + "properties": { + "redirectUri": { + "type": "string", + "description": "Optional redirect uri.", + "nullable": true + } + } + }, + "ChangePlanDto": { + "type": "object", + "additionalProperties": false, + "required": [ + "planId" + ], + "properties": { + "planId": { + "type": "string", + "description": "The new plan id.", + "minLength": 1 + } + } + }, + "ExposedValues": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "FeaturesDto": { + "type": "object", + "additionalProperties": false, + "required": [ + "features", + "version" + ], + "properties": { + "features": { + "type": "array", + "description": "The latest features.", + "items": { + "$ref": "#/components/schemas/FeatureDto" + } + }, + "version": { + "type": "integer", + "description": "The recent version.", + "format": "int32" + } + } + }, + "FeatureDto": { + "type": "object", + "additionalProperties": false, + "required": [ + "name", + "text" + ], + "properties": { + "name": { + "type": "string", + "description": "The name of the feature." + }, + "text": { + "type": "string", + "description": "The description text." + } + } + }, + "LanguageDto": { + "type": "object", + "additionalProperties": false, + "required": [ + "iso2Code", + "englishName", + "nativeName" + ], + "properties": { + "iso2Code": { + "type": "string", + "description": "The iso code of the language." + }, + "englishName": { + "type": "string", + "description": "The english name of the language." + }, + "nativeName": { + "type": "string", + "description": "The native name of the language." + } + } + }, + "JobsDto": { + "allOf": [ + { + "$ref": "#/components/schemas/Resource" + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "items" + ], + "properties": { + "items": { + "type": "array", + "description": "The jobs.", + "items": { + "$ref": "#/components/schemas/JobDto" + } + } + } + } + ] + }, + "JobDto": { + "allOf": [ + { + "$ref": "#/components/schemas/Resource" + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "id", + "started", + "status", + "taskName", + "description", + "taskArguments", + "log", + "canDownload" + ], + "properties": { + "id": { + "type": "string", + "description": "The ID of the job." + }, + "started": { + "type": "string", + "description": "The time when the job has been started.", + "format": "date-time" + }, + "stopped": { + "type": "string", + "description": "The time when the job has been stopped.", + "format": "date-time", + "nullable": true + }, + "status": { + "description": "The status of the operation.", + "$ref": "#/components/schemas/JobStatus" + }, + "taskName": { + "type": "string", + "description": "The name of the task." + }, + "description": { + "type": "string", + "description": "The description of the job." + }, + "taskArguments": { + "type": "object", + "description": "The arguments for the job.", + "additionalProperties": { + "type": "string" + } + }, + "log": { + "type": "array", + "description": "The list of log items.", + "items": { + "$ref": "#/components/schemas/JobLogMessageDto" + } + }, + "canDownload": { + "type": "boolean", + "description": "Indicates whether the job can be downloaded." + } + } + } + ] + }, + "JobStatus": { + "type": "string", + "description": "", + "x-enumNames": [ + "Created", + "Started", + "Completed", + "Cancelled", + "Failed" + ], + "enum": [ + "Created", + "Started", + "Completed", + "Cancelled", + "Failed" + ] + }, + "JobLogMessageDto": { + "type": "object", + "additionalProperties": false, + "required": [ + "timestamp", + "message" + ], + "properties": { + "timestamp": { + "type": "string", + "description": "The timestamp.", + "format": "date-time" + }, + "message": { + "type": "string", + "description": "The log message." + } + } + }, + "HistoryEventDto": { + "type": "object", + "additionalProperties": false, + "required": [ + "message", + "eventType", + "actor", + "eventId", + "created", + "version" + ], + "properties": { + "message": { + "type": "string", + "description": "The message for the event." + }, + "eventType": { + "type": "string", + "description": "The type of the original event." + }, + "actor": { + "type": "string", + "description": "The user who called the action." + }, + "eventId": { + "type": "string", + "description": "Gets a unique id for the event." + }, + "created": { + "type": "string", + "description": "The time when the event happened.", + "format": "date-time" + }, + "version": { + "type": "integer", + "description": "The version identifier.", + "format": "int64" + } + } + }, + "EventConsumersDto": { + "allOf": [ + { + "$ref": "#/components/schemas/Resource" + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "items" + ], + "properties": { + "items": { + "type": "array", + "description": "The event consumers.", + "items": { + "$ref": "#/components/schemas/EventConsumerDto" + } + } + } + } + ] + }, + "EventConsumerDto": { + "allOf": [ + { + "$ref": "#/components/schemas/Resource" + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "name", + "isStopped", + "isResetting", + "count" + ], + "properties": { + "isStopped": { + "type": "boolean", + "description": "Indicates if the event consumer has been started." + }, + "isResetting": { + "type": "boolean", + "description": "Indicates if the event consumer is resetting at the moment." + }, + "count": { + "type": "integer", + "description": "The number of handled events.", + "format": "int32" + }, + "name": { + "type": "string", + "description": "The name of the event consumer.", + "minLength": 1 + }, + "error": { + "type": "string", + "description": "The error details if the event consumer has been stopped after a failure.", + "nullable": true + }, + "position": { + "type": "string", + "description": "The position within the vent stream.", + "nullable": true + } + } + } + ] + }, + "ContentsDto": { + "allOf": [ + { + "$ref": "#/components/schemas/Resource" + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "total", + "items", + "statuses" + ], + "properties": { + "total": { + "type": "integer", + "description": "The total number of content items.", + "format": "int64" + }, + "items": { + "type": "array", + "description": "The content items.", + "items": { + "$ref": "#/components/schemas/ContentDto" + } + }, + "statuses": { + "type": "array", + "description": "The possible statuses.", + "items": { + "$ref": "#/components/schemas/StatusInfoDto" + } + } + } + } + ] + }, + "ContentDto": { + "allOf": [ + { + "$ref": "#/components/schemas/Resource" + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "id", + "createdBy", + "lastModifiedBy", + "data", + "created", + "lastModified", + "status", + "statusColor", + "schemaId", + "isDeleted", + "version" + ], + "properties": { + "id": { + "type": "string", + "description": "The if of the content item." + }, + "createdBy": { + "type": "string", + "description": "The user that has created the content item." + }, + "lastModifiedBy": { + "type": "string", + "description": "The user that has updated the content item." + }, + "data": { + "description": "The data of the content item." + }, + "referenceData": { + "description": "The reference data for the frontend UI.", + "nullable": true, + "$ref": "#/components/schemas/ContentData" + }, + "created": { + "type": "string", + "description": "The date and time when the content item has been created.", + "format": "date-time" + }, + "lastModified": { + "type": "string", + "description": "The date and time when the content item has been modified last.", + "format": "date-time" + }, + "status": { + "type": "string", + "description": "The status of the content." + }, + "newStatus": { + "type": "string", + "description": "The new status of the content.", + "nullable": true + }, + "statusColor": { + "type": "string", + "description": "The color of the status." + }, + "newStatusColor": { + "type": "string", + "description": "The color of the new status.", + "nullable": true + }, + "editToken": { + "type": "string", + "description": "The UI token.", + "nullable": true + }, + "scheduleJob": { + "description": "The scheduled status.", + "nullable": true, + "$ref": "#/components/schemas/ScheduleJobDto" + }, + "schemaId": { + "type": "string", + "description": "The ID of the schema." + }, + "schemaName": { + "type": "string", + "description": "The name of the schema.", + "nullable": true + }, + "schemaDisplayName": { + "type": "string", + "description": "The display name of the schema.", + "nullable": true + }, + "referenceFields": { + "type": "array", + "description": "The reference fields.", + "nullable": true, + "items": { + "$ref": "#/components/schemas/FieldDto" + } + }, + "isDeleted": { + "type": "boolean", + "description": "Indicates whether the content is deleted." + }, + "version": { + "type": "integer", + "description": "The version of the content.", + "format": "int64" + } + } + } + ] + }, + "ContentData": { + "type": "object", + "additionalProperties": { + "nullable": true, + "$ref": "#/components/schemas/ContentFieldData" + } + }, + "ContentFieldData": { + "type": "object", + "additionalProperties": {} + }, + "ScheduleJobDto": { + "type": "object", + "additionalProperties": false, + "required": [ + "id", + "status", + "dueTime", + "color", + "scheduledBy" + ], + "properties": { + "id": { + "type": "string", + "description": "The ID of the schedule job." + }, + "status": { + "type": "string", + "description": "The new status." + }, + "dueTime": { + "type": "string", + "description": "The target date and time when the content should be scheduled.", + "format": "date-time" + }, + "color": { + "type": "string", + "description": "The color of the scheduled status." + }, + "scheduledBy": { + "type": "string", + "description": "The user who schedule the content." + } + } + }, + "StatusInfoDto": { + "type": "object", + "additionalProperties": false, + "required": [ + "status", + "color" + ], + "properties": { + "status": { + "type": "string", + "description": "The name of the status." + }, + "color": { + "type": "string", + "description": "The color of the status." + } + } + }, + "QueryDto": { + "type": "object", + "additionalProperties": false, + "properties": { + "ids": { + "type": "array", + "description": "The optional list of ids to query.", + "nullable": true, + "items": { + "type": "string" + } + }, + "oData": { + "type": "string", + "description": "The optional odata query.", + "nullable": true + }, + "q": { + "description": "The optional json query.", + "nullable": true + }, + "parentId": { + "type": "string", + "description": "The parent id (for assets).", + "nullable": true + } + } + }, + "BulkResultDto": { + "type": "object", + "additionalProperties": false, + "required": [ + "jobIndex" + ], + "properties": { + "error": { + "description": "The error when the bulk job failed.", + "nullable": true, + "$ref": "#/components/schemas/ErrorDto" + }, + "jobIndex": { + "type": "integer", + "description": "The index of the bulk job where the result belongs to. The order can change.", + "format": "int32" + }, + "id": { + "type": "string", + "description": "The ID of the entity that has been handled successfully or not.", + "nullable": true + }, + "contentId": { + "type": "string", + "description": "The ID of the entity that has been handled successfully or not.", + "deprecated": true, + "x-deprecatedMessage": "Use 'id' field now.", + "nullable": true + } + } + }, + "ImportContentsDto": { + "type": "object", + "additionalProperties": false, + "required": [ + "datas" + ], + "properties": { + "datas": { + "type": "array", + "description": "The data to import.", + "items": { + "$ref": "#/components/schemas/ContentData" + } + }, + "publish": { + "type": "boolean", + "description": "True to automatically publish the content.", + "deprecated": true, + "x-deprecatedMessage": "Use bulk endpoint now." + }, + "doNotScript": { + "type": "boolean", + "description": "True to turn off scripting for faster inserts. Default: true." + }, + "optimizeValidation": { + "type": "boolean", + "description": "True to turn off costly validation: Unique checks, asset checks and reference checks. Default: true." + } + } + }, + "BulkUpdateContentsDto": { + "type": "object", + "additionalProperties": false, + "required": [ + "jobs" + ], + "properties": { + "jobs": { + "type": "array", + "description": "The contents to update or insert.", + "items": { + "$ref": "#/components/schemas/BulkUpdateContentsJobDto" + } + }, + "publish": { + "type": "boolean", + "description": "True to automatically publish the content.", + "deprecated": true, + "x-deprecatedMessage": "Use 'jobs.status' fields now." + }, + "doNotScript": { + "type": "boolean", + "description": "True to turn off scripting for faster inserts. Default: true." + }, + "enrichRequiredFields": { + "type": "boolean", + "description": "True, to also enrich required fields. Default: false." + }, + "doNotValidate": { + "type": "boolean", + "description": "True to turn off validation for faster inserts. Default: false." + }, + "doNotValidateWorkflow": { + "type": "boolean", + "description": "True to turn off validation of workflow rules. Default: false." + }, + "checkReferrers": { + "type": "boolean", + "description": "True to check referrers of deleted contents." + }, + "optimizeValidation": { + "type": "boolean", + "description": "True to turn off costly validation: Unique checks, asset checks and reference checks. Default: true." + } + } + }, + "BulkUpdateContentsJobDto": { + "type": "object", + "additionalProperties": false, + "properties": { + "query": { + "description": "An optional query to identify the content to update.", + "nullable": true, + "$ref": "#/components/schemas/QueryJsonDto" + }, + "id": { + "type": "string", + "description": "An optional ID of the content to update.", + "nullable": true + }, + "data": { + "description": "The data of the content when type is set to 'Upsert', 'Create', 'Update' or 'Patch.", + "nullable": true, + "$ref": "#/components/schemas/ContentData" + }, + "status": { + "type": "string", + "description": "The new status when the type is set to 'ChangeStatus' or 'Upsert'.", + "nullable": true + }, + "dueTime": { + "type": "string", + "description": "The due time.", + "format": "date-time", + "nullable": true + }, + "type": { + "description": "The update type.", + "$ref": "#/components/schemas/BulkUpdateContentType" + }, + "schema": { + "type": "string", + "description": "The optional schema id or name.", + "nullable": true + }, + "patch": { + "type": "boolean", + "description": "Makes the update as patch." + }, + "permanent": { + "type": "boolean", + "description": "True to delete the content permanently." + }, + "enrichDefaults": { + "type": "boolean", + "description": "Enrich the data with the default values when updating a content item." + }, + "expectedCount": { + "type": "integer", + "description": "The number of expected items. Set it to a higher number to update multiple items when a query is defined.", + "format": "int64" + }, + "expectedVersion": { + "type": "integer", + "description": "The expected version.", + "format": "int64" + } + } + }, + "QueryJsonDto": { + "type": "object", + "additionalProperties": false, + "required": [ + "skip", + "take", + "random", + "top" + ], + "properties": { + "filter": { + "nullable": true + }, + "fullText": { + "type": "string", + "nullable": true + }, + "collation": { + "type": "string", + "nullable": true + }, + "skip": { + "type": "integer", + "format": "int64" + }, + "take": { + "type": "integer", + "format": "int64" + }, + "random": { + "type": "integer", + "format": "int64" + }, + "top": { + "type": "integer", + "format": "int64" + }, + "sort": { + "type": "array", + "nullable": true, + "items": { + "$ref": "#/components/schemas/SortNode" + } + } + } + }, + "SortNode": { + "type": "object", + "additionalProperties": false, + "required": [ + "path", + "order" + ], + "properties": { + "path": { + "type": "string" + }, + "order": { + "$ref": "#/components/schemas/SortOrder" + } + } + }, + "BulkUpdateContentType": { + "type": "string", + "description": "", + "x-enumNames": [ + "Upsert", + "ChangeStatus", + "Create", + "Delete", + "Patch", + "Update", + "Validate", + "EnrichDefaults" + ], + "enum": [ + "Upsert", + "ChangeStatus", + "Create", + "Delete", + "Patch", + "Update", + "Validate", + "EnrichDefaults" + ] + }, + "ChangeStatusDto": { + "type": "object", + "additionalProperties": false, + "required": [ + "status" + ], + "properties": { + "status": { + "type": "string", + "description": "The new status." + }, + "dueTime": { + "type": "string", + "description": "The due time.", + "format": "date-time", + "nullable": true + }, + "checkReferrers": { + "type": "boolean", + "description": "True to check referrers of this content." + } + } + }, + "AllContentsByPostDto": { + "type": "object", + "additionalProperties": false, + "properties": { + "ids": { + "type": "array", + "description": "The list of ids to query.", + "nullable": true, + "items": { + "type": "string" + } + }, + "scheduledFrom": { + "type": "string", + "description": "The start time of the scheduled content period (see scheduledTo).", + "format": "date-time", + "nullable": true + }, + "scheduledTo": { + "type": "string", + "description": "The end time of the scheduled content period (see scheduledFrom).", + "format": "date-time", + "nullable": true + }, + "referencing": { + "type": "string", + "description": "The ID of the referencing content item.", + "nullable": true + }, + "references": { + "type": "string", + "description": "The ID of the reference content item.", + "nullable": true + }, + "oData": { + "type": "string", + "description": "The optional odata query.", + "nullable": true + }, + "q": { + "description": "The optional json query.", + "nullable": true + } + } + }, + "BackupJobsDto": { + "allOf": [ + { + "$ref": "#/components/schemas/Resource" + }, + { + "type": "object", + "deprecated": true, + "x-deprecatedMessage": "Use Jobs endpoint.", + "additionalProperties": false, + "required": [ + "items" + ], + "properties": { + "items": { + "type": "array", + "description": "The backups.", + "items": { + "$ref": "#/components/schemas/BackupJobDto" + } + } + } + } + ] + }, + "BackupJobDto": { + "allOf": [ + { + "$ref": "#/components/schemas/Resource" + }, + { + "type": "object", + "deprecated": true, + "x-deprecatedMessage": "Use Jobs endpoint.", + "additionalProperties": false, + "required": [ + "id", + "started", + "handledEvents", + "handledAssets", + "status" + ], + "properties": { + "id": { + "type": "string", + "description": "The ID of the backup job." + }, + "started": { + "type": "string", + "description": "The time when the job has been started.", + "format": "date-time" + }, + "stopped": { + "type": "string", + "description": "The time when the job has been stopped.", + "format": "date-time", + "nullable": true + }, + "handledEvents": { + "type": "integer", + "description": "The number of handled events.", + "format": "int32" + }, + "handledAssets": { + "type": "integer", + "description": "The number of handled assets.", + "format": "int32" + }, + "status": { + "description": "The status of the operation.", + "$ref": "#/components/schemas/JobStatus" + } + } + } + ] + }, + "RestoreJobDto": { + "type": "object", + "additionalProperties": false, + "required": [ + "url", + "log", + "started", + "status" + ], + "properties": { + "url": { + "type": "string", + "description": "The uri to load from.", + "format": "uri" + }, + "log": { + "type": "array", + "description": "The status log.", + "items": { + "type": "string" + } + }, + "started": { + "type": "string", + "description": "The time when the job has been started.", + "format": "date-time" + }, + "stopped": { + "type": "string", + "description": "The time when the job has been stopped.", + "format": "date-time", + "nullable": true + }, + "status": { + "description": "The status of the operation.", + "$ref": "#/components/schemas/JobStatus" + } + } + }, + "RestoreRequestDto": { + "type": "object", + "additionalProperties": false, + "required": [ + "url" + ], + "properties": { + "name": { + "type": "string", + "description": "The name of the app.", + "pattern": "^[a-z0-9]+(\\-[a-z0-9]+)*$", + "nullable": true + }, + "url": { + "type": "string", + "description": "The url to the restore file.", + "format": "uri", + "minLength": 1 + } + } + }, + "ResizeMode": { + "type": "string", + "description": "", + "x-enumNames": [ + "Crop", + "CropUpsize", + "Pad", + "BoxPad", + "Max", + "Min", + "Stretch" + ], + "enum": [ + "Crop", + "CropUpsize", + "Pad", + "BoxPad", + "Max", + "Min", + "Stretch" + ] + }, + "ImageFormat": { + "type": "string", + "description": "", + "x-enumNames": [ + "AVIF", + "BMP", + "GIF", + "JPEG", + "PNG", + "TGA", + "TIFF", + "WEBP" + ], + "enum": [ + "AVIF", + "BMP", + "GIF", + "JPEG", + "PNG", + "TGA", + "TIFF", + "WEBP" + ] + }, + "WatermarkAnchor": { + "type": "string", + "description": "", + "x-enumNames": [ + "TopLeft", + "TopRight", + "BottomLeft", + "BottomRight", + "Center" + ], + "enum": [ + "TopLeft", + "TopRight", + "BottomLeft", + "BottomRight", + "Center" + ] + }, + "AssetFoldersDto": { + "allOf": [ + { + "$ref": "#/components/schemas/Resource" + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "total", + "items", + "path" + ], + "properties": { + "total": { + "type": "integer", + "description": "The total number of assets.", + "format": "int64" + }, + "items": { + "type": "array", + "description": "The assets folders.", + "items": { + "$ref": "#/components/schemas/AssetFolderDto" + } + }, + "path": { + "type": "array", + "description": "The path to the current folder.", + "items": { + "$ref": "#/components/schemas/AssetFolderDto" + } + } + } + } + ] + }, + "AssetFolderDto": { + "allOf": [ + { + "$ref": "#/components/schemas/Resource" + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "id", + "parentId", + "folderName", + "version" + ], + "properties": { + "id": { + "type": "string", + "description": "The ID of the asset." + }, + "parentId": { + "type": "string", + "description": "The ID of the parent folder. Empty for files without parent." + }, + "folderName": { + "type": "string", + "description": "The folder name." + }, + "version": { + "type": "integer", + "description": "The version of the asset folder.", + "format": "int64" + } + } + } + ] + }, + "AssetFolderScope": { + "type": "string", + "description": "", + "x-enumNames": [ + "PathAndItems", + "Path", + "Items" + ], + "enum": [ + "PathAndItems", + "Path", + "Items" + ] + }, + "CreateAssetFolderDto": { + "type": "object", + "additionalProperties": false, + "required": [ + "folderName" + ], + "properties": { + "folderName": { + "type": "string", + "description": "The name of the folder.", + "minLength": 1 + }, + "parentId": { + "type": "string", + "description": "The ID of the parent folder." + } + } + }, + "RenameAssetFolderDto": { + "type": "object", + "additionalProperties": false, + "required": [ + "folderName" + ], + "properties": { + "folderName": { + "type": "string", + "description": "The name of the folder.", + "minLength": 1 + } + } + }, + "MoveAssetFolderDto": { + "type": "object", + "additionalProperties": false, + "properties": { + "parentId": { + "type": "string", + "description": "The parent folder id." + } + } + }, + "RenameTagDto": { + "type": "object", + "additionalProperties": false, + "required": [ + "tagName" + ], + "properties": { + "tagName": { + "type": "string", + "description": "The new name for the tag.", + "minLength": 1 + } + } + }, + "AssetsDto": { + "allOf": [ + { + "$ref": "#/components/schemas/Resource" + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "total", + "items" + ], + "properties": { + "total": { + "type": "integer", + "description": "The total number of assets.", + "format": "int64" + }, + "items": { + "type": "array", + "description": "The assets.", + "items": { + "$ref": "#/components/schemas/AssetDto" + } + } + } + } + ] + }, + "AssetDto": { + "allOf": [ + { + "$ref": "#/components/schemas/Resource" + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "id", + "parentId", + "fileName", + "isProtected", + "slug", + "mimeType", + "fileType", + "metadataText", + "metadata", + "fileSize", + "fileVersion", + "type", + "createdBy", + "lastModifiedBy", + "created", + "lastModified", + "version", + "isImage" + ], + "properties": { + "id": { + "type": "string", + "description": "The ID of the asset." + }, + "parentId": { + "type": "string", + "description": "The ID of the parent folder. Empty for files without parent." + }, + "fileName": { + "type": "string", + "description": "The file name." + }, + "fileHash": { + "type": "string", + "description": "The file hash.", + "nullable": true + }, + "isProtected": { + "type": "boolean", + "description": "True, when the asset is not public." + }, + "slug": { + "type": "string", + "description": "The slug." + }, + "mimeType": { + "type": "string", + "description": "The mime type." + }, + "fileType": { + "type": "string", + "description": "The file type." + }, + "metadataText": { + "type": "string", + "description": "The formatted text representation of the metadata." + }, + "editToken": { + "type": "string", + "description": "The UI token.", + "nullable": true + }, + "metadata": { + "type": "object", + "description": "The asset metadata.", + "additionalProperties": { + "description": "Any" + } + }, + "tags": { + "type": "array", + "description": "The asset tags.", + "nullable": true, + "items": { + "type": "string" + } + }, + "fileSize": { + "type": "integer", + "description": "The size of the file in bytes.", + "format": "int64" + }, + "fileVersion": { + "type": "integer", + "description": "The version of the file.", + "format": "int64" + }, + "type": { + "description": "The type of the asset.", + "$ref": "#/components/schemas/AssetType" + }, + "createdBy": { + "type": "string", + "description": "The user that has created the schema." + }, + "lastModifiedBy": { + "type": "string", + "description": "The user that has updated the asset." + }, + "created": { + "type": "string", + "description": "The date and time when the asset has been created.", + "format": "date-time" + }, + "lastModified": { + "type": "string", + "description": "The date and time when the asset has been modified last.", + "format": "date-time" + }, + "version": { + "type": "integer", + "description": "The version of the asset.", + "format": "int64" + }, + "_meta": { + "description": "The metadata.", + "nullable": true, + "$ref": "#/components/schemas/AssetMeta" + }, + "isImage": { + "type": "boolean", + "description": "Determines of the created file is an image.", + "deprecated": true, + "x-deprecatedMessage": "Use 'type' field now." + }, + "pixelWidth": { + "type": "integer", + "description": "The width of the image in pixels if the asset is an image.", + "format": "int32", + "deprecated": true, + "x-deprecatedMessage": "Use 'metadata' field now.", + "nullable": true + }, + "pixelHeight": { + "type": "integer", + "description": "The height of the image in pixels if the asset is an image.", + "format": "int32", + "deprecated": true, + "x-deprecatedMessage": "Use 'metadata' field now.", + "nullable": true + } + } + } + ] + }, + "AssetMeta": { + "type": "object", + "additionalProperties": false, + "required": [ + "isDuplicate" + ], + "properties": { + "isDuplicate": { + "type": "string", + "description": "Indicates whether the asset is a duplicate." + } + } + }, + "BulkUpdateAssetsDto": { + "type": "object", + "additionalProperties": false, + "properties": { + "jobs": { + "type": "array", + "description": "The contents to update or insert.", + "nullable": true, + "items": { + "$ref": "#/components/schemas/BulkUpdateAssetsJobDto" + } + }, + "checkReferrers": { + "type": "boolean", + "description": "True to check referrers of deleted assets." + }, + "optimizeValidation": { + "type": "boolean", + "description": "True to turn off costly validation: Folder checks. Default: true." + }, + "doNotScript": { + "type": "boolean", + "description": "True to turn off scripting for faster inserts. Default: true." + } + } + }, + "BulkUpdateAssetsJobDto": { + "type": "object", + "additionalProperties": false, + "properties": { + "id": { + "type": "string", + "description": "An optional ID of the asset to update." + }, + "type": { + "description": "The update type.", + "$ref": "#/components/schemas/BulkUpdateAssetType" + }, + "parentId": { + "type": "string", + "description": "The parent folder id." + }, + "fileName": { + "type": "string", + "description": "The new name of the asset.", + "nullable": true + }, + "slug": { + "type": "string", + "description": "The new slug of the asset.", + "nullable": true + }, + "isProtected": { + "type": "boolean", + "description": "True, when the asset is not public.", + "nullable": true + }, + "tags": { + "type": "array", + "description": "The new asset tags.", + "nullable": true, + "items": { + "type": "string" + } + }, + "metadata": { + "type": "object", + "description": "The asset metadata.", + "nullable": true, + "additionalProperties": { + "description": "Any" + } + }, + "permanent": { + "type": "boolean", + "description": "True to delete the asset permanently." + }, + "expectedVersion": { + "type": "integer", + "description": "The expected version.", + "format": "int64" + } + } + }, + "BulkUpdateAssetType": { + "type": "string", + "description": "", + "x-enumNames": [ + "Annotate", + "Move", + "Delete" + ], + "enum": [ + "Annotate", + "Move", + "Delete" + ] + }, + "AnnotateAssetDto": { + "type": "object", + "additionalProperties": false, + "properties": { + "fileName": { + "type": "string", + "description": "The new name of the asset.", + "nullable": true + }, + "slug": { + "type": "string", + "description": "The new slug of the asset.", + "nullable": true + }, + "isProtected": { + "type": "boolean", + "description": "True, when the asset is not public.", + "nullable": true + }, + "tags": { + "type": "array", + "description": "The new asset tags.", + "nullable": true, + "items": { + "type": "string" + } + }, + "metadata": { + "type": "object", + "description": "The asset metadata.", + "nullable": true, + "additionalProperties": { + "description": "Any" + } + } + } + }, + "MoveAssetDto": { + "type": "object", + "additionalProperties": false, + "properties": { + "parentId": { + "type": "string", + "description": "The parent folder id." + } + } + }, + "AssetScriptsDto": { + "allOf": [ + { + "$ref": "#/components/schemas/Resource" + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "version" + ], + "properties": { + "query": { + "type": "string", + "description": "The script that is executed for each asset when querying assets.", + "nullable": true + }, + "queryPre": { + "type": "string", + "description": "The script that is executed for all assets when querying assets.", + "nullable": true + }, + "create": { + "type": "string", + "description": "The script that is executed when creating an asset.", + "nullable": true + }, + "update": { + "type": "string", + "description": "The script that is executed when updating a content.", + "nullable": true + }, + "annotate": { + "type": "string", + "description": "The script that is executed when annotating a content.", + "nullable": true + }, + "move": { + "type": "string", + "description": "The script that is executed when moving a content.", + "nullable": true + }, + "delete": { + "type": "string", + "description": "The script that is executed when deleting a content.", + "nullable": true + }, + "version": { + "type": "integer", + "description": "The version of the app.", + "format": "int64" + } + } + } + ] + }, + "UpdateAssetScriptsDto": { + "type": "object", + "additionalProperties": false, + "properties": { + "query": { + "type": "string", + "description": "The script that is executed for each asset when querying assets.", + "nullable": true + }, + "queryPre": { + "type": "string", + "description": "The script that is executed for all assets when querying assets.", + "nullable": true + }, + "create": { + "type": "string", + "description": "The script that is executed when creating an asset.", + "nullable": true + }, + "update": { + "type": "string", + "description": "The script that is executed when updating a content.", + "nullable": true + }, + "annotate": { + "type": "string", + "description": "The script that is executed when annotating a content.", + "nullable": true + }, + "move": { + "type": "string", + "description": "The script that is executed when moving a content.", + "nullable": true + }, + "delete": { + "type": "string", + "description": "The script that is executed when deleting a content.", + "nullable": true + } + } + }, + "ClientsDto": { + "allOf": [ + { + "$ref": "#/components/schemas/Resource" + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "items" + ], + "properties": { + "items": { + "type": "array", + "description": "The clients.", + "items": { + "$ref": "#/components/schemas/ClientDto" + } + } + } + } + ] + }, + "ClientDto": { + "allOf": [ + { + "$ref": "#/components/schemas/Resource" + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "id", + "secret", + "name", + "apiCallsLimit", + "apiTrafficLimit", + "allowAnonymous" + ], + "properties": { + "id": { + "type": "string", + "description": "The client id." + }, + "secret": { + "type": "string", + "description": "The client secret." + }, + "name": { + "type": "string", + "description": "The client name." + }, + "role": { + "type": "string", + "description": "The role of the client.", + "nullable": true + }, + "apiCallsLimit": { + "type": "integer", + "description": "The number of allowed api calls per month for this client.", + "format": "int64" + }, + "apiTrafficLimit": { + "type": "integer", + "description": "The number of allowed api traffic bytes per month for this client.", + "format": "int64" + }, + "allowAnonymous": { + "type": "boolean", + "description": "True to allow anonymous access without an access token for this client." + } + } + } + ] + }, + "CreateClientDto": { + "type": "object", + "additionalProperties": false, + "required": [ + "id" + ], + "properties": { + "id": { + "type": "string", + "description": "The ID of the client.", + "minLength": 1, + "pattern": "^[a-z0-9]+(\\-[a-z0-9]+)*$" + } + } + }, + "UpdateClientDto": { + "type": "object", + "additionalProperties": false, + "properties": { + "name": { + "type": "string", + "description": "The new display name of the client.", + "maxLength": 20, + "minLength": 0, + "nullable": true + }, + "role": { + "type": "string", + "description": "The role of the client.", + "nullable": true + }, + "allowAnonymous": { + "type": "boolean", + "description": "True to allow anonymous access without an access token for this client.", + "nullable": true + }, + "apiCallsLimit": { + "type": "integer", + "description": "The number of allowed api calls per month for this client.", + "format": "int64", + "nullable": true + }, + "apiTrafficLimit": { + "type": "integer", + "description": "The number of allowed api traffic bytes per month for this client.", + "format": "int64", + "nullable": true + } + } + }, + "AppLanguagesDto": { + "allOf": [ + { + "$ref": "#/components/schemas/Resource" + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "items" + ], + "properties": { + "items": { + "type": "array", + "description": "The languages.", + "items": { + "$ref": "#/components/schemas/AppLanguageDto" + } + } + } + } + ] + }, + "AppLanguageDto": { + "allOf": [ + { + "$ref": "#/components/schemas/Resource" + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "iso2Code", + "englishName", + "fallback", + "isMaster", + "isOptional" + ], + "properties": { + "iso2Code": { + "type": "string", + "description": "The iso code of the language." + }, + "englishName": { + "type": "string", + "description": "The english name of the language." + }, + "fallback": { + "type": "array", + "description": "The fallback languages.", + "items": { + "type": "string" + } + }, + "isMaster": { + "type": "boolean", + "description": "Indicates if the language is the master language." + }, + "isOptional": { + "type": "boolean", + "description": "Indicates if the language is optional." + } + } + } + ] + }, + "AddLanguageDto": { + "type": "object", + "additionalProperties": false, + "required": [ + "language" + ], + "properties": { + "language": { + "type": "string", + "description": "The language to add." + } + } + }, + "UpdateLanguageDto": { + "type": "object", + "additionalProperties": false, + "properties": { + "isMaster": { + "type": "boolean", + "description": "Set the value to true to make the language the master.", + "nullable": true + }, + "isOptional": { + "type": "boolean", + "description": "Set the value to true to make the language optional." + }, + "fallback": { + "type": "array", + "description": "Optional fallback languages.", + "nullable": true, + "items": { + "type": "string" + } + } + } + }, + "RolesDto": { + "allOf": [ + { + "$ref": "#/components/schemas/Resource" + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "items" + ], + "properties": { + "items": { + "type": "array", + "description": "The roles.", + "items": { + "$ref": "#/components/schemas/RoleDto" + } + } + } + } + ] + }, + "RoleDto": { + "allOf": [ + { + "$ref": "#/components/schemas/Resource" + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "name", + "numClients", + "numContributors", + "isDefaultRole", + "permissions", + "properties" + ], + "properties": { + "name": { + "type": "string", + "description": "The role name." + }, + "numClients": { + "type": "integer", + "description": "The number of clients with this role.", + "format": "int32" + }, + "numContributors": { + "type": "integer", + "description": "The number of contributors with this role.", + "format": "int32" + }, + "isDefaultRole": { + "type": "boolean", + "description": "Indicates if the role is an builtin default role." + }, + "permissions": { + "type": "array", + "description": "Associated list of permissions.", + "items": { + "type": "string" + } + }, + "properties": { + "type": "object", + "description": "Associated list of UI properties.", + "additionalProperties": { + "description": "Any" + } + } + } + } + ] + }, + "AddRoleDto": { + "type": "object", + "additionalProperties": false, + "required": [ + "name" + ], + "properties": { + "name": { + "type": "string", + "description": "The role name.", + "minLength": 1 + } + } + }, + "UpdateRoleDto": { + "type": "object", + "additionalProperties": false, + "required": [ + "permissions" + ], + "properties": { + "permissions": { + "type": "array", + "description": "Associated list of permissions.", + "items": { + "type": "string" + } + }, + "properties": { + "type": "object", + "description": "Associated list of UI properties.", + "additionalProperties": { + "description": "Any" + } + } + } + }, + "AppDto": { + "allOf": [ + { + "$ref": "#/components/schemas/Resource" + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "id", + "name", + "version", + "created", + "lastModified", + "permissions", + "canAccessApi", + "canAccessContent", + "roleProperties" + ], + "properties": { + "id": { + "type": "string", + "description": "The ID of the app." + }, + "name": { + "type": "string", + "description": "The name of the app.", + "pattern": "^[a-z0-9]+(\\-[a-z0-9]+)*$" + }, + "label": { + "type": "string", + "description": "The optional label of the app.", + "nullable": true + }, + "description": { + "type": "string", + "description": "The optional description of the app.", + "nullable": true + }, + "version": { + "type": "integer", + "description": "The version of the app.", + "format": "int64" + }, + "created": { + "type": "string", + "description": "The timestamp when the app has been created.", + "format": "date-time" + }, + "lastModified": { + "type": "string", + "description": "The timestamp when the app has been modified last.", + "format": "date-time" + }, + "teamId": { + "type": "string", + "description": "The ID of the team.", + "nullable": true + }, + "permissions": { + "type": "array", + "description": "The permission level of the user.", + "items": { + "type": "string" + } + }, + "canAccessApi": { + "type": "boolean", + "description": "Indicates if the user can access the api.", + "deprecated": true, + "x-deprecatedMessage": "Use 'roleProperties' field now." + }, + "canAccessContent": { + "type": "boolean", + "description": "Indicates if the user can access at least one content." + }, + "roleName": { + "type": "string", + "description": "The role name of the user.", + "nullable": true + }, + "roleProperties": { + "type": "object", + "description": "The properties from the role.", + "additionalProperties": { + "description": "Any" + } + } + } + } + ] + }, + "CreateAppDto": { + "type": "object", + "additionalProperties": false, + "required": [ + "name" + ], + "properties": { + "name": { + "type": "string", + "description": "The name of the app.", + "minLength": 1, + "pattern": "^[a-z0-9]+(\\-[a-z0-9]+)*$" + }, + "template": { + "type": "string", + "description": "Initialize the app with the inbuilt template.", + "nullable": true + } + } + }, + "UpdateAppDto": { + "type": "object", + "additionalProperties": false, + "properties": { + "label": { + "type": "string", + "description": "The optional label of your app.", + "nullable": true + }, + "description": { + "type": "string", + "description": "The optional description of your app.", + "nullable": true + } + } + }, + "TransferToTeamDto": { + "type": "object", + "additionalProperties": false, + "properties": { + "teamId": { + "type": "string", + "description": "The ID of the team.", + "nullable": true + } + } + }, + "AppSettingsDto": { + "allOf": [ + { + "$ref": "#/components/schemas/Resource" + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "patterns", + "editors", + "hideScheduler", + "hideDateTimeModeButton", + "version" + ], + "properties": { + "patterns": { + "type": "array", + "description": "The configured app patterns.", + "items": { + "$ref": "#/components/schemas/PatternDto" + } + }, + "editors": { + "type": "array", + "description": "The configured UI editors.", + "items": { + "$ref": "#/components/schemas/EditorDto" + } + }, + "hideScheduler": { + "type": "boolean", + "description": "Hide the scheduler for content items." + }, + "hideDateTimeModeButton": { + "type": "boolean", + "description": "Hide the datetime mode button." + }, + "version": { + "type": "integer", + "description": "The version of the app.", + "format": "int64" + } + } + } + ] + }, + "PatternDto": { + "type": "object", + "additionalProperties": false, + "required": [ + "name", + "regex" + ], + "properties": { + "name": { + "type": "string", + "description": "The name of the suggestion." + }, + "regex": { + "type": "string", + "description": "The regex pattern." + }, + "message": { + "type": "string", + "description": "The regex message.", + "nullable": true + } + } + }, + "EditorDto": { + "type": "object", + "additionalProperties": false, + "required": [ + "name", + "url" + ], + "properties": { + "name": { + "type": "string", + "description": "The name of the editor." + }, + "url": { + "type": "string", + "description": "The url to the editor." + } + } + }, + "UpdateAppSettingsDto": { + "type": "object", + "additionalProperties": false, + "required": [ + "patterns", + "editors" + ], + "properties": { + "patterns": { + "type": "array", + "description": "The configured app patterns.", + "items": { + "$ref": "#/components/schemas/PatternDto" + } + }, + "editors": { + "type": "array", + "description": "The configured UI editors.", + "items": { + "$ref": "#/components/schemas/EditorDto" + } + }, + "hideScheduler": { + "type": "boolean", + "description": "Hide the scheduler for content items." + }, + "hideDateTimeModeButton": { + "type": "boolean", + "description": "Hide the datetime mode button." + } + } + }, + "WorkflowsDto": { + "allOf": [ + { + "$ref": "#/components/schemas/Resource" + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "items", + "errors" + ], + "properties": { + "items": { + "type": "array", + "description": "The workflow.", + "items": { + "$ref": "#/components/schemas/WorkflowDto" + } + }, + "errors": { + "type": "array", + "description": "The errros that should be fixed.", + "items": { + "type": "string" + } + } + } + } + ] + }, + "WorkflowDto": { + "allOf": [ + { + "$ref": "#/components/schemas/Resource" + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "id", + "steps", + "initial" + ], + "properties": { + "id": { + "type": "string", + "description": "The workflow id." + }, + "name": { + "type": "string", + "description": "The name of the workflow.", + "nullable": true + }, + "steps": { + "type": "object", + "description": "The workflow steps.", + "additionalProperties": { + "$ref": "#/components/schemas/WorkflowStepDto" + } + }, + "schemaIds": { + "type": "array", + "description": "The schema ids.", + "nullable": true, + "items": { + "type": "string" + } + }, + "initial": { + "type": "string", + "description": "The initial step." + } + } + } + ] + }, + "WorkflowStepDto": { + "type": "object", + "additionalProperties": false, + "properties": { + "transitions": { + "type": "object", + "description": "The transitions.", + "additionalProperties": { + "$ref": "#/components/schemas/WorkflowTransitionDto" + } + }, + "color": { + "type": "string", + "description": "The optional color.", + "nullable": true + }, + "validate": { + "type": "boolean", + "description": "True if the content should be validated when moving to this step." + }, + "noUpdate": { + "type": "boolean", + "description": "Indicates if updates should not be allowed." + }, + "noUpdateExpression": { + "type": "string", + "description": "Optional expression that must evaluate to true when you want to prevent updates.", + "nullable": true + }, + "noUpdateRoles": { + "type": "array", + "description": "Optional list of roles to restrict the updates for users with these roles.", + "nullable": true, + "items": { + "type": "string" + } + } + } + }, + "WorkflowTransitionDto": { + "type": "object", + "additionalProperties": false, + "properties": { + "expression": { + "type": "string", + "description": "The optional expression.", + "nullable": true + }, + "roles": { + "type": "array", + "description": "The optional restricted role.", + "nullable": true, + "items": { + "type": "string" + } + } + } + }, + "AddWorkflowDto": { + "type": "object", + "additionalProperties": false, + "required": [ + "name" + ], + "properties": { + "name": { + "type": "string", + "description": "The name of the workflow.", + "minLength": 1 + } + } + }, + "UpdateWorkflowDto": { + "type": "object", + "additionalProperties": false, + "required": [ + "steps", + "initial" + ], + "properties": { + "name": { + "type": "string", + "description": "The name of the workflow.", + "nullable": true + }, + "steps": { + "type": "object", + "description": "The workflow steps.", + "additionalProperties": { + "$ref": "#/components/schemas/WorkflowStepDto" + } + }, + "schemaIds": { + "type": "array", + "description": "The schema ids.", + "nullable": true, + "items": { + "type": "string" + } + }, + "initial": { + "type": "string", + "description": "The initial step." + } + } + }, + "EnrichedEventDto": { + "type": "object", + "discriminator": { + "propertyName": "$type", + "mapping": { + "EnrichedAssetEvent": "#/components/schemas/EnrichedAssetEventDto", + "EnrichedCommentEvent": "#/components/schemas/EnrichedCommentEventDto", + "EnrichedContentEvent": "#/components/schemas/EnrichedContentEventDto", + "EnrichedCronJobEvent": "#/components/schemas/EnrichedCronJobEventDto", + "EnrichedManualEvent": "#/components/schemas/EnrichedManualEventDto", + "EnrichedSchemaEvent": "#/components/schemas/EnrichedSchemaEventDto", + "EnrichedUsageExceededEvent": "#/components/schemas/EnrichedUsageExceededEventDto" + } + }, + "x-abstract": true, + "additionalProperties": false, + "required": [ + "$type", + "appId", + "timestamp", + "name", + "version", + "partition" + ], + "properties": { + "appId": { + "type": "string" + }, + "timestamp": { + "type": "string", + "format": "date-time" + }, + "name": { + "type": "string" + }, + "version": { + "type": "integer", + "format": "int64" + }, + "partition": { + "type": "integer", + "format": "int64" + }, + "$type": { + "type": "string" + } + } + }, + "EnrichedAssetEventDto": { + "allOf": [ + { + "$ref": "#/components/schemas/EnrichedUserEventBaseEventDto" + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "type", + "id", + "created", + "lastModified", + "createdBy", + "lastModifiedBy", + "parentId", + "mimeType", + "fileName", + "fileHash", + "slug", + "fileVersion", + "fileSize", + "isProtected", + "assetType", + "metadata", + "isImage", + "partition" + ], + "properties": { + "type": { + "$ref": "#/components/schemas/EnrichedAssetEventType" + }, + "id": { + "type": "string" + }, + "created": { + "type": "string", + "format": "date-time" + }, + "lastModified": { + "type": "string", + "format": "date-time" + }, + "createdBy": { + "type": "string" + }, + "lastModifiedBy": { + "type": "string" + }, + "parentId": { + "type": "string" + }, + "mimeType": { + "type": "string" + }, + "fileName": { + "type": "string" + }, + "fileHash": { + "type": "string" + }, + "slug": { + "type": "string" + }, + "fileVersion": { + "type": "integer", + "format": "int64" + }, + "fileSize": { + "type": "integer", + "format": "int64" + }, + "isProtected": { + "type": "boolean" + }, + "pixelWidth": { + "type": "integer", + "format": "int32", + "nullable": true + }, + "pixelHeight": { + "type": "integer", + "format": "int32", + "nullable": true + }, + "assetType": { + "$ref": "#/components/schemas/AssetType" + }, + "metadata": { + "type": "object", + "additionalProperties": { + "description": "Any" + } + }, + "isImage": { + "type": "boolean" + }, + "partition": { + "type": "integer", + "format": "int64" + } + } + } + ] + }, + "EnrichedAssetEventType": { + "type": "string", + "description": "", + "x-enumNames": [ + "Created", + "Deleted", + "Annotated", + "Updated" + ], + "enum": [ + "Created", + "Deleted", + "Annotated", + "Updated" + ] + }, + "EnrichedUserEventBaseEventDto": { + "allOf": [ + { + "$ref": "#/components/schemas/EnrichedEventDto" + }, + { + "type": "object", + "x-abstract": true, + "additionalProperties": false, + "required": [ + "actor" + ], + "properties": { + "actor": { + "type": "string" + } + } + } + ] + }, + "EnrichedCommentEventDto": { + "allOf": [ + { + "$ref": "#/components/schemas/EnrichedUserEventBaseEventDto" + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "text" + ], + "properties": { + "text": { + "type": "string" + }, + "url": { + "type": "string", + "format": "uri", + "nullable": true + } + } + } + ] + }, + "EnrichedContentEventDto": { + "allOf": [ + { + "$ref": "#/components/schemas/EnrichedSchemaEventBaseEventDto" + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "type", + "id", + "created", + "lastModified", + "createdBy", + "lastModifiedBy", + "data", + "status", + "partition" + ], + "properties": { + "type": { + "$ref": "#/components/schemas/EnrichedContentEventType" + }, + "id": { + "type": "string" + }, + "created": { + "type": "string", + "format": "date-time" + }, + "lastModified": { + "type": "string", + "format": "date-time" + }, + "createdBy": { + "type": "string" + }, + "lastModifiedBy": { + "type": "string" + }, + "data": { + "$ref": "#/components/schemas/ContentData" + }, + "dataOld": { + "nullable": true, + "$ref": "#/components/schemas/ContentData" + }, + "status": { + "type": "string" + }, + "newStatus": { + "type": "string", + "nullable": true + }, + "partition": { + "type": "integer", + "format": "int64" + } + } + } + ] + }, + "EnrichedContentEventType": { + "type": "string", + "description": "", + "x-enumNames": [ + "Created", + "Deleted", + "Published", + "StatusChanged", + "Updated", + "Unpublished", + "ReferenceUpdated" + ], + "enum": [ + "Created", + "Deleted", + "Published", + "StatusChanged", + "Updated", + "Unpublished", + "ReferenceUpdated" + ] + }, + "EnrichedSchemaEventBaseEventDto": { + "allOf": [ + { + "$ref": "#/components/schemas/EnrichedUserEventBaseEventDto" + }, + { + "type": "object", + "x-abstract": true, + "additionalProperties": false, + "required": [ + "schemaId" + ], + "properties": { + "schemaId": { + "type": "string" + } + } + } + ] + }, + "EnrichedCronJobEventDto": { + "allOf": [ + { + "$ref": "#/components/schemas/EnrichedUserEventBaseEventDto" + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "value", + "partition" + ], + "properties": { + "value": {}, + "partition": { + "type": "integer", + "format": "int64" + } + } + } + ] + }, + "EnrichedManualEventDto": { + "allOf": [ + { + "$ref": "#/components/schemas/EnrichedUserEventBaseEventDto" + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "value", + "partition" + ], + "properties": { + "value": {}, + "partition": { + "type": "integer", + "format": "int64" + } + } + } + ] + }, + "EnrichedSchemaEventDto": { + "allOf": [ + { + "$ref": "#/components/schemas/EnrichedSchemaEventBaseEventDto" + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "type", + "id", + "partition" + ], + "properties": { + "type": { + "$ref": "#/components/schemas/EnrichedSchemaEventType" + }, + "id": { + "type": "string" + }, + "partition": { + "type": "integer", + "format": "int64" + } + } + } + ] + }, + "EnrichedSchemaEventType": { + "type": "string", + "description": "", + "x-enumNames": [ + "Created", + "Deleted", + "Published", + "Unpublished", + "Updated" + ], + "enum": [ + "Created", + "Deleted", + "Published", + "Unpublished", + "Updated" + ] + }, + "EnrichedUsageExceededEventDto": { + "allOf": [ + { + "$ref": "#/components/schemas/EnrichedEventDto" + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "callsCurrent", + "callsLimit", + "partition" + ], + "properties": { + "callsCurrent": { + "type": "integer", + "format": "int64" + }, + "callsLimit": { + "type": "integer", + "format": "int64" + }, + "partition": { + "type": "integer", + "format": "int64" + } + } + } + ] + }, + "DynamicCreateRuleDto": { + "type": "object", + "additionalProperties": false, + "required": [ + "trigger", + "flow" + ], + "properties": { + "name": { + "type": "string", + "description": "Optional rule name.", + "nullable": true + }, + "trigger": { + "description": "The trigger properties.", + "$ref": "#/components/schemas/RuleTriggerDto" + }, + "action": { + "type": "object", + "description": "The action properties.", + "deprecated": true, + "x-deprecatedMessage": "Use the new 'Flow' property to define actions", + "nullable": true, + "additionalProperties": {} + }, + "flow": { + "description": "The flow to describe the sequence of actions to perform.", + "$ref": "#/components/schemas/DynamicFlowDefinitionDto" + }, + "isEnabled": { + "type": "boolean", + "description": "Enable or disable the rule.", + "nullable": true + } + } + }, + "DynamicFlowDefinitionDto": { + "type": "object", + "additionalProperties": false, + "required": [ + "initialStepId", + "steps" + ], + "properties": { + "initialStepId": { + "type": "string", + "description": "The ID of the initial step.", + "format": "guid", + "minLength": 1 + }, + "steps": { + "type": "object", + "description": "The steps.", + "additionalProperties": { + "$ref": "#/components/schemas/DynamicFlowStepDefinitionDto" + } + } + } + }, + "DynamicFlowStepDefinitionDto": { + "type": "object", + "additionalProperties": false, + "required": [ + "step" + ], + "properties": { + "step": { + "type": "object", + "description": "The actual step.", + "additionalProperties": {} + }, + "name": { + "type": "string", + "description": "The optional descriptive name.", + "nullable": true + }, + "nextStepId": { + "type": "string", + "description": "The next step.", + "format": "guid", + "nullable": true + }, + "ignoreError": { + "type": "boolean", + "description": "Indicates if errors should be ignored." + } + } + }, + "DynamicFlowExecutionStateDto": { + "type": "object", + "additionalProperties": false, + "required": [ + "definition", + "context", + "steps", + "nextStepId", + "created", + "completed", + "status" + ], + "properties": { + "definition": { + "description": "The actual definition of the the steps to be executed.", + "$ref": "#/components/schemas/DynamicFlowDefinitionDto" + }, + "context": { + "description": "The context." + }, + "steps": { + "type": "object", + "description": "The state of each step.", + "additionalProperties": { + "$ref": "#/components/schemas/FlowExecutionStepStateDto" + } + }, + "nextStepId": { + "type": "string", + "description": "The next step to be executed.", + "format": "guid" + }, + "nextRun": { + "type": "string", + "description": "THe time when the next step will be executed.", + "format": "date-time", + "nullable": true + }, + "created": { + "type": "string", + "description": "The creation time.", + "format": "date-time" + }, + "completed": { + "type": "string", + "description": "The completion time.", + "format": "date-time" + }, + "status": { + "description": "The overall status.", + "$ref": "#/components/schemas/FlowExecutionStatus" + } + } + }, + "DynamicRulesDto": { + "allOf": [ + { + "$ref": "#/components/schemas/Resource" + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "items" + ], + "properties": { + "items": { + "type": "array", + "description": "The rules.", + "items": { + "$ref": "#/components/schemas/DynamicRuleDto" + } + }, + "runningRuleId": { + "type": "string", + "description": "The ID of the rule that is currently rerunning.", + "nullable": true + } + } + } + ] + }, + "DynamicRuleDto": { + "allOf": [ + { + "$ref": "#/components/schemas/Resource" + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "id", + "createdBy", + "lastModifiedBy", + "created", + "lastModified", + "version", + "isEnabled", + "trigger", + "flow", + "action", + "numSucceeded", + "numFailed" + ], + "properties": { + "id": { + "type": "string", + "description": "The ID of the rule." + }, + "createdBy": { + "type": "string", + "description": "The user that has created the rule." + }, + "lastModifiedBy": { + "type": "string", + "description": "The user that has updated the rule." + }, + "created": { + "type": "string", + "description": "The date and time when the rule has been created.", + "format": "date-time" + }, + "lastModified": { + "type": "string", + "description": "The date and time when the rule has been modified last.", + "format": "date-time" + }, + "version": { + "type": "integer", + "description": "The version of the rule.", + "format": "int64" + }, + "isEnabled": { + "type": "boolean", + "description": "Determines if the rule is enabled." + }, + "name": { + "type": "string", + "description": "Optional rule name.", + "nullable": true + }, + "trigger": { + "description": "The trigger properties.", + "$ref": "#/components/schemas/RuleTriggerDto" + }, + "flow": { + "description": "The flow to describe the sequence of actions to perform.", + "$ref": "#/components/schemas/DynamicFlowDefinitionDto" + }, + "action": { + "type": "object", + "description": "The action properties.", + "deprecated": true, + "x-deprecatedMessage": "Use the new 'Flow' property to define actions. Can be null if the flow cannot be converted.", + "additionalProperties": {} + }, + "numSucceeded": { + "type": "integer", + "description": "The number of completed executions.", + "format": "int64" + }, + "numFailed": { + "type": "integer", + "description": "The number of failed executions.", + "format": "int64" + }, + "lastExecuted": { + "type": "string", + "description": "The date and time when the rule was executed the last time.", + "format": "date-time", + "deprecated": true, + "x-deprecatedMessage": "Removed when migrated to new rule statistics.", + "nullable": true + } + } + } + ] + }, + "DynamicUpdateRuleDto": { + "type": "object", + "additionalProperties": false, + "properties": { + "name": { + "type": "string", + "description": "Optional rule name.", + "nullable": true + }, + "trigger": { + "description": "The trigger properties.", + "nullable": true, + "$ref": "#/components/schemas/RuleTriggerDto" + }, + "action": { + "type": "object", + "description": "The action properties.", + "deprecated": true, + "x-deprecatedMessage": "Use the new 'Flow' property to define actions", + "nullable": true, + "additionalProperties": {} + }, + "flow": { + "description": "The flow to describe the sequence of actions to perform.", + "nullable": true, + "$ref": "#/components/schemas/DynamicFlowDefinitionDto" + }, + "isEnabled": { + "type": "boolean", + "description": "Enable or disable the rule.", + "nullable": true + } + } + } + }, + "securitySchemes": { + "squidex-oauth-auth": { + "type": "openIdConnect", + "description": "Squidex uses OpenId Connect (OIDC) with the Client Credentials Flow (defined in OAuth 2.0 RFC 6749, section 4.4).\r\n\r\nThe OpenId Connect Client Credentials flow can be used for machine to machine authentication. In this grant a specific user is not authorized but rather the credentials are verified and a generic `access_token` is returned.\r\n\r\nThe `access_token` is a signed JSON Web Token (JWT) which contains expiry information. \r\n\r\nTo retrieve an access token you must pass the Client ID and Client Secret to the token endpoint to authenticate yourself and get a token:\r\n\r\n $ curl\r\n -X POST 'https://localhost:5001/identity-server/connect/token' \r\n -H 'Content-Type: application/x-www-form-urlencoded' \r\n -d 'grant_type=client_credentials&\r\n client_id=[CLIENT_ID]&\r\n client_secret=[CLIENT_SECRET]&\r\n\t\t\tscope=squidex-api'\r\n\r\nPass this token to all consecutiv requests to the API via the `Authorization` header:\r\n\r\n Authorization: Bearer ", + "openIdConnectUrl": "https://localhost:5001/identity-server/.well-known/openid-configuration" + } + } + }, + "security": [ + { + "squidex-oauth-auth": [ + "squidex-api" + ] + } + ], + "externalDocs": { + "url": "https://docs.squidex.io" + } +} \ No newline at end of file diff --git a/frontend/src/app/features/content/pages/content/editor/content-editor.component.html b/frontend/src/app/features/content/pages/content/editor/content-editor.component.html index 1c5a5a947..1e0ee0492 100644 --- a/frontend/src/app/features/content/pages/content/editor/content-editor.component.html +++ b/frontend/src/app/features/content/pages/content/editor/content-editor.component.html @@ -12,11 +12,11 @@ @if (isDeleted) { -
+
} @if (!isDeleted) { -
+
} } diff --git a/frontend/src/app/features/content/shared/forms/assets-editor.component.html b/frontend/src/app/features/content/shared/forms/assets-editor.component.html index 9f3b7893b..3c33f21e0 100644 --- a/frontend/src/app/features/content/shared/forms/assets-editor.component.html +++ b/frontend/src/app/features/content/shared/forms/assets-editor.component.html @@ -1,7 +1,7 @@ -
+
@@ -11,7 +11,7 @@
-
diff --git a/frontend/src/app/features/content/shared/forms/assets-editor.component.scss b/frontend/src/app/features/content/shared/forms/assets-editor.component.scss index 7f3d5fc26..b6684668b 100644 --- a/frontend/src/app/features/content/shared/forms/assets-editor.component.scss +++ b/frontend/src/app/features/content/shared/forms/assets-editor.component.scss @@ -31,6 +31,10 @@ pointer-events: none; } +.header { + margin-bottom: -.25rem; +} + .list-view { margin-bottom: 1rem; } diff --git a/frontend/src/app/features/content/shared/forms/component-section.component.html b/frontend/src/app/features/content/shared/forms/component-section.component.html index ab726b772..98706f09c 100644 --- a/frontend/src/app/features/content/shared/forms/component-section.component.html +++ b/frontend/src/app/features/content/shared/forms/component-section.component.html @@ -4,7 +4,7 @@

{{ separator!.displayName }}

@if (separator.properties.hints && separator.properties.hints.length > 0) { - + }
} @@ -24,8 +24,8 @@ [formModel]="child" [hasChatBot]="hasChatBot" [index]="index" - [isComparing]="isComparing" [isCollapsed]="false" + [isComparing]="isComparing" [language]="language" [languages]="languages" /> } diff --git a/frontend/src/app/features/content/shared/forms/content-section.component.html b/frontend/src/app/features/content/shared/forms/content-section.component.html index 453421d4a..b8de8b5cf 100644 --- a/frontend/src/app/features/content/shared/forms/content-section.component.html +++ b/frontend/src/app/features/content/shared/forms/content-section.component.html @@ -13,7 +13,7 @@ @if (separator.properties.hints && separator.properties.hints.length > 0) { - + }
diff --git a/frontend/src/app/features/content/shared/forms/field-editor.component.html b/frontend/src/app/features/content/shared/forms/field-editor.component.html index dd2d4eb36..b9baf60ad 100644 --- a/frontend/src/app/features/content/shared/forms/field-editor.component.html +++ b/frontend/src/app/features/content/shared/forms/field-editor.component.html @@ -354,12 +354,16 @@ @case ("UI") {

{{ field.displayName }}

} + + @case ("UserInfo") { + + } } }
@if (field.properties.hints && field.properties.hints.length > 0) { - + } } diff --git a/frontend/src/app/features/content/shared/forms/field-editor.component.ts b/frontend/src/app/features/content/shared/forms/field-editor.component.ts index 06eb50f19..99f2d8bb4 100644 --- a/frontend/src/app/features/content/shared/forms/field-editor.component.ts +++ b/frontend/src/app/features/content/shared/forms/field-editor.component.ts @@ -20,6 +20,7 @@ import { AssetsEditorComponent } from './assets-editor.component'; import { ComponentComponent } from './component.component'; import { IFrameEditorComponent } from './iframe-editor.component'; import { StockPhotoEditorComponent } from './stock-photo-editor.component'; +import { UserInfoEditorComponent } from './user-info-editor.component'; @Component({ selector: 'sqx-field-editor', @@ -42,9 +43,9 @@ import { StockPhotoEditorComponent } from './stock-photo-editor.component'; IFrameEditorComponent, IndeterminateValueDirective, MarkdownDirective, - ModalDirective, MenuComponent, MenuItemComponent, + ModalDirective, RadioGroupComponent, ReactiveFormsModule, ReferenceDropdownComponent, @@ -59,6 +60,7 @@ import { StockPhotoEditorComponent } from './stock-photo-editor.component'; TagEditorComponent, ToggleComponent, TransformInputDirective, + UserInfoEditorComponent, ], }) export class FieldEditorComponent { diff --git a/frontend/src/app/features/content/shared/forms/user-info-editor.component.html b/frontend/src/app/features/content/shared/forms/user-info-editor.component.html new file mode 100644 index 000000000..f65359112 --- /dev/null +++ b/frontend/src/app/features/content/shared/forms/user-info-editor.component.html @@ -0,0 +1,31 @@ +
+ +
+ + +
+
+ + + + + + + + +
Authorization: ApiKey {{ rolesState.appName }}:{{ apiKey | async }}
+
+ + {{ 'common.or' | sqxTranslate }} + + +
ApiKey: {{ rolesState.appName }}:{{ apiKey | async }}
+
+
+
diff --git a/frontend/src/app/features/content/shared/forms/user-info-editor.component.scss b/frontend/src/app/features/content/shared/forms/user-info-editor.component.scss new file mode 100644 index 000000000..62d8b41a2 --- /dev/null +++ b/frontend/src/app/features/content/shared/forms/user-info-editor.component.scss @@ -0,0 +1,24 @@ +@import 'mixins'; +@import 'vars'; + +.form { + border: 1px solid $color-border; + border-radius: $border-radius; + padding: 1.5rem; +} + +.form-group { + position: relative; +} + +.key { + padding-right: 6rem; +} + +.key-generate { + @include absolute(auto, 10px, 3px, auto); + + &:focus { + box-shadow: none; + } +} \ No newline at end of file diff --git a/frontend/src/app/features/content/shared/forms/user-info-editor.component.ts b/frontend/src/app/features/content/shared/forms/user-info-editor.component.ts new file mode 100644 index 000000000..fe958d84d --- /dev/null +++ b/frontend/src/app/features/content/shared/forms/user-info-editor.component.ts @@ -0,0 +1,97 @@ +/* + * Squidex Headless CMS + * + * @license + * Copyright (c) Squidex UG (haftungsbeschränkt). All rights reserved. + */ + +import { AsyncPipe } from '@angular/common'; +import { booleanAttribute, ChangeDetectionStrategy, Component, forwardRef, Input, OnInit } from '@angular/core'; +import { FormsModule, NG_VALUE_ACCESSOR, ReactiveFormsModule, UntypedFormControl, Validators } from '@angular/forms'; +import { map } from 'rxjs'; +import { CodeComponent, ExtendedFormGroup, FormHintComponent, FormRowComponent, generateApiKey, MarkdownDirective, RolesState, StatefulControlComponent, Subscriptions, TranslatePipe, Types, value$ } from '@app/shared'; + +export const SQX_USER_INFO_EDITOR_CONTROL_VALUE_ACCESSOR: any = { + provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => UserInfoEditorComponent), multi: true, +}; + +type UserInfo = { apiKey: string; role: string }; + +@Component({ + selector: 'sqx-user-info-editor', + styleUrls: ['./user-info-editor.component.scss'], + templateUrl: './user-info-editor.component.html', + providers: [ + SQX_USER_INFO_EDITOR_CONTROL_VALUE_ACCESSOR, + ], + changeDetection: ChangeDetectionStrategy.OnPush, + imports: [ + AsyncPipe, + CodeComponent, + FormsModule, + FormHintComponent, + MarkdownDirective, + ReactiveFormsModule, + FormRowComponent, + TranslatePipe, + ], +}) +export class UserInfoEditorComponent extends StatefulControlComponent implements OnInit { + private readonly subscriptions = new Subscriptions(); + + @Input({ required: true }) + public formId!: string; + + @Input({ transform: booleanAttribute }) + public set disabled(value: boolean | undefined | null) { + this.setDisabledState(value === true); + } + + public readonly form = new ExtendedFormGroup({ + apiKey: new UntypedFormControl('', + Validators.required, + ), + role: new UntypedFormControl('', + Validators.required, + ), + }); + + public readonly apiKey = + value$(this.form.get('apiKey')!) + .pipe(map(x => x || 'NONE')); + + constructor( + public readonly rolesState: RolesState, + ) { + super({}); + + this.subscriptions.add( + value$(this.form).subscribe(value => { + if (this.form.valid) { + this.callChange(value); + } else { + this.callChange(null); + } + + this.callTouched(); + })); + } + + public ngOnInit() { + this.rolesState.loadIfNotLoaded(); + } + + public writeValue(obj: UserInfo | undefined | null) { + if (Types.isObject(obj)) { + this.form.setValue(obj, { emitEvent: true }); + } else { + this.form.reset(); + } + } + + public async generateApiKey() { + const apiKey = generateApiKey(); + + this.form.patchValue({ apiKey }); + } +} \ No newline at end of file diff --git a/frontend/src/app/features/rules/pages/rule/step-dialog.component.html b/frontend/src/app/features/rules/pages/rule/step-dialog.component.html index 8de2aab03..d9e53c103 100644 --- a/frontend/src/app/features/rules/pages/rule/step-dialog.component.html +++ b/frontend/src/app/features/rules/pages/rule/step-dialog.component.html @@ -85,7 +85,7 @@ } } - + @if (property.isFormattable) {
{{ "rules.advancedFormattingHint" | sqxTranslate }}: diff --git a/frontend/src/app/features/schemas/pages/schema/fields/forms/field-form-ui.component.html b/frontend/src/app/features/schemas/pages/schema/fields/forms/field-form-ui.component.html index 3703c21fc..2f48b85f9 100644 --- a/frontend/src/app/features/schemas/pages/schema/fields/forms/field-form-ui.component.html +++ b/frontend/src/app/features/schemas/pages/schema/fields/forms/field-form-ui.component.html @@ -56,6 +56,10 @@ @case ("Tags") { } + + @case ("UserInfo") { + + } }
diff --git a/frontend/src/app/features/schemas/pages/schema/fields/forms/field-form-ui.component.ts b/frontend/src/app/features/schemas/pages/schema/fields/forms/field-form-ui.component.ts index 47ffed079..4eb324952 100644 --- a/frontend/src/app/features/schemas/pages/schema/fields/forms/field-form-ui.component.ts +++ b/frontend/src/app/features/schemas/pages/schema/fields/forms/field-form-ui.component.ts @@ -22,6 +22,7 @@ import { ReferencesUIComponent } from '../types/references-ui.component'; import { RichTextUIComponent } from '../types/rich-text-ui.component'; import { StringUIComponent } from '../types/string-ui.component'; import { TagsUIComponent } from '../types/tags-ui.component'; +import { UserInfoUIComponent } from '../types/user-info-ui.component'; @Component({ selector: 'sqx-field-form-ui', @@ -44,6 +45,7 @@ import { TagsUIComponent } from '../types/tags-ui.component'; ReferencesUIComponent, StringUIComponent, TagsUIComponent, + UserInfoUIComponent, ], }) export class FieldFormUIComponent { diff --git a/frontend/src/app/features/schemas/pages/schema/fields/forms/field-form-validation.component.html b/frontend/src/app/features/schemas/pages/schema/fields/forms/field-form-validation.component.html index 5eeb11c04..c78220453 100644 --- a/frontend/src/app/features/schemas/pages/schema/fields/forms/field-form-validation.component.html +++ b/frontend/src/app/features/schemas/pages/schema/fields/forms/field-form-validation.component.html @@ -1,4 +1,4 @@ -
+
@@ -102,4 +102,8 @@ [languages]="languages" [properties]="field.rawProperties" /> } + + @case ("UserInfo") { + + } } diff --git a/frontend/src/app/features/schemas/pages/schema/fields/forms/field-form-validation.component.ts b/frontend/src/app/features/schemas/pages/schema/fields/forms/field-form-validation.component.ts index 717b98e37..6fb002d8e 100644 --- a/frontend/src/app/features/schemas/pages/schema/fields/forms/field-form-validation.component.ts +++ b/frontend/src/app/features/schemas/pages/schema/fields/forms/field-form-validation.component.ts @@ -22,6 +22,7 @@ import { ReferencesValidationComponent } from '../types/references-validation.co import { RichTextValidationComponent } from '../types/rich-text-validation.component'; import { StringValidationComponent } from '../types/string-validation.component'; import { TagsValidationComponent } from '../types/tags-validation.component'; +import { UserInfoValidationComponent } from '../types/user-info-validation.component'; @Component({ selector: 'sqx-field-form-validation', @@ -44,6 +45,7 @@ import { TagsValidationComponent } from '../types/tags-validation.component'; RichTextValidationComponent, StringValidationComponent, TagsValidationComponent, + UserInfoValidationComponent, ], }) export class FieldFormValidationComponent { diff --git a/frontend/src/app/features/schemas/pages/schema/fields/types/user-info-ui.component.html b/frontend/src/app/features/schemas/pages/schema/fields/types/user-info-ui.component.html new file mode 100644 index 000000000..e69de29bb diff --git a/frontend/src/app/features/schemas/pages/schema/fields/types/user-info-ui.component.scss b/frontend/src/app/features/schemas/pages/schema/fields/types/user-info-ui.component.scss new file mode 100644 index 000000000..2742d895e --- /dev/null +++ b/frontend/src/app/features/schemas/pages/schema/fields/types/user-info-ui.component.scss @@ -0,0 +1,2 @@ +@import 'mixins'; +@import 'vars'; \ No newline at end of file diff --git a/frontend/src/app/features/schemas/pages/schema/fields/types/user-info-ui.component.ts b/frontend/src/app/features/schemas/pages/schema/fields/types/user-info-ui.component.ts new file mode 100644 index 000000000..bdaa075cc --- /dev/null +++ b/frontend/src/app/features/schemas/pages/schema/fields/types/user-info-ui.component.ts @@ -0,0 +1,26 @@ +/* + * Squidex Headless CMS + * + * @license + * Copyright (c) Squidex UG (haftungsbeschränkt). All rights reserved. + */ + +import { Component, Input } from '@angular/core'; +import { UntypedFormGroup } from '@angular/forms'; +import { FieldDto, UserInfoFieldPropertiesDto } from '@app/shared'; + +@Component({ + selector: 'sqx-user-info-ui', + styleUrls: ['user-info-ui.component.scss'], + templateUrl: 'user-info-ui.component.html', +}) +export class UserInfoUIComponent { + @Input({ required: true }) + public fieldForm!: UntypedFormGroup; + + @Input({ required: true }) + public field!: FieldDto; + + @Input({ required: true }) + public properties!: UserInfoFieldPropertiesDto; +} diff --git a/frontend/src/app/features/schemas/pages/schema/fields/types/user-info-validation.component.html b/frontend/src/app/features/schemas/pages/schema/fields/types/user-info-validation.component.html new file mode 100644 index 000000000..944b40cf4 --- /dev/null +++ b/frontend/src/app/features/schemas/pages/schema/fields/types/user-info-validation.component.html @@ -0,0 +1,14 @@ +
+ + + +
diff --git a/frontend/src/app/features/schemas/pages/schema/fields/types/user-info-validation.component.scss b/frontend/src/app/features/schemas/pages/schema/fields/types/user-info-validation.component.scss new file mode 100644 index 000000000..2742d895e --- /dev/null +++ b/frontend/src/app/features/schemas/pages/schema/fields/types/user-info-validation.component.scss @@ -0,0 +1,2 @@ +@import 'mixins'; +@import 'vars'; \ No newline at end of file diff --git a/frontend/src/app/features/schemas/pages/schema/fields/types/user-info-validation.component.ts b/frontend/src/app/features/schemas/pages/schema/fields/types/user-info-validation.component.ts new file mode 100644 index 000000000..2df7b11b8 --- /dev/null +++ b/frontend/src/app/features/schemas/pages/schema/fields/types/user-info-validation.component.ts @@ -0,0 +1,42 @@ +/* + * Squidex Headless CMS + * + * @license + * Copyright (c) Squidex UG (haftungsbeschränkt). All rights reserved. + */ + +import { AsyncPipe } from '@angular/common'; +import { Component, Input, OnInit } from '@angular/core'; +import { FormsModule, ReactiveFormsModule, UntypedFormGroup } from '@angular/forms'; +import { FieldDto, FormRowComponent, RolesState, UserInfoFieldPropertiesDto } from '@app/shared'; + +@Component({ + selector: 'sqx-user-info-validation', + styleUrls: ['user-info-validation.component.scss'], + templateUrl: 'user-info-validation.component.html', + imports: [ + AsyncPipe, + FormRowComponent, + FormsModule, + ReactiveFormsModule, + ], +}) +export class UserInfoValidationComponent implements OnInit { + @Input({ required: true }) + public fieldForm!: UntypedFormGroup; + + @Input({ required: true }) + public field!: FieldDto; + + @Input({ required: true }) + public properties!: UserInfoFieldPropertiesDto; + + constructor( + public readonly rolesState: RolesState, + ) { + } + + public ngOnInit() { + this.rolesState.loadIfNotLoaded(); + } +} diff --git a/frontend/src/app/features/schemas/pages/schema/indexes/index-form.component.html b/frontend/src/app/features/schemas/pages/schema/indexes/index-form.component.html index a086dca59..45e050dc2 100644 --- a/frontend/src/app/features/schemas/pages/schema/indexes/index-form.component.html +++ b/frontend/src/app/features/schemas/pages/schema/indexes/index-form.component.html @@ -3,7 +3,7 @@ {{ "schemas.indexes.addTitle" | sqxTranslate }} - + @for (form of createForm.controls; track form; let i = $index) {
diff --git a/frontend/src/app/features/settings/pages/clients/client-connect-form.component.html b/frontend/src/app/features/settings/pages/clients/client-connect-form.component.html index 44f7a8091..363e549ad 100644 --- a/frontend/src/app/features/settings/pages/clients/client-connect-form.component.html +++ b/frontend/src/app/features/settings/pages/clients/client-connect-form.component.html @@ -25,7 +25,7 @@ @case ("Start") {

{{ "clients.connectWizard.step1Title" | sqxTranslate }}

- +
diff --git a/frontend/src/app/framework/angular/forms/form-row.component.html b/frontend/src/app/framework/angular/forms/form-row.component.html index c78650c97..5258dede3 100644 --- a/frontend/src/app/framework/angular/forms/form-row.component.html +++ b/frontend/src/app/framework/angular/forms/form-row.component.html @@ -12,7 +12,7 @@ } -
+
@@ -33,7 +33,7 @@
@if (hint) { - + } @if (alert) { diff --git a/frontend/src/app/framework/angular/modals/tour-template.component.html b/frontend/src/app/framework/angular/modals/tour-template.component.html index 5f726f63b..b77773549 100644 --- a/frontend/src/app/framework/angular/modals/tour-template.component.html +++ b/frontend/src/app/framework/angular/modals/tour-template.component.html @@ -17,9 +17,9 @@
-
+
-
+
diff --git a/frontend/src/app/shared/components/assets/asset-dialog.component.scss b/frontend/src/app/shared/components/assets/asset-dialog.component.scss index 797bfbb4f..b6e7cc94d 100644 --- a/frontend/src/app/shared/components/assets/asset-dialog.component.scss +++ b/frontend/src/app/shared/components/assets/asset-dialog.component.scss @@ -1,10 +1,6 @@ @import 'mixins'; @import 'vars'; -.form-group { - position: relative; -} - .editor { @include absolute(0, 0, 0, 0); @@ -41,6 +37,10 @@ } } +.form-group { + position: relative; +} + .slug { padding-right: 6rem; } diff --git a/frontend/src/app/shared/model/custom.ts b/frontend/src/app/shared/model/custom.ts index a1d59d7ed..400021d95 100644 --- a/frontend/src/app/shared/model/custom.ts +++ b/frontend/src/app/shared/model/custom.ts @@ -964,3 +964,21 @@ export class UIFieldPropertiesDto extends generated.UIFieldPropertiesDto { return visitor.visitUI(this); } } + +export class UserInfoFieldPropertiesDto extends generated.UserInfoFieldPropertiesDto { + public get isComplexUI() { + return true; + } + + public get isSortable() { + return false; + } + + public get isContentField() { + return true; + } + + public accept(visitor: FieldPropertiesVisitor): T { + return visitor.visitUserInfo(this); + } +} diff --git a/frontend/src/app/shared/model/generated.ts b/frontend/src/app/shared/model/generated.ts index e22577ac1..b82d06b0b 100644 --- a/frontend/src/app/shared/model/generated.ts +++ b/frontend/src/app/shared/model/generated.ts @@ -3132,6 +3132,9 @@ export abstract class FieldPropertiesDto implements IFieldPropertiesDto { if (data["fieldType"] === "UI") { return new UIFieldPropertiesDto().init(data); } + if (data["fieldType"] === "UserInfo") { + return new UserInfoFieldPropertiesDto().init(data); + } throw new Error("The abstract class 'FieldPropertiesDto' cannot be instantiated."); } @@ -4656,6 +4659,58 @@ export const UIFieldEditorValues: ReadonlyArray = [ "Separator" ]; +export class UserInfoFieldPropertiesDto extends FieldPropertiesDto implements IUserInfoFieldPropertiesDto { + /** The role to create a default value. */ + readonly defaultRole?: string | undefined; + + public get isComplexUI() { + return true; + } + + public get isSortable() { + return false; + } + + public get isContentField() { + return true; + } + + public accept(visitor: FieldPropertiesVisitor): T { + return visitor.visitUserInfo(this); + } + + constructor(data?: IUserInfoFieldPropertiesDto) { + super(data); + (this).fieldType = "UserInfo"; + } + + init(_data: any) { + super.init(_data); + (this).defaultRole = _data["defaultRole"]; + this.cleanup(this); + return this; + } + + static fromJSON(data: any): UserInfoFieldPropertiesDto { + const result = new UserInfoFieldPropertiesDto().init(data); + result.cleanup(this); + return result; + } + + toJSON(data?: any) { + data = typeof data === 'object' ? data : {}; + data["defaultRole"] = this.defaultRole; + super.toJSON(data); + this.cleanup(data); + return data; + } +} + +export interface IUserInfoFieldPropertiesDto extends IFieldPropertiesDto { + /** The role to create a default value. */ + readonly defaultRole?: string | undefined; +} + export class NestedFieldDto extends ResourceDto implements INestedFieldDto { /** The ID of the field. */ readonly fieldId!: number; @@ -12507,9 +12562,9 @@ export class AllContentsByPostDto implements IAllContentsByPostDto { private readonly cachedValues: { [key: string]: any } = {}; /** The list of ids to query. */ readonly ids?: string[] | undefined; - /** The start of the schedule. */ + /** The start time of the scheduled content period (see scheduledTo). */ readonly scheduledFrom?: DateTime | undefined; - /** The end of the schedule. */ + /** The end time of the scheduled content period (see scheduledFrom). */ readonly scheduledTo?: DateTime | undefined; /** The ID of the referencing content item. */ readonly referencing?: string | undefined; @@ -12593,9 +12648,9 @@ export class AllContentsByPostDto implements IAllContentsByPostDto { export interface IAllContentsByPostDto { /** The list of ids to query. */ readonly ids?: string[] | undefined; - /** The start of the schedule. */ + /** The start time of the scheduled content period (see scheduledTo). */ readonly scheduledFrom?: DateTime | undefined; - /** The end of the schedule. */ + /** The end time of the scheduled content period (see scheduledFrom). */ readonly scheduledTo?: DateTime | undefined; /** The ID of the referencing content item. */ readonly referencing?: string | undefined; diff --git a/frontend/src/app/shared/model/schemas.ts b/frontend/src/app/shared/model/schemas.ts index b3d6fc895..74cf1c4d6 100644 --- a/frontend/src/app/shared/model/schemas.ts +++ b/frontend/src/app/shared/model/schemas.ts @@ -5,7 +5,7 @@ * Copyright (c) Squidex UG (haftungsbeschränkt). All rights reserved. */ -import { ArrayFieldPropertiesDto, AssetsFieldPropertiesDto, BooleanFieldPropertiesDto, ComponentFieldPropertiesDto, ComponentsFieldPropertiesDto, DateTimeFieldPropertiesDto, FieldDto, FieldPropertiesDto, FieldRuleAction, GeolocationFieldPropertiesDto, JsonFieldPropertiesDto, NumberFieldPropertiesDto, ReferencesFieldPropertiesDto, RichTextFieldPropertiesDto, StringFieldPropertiesDto, TagsFieldPropertiesDto, UIFieldPropertiesDto } from './generated'; +import { ArrayFieldPropertiesDto, AssetsFieldPropertiesDto, BooleanFieldPropertiesDto, ComponentFieldPropertiesDto, ComponentsFieldPropertiesDto, DateTimeFieldPropertiesDto, FieldDto, FieldPropertiesDto, FieldRuleAction, GeolocationFieldPropertiesDto, JsonFieldPropertiesDto, NumberFieldPropertiesDto, ReferencesFieldPropertiesDto, RichTextFieldPropertiesDto, StringFieldPropertiesDto, TagsFieldPropertiesDto, UIFieldPropertiesDto, UserInfoFieldPropertiesDto } from './generated'; export type FieldType = 'Array' | @@ -21,7 +21,8 @@ export type FieldType = 'RichText' | 'String' | 'Tags' | - 'UI'; + 'UI' | + 'UserInfo'; export const fieldTypes: ReadonlyArray<{ type: FieldType; description: string }> = [ { @@ -66,6 +67,9 @@ export const fieldTypes: ReadonlyArray<{ type: FieldType; description: string }> }, { type: 'UI', description: 'i18n:schemas.fieldTypes.ui.description', + }, { + type: 'UserInfo', + description: 'i18n:schemas.fieldTypes.user.description', }, ]; @@ -117,6 +121,9 @@ export function createProperties(fieldType: FieldType, values?: any): FieldPrope case 'UI': properties = new UIFieldPropertiesDto(values); break; + case 'UserInfo': + properties = new UserInfoFieldPropertiesDto(values); + break; default: throw new Error(`Unknown field type ${fieldType}.`); } @@ -152,6 +159,8 @@ export interface FieldPropertiesVisitor { visitTags(properties: TagsFieldPropertiesDto): T; visitUI(properties: UIFieldPropertiesDto): T; + + visitUserInfo(properties: UserInfoFieldPropertiesDto): T; } export const META_FIELDS = { diff --git a/frontend/src/app/shared/state/contents.forms.visitors.spec.ts b/frontend/src/app/shared/state/contents.forms.visitors.spec.ts index ad4d93c54..d97ba8b85 100644 --- a/frontend/src/app/shared/state/contents.forms.visitors.spec.ts +++ b/frontend/src/app/shared/state/contents.forms.visitors.spec.ts @@ -489,6 +489,32 @@ describe('TagsField', () => { }); }); +describe('UserInfoField', () => { + const field = createField({ properties: createProperties('UserInfo') }); + + it('should create validators', () => { + expect(FieldsValidators.create(field, false).length).toBe(0); + }); + + it('should format to empty string if null', () => { + expect(FieldFormatter.format(field, null)).toBe(''); + }); + + it('should format to user constant', () => { + expect(FieldFormatter.format(field, {})).toBe('User'); + }); + + it('should return default value as null if role is not defined', () => { + expect(FieldDefaultValue.get(field, 'iv')).toBeNull(); + }); + + it('should return default value from properties', () => { + const field2 = createField({ properties: createProperties('UserInfo', { defaultRole: 'Reader' }) }); + + expect(FieldDefaultValue.get(field2, 'iv').role).toEqual('Reader'); + }); +}); + function isUtc() { return new Date().getTimezoneOffset() === 0; } diff --git a/frontend/src/app/shared/state/contents.forms.visitors.ts b/frontend/src/app/shared/state/contents.forms.visitors.ts index 00318306e..16983e6a0 100644 --- a/frontend/src/app/shared/state/contents.forms.visitors.ts +++ b/frontend/src/app/shared/state/contents.forms.visitors.ts @@ -7,7 +7,7 @@ import { ValidatorFn, Validators } from '@angular/forms'; import { DateTime, Types, ValidatorsEx } from '@app/framework'; -import { AppLanguageDto, ContentDto, FieldDto, NestedFieldDto } from '../model'; +import { AppLanguageDto, ContentDto, FieldDto, NestedFieldDto, UserInfoFieldPropertiesDto } from '../model'; import { ArrayFieldPropertiesDto, AssetsFieldPropertiesDto, BooleanFieldPropertiesDto, ComponentFieldPropertiesDto, ComponentsFieldPropertiesDto, DateTimeFieldPropertiesDto, fieldInvariant, FieldPropertiesVisitor, GeolocationFieldPropertiesDto, JsonFieldPropertiesDto, NumberFieldPropertiesDto, ReferencesFieldPropertiesDto, RichTextFieldPropertiesDto, StringFieldPropertiesDto, TagsFieldPropertiesDto, UIFieldPropertiesDto } from '../model'; export class HtmlValue { @@ -276,6 +276,10 @@ export class FieldFormatter implements FieldPropertiesVisitor { return this.value; } + public visitUserInfo(_: UserInfoFieldPropertiesDto): string { + return 'User'; + } + private formatArray(singularName: string, pluralName: string) { if (!Types.isArray(this.value)) { return `0 ${pluralName}`; @@ -448,6 +452,10 @@ export class FieldsValidators implements FieldPropertiesVisitor { return []; } + + public visitUserInfo(_: UserInfoFieldPropertiesDto): ReadonlyArray { + return []; + } } export class FieldDefaultValue implements FieldPropertiesVisitor { @@ -533,6 +541,14 @@ export class FieldDefaultValue implements FieldPropertiesVisitor { return null; } + public visitUserInfo(properties: UserInfoFieldPropertiesDto): any { + if (!!properties.defaultRole) { + return { apiKey: generateApiKey(), role: properties.defaultRole }; + } + + return null; + } + private getValue(value: any, values?: any) { if (values && values.hasOwnProperty(this.partitionKey)) { return values[this.partitionKey]; @@ -541,3 +557,16 @@ export class FieldDefaultValue implements FieldPropertiesVisitor { return value; } } + +export function generateApiKey() { + const uuid = crypto.randomUUID(); + + const base64 = btoa(uuid); + + const cleaned = base64 + .replace(/\+/g, '') + .replace(/\//g, '') + .replace(/=+$/, ''); + + return cleaned; +} \ No newline at end of file diff --git a/frontend/src/app/shared/state/roles.state.ts b/frontend/src/app/shared/state/roles.state.ts index a11464a01..aeb928095 100644 --- a/frontend/src/app/shared/state/roles.state.ts +++ b/frontend/src/app/shared/state/roles.state.ts @@ -6,7 +6,7 @@ */ import { Injectable } from '@angular/core'; -import { Observable } from 'rxjs'; +import { EMPTY, Observable } from 'rxjs'; import { finalize, tap } from 'rxjs/operators'; import { debug, DialogService, LoadingState, shareSubscribed, State, VersionTag } from '@app/framework'; import { AddRoleDto, RoleDto, RolesDto, UpdateRoleDto } from '../model'; @@ -64,6 +64,14 @@ export class RolesState extends State { debug(this, 'roles'); } + public loadIfNotLoaded(): Observable { + if (this.snapshot.isLoaded) { + return EMPTY; + } + + return this.loadInternal(false); + } + public load(isReload = false): Observable { if (!isReload) { this.resetState('Loading Initial'); diff --git a/frontend/src/app/shared/state/schemas.forms.ts b/frontend/src/app/shared/state/schemas.forms.ts index 9e3e4be8b..59942f87e 100644 --- a/frontend/src/app/shared/state/schemas.forms.ts +++ b/frontend/src/app/shared/state/schemas.forms.ts @@ -386,6 +386,10 @@ export class EditFieldFormVisitor implements FieldPropertiesVisitor { this.config['minItems'] = new UntypedFormControl(undefined); } + public visitUserInfo() { + this.config['defaultRole'] = new UntypedFormControl(undefined); + } + public visitGeolocation() { return undefined; } diff --git a/frontend/src/app/theme/icomoon/Read Me.txt b/frontend/src/app/theme/icomoon/Read Me.txt index 723a49eee..6fceb3881 100644 --- a/frontend/src/app/theme/icomoon/Read Me.txt +++ b/frontend/src/app/theme/icomoon/Read Me.txt @@ -1,6 +1,6 @@ Open *demo.html* to see a list of all the glyphs in your font along with their codes/ligatures. -To use the generated font in desktop programs, you can install the TTF font. In order to copy the character associated with each icon, refer to the text box at the bottom right corner of each glyph in demo.html. The character inside this text box may be invisible; but it can still be copied. See this guide for more info: https://icomoon.io/docs/#local-fonts +To use the generated font in desktop programs, you can install the TTF font. In order to copy the character associated with each icon, refer to the text box at the bottom right corner of each glyph in demo.html. The character inside this text box may be invisible; but it can still be copied. See this guide for more info: https://icomoon.io/docs#install You won't need any of the files located under the *demo-files* directory when including the generated font in your own projects. diff --git a/frontend/src/app/theme/icomoon/demo.html b/frontend/src/app/theme/icomoon/demo.html index c632f3241..e22a6d4f3 100644 --- a/frontend/src/app/theme/icomoon/demo.html +++ b/frontend/src/app/theme/icomoon/demo.html @@ -1178,6 +1178,20 @@
+
+
+ + icon-type-UserInfo +
+
+ + +
+
+ liga: + +
+
diff --git a/frontend/src/app/theme/icomoon/fonts/icomoon.eot b/frontend/src/app/theme/icomoon/fonts/icomoon.eot index 1ec0b9fad..0adc71481 100644 Binary files a/frontend/src/app/theme/icomoon/fonts/icomoon.eot and b/frontend/src/app/theme/icomoon/fonts/icomoon.eot differ diff --git a/frontend/src/app/theme/icomoon/fonts/icomoon.svg b/frontend/src/app/theme/icomoon/fonts/icomoon.svg index 83b032f61..e1da95dfa 100644 --- a/frontend/src/app/theme/icomoon/fonts/icomoon.svg +++ b/frontend/src/app/theme/icomoon/fonts/icomoon.svg @@ -57,7 +57,7 @@ - + diff --git a/frontend/src/app/theme/icomoon/fonts/icomoon.ttf b/frontend/src/app/theme/icomoon/fonts/icomoon.ttf index ba598c157..0c0401f7e 100644 Binary files a/frontend/src/app/theme/icomoon/fonts/icomoon.ttf and b/frontend/src/app/theme/icomoon/fonts/icomoon.ttf differ diff --git a/frontend/src/app/theme/icomoon/fonts/icomoon.woff b/frontend/src/app/theme/icomoon/fonts/icomoon.woff index 6bd7cd0bf..eca7bb50c 100644 Binary files a/frontend/src/app/theme/icomoon/fonts/icomoon.woff and b/frontend/src/app/theme/icomoon/fonts/icomoon.woff differ diff --git a/frontend/src/app/theme/icomoon/selection.json b/frontend/src/app/theme/icomoon/selection.json index 437a676f9..a9889f9bc 100644 --- a/frontend/src/app/theme/icomoon/selection.json +++ b/frontend/src/app/theme/icomoon/selection.json @@ -1 +1 @@ -{"IcoMoonType":"selection","icons":[{"icon":{"paths":["M213.333 554.667h597.333c23.552 0 42.667-19.115 42.667-42.667s-19.115-42.667-42.667-42.667h-597.333c-23.552 0-42.667 19.115-42.667 42.667s19.115 42.667 42.667 42.667z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["minus"],"grid":24},"attrs":[{}],"properties":{"order":1,"id":1,"prevSize":24,"code":59798,"name":"minus2"},"setIdx":0,"setId":2,"iconIdx":0},{"icon":{"paths":["M213.333 554.667h256v256c0 23.552 19.115 42.667 42.667 42.667s42.667-19.115 42.667-42.667v-256h256c23.552 0 42.667-19.115 42.667-42.667s-19.115-42.667-42.667-42.667h-256v-256c0-23.552-19.115-42.667-42.667-42.667s-42.667 19.115-42.667 42.667v256h-256c-23.552 0-42.667 19.115-42.667 42.667s19.115 42.667 42.667 42.667z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["plus"],"grid":24},"attrs":[{}],"properties":{"order":2,"id":0,"prevSize":24,"code":59799,"name":"plus2"},"setIdx":0,"setId":2,"iconIdx":1},{"icon":{"paths":["M512 890.112c-50.517-28.672-188.587-114.987-258.133-236.757-3.371-5.888-6.528-11.776-9.515-17.792-19.456-38.869-31.019-80.128-31.019-123.563v-269.099l298.667-112 298.667 112v269.099c0 43.435-11.563 84.693-30.976 123.605-2.987 5.973-6.187 11.904-9.515 17.792-69.589 121.771-207.659 208.043-258.133 236.757zM531.072 976.811c0 0 212.864-105.6 313.173-281.131 4.096-7.168 8.021-14.507 11.776-21.973 24.235-48.427 39.979-102.741 39.979-161.707v-298.667c0-18.176-11.392-33.707-27.691-39.936l-341.333-128c-10.069-3.797-20.693-3.499-29.952 0l-341.333 128c-17.024 6.357-27.563 22.485-27.691 39.936v298.667c0 58.965 15.744 113.28 40.021 161.749 3.712 7.467 7.637 14.763 11.776 21.973 100.309 175.531 313.173 281.131 313.173 281.131 12.459 6.229 26.453 5.803 38.144 0z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["shield"],"grid":24},"attrs":[{}],"properties":{"order":1,"id":0,"prevSize":24,"code":59797,"name":"shield"},"setIdx":1,"setId":1,"iconIdx":0},{"icon":{"paths":["M634 558q92-64 92-174 0-88-63-151t-151-63-151 63-63 151q0 46 27 96t65 78l36 26v98h172v-98zM512 86q124 0 211 87t87 211q0 156-128 244v98q0 18-12 30t-30 12h-256q-18 0-30-12t-12-30v-98q-128-88-128-244 0-124 87-211t211-87zM384 896v-42h256v42q0 18-12 30t-30 12h-172q-18 0-30-12t-12-30z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["lightbulb_outline"],"grid":24},"attrs":[{}],"properties":{"order":1,"id":0,"prevSize":24,"code":59795,"name":"lightbulb_outline"},"setIdx":1,"setId":1,"iconIdx":1},{"icon":{"paths":["M256 86v256l170 170-170 172v254h512v-256l-170-170 170-170v-256h-512zM682 704v150h-340v-150l170-170z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["hourglass_top"],"grid":24},"attrs":[{}],"properties":{"order":1,"id":0,"prevSize":24,"code":59794,"name":"hourglass_top"},"setIdx":1,"setId":1,"iconIdx":2},{"icon":{"paths":["M726 470q70 0 120 50t50 120-50 120-120 50h-86v86l-128-128 128-128v86h96q34 0 60-26t26-60-26-60-60-26h-566v-84h556zM854 214v84h-684v-84h684zM170 810v-84h256v84h-256z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["wrap_text"],"grid":24},"attrs":[{}],"properties":{"order":1,"id":0,"prevSize":24,"code":59793,"name":"wrap_text"},"setIdx":1,"setId":1,"iconIdx":3},{"icon":{"paths":["M682 342h128v84h-212v-212h84v128zM598 810v-212h212v84h-128v128h-84zM342 342v-128h84v212h-212v-84h128zM214 682v-84h212v212h-84v-128h-128z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["fullscreen_exit"],"grid":24},"attrs":[{}],"properties":{"order":1,"id":1,"prevSize":24,"code":59791,"name":"fullscreen_exit"},"setIdx":1,"setId":1,"iconIdx":4},{"icon":{"paths":["M598 214h212v212h-84v-128h-128v-84zM726 726v-128h84v212h-212v-84h128zM214 426v-212h212v84h-128v128h-84zM298 598v128h128v84h-212v-212h84z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["fullscreen"],"grid":24},"attrs":[{}],"properties":{"order":2,"id":0,"prevSize":24,"code":59792,"name":"fullscreen"},"setIdx":1,"setId":1,"iconIdx":5},{"icon":{"paths":["M470 384l60 60-154 154h392v-428h86v512h-478l154 154-60 60-256-256z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["subdirectory_arrow_left"],"grid":24},"attrs":[{}],"properties":{"order":1,"id":0,"prevSize":24,"code":59780,"name":"enter"},"setIdx":1,"setId":1,"iconIdx":6},{"icon":{"paths":["M298 384h214v42h-214v-42zM406 598q80 0 136-56t56-136-56-136-136-56-136 56-56 136 56 136 136 56zM662 598l212 212-64 64-212-212v-34l-12-12q-76 66-180 66-116 0-197-80t-81-196 81-197 197-81 196 81 80 197q0 42-20 95t-46 85l12 12h34z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["zoom_out"],"grid":24},"attrs":[{}],"properties":{"order":1,"id":4,"prevSize":24,"code":59778,"name":"zoom_out"},"setIdx":1,"setId":1,"iconIdx":7},{"icon":{"paths":["M512 426h-86v86h-42v-86h-86v-42h86v-86h42v86h86v42zM406 598q80 0 136-56t56-136-56-136-136-56-136 56-56 136 56 136 136 56zM662 598l212 212-64 64-212-212v-34l-12-12q-76 66-180 66-116 0-197-80t-81-196 81-197 197-81 196 81 80 197q0 42-20 95t-46 85l12 12h34z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["zoom_in"],"grid":24},"attrs":[{}],"properties":{"order":2,"id":3,"prevSize":24,"code":59779,"name":"zoom_in"},"setIdx":1,"setId":1,"iconIdx":8},{"icon":{"paths":["M810 896v-86h86q0 34-26 60t-60 26zM810 554v-84h86v84h-86zM640 214v-86h86v86h-86zM810 726v-86h86v86h-86zM470 982v-940h84v940h-84zM810 128q34 0 60 26t26 60h-86v-86zM128 214q0-34 26-60t60-26h170v86h-170v596h170v86h-170q-34 0-60-26t-26-60v-596zM810 384v-86h86v86h-86zM640 896v-86h86v86h-86z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["flip"],"grid":24},"attrs":[{}],"properties":{"order":1,"id":2,"name":"flip","prevSize":24,"code":59775},"setIdx":1,"setId":1,"iconIdx":9},{"icon":{"paths":["M720 660q34-46 44-106h86q-12 92-68 166zM554 764q60-10 106-44l62 62q-72 56-168 68v-86zM850 470h-86q-10-60-44-106l62-60q58 72 68 166zM664 236l-194 190v-166q-92 16-153 87t-61 165 61 165 153 87v86q-126-16-213-112t-87-226 87-226 213-112v-132z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["rotate_right"],"grid":24},"attrs":[{}],"properties":{"order":1,"id":1,"name":"rotate_right","prevSize":24,"code":59776},"setIdx":1,"setId":1,"iconIdx":10},{"icon":{"paths":["M554 174q126 16 213 112t87 226-87 226-213 112v-86q92-16 153-87t61-165-61-165-153-87v166l-194-190 194-194v132zM302 782l62-62q46 34 106 44v86q-96-12-168-68zM260 554q10 58 42 106l-60 60q-56-74-68-166h86zM304 364q-36 52-44 106h-86q12-90 70-166z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["rotate_left"],"grid":24},"attrs":[{}],"properties":{"order":2,"id":0,"name":"rotate_left","prevSize":24,"code":59777},"setIdx":1,"setId":1,"iconIdx":11},{"icon":{"paths":["M810 598v-86h-128v-128h-84v128h-128v86h128v128h84v-128h128zM854 256q36 0 60 25t24 61v426q0 36-24 61t-60 25h-684q-36 0-60-25t-24-61v-512q0-36 24-61t60-25h256l86 86h342z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["create_new_folder"],"grid":24},"attrs":[{}],"properties":{"order":1,"id":1,"prevSize":24,"code":59771,"name":"create_new_folder"},"setIdx":1,"setId":1,"iconIdx":12},{"icon":{"paths":["M426 170l86 86h342q34 0 59 26t25 60v426q0 34-25 60t-59 26h-684q-34 0-59-26t-25-60v-512q0-34 25-60t59-26h256z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["folder"],"grid":24},"attrs":[{}],"properties":{"order":2,"id":0,"prevSize":24,"code":59772,"name":"folder"},"setIdx":1,"setId":1,"iconIdx":13},{"icon":{"paths":["M512 256q70 0 120 50t50 120q0 54-64 111t-64 103h-84q0-46 20-79t44-48 44-37 20-50q0-34-26-59t-60-25-60 25-26 59h-84q0-70 50-120t120-50zM512 854q140 0 241-101t101-241-101-241-241-101-241 101-101 241 101 241 241 101zM512 86q176 0 301 125t125 301-125 301-301 125-301-125-125-301 125-301 301-125zM470 768v-86h84v86h-84z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["help_outline"],"grid":24},"attrs":[{}],"properties":{"order":1,"id":0,"prevSize":24,"code":59770,"name":"help2"},"setIdx":1,"setId":1,"iconIdx":14},{"icon":{"paths":["M236.416 92.117c-6.528-4.267-14.507-6.784-23.083-6.784-23.552 0-42.667 19.115-42.667 42.667v768c-0.043 7.765 2.133 15.872 6.784 23.083 12.757 19.84 39.125 25.557 58.965 12.8l597.333-384c4.864-3.072 9.344-7.424 12.8-12.8 12.757-19.84 6.997-46.208-12.8-58.965zM256 206.165l475.776 305.835-475.776 305.835z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["play"],"grid":24},"attrs":[{}],"properties":{"order":1,"id":0,"prevSize":24,"code":59769,"name":"trigger-Manual, play-line"},"setIdx":1,"setId":1,"iconIdx":15},{"icon":{"paths":["M128 170.667v298.667c0 58.88 23.936 112.299 62.464 150.869s91.989 62.464 150.869 62.464h409.003l-140.501 140.501c-16.683 16.683-16.683 43.691 0 60.331s43.691 16.683 60.331 0l213.333-213.333c3.925-3.925 7.083-8.619 9.259-13.824s3.243-10.795 3.243-16.341c0-10.923-4.181-21.845-12.501-30.165l-213.333-213.333c-16.683-16.683-43.691-16.683-60.331 0s-16.683 43.691 0 60.331l140.501 140.501h-409.003c-35.371 0-67.285-14.293-90.496-37.504s-37.504-55.125-37.504-90.496v-298.667c0-23.552-19.115-42.667-42.667-42.667s-42.667 19.115-42.667 42.667z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["corner-down-right"],"grid":24},"attrs":[{}],"properties":{"order":1,"id":0,"prevSize":24,"code":59767,"name":"corner-down-right"},"setIdx":1,"setId":1,"iconIdx":16},{"icon":{"paths":["M470 384v-86h84v86h-84zM512 854c188 0 342-154 342-342s-154-342-342-342-342 154-342 342 154 342 342 342zM512 86c236 0 426 190 426 426s-190 426-426 426-426-190-426-426 190-426 426-426zM470 726v-256h84v256h-84z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["info_outline"],"grid":24},"attrs":[{}],"properties":{"order":128,"id":0,"prevSize":24,"code":59764,"name":"info-outline"},"setIdx":1,"setId":1,"iconIdx":17},{"icon":{"paths":["M214 768h596v86h-596v-86zM384 682v-256h-170l298-298 298 298h-170v256h-256z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["file_upload"],"grid":24},"attrs":[{}],"properties":{"order":1,"id":0,"prevSize":24,"code":59762,"name":"upload-2"},"setIdx":1,"setId":1,"iconIdx":18},{"icon":{"paths":["M678 726h138l-70-186zM790 426l192 512h-86l-48-128h-202l-48 128h-86l192-512h86zM550 642l-34 88-132-132-214 212-60-60 218-214c-54-60-96-124-128-194h86c26 50 58 98 98 142 62-68 108-146 136-228h-478v-86h300v-84h84v84h300v86h-126c-32 100-84 196-158 278l-2 2z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["translate"],"grid":24},"attrs":[{}],"properties":{"order":1,"id":0,"prevSize":24,"code":59759,"name":"translate"},"setIdx":1,"setId":1,"iconIdx":19},{"icon":{"paths":["M854 470v84h-520l238 240-60 60-342-342 342-342 60 60-238 240h520z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["arrow_back"],"grid":24},"attrs":[{}],"properties":{"order":1,"id":1,"prevSize":24,"code":59758,"name":"arrow_back"},"setIdx":1,"setId":1,"iconIdx":20},{"icon":{"paths":["M768 512c-25.6 0-42.667 17.067-42.667 42.667v256c0 25.6-17.067 42.667-42.667 42.667h-469.333c-25.6 0-42.667-17.067-42.667-42.667v-469.333c0-25.6 17.067-42.667 42.667-42.667h256c25.6 0 42.667-17.067 42.667-42.667s-17.067-42.667-42.667-42.667h-256c-72.533 0-128 55.467-128 128v469.333c0 72.533 55.467 128 128 128h469.333c72.533 0 128-55.467 128-128v-256c0-25.6-17.067-42.667-42.667-42.667z","M934.4 110.933c-4.267-8.533-12.8-17.067-21.333-21.333-4.267-4.267-12.8-4.267-17.067-4.267h-256c-25.6 0-42.667 17.067-42.667 42.667s17.067 42.667 42.667 42.667h153.6l-396.8 396.8c-17.067 17.067-17.067 42.667 0 59.733 8.533 8.533 17.067 12.8 29.867 12.8s21.333-4.267 29.867-12.8l396.8-396.8v153.6c0 25.6 17.067 42.667 42.667 42.667s42.667-17.067 42.667-42.667v-256c0-4.267 0-12.8-4.267-17.067z"],"attrs":[{},{}],"isMulticolor":false,"isMulticolor2":false,"tags":["external-link"],"grid":24},"attrs":[{},{}],"properties":{"order":1,"id":2,"prevSize":24,"code":59757,"name":"external-link"},"setIdx":1,"setId":1,"iconIdx":21},{"icon":{"paths":["M810.667 85.333h-597.333c-72.533 0-128 55.467-128 128v597.333c0 72.533 55.467 128 128 128h597.333c72.533 0 128-55.467 128-128v-597.333c0-72.533-55.467-128-128-128zM853.333 810.667c0 25.6-17.067 42.667-42.667 42.667h-597.333c-25.6 0-42.667-17.067-42.667-42.667v-597.333c0-25.6 17.067-42.667 42.667-42.667h597.333c25.6 0 42.667 17.067 42.667 42.667v597.333z","M682.667 469.333h-341.333c-25.6 0-42.667 17.067-42.667 42.667s17.067 42.667 42.667 42.667h341.333c25.6 0 42.667-17.067 42.667-42.667s-17.067-42.667-42.667-42.667z"],"attrs":[{},{}],"isMulticolor":false,"isMulticolor2":false,"tags":["minus-square"],"grid":24},"attrs":[{},{}],"properties":{"order":1,"id":3,"prevSize":24,"code":59753,"name":"minus-square"},"setIdx":1,"setId":1,"iconIdx":22},{"icon":{"paths":["M810.667 85.333h-597.333c-72.533 0-128 55.467-128 128v597.333c0 72.533 55.467 128 128 128h597.333c72.533 0 128-55.467 128-128v-597.333c0-72.533-55.467-128-128-128zM853.333 810.667c0 25.6-17.067 42.667-42.667 42.667h-597.333c-25.6 0-42.667-17.067-42.667-42.667v-597.333c0-25.6 17.067-42.667 42.667-42.667h597.333c25.6 0 42.667 17.067 42.667 42.667v597.333z","M682.667 469.333h-128v-128c0-25.6-17.067-42.667-42.667-42.667s-42.667 17.067-42.667 42.667v128h-128c-25.6 0-42.667 17.067-42.667 42.667s17.067 42.667 42.667 42.667h128v128c0 25.6 17.067 42.667 42.667 42.667s42.667-17.067 42.667-42.667v-128h128c25.6 0 42.667-17.067 42.667-42.667s-17.067-42.667-42.667-42.667z"],"attrs":[{},{}],"isMulticolor":false,"isMulticolor2":false,"tags":["plus-square"],"grid":24},"attrs":[{},{}],"properties":{"order":1,"id":4,"name":"plus-square","prevSize":24,"code":59752},"setIdx":1,"setId":1,"iconIdx":23},{"icon":{"paths":["M170 640v-86h684v86h-684zM854 384v86h-684v-86h684z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["drag_handle"],"grid":24},"attrs":[{}],"properties":{"order":1,"id":5,"prevSize":24,"code":59745,"name":"drag2"},"setIdx":1,"setId":1,"iconIdx":24},{"icon":{"paths":["M854 682v-512h-684v598l86-86h598zM854 86c46 0 84 38 84 84v512c0 46-38 86-84 86h-598l-170 170v-768c0-46 38-84 84-84h684z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["chat_bubble_outline"],"grid":24},"attrs":[{}],"properties":{"order":133,"id":6,"name":"comments","prevSize":24,"code":59743},"setIdx":1,"setId":1,"iconIdx":25},{"icon":{"paths":["M512 128c212 0 384 172 384 384s-172 384-384 384c-88 0-170-30-234-80l60-60c50 34 110 54 174 54 166 0 298-132 298-298s-132-298-298-298-298 132-298 298h128l-172 170-170-170h128c0-212 172-384 384-384zM598 512c0 46-40 86-86 86s-86-40-86-86 40-86 86-86 86 40 86 86z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["settings_backup_restore"],"grid":24},"attrs":[{}],"properties":{"order":1,"id":7,"prevSize":24,"code":59739,"name":"backup"},"setIdx":1,"setId":1,"iconIdx":26},{"icon":{"paths":["M726 512c0 24-20 42-44 42h-426l-170 172v-598c0-24 18-42 42-42h554c24 0 44 18 44 42v384zM896 256c24 0 42 18 42 42v640l-170-170h-470c-24 0-42-18-42-42v-86h554v-384h86z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["question_answer"],"grid":24},"attrs":[{}],"properties":{"order":1,"id":8,"prevSize":24,"code":59738,"name":"support"},"setIdx":1,"setId":1,"iconIdx":27},{"icon":{"paths":["M918 384v128h-128v298h-128v-298h-128v-128h384zM106 170h556v128h-214v512h-128v-512h-214v-128z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["text_fields"],"grid":24},"attrs":[{}],"properties":{"order":75,"id":9,"prevSize":24,"code":59705,"name":"control-RichText, type-RichText"},"setIdx":1,"setId":1,"iconIdx":28},{"icon":{"paths":["M640 85.333q78 0 149.167 30.5t122.5 81.833 81.833 122.5 30.5 149.167q0 85-35 160.667t-96.667 129.167-140 77.5l21-20.667q18-18.333 28-42.667 9.333-22.667 9.333-49.333 0-6.667-0.333-9.333 59.333-41.333 93.833-105.833t34.5-139.5q0-60.667-23.667-116t-63.667-95.333-95.333-63.667-116-23.667q-55.333 0-106.5 19.833t-90 53.833-65 81.333-33.833 101h-88.667q-70.667 0-120.667 50t-50 120.667q0 38.667 15.167 71.667t39.833 54.167 54.833 33 60.833 11.833h50q11.667 29.333 30 48l37.667 37.333h-117.667q-69.667 0-128.5-34.333t-93.167-93.167-34.333-128.5 34.333-128.5 93.167-93.167 128.5-34.333h22q26.333-74.333 79.333-132.167t126.833-90.833 155.833-33zM554.667 426.667q17.667 0 30.167 12.5t12.5 30.167v281l55-55.333q12.333-12.333 30.333-12.333 18.333 0 30.5 12.167t12.167 30.5q0 18-12.333 30.333l-128 128q-12.333 12.333-30.333 12.333t-30.333-12.333l-128-128q-12.333-13-12.333-30.333 0-17.667 12.5-30.167t30.167-12.5q18 0 30.333 12.333l55 55.333v-281q0-17.667 12.5-30.167t30.167-12.5z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["cloud-download"],"grid":24},"attrs":[{}],"properties":{"order":1,"id":10,"prevSize":24,"code":59710,"name":"download"},"setIdx":1,"setId":1,"iconIdx":29},{"icon":{"paths":["M647.429 596c10.857 10.286 13.714 26.286 8 39.429-5.714 13.714-18.857 22.857-33.714 22.857h-218.286l114.857 272c8 18.857-1.143 40-19.429 48l-101.143 42.857c-18.857 8-40-1.143-48-19.429l-109.143-258.286-178.286 178.286c-6.857 6.857-16 10.857-25.714 10.857-4.571 0-9.714-1.143-13.714-2.857-13.714-5.714-22.857-18.857-22.857-33.714v-859.429c0-14.857 9.143-28 22.857-33.714 4-1.714 9.143-2.857 13.714-2.857 9.714 0 18.857 3.429 25.714 10.857z"],"attrs":[{}],"width":661,"isMulticolor":false,"isMulticolor2":false,"tags":["mouse-pointer"],"grid":14},"attrs":[{}],"properties":{"order":1,"id":0,"prevSize":28,"code":59796,"name":"mouse-pointer"},"setIdx":1,"setId":1,"iconIdx":30},{"icon":{"paths":["M32 591.125c-0.135-0.002-0.294-0.003-0.453-0.003-17.675 0-32.003 14.328-32.003 32.003s14.328 32.003 32.003 32.003c0.159 0 0.318-0.001 0.477-0.003l-0.024 0h932.5c0.135 0.002 0.294 0.003 0.453 0.003 17.675 0 32.003-14.328 32.003-32.003s-14.328-32.003-32.003-32.003c-0.159 0-0.318 0.001-0.477 0.003l0.024-0z","M283.5 192c-48.529 0.018-93.046 27.658-114.625 71.125l-165.5 330.5c-2.128 4.168-3.375 9.091-3.375 14.305 0 0.025 0 0.049 0 0.074l-0-0.004v288c0 70.313 57.687 128 128 128h768c70.313 0 128-57.687 128-128v-288c0-0.021 0-0.045 0-0.070 0-5.214-1.247-10.137-3.459-14.487l0.084 0.182-165.625-330.625c-21.582-43.39-66.034-70.95-114.5-71zM283.5 256h457c24.351 0.025 46.422 13.689 57.25 35.5-0 0.019-0 0.040-0 0.062s0 0.044 0 0.066l-0-0.003 162.25 324v280.375c0 35.725-28.275 64-64 64h-768c-35.725 0-64-28.275-64-64v-280.375l162.125-324c0.042-0.042 0.083-0.083 0.123-0.123l0.001-0.001c10.835-21.826 32.883-35.491 57.25-35.5z","M231.625 790.75c-0.135-0.002-0.293-0.003-0.453-0.003-17.675 0-32.003 14.328-32.003 32.003s14.328 32.003 32.003 32.003c0.159 0 0.318-0.001 0.477-0.003l-0.024 0c0.135 0.002 0.293 0.003 0.453 0.003 17.675 0 32.003-14.328 32.003-32.003s-14.328-32.003-32.003-32.003c-0.159 0-0.318 0.001-0.477 0.003l0.024-0z","M431.125 790.75c-0.135-0.002-0.293-0.003-0.453-0.003-17.675 0-32.003 14.328-32.003 32.003s14.328 32.003 32.003 32.003c0.159 0 0.318-0.001 0.477-0.003l-0.024 0c0.135 0.002 0.293 0.003 0.453 0.003 17.675 0 32.003-14.328 32.003-32.003s-14.328-32.003-32.003-32.003c-0.159 0-0.318 0.001-0.477 0.003l0.024-0z"],"attrs":[{},{},{},{}],"isMulticolor":false,"isMulticolor2":false,"grid":14,"tags":["backups"]},"attrs":[{},{},{},{}],"properties":{"order":146,"id":56,"name":"backups","prevSize":28,"code":59783},"setIdx":1,"setId":1,"iconIdx":31},{"icon":{"paths":["M205.75 684.876c-116.072 2.994-208.526 100.048-205.75 216.125v91.125c-0.002 0.135-0.003 0.293-0.003 0.453 0 17.675 14.328 32.003 32.003 32.003s32.003-14.328 32.003-32.003c0-0.159-0.001-0.318-0.003-0.477l0 0.024v-91.875c0.001-0.111 0.002-0.243 0.002-0.375s-0.001-0.264-0.002-0.395l0 0.020c-1.95-81.542 61.837-148.522 143.375-150.625h347.5c81.538 2.103 145.2 69.083 143.25 150.625-0.001 0.111-0.002 0.243-0.002 0.375s0.001 0.264 0.002 0.395l-0-0.020v91.875c-0.002 0.135-0.003 0.293-0.003 0.453 0 17.675 14.328 32.003 32.003 32.003s32.003-14.328 32.003-32.003c0-0.159-0.001-0.318-0.003-0.477l0 0.024v-91.125c2.776-116.077-89.553-213.131-205.625-216.125-0.13-0.002-0.284-0.003-0.438-0.003s-0.307 0.001-0.461 0.003l0.023-0h-349.125c-0.111-0.001-0.243-0.002-0.375-0.002s-0.264 0.001-0.395 0.002l0.020-0z","M418.5 158.626c-114.011 0-207.625 91.723-207.625 204.625s93.614 204.5 207.625 204.5c114.011 0 207.625-91.598 207.625-204.5s-93.614-204.625-207.625-204.625zM418.5 222.626c80.040 0 143.625 62.94 143.625 140.625s-63.585 140.5-143.625 140.5c-80.040 0-143.625-62.815-143.625-140.5s63.585-140.625 143.625-140.625z","M860.625 690.626c-0.020-0-0.043-0-0.066-0-17.675 0-32.003 14.328-32.003 32.003 0 14.674 9.876 27.042 23.344 30.818l0.225 0.054c64.84 18.992 108.818 78.567 107.875 146.125-0.001 0.074-0.001 0.162-0.001 0.25s0 0.175 0.001 0.263l-0-0.013v91.875c-0.002 0.135-0.003 0.293-0.003 0.453 0 17.675 14.328 32.003 32.003 32.003s32.003-14.328 32.003-32.003c0-0.159-0.001-0.318-0.003-0.477l0 0.024v-91.5c1.34-96.005-61.732-181.386-153.875-208.375-2.836-0.933-6.1-1.48-9.49-1.5l-0.010-0z","M684.375 164.126c-17.015 0.826-30.498 14.822-30.498 31.968 0 15.282 10.711 28.062 25.036 31.243l0.213 0.040c73.504 17.494 106.625 75.198 106.625 135s-33.121 117.506-106.625 135c-14.723 3.073-25.625 15.944-25.625 31.361 0 17.675 14.328 32.003 32.003 32.003 2.978 0 5.861-0.407 8.596-1.168l-0.225 0.053c101.451-24.146 155.875-111.76 155.875-197.25s-54.424-173.104-155.875-197.25c-2.419-0.656-5.197-1.032-8.063-1.032-0.506 0-1.008 0.012-1.508 0.035l0.071-0.003z"],"attrs":[{},{},{},{}],"isMulticolor":false,"isMulticolor2":false,"grid":14,"tags":["clients"]},"attrs":[{},{},{},{}],"properties":{"order":147,"id":55,"name":"clients","prevSize":28,"code":59784},"setIdx":1,"setId":1,"iconIdx":32},{"icon":{"paths":["M156.505 775.014c-86.098 0-156.505 70.407-156.505 156.505v64.025c-0.002 0.12-0.003 0.261-0.003 0.402 0 15.717 12.741 28.458 28.458 28.458s28.458-12.741 28.458-28.458c0-0.141-0.001-0.283-0.003-0.424l0 0.021v-64.025c0-55.341 44.253-99.594 99.594-99.594h256.1c55.341 0 99.594 44.253 99.594 99.594v64.025c-0.002 0.12-0.003 0.261-0.003 0.402 0 15.717 12.741 28.458 28.458 28.458s28.458-12.741 28.458-28.458c0-0.141-0.001-0.283-0.003-0.424l0 0.021v-64.025c0-86.098-70.407-156.505-156.505-156.505z","M284.555 390.865c-86.098 0-156.505 70.407-156.505 156.505s70.407 156.505 156.505 156.505c86.098 0 156.505-70.407 156.505-156.505s-70.407-156.505-156.505-156.505zM284.555 447.776c55.341 0 99.594 44.253 99.594 99.594s-44.253 99.594-99.594 99.594c-55.341 0-99.594-44.253-99.594-99.594s44.253-99.594 99.594-99.594z","M759.184 390.42c-15.525 0.25-28.014 12.894-28.014 28.455 0 0.157 0.001 0.313 0.004 0.469l-0-0.024v443.061c-0.002 0.12-0.003 0.261-0.003 0.402 0 15.717 12.741 28.458 28.458 28.458s28.458-12.741 28.458-28.458c0-0.141-0.001-0.283-0.003-0.424l0 0.021v-443.061c0.002-0.132 0.003-0.289 0.003-0.445 0-15.717-12.741-28.458-28.458-28.458-0.157 0-0.313 0.001-0.469 0.004l0.024-0z","M761.963 390.865c-7.832 0.065-14.899 3.283-20.005 8.445l-221.533 224.201c-5.32 5.176-8.62 12.405-8.62 20.404 0 15.717 12.741 28.458 28.458 28.458 8.11 0 15.427-3.392 20.611-8.835l0.011-0.012 201.3-203.746 201.301 203.746c5.17 5.24 12.349 8.486 20.287 8.486 15.736 0 28.492-12.756 28.492-28.492 0-7.8-3.134-14.867-8.211-20.012l0.003 0.003-221.642-224.198c-5.161-5.218-12.321-8.449-20.236-8.449-0.076 0-0.152 0-0.228 0.001l0.012-0z"],"attrs":[{},{},{},{}],"isMulticolor":false,"isMulticolor2":false,"grid":14,"tags":["contributors"]},"attrs":[{},{},{},{}],"properties":{"order":140,"id":54,"name":"contributors","prevSize":28,"code":59785},"setIdx":1,"setId":1,"iconIdx":33},{"icon":{"paths":["M512 0c-282.413 0-512 229.587-512 512s229.587 512 512 512c282.413 0 512-229.587 512-512s-229.587-512-512-512zM512 60.235c249.859 0 451.765 201.905 451.765 451.765s-201.905 451.765-451.765 451.765c-249.859 0-451.765-201.905-451.765-451.765s201.905-451.765 451.765-451.765z","M30.118 481.882c-0.127-0.002-0.276-0.003-0.426-0.003-16.635 0-30.121 13.485-30.121 30.121s13.485 30.121 30.121 30.121c0.15 0 0.299-0.001 0.448-0.003l-0.023 0h963.765c0.127 0.002 0.276 0.003 0.426 0.003 16.635 0 30.121-13.485 30.121-30.121s-13.485-30.121-30.121-30.121c-0.15 0-0.299 0.001-0.448 0.003l0.023-0z","M521.647 20.588c-8.005 0.591-15.062 4.227-20.097 9.741l-0.021 0.023c-119.234 130.527-187.021 299.957-190.706 476.706-0.004 0.175-0.006 0.381-0.006 0.588s0.002 0.413 0.006 0.619l-0-0.031c3.685 176.749 71.472 346.179 190.706 476.706 5.527 6.033 13.441 9.802 22.235 9.802s16.708-3.769 22.215-9.78l0.020-0.022c119.234-130.527 187.021-299.956 190.706-476.706 0.004-0.175 0.006-0.381 0.006-0.588s-0.002-0.413-0.006-0.619l0 0.031c-3.685-176.749-71.472-346.179-190.706-476.706-5.529-6.054-13.456-9.837-22.267-9.837-0.734 0-1.462 0.026-2.183 0.078l0.097-0.006zM523.765 106.353c92.106 114.621 149.373 253.509 152.588 401.294-3.216 147.779-60.489 286.675-152.588 401.294-92.103-114.621-149.373-253.511-152.588-401.294 3.216-147.789 60.478-286.671 152.588-401.294z"],"attrs":[{},{},{}],"isMulticolor":false,"isMulticolor2":false,"grid":14,"tags":["languages"]},"attrs":[{},{},{}],"properties":{"order":145,"id":53,"name":"languages","prevSize":28,"code":59786},"setIdx":1,"setId":1,"iconIdx":34},{"icon":{"paths":["M958.037 713.984c5.901 3.089 10.267 8.43 11.994 14.853l0.038 0.165c0.413 1.924 0.65 4.134 0.65 6.4 0 4.566-0.961 8.908-2.693 12.833l0.080-0.204-23.979 40.021c-3.089 5.901-8.43 10.267-14.853 11.994l-0.165 0.038c-1.924 0.413-4.134 0.65-6.4 0.65-4.566 0-8.908-0.961-12.833-2.693l0.204 0.080-349.867-201.984v403.883c0 0.025 0 0.055 0 0.085 0 13.196-10.697 23.893-23.893 23.893-0.030 0-0.060-0-0.090-0l0.005 0h-48.213c-0.025 0-0.055 0-0.085 0-13.196 0-23.893-10.697-23.893-23.893 0-0.030 0-0.060 0-0.090l-0 0.005v-404.053l-349.867 201.984c-3.722 1.651-8.063 2.613-12.629 2.613-2.266 0-4.476-0.237-6.608-0.687l0.208 0.037c-6.588-1.765-11.93-6.131-14.957-11.902l-0.062-0.13-24.149-39.851c-1.651-3.722-2.613-8.063-2.613-12.629 0-2.266 0.237-4.476 0.687-6.608l-0.037 0.208c1.765-6.588 6.131-11.93 11.902-14.957l0.13-0.062 349.952-201.984-350.037-201.984c-5.901-3.089-10.267-8.43-11.994-14.853l-0.038-0.165c-0.413-1.924-0.65-4.134-0.65-6.4 0-4.566 0.961-8.908 2.693-12.833l-0.080 0.204 23.979-40.021c3.089-5.901 8.43-10.267 14.853-11.994l0.165-0.038c1.924-0.413 4.134-0.65 6.4-0.65 4.566 0 8.908 0.961 12.833 2.693l-0.204-0.080 349.867 201.984v-403.968c-0.003-0.145-0.005-0.317-0.005-0.489 0-6.499 2.681-12.372 6.997-16.573l0.005-0.005c4.206-4.322 10.079-7.002 16.578-7.002 0.172 0 0.343 0.002 0.514 0.006l-0.025-0h47.957c0.145-0.003 0.317-0.005 0.489-0.005 6.499 0 12.372 2.681 16.573 6.997l0.005 0.005c4.322 4.206 7.002 10.079 7.002 16.578 0 0.172-0.002 0.343-0.006 0.514l0-0.025v403.968l349.867-201.984c3.722-1.651 8.063-2.613 12.629-2.613 2.266 0 4.476 0.237 6.608 0.687l-0.208-0.037c6.588 1.765 11.93 6.131 14.957 11.902l0.062 0.13 23.979 40.021c1.651 3.722 2.613 8.063 2.613 12.629 0 2.266-0.237 4.476-0.687 6.608l0.037-0.208c-1.765 6.588-6.131 11.93-11.902 14.957l-0.13 0.062-349.696 201.984z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"grid":14,"tags":["patterns"]},"attrs":[{}],"properties":{"order":144,"id":52,"name":"patterns","prevSize":28,"code":59787},"setIdx":1,"setId":1,"iconIdx":35},{"icon":{"paths":["M345.882 569.765c-54.454 0-93.859 39.044-121.294 72.824s-44.118 67.294-44.118 67.294c-2.389 4.219-3.798 9.265-3.798 14.641 0 16.635 13.485 30.121 30.121 30.121 12.135 0 22.594-7.176 27.364-17.516l0.077-0.187c0 0 14.348-28.391 37.059-56.353s52.544-50.588 74.588-50.588h277.059c22.044 0 51.878 22.626 74.588 50.588s37.059 56.353 37.059 56.353c4.848 10.526 15.307 17.702 27.441 17.702 16.635 0 30.121-13.485 30.121-30.121 0-5.375-1.408-10.422-3.875-14.791l0.078 0.15c0 0-16.682-33.515-44.118-67.294s-66.84-72.824-121.294-72.824z","M484.118 168.588c-89.664 0-163.059 73.277-163.059 162.941s73.395 163.059 163.059 163.059c89.664 0 162.941-73.395 162.941-163.059s-73.277-162.941-162.941-162.941zM484.118 228.824c57.11 0 102.706 45.596 102.706 102.706s-45.596 102.824-102.706 102.824c-57.11 0-102.824-45.713-102.824-102.824s45.713-102.706 102.824-102.706z","M120.471 0c-66.22 0-120.471 54.251-120.471 120.471v783.059c0 66.22 54.251 120.471 120.471 120.471h722.824c66.22 0 120.471-54.251 120.471-120.471v-783.059c0-66.22-54.251-120.471-120.471-120.471zM120.471 60.235h722.824c33.891 0 60.235 26.344 60.235 60.235v783.059c0 33.891-26.344 60.235-60.235 60.235h-722.824c-33.891 0-60.235-26.344-60.235-60.235v-783.059c0-33.891 26.344-60.235 60.235-60.235z","M391.529 782.941c-0.127-0.002-0.276-0.003-0.426-0.003-16.635 0-30.121 13.485-30.121 30.121s13.485 30.121 30.121 30.121c0.15 0 0.299-0.001 0.448-0.003l-0.023 0h180.706c0.127 0.002 0.276 0.003 0.426 0.003 16.635 0 30.121-13.485 30.121-30.121s-13.485-30.121-30.121-30.121c-0.15 0-0.299 0.001-0.448 0.003l0.023-0z"],"attrs":[{},{},{},{}],"width":964,"isMulticolor":false,"isMulticolor2":false,"grid":14,"tags":["roles"]},"attrs":[{},{},{},{}],"properties":{"order":143,"id":51,"name":"roles","prevSize":28,"code":59788},"setIdx":1,"setId":1,"iconIdx":36},{"icon":{"paths":["M855.509 941.69l7.314 34.328c0.337 1.714 0.53 3.686 0.53 5.702 0 5.892-1.648 11.398-4.508 16.084l0.077-0.136c-3.469 6.522-9.66 11.204-17.016 12.558l-0.149 0.023c-36.275 8.739-77.923 13.751-120.742 13.751-0.134 0-0.269-0-0.403-0l0.020 0c-3.435 0.087-7.48 0.136-11.536 0.136-111.713 0-214.681-37.447-297.034-100.474l1.175 0.863c-83.817-64.681-143.45-157.126-165.203-263.373l-0.49-2.867h-59.49c-0.166 0.004-0.362 0.006-0.558 0.006-7.428 0-14.139-3.064-18.941-7.997l-0.006-0.006c-4.881-4.798-7.905-11.472-7.905-18.851 0-0.196 0.002-0.391 0.006-0.585l-0 0.029v-18.237c-0.004-0.166-0.006-0.362-0.006-0.558 0-7.428 3.064-14.139 7.997-18.941l0.006-0.006c4.807-4.939 11.519-8.003 18.946-8.003 0.196 0 0.392 0.002 0.587 0.006l-0.029-0.001h47.884q-2.243-27.404-2.243-70.9c-0.029-1.956-0.045-4.265-0.045-6.578 0-24.275 1.789-48.132 5.242-71.447l-0.321 2.639h-50.615c-0.166 0.004-0.362 0.006-0.558 0.006-7.428 0-14.139-3.064-18.941-7.997l-0.006-0.006c-4.881-4.798-7.905-11.472-7.905-18.851 0-0.196 0.002-0.391 0.006-0.585l-0 0.029v-18.237c-0.004-0.166-0.006-0.362-0.006-0.558 0-7.428 3.064-14.139 7.997-18.941l0.006-0.006c4.807-4.938 11.518-8.001 18.945-8.001 0.163 0 0.325 0.001 0.487 0.004l-0.024-0h61.733c28.466-107.153 88.956-197.45 170.455-262.549l0.992-0.766c78.807-63.833 180.289-102.48 290.797-102.48 3.024 0 6.042 0.029 9.053 0.087l-0.452-0.007c37.267 0.031 73.546 4.186 108.428 12.034l-3.298-0.624c7.43 1.104 13.693 5.346 17.494 11.309l0.060 0.101c2.584 4.095 4.117 9.078 4.117 14.418 0 2.184-0.256 4.309-0.741 6.345l0.037-0.186-9.167 36.571c-1.931 6.644-5.964 12.163-11.318 15.932l-0.093 0.062c-4.144 3.232-9.425 5.183-15.163 5.183-1.919 0-3.788-0.218-5.582-0.631l0.167 0.032c-25.319-7.096-54.417-11.251-84.461-11.41l-0.092-0c-2.61-0.067-5.685-0.106-8.767-0.106-84.523 0-162.305 28.858-224.032 77.259l0.791-0.597c-63.522 50.125-110.592 118.549-133.414 197.278l-0.681 2.743h395.459c0.308-0.013 0.67-0.021 1.034-0.021 8.421 0 15.909 3.998 20.668 10.199l0.046 0.062c3.87 4.492 6.227 10.383 6.227 16.825 0 1.741-0.172 3.443-0.501 5.087l0.027-0.165-2.828 18.334c-1.095 7.053-4.844 13.073-10.174 17.116l-0.066 0.048c-4.736 3.543-10.693 5.694-17.15 5.754l-0.014 0h-409.6c-2.186 21.926-3.432 47.389-3.432 73.143s1.246 51.218 3.682 76.334l-0.25-3.191h372.541c0.308-0.013 0.67-0.021 1.034-0.021 8.421 0 15.909 3.998 20.668 10.199l0.046 0.062c3.87 4.492 6.227 10.383 6.227 16.825 0 1.741-0.172 3.443-0.501 5.087l0.027-0.165-4.584 18.237c0.031 0.413 0.049 0.895 0.049 1.38 0 6.466-3.146 12.197-7.991 15.746l-0.055 0.038c-4.513 3.345-10.136 5.433-16.235 5.655l-0.052 0.001h-356.547c20.764 82.906 67.838 152.643 131.672 201.629l0.862 0.636c62.224 46.492 140.664 74.44 225.632 74.44 3.443 0 6.875-0.046 10.296-0.137l-0.505 0.011c0.29 0.001 0.634 0.001 0.977 0.001 35.421 0 69.711-4.842 102.245-13.9l-2.675 0.636c1.85-0.447 3.975-0.704 6.159-0.704 5.341 0 10.323 1.533 14.532 4.183l-0.113-0.066c6.198 3.962 10.97 9.677 13.669 16.443l0.082 0.234z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"grid":14,"tags":["subscription"]},"attrs":[{}],"properties":{"order":142,"id":50,"name":"subscription","prevSize":28,"code":59789},"setIdx":1,"setId":1,"iconIdx":37},{"icon":{"paths":["M823.125 31.625c-17.62 0.072-31.877 14.372-31.877 32.003 0 9.085 3.786 17.286 9.865 23.111l0.011 0.011 132.375 130.875-132.375 130.875c-6.134 5.842-9.949 14.071-9.949 23.19 0 17.675 14.328 32.003 32.003 32.003 8.996 0 17.124-3.711 22.938-9.686l0.007-0.007 155.375-153.625c5.864-5.803 9.494-13.853 9.494-22.75s-3.631-16.947-9.492-22.747l-155.378-153.628c-5.815-5.942-13.917-9.625-22.879-9.625-0.043 0-0.085 0-0.128 0l0.007-0zM576 183.75c-0.135-0.002-0.293-0.003-0.453-0.003-17.675 0-32.003 14.328-32.003 32.003s14.328 32.003 32.003 32.003c0.159 0 0.318-0.001 0.477-0.003l-0.024 0h403c0.135 0.002 0.293 0.003 0.453 0.003 17.675 0 32.003-14.328 32.003-32.003s-14.328-32.003-32.003-32.003c-0.159 0-0.318 0.001-0.477 0.003l0.024-0z","M218.875 607.75c-8.624 0.212-16.371 3.805-21.997 9.497l-0.003 0.003-147.625 146c-10.536 5.383-17.624 16.16-17.624 28.591 0 2.992 0.41 5.887 1.178 8.634l-0.054-0.225c0.167 0.686 0.296 1.146 0.434 1.602l-0.059-0.227c1.502 5.803 4.423 10.792 8.375 14.75l-0-0 155.375 153.625c5.821 5.982 13.95 9.693 22.945 9.693 17.675 0 32.003-14.328 32.003-32.003 0-9.12-3.815-17.348-9.935-23.178l-0.013-0.012-101.875-100.75h327c0.135 0.002 0.293 0.003 0.453 0.003 17.675 0 32.003-14.328 32.003-32.003s-14.328-32.003-32.003-32.003c-0.159 0-0.318 0.001-0.477 0.003l0.024-0h-323.25l98.125-97c6.019-5.826 9.756-13.98 9.756-23.006 0-17.675-14.328-32.003-32.003-32.003-0.265 0-0.529 0.003-0.792 0.010l0.039-0.001z","M128 0c-70.358 0-128 57.642-128 128v192c0 70.358 57.642 128 128 128h192c70.358 0 128-57.642 128-128v-192c0-70.358-57.642-128-128-128zM128 64h192c36.010 0 64 27.99 64 64v192c0 36.010-27.99 64-64 64h-192c-36.010 0-64-27.99-64-64v-192c0-36.010 27.99-64 64-64z","M704 576c-70.358 0-128 57.642-128 128v192c0 70.358 57.642 128 128 128h192c70.358 0 128-57.642 128-128v-192c0-70.358-57.642-128-128-128zM704 640h192c36.010 0 64 27.99 64 64v192c0 36.010-27.99 64-64 64h-192c-36.010 0-64-27.99-64-64v-192c0-36.010 27.99-64 64-64z"],"attrs":[{},{},{},{}],"isMulticolor":false,"isMulticolor2":false,"grid":14,"tags":["workflows"]},"attrs":[{},{},{},{}],"properties":{"order":141,"id":49,"name":"workflows","prevSize":28,"code":59790},"setIdx":1,"setId":1,"iconIdx":38},{"icon":{"paths":["M251.429 100.571c-87.881 0-160 72.119-160 160v525.714c0 87.881 72.119 160 160 160h525.714c87.881 0 160-72.119 160-160v-525.714c0-87.881-72.119-160-160-160zM251.429 146.286h525.714c62.976 0 114.286 51.31 114.286 114.286v525.714c0 62.976-51.31 114.286-114.286 114.286h-525.714c-62.976 0-114.286-51.31-114.286-114.286v-525.714c0-62.976 51.31-114.286 114.286-114.286z","M397.714 246.857c-87.881 0-160 72.119-160 160v233.143c0 87.881 72.119 160 160 160h233.143c87.881 0 160-72.119 160-160v-233.143c0-87.881-72.119-160-160-160zM397.714 292.571h233.143c62.976 0 114.286 51.31 114.286 114.286v233.143c0 62.976-51.31 114.286-114.286 114.286h-233.143c-62.976 0-114.286-51.31-114.286-114.286v-233.143c0-62.976 51.31-114.286 114.286-114.286z","M361.143 424.368h-0.329c-12.617 0-22.857 10.24-22.857 22.857s10.24 22.857 22.857 22.857h306.944c12.617 0 22.857-10.24 22.857-22.857s-35.474-22.857-22.857-22.857h-0.329z","M402.286 561.511h-0.329c-12.617 0-22.857 10.24-22.857 22.857s10.24 22.857 22.857 22.857h224.658c12.617 0 22.857-10.24 22.857-22.857s-10.24-22.857-22.857-22.857h-0.329z"],"attrs":[{},{},{},{}],"isMulticolor":false,"isMulticolor2":false,"grid":14,"tags":["component"]},"attrs":[{},{},{},{}],"properties":{"order":139,"id":48,"name":"component","prevSize":28,"code":59782},"setIdx":1,"setId":1,"iconIdx":39},{"icon":{"paths":["M456.158 36.282c-12.145-0.032-24.18 1.32-35.941 3.974-23.536 5.313-45.906 15.872-65.238 31.342-77.826 61.631-80.817 179.217-6.302 244.772 0.028 0.028 0.084 0.086 0.113 0.114 0.020 0.018 0.038 0.039 0.058 0.057 0.037 0.039 0.074 0.076 0.112 0.112l0.001 0.001c4.727 4.044 7.287 9.964 7.097 16.182-0.003 0.018 0.003 0.038 0 0.057-0.008 0.085-0.012 0.184-0.012 0.284s0.004 0.199 0.013 0.296l-0.001-0.013c0 10.503-8.234 18.737-18.737 18.737h-290.707c-5.436-0.020-10.354 4.898-10.334 10.334v192.479c0.079 40.118 25.509 70.246 57.289 81.875 31.779 11.628 70.726 5.088 96.694-25.494 48.914-57.384 140.83-35.582 158.809 37.644 6.312 27.401 0.010 56.217-17.261 78.411-35.813 45.415-103.666 46.801-141.265 2.839-0.153-0.167-0.32-0.317-0.501-0.448l-0.010-0.007c-0.073-0.080-0.147-0.154-0.224-0.224l-0.003-0.002c-25.873-30.135-64.41-36.684-96.012-25.21-31.887 11.577-57.465 41.733-57.517 81.988v191.003c-0.020 5.436 4.898 10.354 10.334 10.334h745.955c5.436 0.020 10.354-4.898 10.334-10.334l-0.852-616.898c0.020-5.436-4.898-10.354-10.334-10.334h-222.401c-10.503 0-18.737-8.234-18.737-18.737-0.019-5.72 2.466-11.020 6.87-14.592 0.080-0.073 0.154-0.147 0.224-0.224l0.002-0.003 0.227-0.227c97.336-84.032 59.622-244.251-65.125-275.83-0.169-0.034-0.365-0.054-0.566-0.057l-0.002-0c-0.018-0.004-0.038 0.004-0.058 0h-0.113c-11.884-2.753-23.91-4.17-35.884-4.202zM454.682 105.041c6.891 0.035 13.821 0.856 20.667 2.441 73.201 17.648 95.396 109.369 38.439 158.582-30.669 26.067-37.154 65.105-25.38 96.921 11.773 31.813 42.084 57.204 82.329 57.006h164.090v499.65h-629.673l-0.795-133.884c0.026-10.44 8.193-18.619 18.623-18.68 5.89 0.174 11.341 2.823 15.103 7.324 0.055 0.060 0.111 0.116 0.169 0.17l0.002 0.002c0.028 0.028 0.086 0.087 0.114 0.113 65.15 75.665 183.646 73.404 245.737-4.769l0.058-0.058c0.076-0.085 0.151-0.178 0.22-0.275l0.007-0.010c30.825-38.562 42.246-89.164 31.058-137.234-0.010-0.168-0.030-0.324-0.062-0.475l0.004 0.021c-30.581-126.005-192.369-164.654-276.681-66.145-0.019 0.019-0.037 0.038-0.055 0.057l-0.001 0.001c-0.175 0.215-0.297 0.397-0.454 0.624-5.948 8.251-13.969 9.414-21.519 6.699-7.485-2.692-12.925-8.644-12.378-18.623v-0.172c0.003-0.041-0.003-0.073 0-0.113 0.017-0.131 0.045-0.267 0.057-0.397 0.002-0.043 0.003-0.092 0.003-0.142s-0.001-0.1-0.003-0.149l0 0.007v-133.259h233.53c40.255-0.052 70.451-25.629 82.045-57.517 11.514-31.669 4.916-70.308-25.38-96.183 0-0.008 0-0.018 0-0.028s-0-0.020-0-0.030l0 0.002c-0.064-0.053-0.108-0.117-0.172-0.17-0.106-0.123-0.218-0.234-0.337-0.337l-0.004-0.003c-43.965-37.601-42.63-105.454 2.782-141.265 11.117-8.651 23.938-14.535 37.36-17.488 6.716-1.478 13.596-2.249 20.497-2.214z"],"attrs":[{}],"width":839,"isMulticolor":false,"isMulticolor2":false,"grid":14,"tags":["noun_extension_1559208"]},"attrs":[{}],"properties":{"order":138,"id":46,"name":"plugin","prevSize":28,"code":59781},"setIdx":1,"setId":1,"iconIdx":40},{"icon":{"paths":["M340 548.571c0 4.571-2.286 9.714-5.714 13.143l-266.286 266.286c-3.429 3.429-8.571 5.714-13.143 5.714s-9.714-2.286-13.143-5.714l-28.571-28.571c-3.429-3.429-5.714-8.571-5.714-13.143s2.286-9.714 5.714-13.143l224.571-224.571-224.571-224.571c-3.429-3.429-5.714-8.571-5.714-13.143s2.286-9.714 5.714-13.143l28.571-28.571c3.429-3.429 8.571-5.714 13.143-5.714s9.714 2.286 13.143 5.714l266.286 266.286c3.429 3.429 5.714 8.571 5.714 13.143zM559.429 548.571c0 4.571-2.286 9.714-5.714 13.143l-266.286 266.286c-3.429 3.429-8.571 5.714-13.143 5.714s-9.714-2.286-13.143-5.714l-28.571-28.571c-3.429-3.429-5.714-8.571-5.714-13.143s2.286-9.714 5.714-13.143l224.571-224.571-224.571-224.571c-3.429-3.429-5.714-8.571-5.714-13.143s2.286-9.714 5.714-13.143l28.571-28.571c3.429-3.429 8.571-5.714 13.143-5.714s9.714 2.286 13.143 5.714l266.286 266.286c3.429 3.429 5.714 8.571 5.714 13.143z"],"attrs":[{}],"width":567,"isMulticolor":false,"isMulticolor2":false,"tags":["angle-double-right"],"grid":14},"attrs":[{}],"properties":{"order":1,"id":1,"prevSize":28,"code":59773,"name":"angle-double-right"},"setIdx":1,"setId":1,"iconIdx":41},{"icon":{"paths":["M358.286 786.286c0 4.571-2.286 9.714-5.714 13.143l-28.571 28.571c-3.429 3.429-8.571 5.714-13.143 5.714s-9.714-2.286-13.143-5.714l-266.286-266.286c-3.429-3.429-5.714-8.571-5.714-13.143s2.286-9.714 5.714-13.143l266.286-266.286c3.429-3.429 8.571-5.714 13.143-5.714s9.714 2.286 13.143 5.714l28.571 28.571c3.429 3.429 5.714 8.571 5.714 13.143s-2.286 9.714-5.714 13.143l-224.571 224.571 224.571 224.571c3.429 3.429 5.714 8.571 5.714 13.143zM577.714 786.286c0 4.571-2.286 9.714-5.714 13.143l-28.571 28.571c-3.429 3.429-8.571 5.714-13.143 5.714s-9.714-2.286-13.143-5.714l-266.286-266.286c-3.429-3.429-5.714-8.571-5.714-13.143s2.286-9.714 5.714-13.143l266.286-266.286c3.429-3.429 8.571-5.714 13.143-5.714s9.714 2.286 13.143 5.714l28.571 28.571c3.429 3.429 5.714 8.571 5.714 13.143s-2.286 9.714-5.714 13.143l-224.571 224.571 224.571 224.571c3.429 3.429 5.714 8.571 5.714 13.143z"],"attrs":[{}],"width":603,"isMulticolor":false,"isMulticolor2":false,"tags":["angle-double-left"],"grid":14},"attrs":[{}],"properties":{"order":2,"id":0,"prevSize":28,"code":59774,"name":"angle-double-left"},"setIdx":1,"setId":1,"iconIdx":42},{"icon":{"paths":["M938.667 85.333h-853.333c-23.552 0-42.667 19.115-42.667 42.667 0 10.539 3.797 20.181 10.069 27.563l331.264 391.68v263.424c0 16.597 9.472 31.019 23.595 38.144l170.667 85.333c21.077 10.539 46.72 2.005 57.259-19.072 3.072-6.229 4.523-12.843 4.48-19.072v-348.757l331.264-391.68c15.232-18.005 12.971-44.928-5.035-60.117-8.064-6.827-17.877-10.155-27.563-10.112z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["filter"],"grid":14},"attrs":[{}],"properties":{"order":1,"id":0,"prevSize":28,"code":59768,"name":"filter-filled"},"setIdx":1,"setId":1,"iconIdx":43},{"icon":{"paths":["M950.857 932.571v-621.714c0-9.714-8.571-18.286-18.286-18.286h-621.714c-9.714 0-18.286 8.571-18.286 18.286v621.714c0 9.714 8.571 18.286 18.286 18.286h621.714c9.714 0 18.286-8.571 18.286-18.286zM1024 310.857v621.714c0 50.286-41.143 91.429-91.429 91.429h-621.714c-50.286 0-91.429-41.143-91.429-91.429v-621.714c0-50.286 41.143-91.429 91.429-91.429h621.714c50.286 0 91.429 41.143 91.429 91.429zM804.571 91.429v91.429h-73.143v-91.429c0-9.714-8.571-18.286-18.286-18.286h-621.714c-9.714 0-18.286 8.571-18.286 18.286v621.714c0 9.714 8.571 18.286 18.286 18.286h91.429v73.143h-91.429c-50.286 0-91.429-41.143-91.429-91.429v-621.714c0-50.286 41.143-91.429 91.429-91.429h621.714c50.286 0 91.429 41.143 91.429 91.429z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["clone"],"grid":14},"attrs":[{}],"properties":{"order":1,"id":0,"prevSize":28,"code":59754,"name":"clone"},"setIdx":1,"setId":1,"iconIdx":44},{"icon":{"paths":["M498.787 330.323v-49.548h112.31v-66.065c0-49.548-39.639-89.187-89.187-89.187s-89.187 39.639-89.187 89.187v541.729l89.187 161.858 89.187-161.858v-426.116z","M360.052 716.8h-66.065c-59.458 0-105.703-46.245-105.703-105.703v-254.348c0-59.458 46.245-105.703 105.703-105.703h66.065v-42.942h-66.065c-82.581 0-148.645 66.065-148.645 148.645v254.348c0 82.581 66.065 148.645 148.645 148.645h66.065z","M852.232 260.955c-26.426-33.032-66.065-52.852-109.006-52.852h-59.458v42.942h39.639c42.942 0 82.581 19.819 109.006 52.852l145.342 181.677-142.039 178.374c-26.426 33.032-69.368 52.852-112.31 52.852h-36.335v42.942h56.155c42.942 0 85.884-19.819 112.31-52.852l178.374-221.316z"],"width":1140,"attrs":[{},{},{}],"isMulticolor":false,"isMulticolor2":false,"tags":["control-Tags"],"grid":14},"attrs":[{},{},{}],"properties":{"order":119,"id":1,"name":"control-Tags","prevSize":28,"code":59747},"setIdx":1,"setId":1,"iconIdx":45},{"icon":{"paths":["M384 179.2h614.4c14.157 0 25.6-11.443 25.6-25.6s-11.443-25.6-25.6-25.6h-614.4c-14.131 0-25.6 11.443-25.6 25.6s11.469 25.6 25.6 25.6zM998.4 486.4h-614.4c-14.131 0-25.6 11.443-25.6 25.6s11.469 25.6 25.6 25.6h614.4c14.157 0 25.6-11.443 25.6-25.6s-11.443-25.6-25.6-25.6zM998.4 844.8h-614.4c-38.406 15.539-22.811 37.543 0 51.2h614.4c14.157 0 25.6-11.443 25.6-25.6s-11.443-25.6-25.6-25.6z","M0 0v307.2h307.2v-307.2zM47.4 47.4h212.4v212.4h-212.4z","M0 716.8v307.2h307.2v-307.2zM47.4 764.2h212.4v212.4h-212.4z","M0 358.4v307.2h307.2v-307.2zM47.4 405.8h212.4v212.4h-212.4z","M89.6 89.6h128v128h-128v-128z"],"attrs":[{},{},{},{},{}],"isMulticolor":false,"isMulticolor2":false,"tags":["control-Checkboxes"],"grid":14},"attrs":[{},{},{},{},{}],"properties":{"order":118,"id":2,"name":"control-Checkboxes, control-List","prevSize":28,"code":59746},"setIdx":1,"setId":1,"iconIdx":46},{"icon":{"paths":["M159.073 665.6l-159.073-134.055 159.073-133.819 36.818 37.29-117.062 96.057 117.062 97.237z","M493.247 536.029q0 33.042-9.441 57.115-9.205 24.073-25.961 40.122-16.521 15.813-39.178 23.601-22.657 7.552-49.327 7.552-26.197 0-48.855-4.012-22.421-3.776-42.954-10.385v-323.338h57.587v78.356l-2.36 47.203q12.981-16.757 30.21-26.905 17.465-10.149 41.774-10.149 21.241 0 37.762 8.496t27.614 24.309q11.329 15.577 17.229 37.998 5.9 22.185 5.9 50.035zM432.828 538.389q0-19.825-2.832-33.75t-8.26-22.893q-5.192-8.969-12.981-12.981-7.552-4.248-17.465-4.248-14.633 0-28.086 11.801-13.217 11.801-28.086 32.098v104.79q6.844 2.596 16.757 4.248 10.149 1.652 20.533 1.652 13.689 0 24.781-5.664 11.329-5.664 19.117-16.049 8.024-10.385 12.273-25.253 4.248-15.105 4.248-33.75z","M700.682 513.608q0.472-13.453-1.416-22.893-1.652-9.441-5.664-15.577-3.776-6.136-9.441-8.968t-12.981-2.832q-12.745 0-26.433 10.621-13.453 10.385-29.738 34.458v151.756h-59.003v-239.789h52.159l2.124 34.93q5.9-9.205 13.217-16.521 7.552-7.316 16.521-12.509 9.205-5.428 20.297-8.26t24.309-2.832q18.173 0 32.098 6.372 14.161 6.136 23.601 18.409 9.677 12.273 14.161 30.918 4.72 18.409 4.012 42.718z","M864.927 397.725l159.073 133.819-159.073 134.055-36.582-37.29 116.826-96.293-116.826-97.001z"],"attrs":[{},{},{},{}],"isMulticolor":false,"isMulticolor2":false,"tags":["control-Html"],"grid":14},"attrs":[{},{},{},{}],"properties":{"order":116,"id":3,"name":"control-Html","prevSize":28,"code":59744},"setIdx":1,"setId":1,"iconIdx":47},{"icon":{"paths":["M251.429 100.58c-87.896 0-160 72.104-160 160v525.714c0 87.896 72.104 160 160 160h525.714c87.896 0 160-72.104 160-160v-525.714c0-87.896-72.104-160-160-160zM251.429 146.295h525.714c62.961 0 114.286 51.325 114.286 114.286v525.714c0 62.961-51.325 114.286-114.286 114.286h-525.714c-62.961 0-114.286-51.325-114.286-114.286v-525.714c0-62.961 51.325-114.286 114.286-114.286z","M251.429 306.295c-0.096-0.001-0.21-0.002-0.323-0.002-12.625 0-22.859 10.235-22.859 22.859s10.235 22.859 22.859 22.859c0.114 0 0.227-0.001 0.34-0.002l-0.017 0h525.714c0.096 0.001 0.21 0.002 0.323 0.002 12.625 0 22.859-10.235 22.859-22.859s-10.235-22.859-22.859-22.859c-0.114 0-0.227 0.001-0.34 0.002l0.017-0z","M251.429 443.438c-0.096-0.001-0.21-0.002-0.323-0.002-12.625 0-22.859 10.235-22.859 22.859s10.235 22.859 22.859 22.859c0.114 0 0.227-0.001 0.34-0.002l-0.017 0h297.143c0.096 0.001 0.21 0.002 0.323 0.002 12.625 0 22.859-10.235 22.859-22.859s-10.235-22.859-22.859-22.859c-0.114 0-0.227 0.001-0.34 0.002l0.017-0z","M251.429 580.58c-0.096-0.001-0.21-0.002-0.323-0.002-12.625 0-22.859 10.235-22.859 22.859s10.235 22.859 22.859 22.859c0.114 0 0.227-0.001 0.34-0.002l-0.017 0h297.143c0.096 0.001 0.21 0.002 0.323 0.002 12.625 0 22.859-10.235 22.859-22.859s-10.235-22.859-22.859-22.859c-0.114 0-0.227 0.001-0.34 0.002l0.017-0z"],"width":1029,"attrs":[{},{},{},{}],"isMulticolor":false,"isMulticolor2":false,"tags":["single-content"],"grid":14},"attrs":[{},{},{},{}],"properties":{"order":112,"id":4,"name":"single-content, search-Content, type-Component","prevSize":28,"code":59736},"setIdx":1,"setId":1,"iconIdx":48},{"icon":{"paths":["M777.143 946.286h-525.714c-89.143 0-160-70.857-160-160v-297.143c0-89.143 70.857-160 160-160h525.714c89.143 0 160 70.857 160 160v297.143c0 89.143-70.857 160-160 160zM251.429 374.857c-64 0-114.286 50.286-114.286 114.286v297.143c0 64 50.286 114.286 114.286 114.286h525.714c64 0 114.286-50.286 114.286-114.286v-297.143c0-64-50.286-114.286-114.286-114.286h-525.714z","M731.429 580.571h-457.143c-13.714 0-22.857-9.143-22.857-22.857s9.143-22.857 22.857-22.857h457.143c13.714 0 22.857 9.143 22.857 22.857s-9.143 22.857-22.857 22.857z","M502.857 740.571h-228.571c-13.714 0-22.857-9.143-22.857-22.857s9.143-22.857 22.857-22.857h228.571c13.714 0 22.857 9.143 22.857 22.857s-9.143 22.857-22.857 22.857z","M777.143 260.571h-525.714c-13.714 0-22.857-9.143-22.857-22.857s9.143-22.857 22.857-22.857h525.714c13.714 0 22.857 9.143 22.857 22.857s-9.143 22.857-22.857 22.857z","M685.714 146.286h-342.857c-13.714 0-22.857-9.143-22.857-22.857s9.143-22.857 22.857-22.857h342.857c13.714 0 22.857 9.143 22.857 22.857s-9.143 22.857-22.857 22.857z"],"width":1029,"attrs":[{},{},{},{},{}],"isMulticolor":false,"isMulticolor2":false,"tags":["multiple-content"],"grid":14},"attrs":[{},{},{},{},{}],"properties":{"order":113,"id":5,"name":"multiple-content, type-Components","prevSize":28,"code":59735},"setIdx":1,"setId":1,"iconIdx":49},{"icon":{"paths":["M832 268.8h-657.92c-15.36 0-25.6-10.24-25.6-25.6s10.24-25.6 25.6-25.6h657.92c15.36 0 25.6 10.24 25.6 25.6s-10.24 25.6-25.6 25.6z","M832 453.12h-409.6c-15.36 0-25.6-10.24-25.6-25.6s10.24-25.6 25.6-25.6h409.6c15.36 0 25.6 10.24 25.6 25.6s-10.24 25.6-25.6 25.6z","M832 642.56h-409.6c-15.36 0-25.6-10.24-25.6-25.6s10.24-25.6 25.6-25.6h409.6c15.36 0 25.6 10.24 25.6 25.6s-10.24 25.6-25.6 25.6z","M832 832h-409.6c-15.36 0-25.6-10.24-25.6-25.6s10.24-25.6 25.6-25.6h409.6c15.36 0 25.6 10.24 25.6 25.6s-10.24 25.6-25.6 25.6z"],"attrs":[{},{},{},{}],"isMulticolor":false,"isMulticolor2":false,"tags":["type-Array"],"grid":14},"attrs":[{},{},{},{}],"properties":{"order":108,"id":6,"name":"type-Array","prevSize":28,"code":59734},"setIdx":1,"setId":1,"iconIdx":50},{"icon":{"paths":["M292.571 713.143v128c0 20-16.571 36.571-36.571 36.571h-146.286c-20 0-36.571-16.571-36.571-36.571v-128c0-20 16.571-36.571 36.571-36.571h146.286c20 0 36.571 16.571 36.571 36.571zM309.714 109.714l-16 438.857c-0.571 20-17.714 36.571-37.714 36.571h-146.286c-20 0-37.143-16.571-37.714-36.571l-16-438.857c-0.571-20 15.429-36.571 35.429-36.571h182.857c20 0 36 16.571 35.429 36.571z"],"width":366,"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["exclamation"],"grid":14},"attrs":[{}],"properties":{"order":1,"id":7,"prevSize":28,"code":59733,"name":"exclamation"},"setIdx":1,"setId":1,"iconIdx":51},{"icon":{"paths":["M512 26.38l-424.96 242.8v485.64l424.96 242.8 424.96-242.8v-485.64l-424.96-242.8zM512 235.52l245.76 138.24v276.48l-245.76 138.24-245.76-138.24v-276.48l245.76-138.24z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["orleans"],"grid":14},"attrs":[{}],"properties":{"order":99,"id":8,"name":"orleans","prevSize":28,"code":59723},"setIdx":1,"setId":1,"iconIdx":52},{"icon":{"paths":["M358.4 102.4c-28.314 0-51.2 22.886-51.2 51.2v204.8h51.2v-204.8h307.2v153.6c0 28.314 22.886 51.2 51.2 51.2h153.6v512h-307.2v51.2h307.2c28.314 0 51.2-22.886 51.2-51.2v-548.2l-219.8-219.8h-292.2zM716.8 189.8l117.4 117.4h-117.4z","M153.6 640v281.6h358.4v-281.6zM179.2 640v-76.8c0-84.48 69.12-153.6 153.6-153.6s153.6 69.12 153.6 153.6v76.8h-51.2v-76.8c0-56.32-46.080-102.4-102.4-102.4s-102.4 46.080-102.4 102.4v76.8z"],"attrs":[{},{}],"isMulticolor":false,"isMulticolor2":false,"tags":["document-lock"],"grid":14},"attrs":[{},{}],"properties":{"order":97,"id":9,"name":"document-lock","prevSize":28,"code":59721},"setIdx":1,"setId":1,"iconIdx":53},{"icon":{"paths":["M358.4 102.4c-28.314 0-51.2 22.886-51.2 51.2v153.6h51.2v-153.6h307.2v153.6c0 28.314 22.886 51.2 51.2 51.2h153.6v512h-358.4v51.2h358.4c28.314 0 51.2-22.886 51.2-51.2v-548.2l-219.8-219.8h-292.2zM716.8 189.8l117.4 117.4h-117.4zM332.8 460.8l-230.4 256v51.2h102.4v153.6h256v-153.6h102.4v-51.2zM332.8 537.3l161.5 179.5h-84.7v153.6h-153.6v-153.6h-84.7z","M102.4 357.532h460.8v52.068h-460.8v-52.068z"],"attrs":[{},{}],"isMulticolor":false,"isMulticolor2":false,"tags":["document-unpublish"],"grid":14},"attrs":[{},{}],"properties":{"order":96,"id":10,"name":"document-unpublish","prevSize":28,"code":59711},"setIdx":1,"setId":1,"iconIdx":54},{"icon":{"paths":["M614.286 420.571c0 4.571-2.286 9.714-5.714 13.143l-266.286 266.286c-3.429 3.429-8.571 5.714-13.143 5.714s-9.714-2.286-13.143-5.714l-266.286-266.286c-3.429-3.429-5.714-8.571-5.714-13.143s2.286-9.714 5.714-13.143l28.571-28.571c3.429-3.429 8-5.714 13.143-5.714 4.571 0 9.714 2.286 13.143 5.714l224.571 224.571 224.571-224.571c3.429-3.429 8.571-5.714 13.143-5.714s9.714 2.286 13.143 5.714l28.571 28.571c3.429 3.429 5.714 8.571 5.714 13.143z"],"width":658,"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["angle-down"],"grid":14},"attrs":[{}],"properties":{"order":1,"id":11,"prevSize":28,"code":59648,"name":"angle-down"},"setIdx":1,"setId":1,"iconIdx":55},{"icon":{"paths":["M358.286 310.857c0 4.571-2.286 9.714-5.714 13.143l-224.571 224.571 224.571 224.571c3.429 3.429 5.714 8.571 5.714 13.143s-2.286 9.714-5.714 13.143l-28.571 28.571c-3.429 3.429-8.571 5.714-13.143 5.714s-9.714-2.286-13.143-5.714l-266.286-266.286c-3.429-3.429-5.714-8.571-5.714-13.143s2.286-9.714 5.714-13.143l266.286-266.286c3.429-3.429 8.571-5.714 13.143-5.714s9.714 2.286 13.143 5.714l28.571 28.571c3.429 3.429 5.714 8 5.714 13.143z"],"width":384,"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["angle-left"],"grid":14},"attrs":[{}],"properties":{"order":2,"id":12,"prevSize":28,"code":59649,"name":"angle-left"},"setIdx":1,"setId":1,"iconIdx":56},{"icon":{"paths":["M340 548.571c0 4.571-2.286 9.714-5.714 13.143l-266.286 266.286c-3.429 3.429-8.571 5.714-13.143 5.714s-9.714-2.286-13.143-5.714l-28.571-28.571c-3.429-3.429-5.714-8-5.714-13.143 0-4.571 2.286-9.714 5.714-13.143l224.571-224.571-224.571-224.571c-3.429-3.429-5.714-8.571-5.714-13.143s2.286-9.714 5.714-13.143l28.571-28.571c3.429-3.429 8.571-5.714 13.143-5.714s9.714 2.286 13.143 5.714l266.286 266.286c3.429 3.429 5.714 8.571 5.714 13.143z"],"width":347,"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["angle-right"],"grid":14},"attrs":[{}],"properties":{"order":67,"id":13,"prevSize":28,"code":59697,"name":"angle-right"},"setIdx":1,"setId":1,"iconIdx":57},{"icon":{"paths":["M614.286 676.571c0 4.571-2.286 9.714-5.714 13.143l-28.571 28.571c-3.429 3.429-8 5.714-13.143 5.714-4.571 0-9.714-2.286-13.143-5.714l-224.571-224.571-224.571 224.571c-3.429 3.429-8.571 5.714-13.143 5.714s-9.714-2.286-13.143-5.714l-28.571-28.571c-3.429-3.429-5.714-8.571-5.714-13.143s2.286-9.714 5.714-13.143l266.286-266.286c3.429-3.429 8.571-5.714 13.143-5.714s9.714 2.286 13.143 5.714l266.286 266.286c3.429 3.429 5.714 8.571 5.714 13.143z"],"width":658,"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["angle-up"],"grid":14},"attrs":[{}],"properties":{"order":2,"id":14,"prevSize":28,"code":59651,"name":"angle-up"},"setIdx":1,"setId":1,"iconIdx":58},{"icon":{"paths":["M592 393.6h-156.8c-57.6 0-105.6-48-105.6-105.6v-182.4c0-57.6 48-105.6 105.6-105.6h156.8c57.6 0 105.6 48 105.6 105.6v182.4c-3.2 57.6-48 105.6-105.6 105.6zM432 64c-22.4 0-41.6 19.2-41.6 41.6v182.4c0 22.4 19.2 41.6 41.6 41.6h156.8c22.4 0 41.6-19.2 41.6-41.6v-182.4c0-22.4-19.2-41.6-41.6-41.6h-156.8z","M195.2 1024c-105.6 0-195.2-89.6-195.2-195.2 0-108.8 89.6-195.2 195.2-195.2s195.2 89.6 195.2 195.2c3.2 105.6-86.4 195.2-195.2 195.2zM195.2 694.4c-73.6 0-131.2 60.8-131.2 131.2 0 73.6 60.8 134.4 131.2 134.4 73.6 0 131.2-60.8 131.2-131.2 3.2-73.6-57.6-134.4-131.2-134.4z","M828.8 1024c-108.8 0-195.2-89.6-195.2-195.2 0-108.8 89.6-195.2 195.2-195.2s195.2 89.6 195.2 195.2c0 105.6-89.6 195.2-195.2 195.2zM828.8 694.4c-73.6 0-131.2 60.8-131.2 131.2 0 73.6 60.8 131.2 131.2 131.2 73.6 0 131.2-60.8 131.2-131.2s-60.8-131.2-131.2-131.2z","M332.8 640c-6.4 0-12.8 0-16-3.2-16-9.6-19.2-28.8-9.6-44.8l83.2-137.6c9.6-16 28.8-19.2 44.8-9.6s19.2 28.8 9.6 44.8l-83.2 137.6c-6.4 6.4-16 12.8-28.8 12.8z","M691.2 640c-9.6 0-22.4-6.4-28.8-16l-83.2-137.6c-9.6-16-3.2-35.2 9.6-44.8s35.2-3.2 44.8 9.6l83.2 137.6c9.6 16 3.2 35.2-9.6 44.8-6.4 6.4-12.8 6.4-16 6.4z"],"attrs":[{},{},{},{},{}],"isMulticolor":false,"isMulticolor2":false,"tags":["api"],"grid":14},"attrs":[{},{},{},{},{}],"properties":{"order":94,"id":15,"name":"api","prevSize":28,"code":59717},"setIdx":1,"setId":1,"iconIdx":59},{"icon":{"paths":["M800 1024h-576c-124.8 0-224-99.2-224-224v-576c0-124.8 99.2-224 224-224h576c124.8 0 224 99.2 224 224v576c0 124.8-99.2 224-224 224zM224 64c-89.6 0-160 70.4-160 160v576c0 89.6 70.4 160 160 160h576c89.6 0 160-70.4 160-160v-576c0-89.6-70.4-160-160-160h-576z","M771.2 860.8h-438.4c-12.8 0-22.4-6.4-28.8-19.2s-3.2-25.6 3.2-35.2l300.8-355.2c6.4-6.4 16-12.8 25.6-12.8s19.2 6.4 25.6 12.8l192 275.2c3.2 3.2 3.2 6.4 3.2 9.6 16 44.8 3.2 73.6-6.4 89.6-22.4 32-70.4 35.2-76.8 35.2zM403.2 796.8h371.2c6.4 0 22.4-3.2 25.6-9.6 3.2-3.2 3.2-12.8 0-25.6l-166.4-236.8-230.4 272z","M332.8 502.4c-76.8 0-140.8-64-140.8-140.8s64-140.8 140.8-140.8 140.8 64 140.8 140.8-60.8 140.8-140.8 140.8zM332.8 284.8c-41.6 0-76.8 32-76.8 76.8s35.2 76.8 76.8 76.8 76.8-35.2 76.8-76.8-32-76.8-76.8-76.8z"],"attrs":[{},{},{}],"isMulticolor":false,"isMulticolor2":false,"tags":["assets"],"grid":14},"attrs":[{},{},{}],"properties":{"order":95,"id":16,"name":"assets, search-Asset","prevSize":28,"code":59720},"setIdx":1,"setId":1,"iconIdx":60},{"icon":{"paths":["M932.571 548.571c0 20-16.571 36.571-36.571 36.571h-128c0 71.429-15.429 125.143-38.286 165.714l118.857 119.429c14.286 14.286 14.286 37.143 0 51.429-6.857 7.429-16.571 10.857-25.714 10.857s-18.857-3.429-25.714-10.857l-113.143-112.571s-74.857 68.571-172 68.571v-512h-73.143v512c-103.429 0-178.857-75.429-178.857-75.429l-104.571 118.286c-7.429 8-17.143 12-27.429 12-8.571 0-17.143-2.857-24.571-9.143-14.857-13.714-16-36.571-2.857-52l115.429-129.714c-20-39.429-33.143-90.286-33.143-156.571h-128c-20 0-36.571-16.571-36.571-36.571s16.571-36.571 36.571-36.571h128v-168l-98.857-98.857c-14.286-14.286-14.286-37.143 0-51.429s37.143-14.286 51.429 0l98.857 98.857h482.286l98.857-98.857c14.286-14.286 37.143-14.286 51.429 0s14.286 37.143 0 51.429l-98.857 98.857v168h128c20 0 36.571 16.571 36.571 36.571zM658.286 219.429h-365.714c0-101.143 81.714-182.857 182.857-182.857s182.857 81.714 182.857 182.857z"],"width":951,"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["bug"],"grid":14},"attrs":[{}],"properties":{"order":1,"id":17,"prevSize":28,"code":59709,"name":"bug"},"setIdx":1,"setId":1,"iconIdx":61},{"icon":{"paths":["M585.143 402.286c0 9.714-4 18.857-10.857 25.714l-256 256c-6.857 6.857-16 10.857-25.714 10.857s-18.857-4-25.714-10.857l-256-256c-6.857-6.857-10.857-16-10.857-25.714 0-20 16.571-36.571 36.571-36.571h512c20 0 36.571 16.571 36.571 36.571z"],"width":585,"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["caret-down"],"grid":14},"attrs":[{}],"properties":{"order":4,"id":18,"prevSize":28,"code":59692,"name":"caret-down"},"setIdx":1,"setId":1,"iconIdx":62},{"icon":{"paths":["M365.714 256v512c0 20-16.571 36.571-36.571 36.571-9.714 0-18.857-4-25.714-10.857l-256-256c-6.857-6.857-10.857-16-10.857-25.714s4-18.857 10.857-25.714l256-256c6.857-6.857 16-10.857 25.714-10.857 20 0 36.571 16.571 36.571 36.571z"],"width":402,"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["caret-left"],"grid":14},"attrs":[{}],"properties":{"order":2,"id":19,"prevSize":28,"code":59690,"name":"caret-left"},"setIdx":1,"setId":1,"iconIdx":63},{"icon":{"paths":["M329.143 512c0 9.714-4 18.857-10.857 25.714l-256 256c-6.857 6.857-16 10.857-25.714 10.857-20 0-36.571-16.571-36.571-36.571v-512c0-20 16.571-36.571 36.571-36.571 9.714 0 18.857 4 25.714 10.857l256 256c6.857 6.857 10.857 16 10.857 25.714z"],"width":329,"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["caret-right"],"grid":14},"attrs":[{}],"properties":{"order":1,"id":20,"prevSize":28,"code":59689,"name":"caret-right"},"setIdx":1,"setId":1,"iconIdx":64},{"icon":{"paths":["M585.143 694.857c0 20-16.571 36.571-36.571 36.571h-512c-20 0-36.571-16.571-36.571-36.571 0-9.714 4-18.857 10.857-25.714l256-256c6.857-6.857 16-10.857 25.714-10.857s18.857 4 25.714 10.857l256 256c6.857 6.857 10.857 16 10.857 25.714z"],"width":585,"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["caret-up"],"grid":14},"attrs":[{}],"properties":{"order":3,"id":21,"prevSize":28,"code":59691,"name":"caret-up"},"setIdx":1,"setId":1,"iconIdx":65},{"icon":{"paths":["M800 1024h-576c-124.8 0-224-99.2-224-224v-576c0-124.8 99.2-224 224-224h576c124.8 0 224 99.2 224 224v576c0 124.8-99.2 224-224 224zM224 64c-89.6 0-160 70.4-160 160v576c0 89.6 70.4 160 160 160h576c89.6 0 160-70.4 160-160v-576c0-89.6-70.4-160-160-160h-576z","M480 448h-211.2c-57.6 0-105.6-48-105.6-105.6v-73.6c0-57.6 48-105.6 105.6-105.6h211.2c57.6 0 105.6 48 105.6 105.6v73.6c0 57.6-48 105.6-105.6 105.6zM268.8 227.2c-22.4 0-41.6 19.2-41.6 41.6v73.6c0 22.4 19.2 41.6 41.6 41.6h211.2c22.4 0 41.6-19.2 41.6-41.6v-73.6c0-22.4-19.2-41.6-41.6-41.6h-211.2z","M828.8 611.2h-633.6c-19.2 0-32-12.8-32-32s12.8-32 32-32h630.4c19.2 0 32 12.8 32 32s-12.8 32-28.8 32z","M553.6 777.6h-358.4c-19.2 0-32-12.8-32-32s12.8-32 32-32h355.2c19.2 0 32 12.8 32 32s-12.8 32-28.8 32z"],"attrs":[{},{},{},{}],"isMulticolor":false,"isMulticolor2":false,"tags":["content"],"grid":14},"attrs":[{},{},{},{}],"properties":{"order":93,"id":22,"name":"contents, trigger-ContentChanged","prevSize":28,"code":59718},"setIdx":1,"setId":1,"iconIdx":66},{"icon":{"paths":["M947.2 102.4h-128v-25.6c0-14.131-11.469-25.6-25.6-25.6s-25.6 11.469-25.6 25.6v25.6h-512v-25.6c0-14.131-11.52-25.6-25.6-25.6s-25.6 11.469-25.6 25.6v25.6h-128c-42.342 0-76.8 34.458-76.8 76.8v716.8c0 42.342 34.458 76.8 76.8 76.8h870.4c42.342 0 76.8-34.458 76.8-76.8v-716.8c0-42.342-34.458-76.8-76.8-76.8zM972.8 896c0 14.131-11.469 25.6-25.6 25.6h-870.4c-14.080 0-25.6-11.469-25.6-25.6v-537.6h921.6v537.6zM972.8 307.2h-921.6v-128c0-14.080 11.52-25.6 25.6-25.6h128v76.8c0 14.080 11.52 25.6 25.6 25.6s25.6-11.52 25.6-25.6v-76.8h512v76.8c0 14.080 11.469 25.6 25.6 25.6s25.6-11.52 25.6-25.6v-76.8h128c14.131 0 25.6 11.52 25.6 25.6v128zM332.8 512h51.2c14.080 0 25.6-11.52 25.6-25.6s-11.52-25.6-25.6-25.6h-51.2c-14.080 0-25.6 11.52-25.6 25.6s11.52 25.6 25.6 25.6zM486.4 512h51.2c14.131 0 25.6-11.52 25.6-25.6s-11.469-25.6-25.6-25.6h-51.2c-14.080 0-25.6 11.52-25.6 25.6s11.52 25.6 25.6 25.6zM640 512h51.2c14.131 0 25.6-11.52 25.6-25.6s-11.469-25.6-25.6-25.6h-51.2c-14.131 0-25.6 11.52-25.6 25.6s11.469 25.6 25.6 25.6zM793.6 512h51.2c14.131 0 25.6-11.52 25.6-25.6s-11.469-25.6-25.6-25.6h-51.2c-14.131 0-25.6 11.52-25.6 25.6s11.469 25.6 25.6 25.6zM179.2 614.4h51.2c14.080 0 25.6-11.469 25.6-25.6s-11.52-25.6-25.6-25.6h-51.2c-14.080 0-25.6 11.469-25.6 25.6s11.52 25.6 25.6 25.6zM332.8 614.4h51.2c14.080 0 25.6-11.469 25.6-25.6s-11.52-25.6-25.6-25.6h-51.2c-14.080 0-25.6 11.469-25.6 25.6s11.52 25.6 25.6 25.6zM486.4 614.4h51.2c14.131 0 25.6-11.469 25.6-25.6s-11.469-25.6-25.6-25.6h-51.2c-14.080 0-25.6 11.469-25.6 25.6s11.52 25.6 25.6 25.6zM640 614.4h51.2c14.131 0 25.6-11.469 25.6-25.6s-11.469-25.6-25.6-25.6h-51.2c-14.131 0-25.6 11.469-25.6 25.6s11.469 25.6 25.6 25.6zM793.6 614.4h51.2c14.131 0 25.6-11.469 25.6-25.6s-11.469-25.6-25.6-25.6h-51.2c-14.131 0-25.6 11.469-25.6 25.6s11.469 25.6 25.6 25.6zM179.2 716.8h51.2c14.080 0 25.6-11.469 25.6-25.6s-11.52-25.6-25.6-25.6h-51.2c-14.080 0-25.6 11.469-25.6 25.6s11.52 25.6 25.6 25.6zM332.8 716.8h51.2c14.080 0 25.6-11.469 25.6-25.6s-11.52-25.6-25.6-25.6h-51.2c-14.080 0-25.6 11.469-25.6 25.6s11.52 25.6 25.6 25.6zM486.4 716.8h51.2c14.131 0 25.6-11.469 25.6-25.6s-11.469-25.6-25.6-25.6h-51.2c-14.080 0-25.6 11.469-25.6 25.6s11.52 25.6 25.6 25.6zM640 716.8h51.2c14.131 0 25.6-11.469 25.6-25.6s-11.469-25.6-25.6-25.6h-51.2c-14.131 0-25.6 11.469-25.6 25.6s11.469 25.6 25.6 25.6zM793.6 716.8h51.2c14.131 0 25.6-11.469 25.6-25.6s-11.469-25.6-25.6-25.6h-51.2c-14.131 0-25.6 11.469-25.6 25.6s11.469 25.6 25.6 25.6zM179.2 819.2h51.2c14.080 0 25.6-11.469 25.6-25.6s-11.52-25.6-25.6-25.6h-51.2c-14.080 0-25.6 11.469-25.6 25.6s11.52 25.6 25.6 25.6zM332.8 819.2h51.2c14.080 0 25.6-11.469 25.6-25.6s-11.52-25.6-25.6-25.6h-51.2c-14.080 0-25.6 11.469-25.6 25.6s11.52 25.6 25.6 25.6zM486.4 819.2h51.2c14.131 0 25.6-11.469 25.6-25.6s-11.469-25.6-25.6-25.6h-51.2c-14.080 0-25.6 11.469-25.6 25.6s11.52 25.6 25.6 25.6zM640 819.2h51.2c14.131 0 25.6-11.469 25.6-25.6s-11.469-25.6-25.6-25.6h-51.2c-14.131 0-25.6 11.469-25.6 25.6s11.469 25.6 25.6 25.6zM793.6 819.2h51.2c14.131 0 25.6-11.469 25.6-25.6s-11.469-25.6-25.6-25.6h-51.2c-14.131 0-25.6 11.469-25.6 25.6s11.469 25.6 25.6 25.6z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["control-date"],"grid":14},"attrs":[{}],"properties":{"order":71,"id":23,"name":"control-Date","prevSize":28,"code":59702},"setIdx":1,"setId":1,"iconIdx":67},{"icon":{"paths":["M486.4 409.6h51.2c14.080 0 25.6 11.52 25.6 25.6s-11.52 25.6-25.6 25.6h-51.2c-14.080 0-25.6-11.52-25.6-25.6s11.52-25.6 25.6-25.6zM230.4 614.4c14.080 0 25.6 11.469 25.6 25.6s-11.52 25.6-25.6 25.6h-51.2c-14.080 0-25.6-11.469-25.6-25.6s11.52-25.6 25.6-25.6h51.2zM230.4 512c14.080 0 25.6 11.469 25.6 25.6s-11.52 25.6-25.6 25.6h-51.2c-14.080 0-25.6-11.469-25.6-25.6s11.52-25.6 25.6-25.6h51.2zM51.2 742.4v-435.2h665.6v102.4h51.2v-281.6c0-42.342-34.458-76.8-76.8-76.8h-128v-25.6c0-14.131-11.469-25.6-25.6-25.6s-25.6 11.469-25.6 25.6v25.6h-256v-25.6c0-14.131-11.52-25.6-25.6-25.6s-25.6 11.469-25.6 25.6v25.6h-128c-42.342 0-76.8 34.458-76.8 76.8v614.4c0 42.342 34.458 76.8 76.8 76.8h332.8v-51.2h-332.8c-14.080 0-25.6-11.469-25.6-25.6zM51.2 128c0-14.080 11.52-25.6 25.6-25.6h128v76.8c0 14.080 11.52 25.6 25.6 25.6s25.6-11.52 25.6-25.6v-76.8h256v76.8c0 14.080 11.469 25.6 25.6 25.6s25.6-11.52 25.6-25.6v-76.8h128c14.131 0 25.6 11.52 25.6 25.6v128h-665.6v-128zM384 409.6c14.080 0 25.6 11.52 25.6 25.6s-11.52 25.6-25.6 25.6h-51.2c-14.080 0-25.6-11.52-25.6-25.6s11.52-25.6 25.6-25.6h51.2zM742.4 460.8c-155.546 0-281.6 126.054-281.6 281.6s126.054 281.6 281.6 281.6 281.6-126.054 281.6-281.6-126.054-281.6-281.6-281.6zM742.4 972.8c-127.232 0-230.4-103.168-230.4-230.4s103.168-230.4 230.4-230.4 230.4 103.168 230.4 230.4-103.168 230.4-230.4 230.4zM384 512c14.080 0 25.6 11.469 25.6 25.6s-11.52 25.6-25.6 25.6h-51.2c-14.080 0-25.6-11.469-25.6-25.6s11.52-25.6 25.6-25.6h51.2zM384 614.4c14.080 0 25.6 11.469 25.6 25.6s-11.52 25.6-25.6 25.6h-51.2c-14.080 0-25.6-11.469-25.6-25.6s11.52-25.6 25.6-25.6h51.2zM844.8 716.8c14.131 0 25.6 11.469 25.6 25.6s-11.469 25.6-25.6 25.6h-102.4c-14.131 0-25.6-11.469-25.6-25.6v-102.4c0-14.131 11.469-25.6 25.6-25.6s25.6 11.469 25.6 25.6v76.8h76.8z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["control-date-time"],"grid":14},"attrs":[{}],"properties":{"order":70,"id":24,"name":"control-DateTime","prevSize":28,"code":59703},"setIdx":1,"setId":1,"iconIdx":68},{"icon":{"paths":["M793.6 609.416h-61.838v-28.108h-0.783q-21.135 33.092-62.034 33.092-37.573 0-60.469-26.912-22.896-27.112-22.896-75.554 0-50.635 25.244-81.136t66.144-30.501q38.747 0 54.011 28.308h0.783v-121.405h61.838v302.216zM732.936 510.139v-15.35q0-19.935-11.35-33.092t-29.549-13.157q-20.548 0-32.093 16.546-11.546 16.347-11.546 45.053 0 26.912 11.154 41.465t30.919 14.553q18.786 0 30.528-15.35 11.937-15.35 11.937-40.668zM548.594 609.416h-61.643v-116.421q0-44.455-32.093-44.455-15.264 0-24.853 13.357t-9.589 33.292v114.228h-61.839v-117.617q0-43.259-31.506-43.259-15.851 0-25.44 12.758-9.393 12.758-9.393 34.687v113.431h-61.838v-204.135h61.838v31.896h0.783q9.589-16.347 26.81-26.514 17.417-10.366 37.964-10.366 42.465 0 58.12 38.076 22.896-38.076 67.318-38.076 65.361 0 65.361 82.133v126.987zM0 0v204.8h76.8v76.8h51.2v-76.8h76.8v-204.8zM819.2 0v204.8h204.8v-204.8zM51.2 51.2h102.4v102.4h-102.4zM870.4 51.2h102.4v102.4h-102.4zM281.6 76.8v51.2h102.4v-51.2zM486.4 76.8v51.2h102.4v-51.2zM691.2 76.8v51.2h102.4v-51.2zM896 281.6v102.4h51.2v-102.4zM76.8 384v102.4h51.2v-102.4zM896 486.4v102.4h51.2v-102.4zM76.8 588.8v102.4h51.2v-102.4zM896 691.2v102.4h51.2v-102.4zM76.8 793.6v25.6h-76.8v204.8h204.8v-76.8h76.8v-51.2h-76.8v-76.8h-76.8v-25.6zM819.2 819.2v76.8h-25.6v51.2h25.6v76.8h204.8v-204.8zM51.2 870.4h102.4v102.4h-102.4zM870.4 870.4h102.4v102.4h-102.4zM384 896v51.2h102.4v-51.2zM588.8 896v51.2h102.4v-51.2z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["control-Markdown"],"grid":14},"attrs":[{}],"properties":{"order":72,"id":25,"name":"control-Markdown","prevSize":28,"code":59704},"setIdx":1,"setId":1,"iconIdx":69},{"icon":{"paths":["M292.571 713.143v109.714c0 30.286-24.571 54.857-54.857 54.857h-182.857c-30.286 0-54.857-24.571-54.857-54.857v-109.714c0-30.286 24.571-54.857 54.857-54.857h182.857c30.286 0 54.857 24.571 54.857 54.857zM292.571 420.571v109.714c0 30.286-24.571 54.857-54.857 54.857h-182.857c-30.286 0-54.857-24.571-54.857-54.857v-109.714c0-30.286 24.571-54.857 54.857-54.857h182.857c30.286 0 54.857 24.571 54.857 54.857zM658.286 713.143v109.714c0 30.286-24.571 54.857-54.857 54.857h-182.857c-30.286 0-54.857-24.571-54.857-54.857v-109.714c0-30.286 24.571-54.857 54.857-54.857h182.857c30.286 0 54.857 24.571 54.857 54.857zM292.571 128v109.714c0 30.286-24.571 54.857-54.857 54.857h-182.857c-30.286 0-54.857-24.571-54.857-54.857v-109.714c0-30.286 24.571-54.857 54.857-54.857h182.857c30.286 0 54.857 24.571 54.857 54.857zM658.286 420.571v109.714c0 30.286-24.571 54.857-54.857 54.857h-182.857c-30.286 0-54.857-24.571-54.857-54.857v-109.714c0-30.286 24.571-54.857 54.857-54.857h182.857c30.286 0 54.857 24.571 54.857 54.857zM1024 713.143v109.714c0 30.286-24.571 54.857-54.857 54.857h-182.857c-30.286 0-54.857-24.571-54.857-54.857v-109.714c0-30.286 24.571-54.857 54.857-54.857h182.857c30.286 0 54.857 24.571 54.857 54.857zM658.286 128v109.714c0 30.286-24.571 54.857-54.857 54.857h-182.857c-30.286 0-54.857-24.571-54.857-54.857v-109.714c0-30.286 24.571-54.857 54.857-54.857h182.857c30.286 0 54.857 24.571 54.857 54.857zM1024 420.571v109.714c0 30.286-24.571 54.857-54.857 54.857h-182.857c-30.286 0-54.857-24.571-54.857-54.857v-109.714c0-30.286 24.571-54.857 54.857-54.857h182.857c30.286 0 54.857 24.571 54.857 54.857zM1024 128v109.714c0 30.286-24.571 54.857-54.857 54.857h-182.857c-30.286 0-54.857-24.571-54.857-54.857v-109.714c0-30.286 24.571-54.857 54.857-54.857h182.857c30.286 0 54.857 24.571 54.857 54.857z"],"width":1024,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["th"],"defaultCode":61450,"grid":14},"attrs":[],"properties":{"name":"grid","id":26,"order":83,"prevSize":28,"code":61450},"setIdx":1,"setId":1,"iconIdx":70},{"icon":{"paths":["M877.714 768v73.143c0 20-16.571 36.571-36.571 36.571h-804.571c-20 0-36.571-16.571-36.571-36.571v-73.143c0-20 16.571-36.571 36.571-36.571h804.571c20 0 36.571 16.571 36.571 36.571zM877.714 475.429v73.143c0 20-16.571 36.571-36.571 36.571h-804.571c-20 0-36.571-16.571-36.571-36.571v-73.143c0-20 16.571-36.571 36.571-36.571h804.571c20 0 36.571 16.571 36.571 36.571zM877.714 182.857v73.143c0 20-16.571 36.571-36.571 36.571h-804.571c-20 0-36.571-16.571-36.571-36.571v-73.143c0-20 16.571-36.571 36.571-36.571h804.571c20 0 36.571 16.571 36.571 36.571z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["bars","navicon","reorder"],"defaultCode":61641,"grid":14},"attrs":[],"properties":{"name":"list1","id":27,"order":89,"prevSize":28,"code":61641},"setIdx":1,"setId":1,"iconIdx":71},{"icon":{"paths":["M512 64c-131.696 0-239.125 107.4-239.125 239 0 65.8 24.831 146.717 65.375 215.25 19.653 33.221 43.902 63.853 71.75 87.125-59.423 7.524-122.009 9.415-172.125 32-79.809 35.967-144.343 94.74-172.375 178.625-1.5 9.499 0 0-1.5 9v0.499c0 73.995 60.563 134.501 134.375 134.501h627.125c73.888 0 134.5-60.506 134.5-134.5l-1.5-9.375c-27.845-84.263-92.273-143.119-172.125-179-50.17-22.544-112.844-24.421-172.375-31.875 27.792-23.26 52.002-53.831 71.625-87 40.544-68.533 65.375-149.45 65.375-215.25 0-131.6-107.304-239-239-239zM512 124c99.241 0 179 79.875 179 179 0 49.562-21.877 125.381-57 184.75s-81.435 98.75-122 98.75c-40.565 0-86.877-39.381-122-98.75s-57.125-135.188-57.125-184.75c0-99.125 79.884-179 179.125-179zM512 646.5c92.551 0 180.829 14.406 249.75 45.375 66.784 30.009 113.649 74.724 136.5 137.75-2.447 39.259-32.9 70.375-72.75 70.375h-627.125c-39.678 0-70.116-31.051-72.625-70.25 22.978-62.705 69.953-107.523 136.75-137.625 68.937-31.067 157.205-45.625 249.5-45.625z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["user-o"],"grid":14},"attrs":[{}],"properties":{"order":64,"id":28,"name":"user-o","prevSize":28,"code":59698},"setIdx":1,"setId":1,"iconIdx":72},{"icon":{"paths":["M217.6 992c-3.2 0-3.2 0-6.4 0h-3.2c-144-25.6-208-144-208-249.6 0-99.2 57.6-208 185.6-240v-147.2c0-19.2 12.8-32 32-32s32 12.8 32 32v172.8c0 16-12.8 28.8-25.6 32-108.8 16-160 102.4-160 182.4s48 166.4 153.6 185.6h6.4c16 3.2 28.8 19.2 25.6 38.4-3.2 16-16 25.6-32 25.6z","M774.4 1001.6c0 0 0 0 0 0-102.4 0-211.2-60.8-243.2-185.6h-176c-19.2 0-32-12.8-32-32s12.8-32 32-32h201.6c16 0 28.8 12.8 32 25.6 16 108.8 102.4 156.8 182.4 160 80 0 166.4-48 185.6-153.6v-3.2c3.2-16 19.2-28.8 38.4-25.6 16 3.2 28.8 19.2 25.6 38.4v3.2c-22.4 140.8-140.8 204.8-246.4 204.8z","M787.2 678.4c-19.2 0-32-12.8-32-32v-176c0-16 12.8-28.8 25.6-32 108.8-16 156.8-102.4 160-182.4 0-80-48-166.4-153.6-185.6h-3.2c-19.2-6.4-32-22.4-28.8-38.4s19.2-28.8 38.4-25.6h3.2c144 25.6 208 144 208 249.6 0 99.2-60.8 208-185.6 240v150.4c0 16-16 32-32 32z","M41.6 246.4c-3.2 0-3.2 0-6.4 0-16-3.2-28.8-19.2-25.6-35.2v-3.2c25.6-144 140.8-208 246.4-208 0 0 3.2 0 3.2 0 99.2 0 208 60.8 240 185.6h147.2c19.2 0 32 12.8 32 32s-12.8 32-32 32h-172.8c-16 0-28.8-12.8-32-25.6-16-108.8-102.4-156.8-182.4-160-80 0-166.4 48-185.6 153.6v3.2c-3.2 16-16 25.6-32 25.6z","M256 387.2c-32 0-67.2-12.8-92.8-38.4-51.2-51.2-51.2-134.4 0-185.6 25.6-22.4 57.6-35.2 92.8-35.2s67.2 12.8 92.8 38.4c25.6 25.6 38.4 57.6 38.4 92.8s-12.8 67.2-38.4 92.8c-25.6 22.4-57.6 35.2-92.8 35.2zM256 192c-16 0-32 6.4-44.8 19.2-25.6 25.6-25.6 67.2 0 92.8s67.2 25.6 92.8 0c12.8-12.8 19.2-28.8 19.2-48s-6.4-32-19.2-44.8-28.8-19.2-48-19.2z","M771.2 873.6c-32 0-67.2-12.8-92.8-38.4-51.2-51.2-51.2-134.4 0-185.6 25.6-25.6 57.6-38.4 92.8-38.4s67.2 12.8 92.8 38.4c25.6 25.6 38.4 57.6 38.4 92.8s-12.8 67.2-38.4 92.8c-28.8 25.6-60.8 38.4-92.8 38.4zM771.2 678.4c-19.2 0-35.2 6.4-48 19.2-25.6 25.6-25.6 67.2 0 92.8s67.2 25.6 92.8 0c12.8-12.8 19.2-28.8 19.2-48s-6.4-35.2-19.2-48-28.8-16-44.8-16z","M745.6 387.2c-32 0-67.2-12.8-92.8-38.4s-38.4-57.6-38.4-92.8 12.8-67.2 38.4-92.8c25.6-22.4 60.8-35.2 92.8-35.2s67.2 12.8 92.8 38.4c51.2 51.2 51.2 134.4 0 185.6v0c-25.6 22.4-57.6 35.2-92.8 35.2zM745.6 192c-19.2 0-35.2 6.4-48 19.2s-19.2 28.8-19.2 48 6.4 35.2 19.2 48c25.6 25.6 67.2 25.6 92.8 0s25.6-67.2 0-92.8c-9.6-16-25.6-22.4-44.8-22.4z","M259.2 873.6c-32 0-67.2-12.8-92.8-38.4s-38.4-57.6-38.4-92.8 12.8-67.2 38.4-92.8c25.6-22.4 57.6-35.2 92.8-35.2s67.2 12.8 92.8 38.4c51.2 51.2 51.2 134.4 0 185.6v0c-25.6 22.4-57.6 35.2-92.8 35.2zM259.2 678.4c-19.2 0-35.2 6.4-48 19.2s-19.2 28.8-19.2 48 6.4 35.2 19.2 48c25.6 25.6 67.2 25.6 92.8 0s25.6-67.2 0-92.8c-9.6-16-25.6-22.4-44.8-22.4z"],"attrs":[{},{},{},{},{},{},{},{}],"isMulticolor":false,"isMulticolor2":false,"tags":["webhooks"],"grid":14},"attrs":[{},{},{},{},{},{},{},{}],"properties":{"order":92,"id":29,"name":"rules, search-Rule","prevSize":28,"code":59719},"setIdx":1,"setId":1,"iconIdx":73},{"icon":{"paths":["M512 682.667h-341.333c-5.845 0-11.349-1.152-16.299-3.2-5.205-2.133-9.899-5.333-13.867-9.301s-7.125-8.661-9.301-13.867c-2.048-4.949-3.2-10.453-3.2-16.299v-426.667c0-5.845 1.152-11.349 3.2-16.299 2.133-5.205 5.333-9.899 9.301-13.867s8.661-7.125 13.867-9.301c4.949-2.048 10.453-3.2 16.299-3.2h682.667c5.845 0 11.349 1.152 16.299 3.2 5.205 2.133 9.899 5.333 13.867 9.301s7.125 8.661 9.301 13.867c2.048 4.949 3.2 10.453 3.2 16.299v426.667c0 5.845-1.152 11.349-3.2 16.299-2.133 5.205-5.333 9.899-9.301 13.867s-8.661 7.125-13.867 9.301c-4.949 2.048-10.453 3.2-16.299 3.2zM469.333 768v85.333h-128c-23.552 0-42.667 19.115-42.667 42.667s19.115 42.667 42.667 42.667h341.333c23.552 0 42.667-19.115 42.667-42.667s-19.115-42.667-42.667-42.667h-128v-85.333h298.667c17.28 0 33.835-3.456 48.981-9.728 15.701-6.485 29.781-16 41.557-27.776s21.291-25.856 27.776-41.557c6.229-15.104 9.685-31.659 9.685-48.939v-426.667c0-17.28-3.456-33.835-9.728-48.981-6.485-15.701-16-29.781-27.776-41.557s-25.856-21.291-41.557-27.776c-15.104-6.229-31.659-9.685-48.939-9.685h-682.667c-17.28 0-33.835 3.456-48.981 9.728-15.659 6.485-29.739 16-41.515 27.776s-21.291 25.856-27.776 41.515c-6.272 15.147-9.728 31.701-9.728 48.981v426.667c0 17.28 3.456 33.835 9.728 48.981 6.485 15.701 16 29.781 27.776 41.557s25.856 21.291 41.557 27.776c15.104 6.229 31.659 9.685 48.939 9.685z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["monitor"],"grid":0},"attrs":[{}],"properties":{"order":132,"id":0,"prevSize":24,"code":59765,"name":"type-UI"},"setIdx":1,"setId":1,"iconIdx":74},{"icon":{"paths":["M66.337 575.491l276.668-171.531v-57.177l-331.627 207.614v42.189l331.627 207.614-0-57.177z","M957.663 575.49l-276.668-171.531v-57.177l331.627 207.614v42.189l-331.627 207.614 0-57.177z","M583.295 214.183l-200.825 621.623 53.007 17.527 200.837-621.623z"],"attrs":[{},{},{}],"isMulticolor":false,"isMulticolor2":false,"tags":["prerender"],"grid":0},"attrs":[{},{},{}],"properties":{"order":114,"id":0,"name":"prerender","prevSize":24,"code":59724},"setIdx":1,"setId":1,"iconIdx":75},{"icon":{"paths":["M1024 512c0 282.77-229.23 512-512 512s-512-229.23-512-512c0-282.77 229.23-512 512-512s512 229.23 512 512z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["circle"],"grid":0},"attrs":[{}],"properties":{"order":106,"id":1,"name":"circle","prevSize":24,"code":59729},"setIdx":1,"setId":1,"iconIdx":76},{"icon":{"paths":["M512 0c-15.36 0-25.6 10.24-25.6 25.6s10.24 25.6 25.6 25.6h128v870.4h-128c-15.36 0-25.6 10.24-25.6 25.6s10.24 25.6 25.6 25.6h307.2c15.36 0 25.6-10.24 25.6-25.6s-10.24-25.6-25.6-25.6h-128v-870.4h128c15.36 0 25.6-10.24 25.6-25.6s-10.24-25.6-25.6-25.6h-307.2zM51.2 204.8c-28.16 0-51.2 23.040-51.2 51.2v460.8c0 28.16 23.040 51.2 51.2 51.2h537.6v-51.2h-512c-15.36 0-25.6-10.24-25.6-25.6v-409.6c0-15.36 10.24-25.6 25.6-25.6h512v-51.2h-537.6zM742.4 204.8v51.2h204.8c15.36 0 25.6 10.24 25.6 25.6v409.6c0 15.36-10.24 25.6-25.6 25.6h-204.8v51.2h230.4c28.16 0 51.2-23.040 51.2-51.2v-460.8c0-28.16-23.040-51.2-51.2-51.2h-230.4z","M386.56 606.72c0 12.8-7.68 23.040-20.48 25.6-28.16 10.24-58.88 15.36-92.16 15.36-35.84 0-66.56-10.24-84.48-25.6s-25.6-38.4-25.6-66.56 10.24-51.2 25.6-66.56c17.92-17.92 46.080-23.040 84.48-23.040h69.12v-38.4c0-35.84-25.6-53.76-64-53.76-23.040 0-46.080 7.68-69.12 20.48-2.56 2.56-5.12 2.56-10.24 2.56-10.24 0-20.48-7.68-20.48-20.48 0-7.68 2.56-12.8 10.24-17.92 30.72-20.48 61.44-25.6 92.16-25.6 56.32 0 104.96 30.72 104.96 92.16v181.76zM345.6 501.76h-69.12c-61.44 0-69.12 28.16-69.12 53.76s7.68 56.32 69.12 56.32c23.040 0 46.080-2.56 69.12-10.24v-99.84z"],"attrs":[{},{}],"isMulticolor":false,"isMulticolor2":false,"tags":["control-Slug"],"grid":0},"attrs":[{},{}],"properties":{"order":103,"id":2,"name":"control-Slug","prevSize":24,"code":59727},"setIdx":1,"setId":1,"iconIdx":77},{"icon":{"paths":["M295.954 822.751h-94.705c-47.353 0-88.786-41.434-88.786-88.786v-491.283c0-47.353 41.434-88.786 88.786-88.786h94.705v-59.191h-94.705c-82.867 0-147.977 65.11-147.977 147.977v491.283c0 82.867 65.11 147.977 147.977 147.977h94.705v-59.191z","M970.728 473.526c-82.867-171.653-201.249-378.821-272.277-378.821h-112.462v59.191h112.462c35.514 11.838 136.139 177.572 213.087 337.387-76.948 153.896-177.572 325.549-213.087 337.387h-112.462v59.191h112.462c71.029 0 183.491-207.168 272.277-384.74l5.919-11.838-5.919-17.757z","M266.358 337.341v260.462h59.191v-260.462z","M479.422 337.341v260.462h59.191v-260.462z"],"attrs":[{},{},{},{}],"isMulticolor":false,"isMulticolor2":false,"tags":["Tags"],"grid":0},"attrs":[{},{},{},{}],"properties":{"order":98,"id":3,"name":"type-Tags","prevSize":24,"code":59722},"setIdx":1,"setId":1,"iconIdx":78},{"icon":{"paths":["M512 102.4c-200.4 0-366.954 144.072-402.4 334.2-0.031 0.165-0.069 0.335-0.1 0.5-2.974 16.061-4.76 32.441-5.8 49.1-0.017 0.271-0.084 0.529-0.1 0.8 0.019 0.004 0.080-0.004 0.1 0-0.503 8.31-1.3 16.564-1.3 25 0 226.202 183.398 409.6 409.6 409.6 208.165 0 379.707-155.44 405.8-356.5 0.004-0.033-0.004-0.067 0-0.1 1.94-14.978 3.124-30.16 3.4-45.6 0.044-2.487 0.4-4.903 0.4-7.4 0-226.202-183.398-409.6-409.6-409.6zM512 153.6c185.461 0 337.902 140.924 356.4 321.5-35.181-21.812-84.232-39.9-151.6-39.9-85.35 0-140.891 41.606-194.6 81.9-49.152 36.864-95.55 71.7-163.8 71.7-86.067 0-135.862-54.67-175.9-98.6-9.001-9.901-17.11-17.483-25.4-25.3 23.131-175.603 172.981-311.3 354.9-311.3zM716.8 486.4c77.828 0 125.173 28.221 152.2 52.8-13.96 185.173-168.254 331.2-357 331.2-190.097 0-345.175-148.14-357.2-335.2 41.826 45.372 102.577 104.8 203.6 104.8 85.35 0 140.891-41.606 194.6-81.9 49.152-36.915 95.55-71.7 163.8-71.7z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["activity"],"grid":0},"attrs":[{}],"properties":{"order":12,"id":4,"name":"activity, history, time","prevSize":24,"code":59652},"setIdx":1,"setId":1,"iconIdx":79},{"icon":{"paths":["M512 0c-35.392 0-64 28.608-64 64v384h-384c-35.392 0-64 28.608-64 64s28.608 64 64 64h384v384c0 35.392 28.608 64 64 64s64-28.608 64-64v-384h384c35.392 0 64-28.608 64-64s-28.608-64-64-64h-384v-384c0-35.392-28.608-64-64-64z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["add"],"grid":0},"attrs":[{}],"properties":{"order":13,"id":5,"name":"add, plus","prevSize":24,"code":59653},"setIdx":1,"setId":1,"iconIdx":80},{"icon":{"paths":["M512 102.4c-226.202 0-409.6 183.398-409.6 409.6s183.398 409.6 409.6 409.6c226.202 0 409.6-183.398 409.6-409.6s-183.398-409.6-409.6-409.6zM512 153.6c197.632 0 358.4 160.819 358.4 358.4s-160.768 358.4-358.4 358.4c-197.632 0-358.4-160.819-358.4-358.4s160.768-358.4 358.4-358.4zM691.9 333c-12.893 0.002-25.782 4.882-35.5 14.6l-222.2 221.9-67.7-67.5c-19.19-19.294-51.085-19.215-70.3 0-19.15 19.15-19.15 51.050 0 70.2 0.198 0.2 26.198 26.681 52 53 12.95 13.209 25.761 26.372 35.2 36 4.719 4.814 8.607 8.755 11.2 11.4 1.296 1.322 2.293 2.281 2.9 2.9 0.279 0.282 0.488 0.486 0.6 0.6 0.001 0.001 7.591-7.429 14.6-14.3l-14.5 14.4 0.2 0.2v0.1c19.43 19.327 51.57 19.327 71 0v-0.1l258.1-257.6c19.546-19.447 19.521-51.885-0.1-71.3-9.731-9.679-22.607-14.502-35.5-14.5z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["check-circle"],"grid":0},"attrs":[{}],"properties":{"order":14,"id":6,"name":"check-circle","prevSize":24,"code":59654},"setIdx":1,"setId":1,"iconIdx":81},{"icon":{"paths":["M512 1024c-282.778 0-512-229.222-512-512s229.222-512 512-512 512 229.222 512 512-229.222 512-512 512zM855.808 270.592c-19.2-19.2-50.278-19.2-69.478 0l-376.73 376.73-171.878-171.93c-19.2-19.2-50.278-19.2-69.478 0s-19.2 50.278 0 69.478c0 0 201.523 205.261 204.8 208.486 9.984 10.138 23.347 14.643 36.557 14.080 13.21 0.563 26.573-3.942 36.608-14.029 3.277-3.226 409.6-413.286 409.6-413.286 19.2-19.2 19.2-50.33 0-69.53z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["check-circle-filled"],"grid":0},"attrs":[{}],"properties":{"order":27,"id":7,"name":"check-circle-filled","prevSize":24,"code":59655},"setIdx":1,"setId":1,"iconIdx":82},{"icon":{"paths":["M601.024 512l276.736 276.736c24.512 24.576 24.512 64.384 0 89.024-24.64 24.576-64.384 24.576-89.024 0l-276.736-276.736-276.736 276.736c-24.512 24.576-64.384 24.576-89.024 0-24.512-24.64-24.512-64.448 0-89.024l276.736-276.736-276.736-276.736c-24.512-24.576-24.512-64.384 0-89.024 24.64-24.576 64.512-24.576 89.024 0l276.736 276.736 276.736-276.736c24.64-24.576 64.384-24.576 89.024 0 24.512 24.64 24.512 64.448 0 89.024l-276.736 276.736z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["close"],"grid":0},"attrs":[{}],"properties":{"order":28,"id":8,"name":"close","prevSize":24,"code":59656},"setIdx":1,"setId":1,"iconIdx":83},{"icon":{"paths":["M409.6 435.2h-153.6v51.2h153.6v-51.2zM409.6 332.8h-153.6v51.2h153.6v-51.2zM256 691.2h409.6v-51.2h-409.6v51.2zM409.6 230.4h-153.6v51.2h153.6v-51.2zM870.4 179.2h-51.2v-51.2c0-28.262-22.938-51.2-51.2-51.2h-614.4c-28.262 0-51.2 22.938-51.2 51.2v665.6c0 28.262 22.938 51.2 51.2 51.2h51.2v51.2c0 28.262 22.938 51.2 51.2 51.2h614.4c28.262 0 51.2-22.938 51.2-51.2v-665.6c0-28.262-22.938-51.2-51.2-51.2zM179.2 793.6c-14.157 0-25.6-11.443-25.6-25.6v-614.4c0-14.131 11.443-25.6 25.6-25.6h563.2c14.157 0 25.6 11.469 25.6 25.6v614.4c0 14.157-11.443 25.6-25.6 25.6h-563.2zM870.4 870.4c0 14.157-11.443 25.6-25.6 25.6h-563.2c-14.157 0-25.6-11.443-25.6-25.6v-25.6h512c28.262 0 51.2-22.938 51.2-51.2v-563.2h25.6c14.157 0 25.6 11.469 25.6 25.6v614.4zM614.4 230.4h-102.4c-28.262 0-51.2 22.938-51.2 51.2v153.6c0 28.262 22.938 51.2 51.2 51.2h102.4c28.262 0 51.2-22.938 51.2-51.2v-153.6c0-28.262-22.938-51.2-51.2-51.2zM614.4 435.2h-102.4v-153.6h102.4v153.6zM256 588.8h409.6v-51.2h-409.6v51.2z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["content"],"grid":0},"attrs":[{}],"properties":{"order":37,"id":9,"name":"type-References","prevSize":24,"code":59657},"setIdx":1,"setId":1,"iconIdx":84},{"icon":{"paths":["M793.6 844.8c0 14.157-11.443 25.6-25.6 25.6h-665.6c-14.131 0-25.6-11.443-25.6-25.6v-665.6c0-14.157 11.469-25.6 25.6-25.6h665.6c14.157 0 25.6 11.443 25.6 25.6v102.4h51.2v-128c0-28.262-22.938-51.2-51.2-51.2h-716.8c-28.262 0-51.2 22.938-51.2 51.2v716.8c0 28.262 22.938 51.2 51.2 51.2h716.8c28.262 0 51.2-22.938 51.2-51.2v-281.6h-51.2v256zM991.078 237.747c-9.958-9.958-26.035-9.958-35.968 0l-391.91 391.91-238.31-238.31c-9.958-9.958-26.061-9.958-35.942 0-9.958 9.907-9.958 26.010 0 35.942l254.874 254.874c0.461 0.538 0.614 1.203 1.126 1.69 5.043 5.018 11.674 7.475 18.278 7.373 6.605 0.102 13.235-2.355 18.278-7.373 0.512-0.512 0.666-1.178 1.126-1.69l408.448-408.474c9.933-9.933 9.933-26.035 0-35.942z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["control-checkbox"],"grid":0},"attrs":[{}],"properties":{"order":38,"id":10,"name":"control-Checkbox","prevSize":24,"code":59658},"setIdx":1,"setId":1,"iconIdx":85},{"icon":{"paths":["M51.2 0c-28.262 0-51.2 22.938-51.2 51.2v281.6c0 28.262 22.938 51.2 51.2 51.2h921.6c28.262 0 51.2-22.938 51.2-51.2v-281.6c0-28.262-22.938-51.2-51.2-51.2h-921.6zM76.8 51.2h512v281.6h-512c-14.157 0-25.6-11.443-25.6-25.6v-230.4c0-14.157 11.443-25.6 25.6-25.6zM640 51.2h307.2c14.157 0 25.6 11.443 25.6 25.6v230.4c0 14.157-11.443 25.6-25.6 25.6h-307.2v-281.6zM716.8 153.6c-0.41 0.358 89.139 102.938 89.6 102.4 0.512 0 89.6-95.36 89.6-102.4 0 0.384-172.16 0-179.2 0zM128 435.2c-42.394 0-76.8 34.406-76.8 76.8s34.406 76.8 76.8 76.8c42.394 0 76.8-34.406 76.8-76.8s-34.406-76.8-76.8-76.8zM128 486.4c14.157 0 25.6 11.443 25.6 25.6s-11.443 25.6-25.6 25.6c-14.157 0-25.6-11.443-25.6-25.6s11.443-25.6 25.6-25.6zM307.2 486.4c-14.157 0-25.6 11.443-25.6 25.6s11.443 25.6 25.6 25.6h640c14.157 0 25.6-11.443 25.6-25.6s-11.443-25.6-25.6-25.6h-640zM128 640c-42.394 0-76.8 34.381-76.8 76.8s34.406 76.8 76.8 76.8c42.394 0 76.8-34.381 76.8-76.8s-34.406-76.8-76.8-76.8zM128 691.2c14.157 0 25.6 11.443 25.6 25.6s-11.443 25.6-25.6 25.6c-14.157 0-25.6-11.443-25.6-25.6s11.443-25.6 25.6-25.6zM307.2 691.2c-14.157 0-25.6 11.443-25.6 25.6s11.443 25.6 25.6 25.6h640c14.157 0 25.6-11.443 25.6-25.6s-11.443-25.6-25.6-25.6h-640zM128 844.8c-42.394 0-76.8 34.381-76.8 76.8s34.406 76.8 76.8 76.8c42.394 0 76.8-34.381 76.8-76.8s-34.406-76.8-76.8-76.8zM128 896c14.157 0 25.6 11.443 25.6 25.6s-11.443 25.6-25.6 25.6c-14.157 0-25.6-11.443-25.6-25.6s11.443-25.6 25.6-25.6zM307.2 896c-14.157 0-25.6 11.443-25.6 25.6s11.443 25.6 25.6 25.6h640c14.157 0 25.6-11.443 25.6-25.6s-11.443-25.6-25.6-25.6h-640z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["control-dropdown"],"grid":0},"attrs":[{}],"properties":{"order":39,"id":11,"name":"control-Dropdown","prevSize":24,"code":59659},"setIdx":1,"setId":1,"iconIdx":86},{"icon":{"paths":["M512 0c-14.157 0-25.6 11.443-25.6 25.6s11.443 25.6 25.6 25.6h128v870.4h-128c-14.157 0-25.6 11.443-25.6 25.6s11.443 25.6 25.6 25.6h307.2c14.157 0 25.6-11.443 25.6-25.6s-11.443-25.6-25.6-25.6h-128v-870.4h128c14.157 0 25.6-11.443 25.6-25.6s-11.443-25.6-25.6-25.6h-307.2zM51.2 204.8c-28.262 0-51.2 22.938-51.2 51.2v460.8c0 28.262 22.938 51.2 51.2 51.2h537.6v-51.2h-512c-14.131 0-25.6-11.443-25.6-25.6v-409.6c0-14.157 11.469-25.6 25.6-25.6h512v-51.2h-537.6zM742.4 204.8v51.2h204.8c14.157 0 25.6 11.443 25.6 25.6v409.6c0 14.157-11.443 25.6-25.6 25.6h-204.8v51.2h230.4c28.262 0 51.2-22.938 51.2-51.2v-460.8c0-28.262-22.938-51.2-51.2-51.2h-230.4zM285.9 307c-0.589 0.051-1.161 0.048-1.75 0.15-8.243 0.051-16.396 4.474-20.85 13.050l-132.55 306.25c-6.656 12.749-2.866 28.981 8.5 36.2 11.341 7.219 25.97 2.749 32.6-10l27.65-63.85h170.5c0.512 0 0.914-0.224 1.4-0.25l27.45 64.050c6.63 12.749 21.136 17.269 32.4 10.050s15.005-23.451 8.4-36.2l-131.3-306.25c-4.454-8.576-12.432-12.973-20.65-13.050-0.614-0.102-1.211-0.099-1.8-0.15zM285.9 389.15l63.65 148.45h-127.9l64.25-148.45z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["control-input"],"grid":0},"attrs":[{}],"properties":{"order":41,"id":12,"name":"control-Input","prevSize":24,"code":59660},"setIdx":1,"setId":1,"iconIdx":87},{"icon":{"paths":["M153.6 716.8c-84.787 0-153.6 68.813-153.6 153.6s68.813 153.6 153.6 153.6c84.787 0 153.6-68.813 153.6-153.6s-68.813-153.6-153.6-153.6zM153.6 972.8c-56.55 0-102.4-45.85-102.4-102.4s45.85-102.4 102.4-102.4c56.55 0 102.4 45.85 102.4 102.4s-45.85 102.4-102.4 102.4zM384 179.2h614.4c14.157 0 25.6-11.443 25.6-25.6s-11.443-25.6-25.6-25.6h-614.4c-14.131 0-25.6 11.443-25.6 25.6s11.469 25.6 25.6 25.6zM998.4 486.4h-614.4c-14.131 0-25.6 11.443-25.6 25.6s11.469 25.6 25.6 25.6h614.4c14.157 0 25.6-11.443 25.6-25.6s-11.443-25.6-25.6-25.6zM153.6 0c-84.787 0-153.6 68.787-153.6 153.6s68.813 153.6 153.6 153.6c84.787 0 153.6-68.787 153.6-153.6s-68.813-153.6-153.6-153.6zM153.6 256c-56.55 0-102.4-45.85-102.4-102.4s45.85-102.4 102.4-102.4c56.55 0 102.4 45.85 102.4 102.4s-45.85 102.4-102.4 102.4zM153.6 358.4c-84.787 0-153.6 68.787-153.6 153.6 0 84.787 68.813 153.6 153.6 153.6s153.6-68.813 153.6-153.6c0-84.813-68.813-153.6-153.6-153.6zM153.6 614.4c-56.55 0-102.4-45.85-102.4-102.4s45.85-102.4 102.4-102.4c56.55 0 102.4 45.85 102.4 102.4s-45.85 102.4-102.4 102.4zM153.6 102.4c-28.262 0-51.2 22.938-51.2 51.2s22.938 51.2 51.2 51.2c28.262 0 51.2-22.938 51.2-51.2s-22.938-51.2-51.2-51.2zM998.4 844.8h-614.4c-14.131 0-25.6 11.443-25.6 25.6s11.469 25.6 25.6 25.6h614.4c14.157 0 25.6-11.443 25.6-25.6s-11.443-25.6-25.6-25.6z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["control-radio"],"grid":0},"attrs":[{}],"properties":{"order":42,"id":13,"name":"control-Radio","prevSize":24,"code":59661},"setIdx":1,"setId":1,"iconIdx":88},{"icon":{"paths":["M0 0v204.8h76.8v76.8h51.2v-76.8h76.8v-204.8h-204.8zM819.2 0v204.8h204.8v-204.8h-204.8zM51.2 51.2h102.4v102.4h-102.4v-102.4zM870.4 51.2h102.4v102.4h-102.4v-102.4zM281.6 76.8v51.2h102.4v-51.2h-102.4zM486.4 76.8v51.2h102.4v-51.2h-102.4zM691.2 76.8v51.2h102.4v-51.2h-102.4zM333.25 204.8c-7.091-0.307-14.348 2.097-19.75 7.55l-74.75 74.75c-10.317 10.291-10.317 27.083 0 37.4s27.059 10.317 37.35 0l68.45-68.5h141.85v486.4h-50.7c-7.117-0.307-14.348 2.097-19.75 7.55l-23.6 23.55c-10.317 10.317-10.317 27.083 0 37.4 10.291 10.317 27.109 10.317 37.4 0l17.25-17.3h129.75l18.050 18c10.394 10.368 27.181 10.368 37.6 0 10.368-10.394 10.368-27.181 0-37.6l-24-24c-5.478-5.478-12.682-7.907-19.85-7.6h-50.95v-486.4h141.55l69.25 69.2c10.394 10.368 27.155 10.368 37.6 0 10.368-10.368 10.368-27.181 0-37.6l-75.2-75.2c-5.478-5.478-12.706-7.907-19.9-7.6h-357.65zM896 281.6v102.4h51.2v-102.4h-51.2zM76.8 384v102.4h51.2v-102.4h-51.2zM896 486.4v102.4h51.2v-102.4h-51.2zM76.8 588.8v102.4h51.2v-102.4h-51.2zM896 691.2v102.4h51.2v-102.4h-51.2zM76.8 793.6v25.6h-76.8v204.8h204.8v-76.8h76.8v-51.2h-76.8v-76.8h-76.8v-25.6h-51.2zM819.2 819.2v76.8h-25.6v51.2h25.6v76.8h204.8v-204.8h-204.8zM51.2 870.4h102.4v102.4h-102.4v-102.4zM870.4 870.4h102.4v102.4h-102.4v-102.4zM384 896v51.2h102.4v-51.2h-102.4zM588.8 896v51.2h102.4v-51.2h-102.4z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["control-textarea"],"grid":0},"attrs":[{}],"properties":{"order":17,"id":14,"name":"control-TextArea","prevSize":24,"code":59662},"setIdx":1,"setId":1,"iconIdx":89},{"icon":{"paths":["M332.8 25.6c-127.258 0-230.4 103.142-230.4 230.4s103.142 230.4 230.4 230.4h358.4c127.258 0 230.4-103.142 230.4-230.4s-103.142-230.4-230.4-230.4h-358.4zM332.8 76.8h358.4c98.97 0 179.2 80.23 179.2 179.2s-80.23 179.2-179.2 179.2h-358.4c-98.97 0-179.2-80.23-179.2-179.2s80.23-179.2 179.2-179.2zM332.8 128c-70.707 0-128 57.293-128 128s57.293 128 128 128c70.707 0 128-57.293 128-128s-57.293-128-128-128zM332.8 179.2c42.419 0 76.8 34.381 76.8 76.8s-34.381 76.8-76.8 76.8c-42.419 0-76.8-34.381-76.8-76.8s34.381-76.8 76.8-76.8zM332.8 537.6c-127.258 0-230.4 103.142-230.4 230.4s103.142 230.4 230.4 230.4h358.4c127.258 0 230.4-103.142 230.4-230.4s-103.142-230.4-230.4-230.4h-358.4zM332.8 588.8h358.4c98.97 0 179.2 80.23 179.2 179.2s-80.23 179.2-179.2 179.2h-358.4c-98.97 0-179.2-80.23-179.2-179.2s80.23-179.2 179.2-179.2zM691.2 640c-70.707 0-128 57.293-128 128s57.293 128 128 128c70.707 0 128-57.293 128-128s-57.293-128-128-128zM691.2 691.2c42.419 0 76.8 34.381 76.8 76.8s-34.381 76.8-76.8 76.8c-42.419 0-76.8-34.381-76.8-76.8s34.381-76.8 76.8-76.8z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["control-toggle"],"grid":0},"attrs":[{}],"properties":{"order":16,"id":15,"name":"control-Toggle","prevSize":24,"code":59663},"setIdx":1,"setId":1,"iconIdx":90},{"icon":{"paths":["M204.8 51.2c-56.525 0-102.4 45.875-102.4 102.4v512c0 56.525 45.875 102.4 102.4 102.4h409.6c56.525 0 102.4-45.875 102.4-102.4v-512c0-56.525-45.875-102.4-102.4-102.4h-409.6zM204.8 102.4h409.6c28.262 0 51.2 22.886 51.2 51.2v512c0 28.314-22.938 51.2-51.2 51.2h-409.6c-28.262 0-51.2-22.886-51.2-51.2v-512c0-28.314 22.938-51.2 51.2-51.2zM768 204.8v51.2c28.262 0 51.2 22.886 51.2 51.2v512c0 28.314-22.938 51.2-51.2 51.2h-409.6c-28.262 0-51.2-22.886-51.2-51.2h-51.2c0 56.525 45.875 102.4 102.4 102.4h409.6c56.525 0 102.4-45.875 102.4-102.4v-512c0-56.525-45.875-102.4-102.4-102.4z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["copy"],"grid":0},"attrs":[{}],"properties":{"order":90,"id":16,"name":"copy","prevSize":24,"code":59664},"setIdx":1,"setId":1,"iconIdx":91},{"icon":{"paths":["M828.8 1024h-633.6c-105.6 0-195.2-89.6-195.2-195.2v-320c0-281.6 227.2-508.8 505.6-508.8 288 0 518.4 230.4 518.4 518.4v310.4c0 105.6-89.6 195.2-195.2 195.2zM505.6 64c-243.2 0-441.6 198.4-441.6 441.6v320c0 73.6 60.8 134.4 131.2 134.4h630.4c73.6 0 131.2-60.8 131.2-131.2v-310.4c3.2-249.6-201.6-454.4-451.2-454.4z","M512 668.8c-3.2 0-6.4 0-6.4 0-32-3.2-64-19.2-80-48l-192-278.4c-9.6-9.6-9.6-25.6-0-38.4 9.6-9.6 25.6-12.8 38.4-6.4l294.4 172.8c28.8 16 48 44.8 51.2 76.8s-6.4 64-28.8 89.6c-19.2 22.4-48 32-76.8 32zM364.8 428.8l108.8 160c6.4 9.6 19.2 19.2 32 19.2s25.6-3.2 35.2-12.8c9.6-9.6 12.8-22.4 9.6-35.2s-9.6-22.4-19.2-32l-166.4-99.2z","M678.4 364.8c-6.4 0-12.8-3.2-19.2-6.4-16-9.6-19.2-28.8-9.6-44.8l54.4-83.2c9.6-16 28.8-19.2 44.8-9.6 19.2 12.8 22.4 35.2 12.8 48l-54.4 83.2c-6.4 9.6-16 12.8-28.8 12.8z"],"attrs":[{},{},{}],"isMulticolor":false,"isMulticolor2":false,"tags":["dashboard"],"grid":0},"attrs":[{},{},{}],"properties":{"order":26,"id":17,"name":"dashboard, search-Dashboard","prevSize":24,"code":59665},"setIdx":1,"setId":1,"iconIdx":92},{"icon":{"paths":["M597.35 819.2c14.131 0 25.6-11.469 25.6-25.6v-307.2c0-14.080-11.469-25.6-25.6-25.6s-25.6 11.52-25.6 25.6v307.2c0 14.131 11.418 25.6 25.6 25.6zM776.55 204.8h-153.6v-51.2c0-28.314-22.886-51.2-51.2-51.2h-102.4c-28.262 0-51.2 22.886-51.2 51.2v51.2h-153.6c-28.262 0-51.2 22.886-51.2 51.2v102.4c0 28.314 22.938 51.2 51.2 51.2v460.8c0 28.314 22.938 51.2 51.2 51.2h409.6c28.314 0 51.2-22.886 51.2-51.2v-460.8c28.314 0 51.2-22.886 51.2-51.2v-102.4c0-28.314-22.938-51.2-51.2-51.2zM469.35 153.6h102.4v51.2h-102.4v-51.2zM725.35 870.4h-409.6v-460.8h409.6v460.8zM776.55 358.4h-512v-102.4h512v102.4zM443.75 819.2c14.131 0 25.6-11.469 25.6-25.6v-307.2c0-14.080-11.469-25.6-25.6-25.6s-25.6 11.52-25.6 25.6v307.2c0 14.131 11.469 25.6 25.6 25.6z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["delete"],"grid":0},"attrs":[{}],"properties":{"order":29,"id":18,"name":"delete, bin","prevSize":24,"code":59666},"setIdx":1,"setId":1,"iconIdx":93},{"icon":{"paths":["M832 128h-192v-64c0-35.392-28.608-64-64-64h-128c-35.328 0-64 28.608-64 64v64h-192c-35.328 0-64 28.608-64 64v128c0 35.392 28.672 64 64 64v512c0 35.392 28.672 64 64 64h512c35.392 0 64-28.608 64-64v-512c35.392 0 64-28.608 64-64v-128c0-35.392-28.608-64-64-64zM448 64h128v64h-128v-64zM448 800c0 17.664-14.336 32-32 32s-32-14.336-32-32v-320c0-17.6 14.336-32 32-32s32 14.4 32 32v320zM640 800c0 17.664-14.336 32-32 32s-32-14.336-32-32v-320c0-17.6 14.336-32 32-32s32 14.4 32 32v320zM832 320h-640v-128h640v128z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["delete-filled"],"grid":0},"attrs":[{}],"properties":{"order":36,"id":19,"name":"delete-filled","prevSize":24,"code":59667},"setIdx":1,"setId":1,"iconIdx":94},{"icon":{"paths":["M358.4 102.4c-28.314 0-51.2 22.886-51.2 51.2v256h51.2v-256h307.2v153.6c0 28.314 22.886 51.2 51.2 51.2h153.6v512h-358.4v51.2h358.4c28.314 0 51.2-22.886 51.2-51.2v-548.2l-219.8-219.8h-343.4zM716.8 189.8l117.4 117.4h-117.4v-117.4zM332.8 460.8c-127.232 0-230.4 103.168-230.4 230.4s103.168 230.4 230.4 230.4c127.232 0 230.4-103.168 230.4-230.4s-103.168-230.4-230.4-230.4zM332.8 512c98.816 0 179.2 80.384 179.2 179.2s-80.384 179.2-179.2 179.2c-98.816 0-179.2-80.384-179.2-179.2s80.384-179.2 179.2-179.2zM227.2 665.6c-12.39 0-22.4 10.061-22.4 22.4v6.4c0 12.39 10.010 22.4 22.4 22.4h211.2c12.39 0 22.4-10.010 22.4-22.4v-6.4c0-12.39-10.061-22.4-22.4-22.4h-211.2z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["document-delete"],"grid":0},"attrs":[{}],"properties":{"order":35,"id":20,"name":"document-delete","prevSize":24,"code":59668},"setIdx":1,"setId":1,"iconIdx":95},{"icon":{"paths":["M358.4 102.4c-28.314 0-51.2 22.886-51.2 51.2v256h51.2v-256h307.2v153.6c0 28.314 22.886 51.2 51.2 51.2h153.6v512h-358.4v51.2h358.4c28.314 0 51.2-22.886 51.2-51.2v-548.2l-219.8-219.8h-343.4zM716.8 189.8l117.4 117.4h-117.4v-117.4zM332.8 460.8c-127.232 0-230.4 103.168-230.4 230.4s103.168 230.4 230.4 230.4c127.232 0 230.4-103.168 230.4-230.4s-103.168-230.4-230.4-230.4zM332.8 512c39.934 0 76.475 13.533 106.3 35.7l-250.4 249c-21.807-29.683-35.1-65.924-35.1-105.5 0-98.816 80.384-179.2 179.2-179.2zM477 585.7c21.785 29.674 35 65.947 35 105.5 0 98.816-80.384 179.2-179.2 179.2-39.906 0-76.386-13.561-106.2-35.7l250.4-249z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["document-disable"],"grid":0},"attrs":[{}],"properties":{"order":40,"id":21,"name":"document-disable","prevSize":24,"code":59669},"setIdx":1,"setId":1,"iconIdx":96},{"icon":{"paths":["M358.4 102.4c-28.314 0-51.2 22.886-51.2 51.2v256h51.2v-256h307.2v153.6c0 28.314 22.886 51.2 51.2 51.2h153.6v512h-358.4v51.2h358.4c28.314 0 51.2-22.886 51.2-51.2v-548.2l-219.8-219.8h-343.4zM716.8 189.8l117.4 117.4h-117.4v-117.4zM332.8 460.8l-230.4 256v51.2h102.4v153.6h256v-153.6h102.4v-51.2l-230.4-256zM332.8 537.3l161.5 179.5h-84.7v153.6h-153.6v-153.6h-84.7l161.5-179.5z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["document-publish"],"grid":0},"attrs":[{}],"properties":{"order":44,"id":22,"name":"document-publish","prevSize":24,"code":59670},"setIdx":1,"setId":1,"iconIdx":97},{"icon":{"paths":["M665.6 51.2v102.4h102.4v-102.4h-102.4zM460.8 153.6h102.4v-102.4h-102.4v102.4zM460.8 358.4h102.4v-102.4h-102.4v102.4zM665.6 358.4h102.4v-102.4h-102.4v102.4zM665.6 563.2h102.4v-102.4h-102.4v102.4zM460.8 563.2h102.4v-102.4h-102.4v102.4zM460.8 768h102.4v-102.4h-102.4v102.4zM665.6 768h102.4v-102.4h-102.4v102.4zM665.6 972.8h102.4v-102.4h-102.4v102.4zM460.8 972.8h102.4v-102.4h-102.4v102.4zM256 153.6h102.4v-102.4h-102.4v102.4zM256 358.4h102.4v-102.4h-102.4v102.4zM256 563.2h102.4v-102.4h-102.4v102.4zM256 768h102.4v-102.4h-102.4v102.4zM256 972.8h102.4v-102.4h-102.4v102.4z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["drag"],"grid":0},"attrs":[{}],"properties":{"order":43,"id":23,"name":"drag","prevSize":24,"code":59671},"setIdx":1,"setId":1,"iconIdx":98},{"icon":{"paths":["M846.72 170.667l-281.984 333.397c-6.272 7.381-10.069 17.024-10.069 27.563v295.339l-85.333-42.667v-252.672c0.043-9.685-3.285-19.499-10.069-27.563l-281.984-333.397zM938.667 85.333h-853.333c-23.552 0-42.667 19.115-42.667 42.667 0 10.539 3.797 20.181 10.069 27.563l331.264 391.68v263.424c0 16.597 9.472 31.019 23.595 38.144l170.667 85.333c21.077 10.539 46.72 2.005 57.259-19.072 3.072-6.229 4.523-12.843 4.48-19.072v-348.757l331.264-391.68c15.232-18.005 12.971-44.928-5.035-60.117-8.064-6.827-17.877-10.155-27.563-10.112z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["filter"],"grid":0},"attrs":[{}],"properties":{"order":18,"id":24,"name":"filter","prevSize":24,"code":59672},"setIdx":1,"setId":1,"iconIdx":99},{"icon":{"paths":["M512 0c-282.88 0-512 229.248-512 512 0 226.24 146.688 418.112 350.080 485.76 25.6 4.8 35.008-11.008 35.008-24.64 0-12.16-0.448-44.352-0.64-87.040-142.464 30.912-172.48-68.672-172.48-68.672-23.296-59.136-56.96-74.88-56.96-74.88-46.4-31.744 3.584-31.104 3.584-31.104 51.392 3.584 78.4 52.736 78.4 52.736 45.696 78.272 119.872 55.68 149.12 42.56 4.608-33.088 17.792-55.68 32.448-68.48-113.728-12.8-233.216-56.832-233.216-252.992 0-55.872 19.84-101.568 52.672-137.408-5.76-12.928-23.040-64.96 4.48-135.488 0 0 42.88-13.76 140.8 52.48 40.96-11.392 84.48-17.024 128-17.28 43.52 0.256 87.040 5.888 128 17.28 97.28-66.24 140.16-52.48 140.16-52.48 27.52 70.528 10.24 122.56 5.12 135.488 32.64 35.84 52.48 81.536 52.48 137.408 0 196.672-119.68 240-233.6 252.608 17.92 15.36 34.56 46.72 34.56 94.72 0 68.48-0.64 123.52-0.64 140.16 0 13.44 8.96 29.44 35.2 24.32 204.864-67.136 351.424-259.136 351.424-485.056 0-282.752-229.248-512-512-512z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["brand","github"],"grid":0},"attrs":[{}],"properties":{"order":77,"id":25,"name":"github","prevSize":24,"code":59713},"setIdx":1,"setId":1,"iconIdx":100},{"icon":{"paths":["M512 512h-204.8v51.2h204.8v-51.2zM768 153.6h-51.2c0-28.314-22.886-51.2-51.2-51.2h-307.2c-28.314 0-51.2 22.886-51.2 51.2h-51.2c-28.314 0-51.2 22.886-51.2 51.2v665.6c0 28.314 22.886 51.2 51.2 51.2h512c28.314 0 51.2-22.886 51.2-51.2v-665.6c0-28.314-22.886-51.2-51.2-51.2zM358.4 153.6h307.2v51.2h-307.2v-51.2zM768 819.2c0 28.314-22.886 51.2-51.2 51.2h-409.6c-28.314 0-51.2-22.886-51.2-51.2v-563.2c0-28.314 22.886-51.2 51.2-51.2 0 28.314 22.886 51.2 51.2 51.2h307.2c28.314 0 51.2-22.886 51.2-51.2 28.314 0 51.2 22.886 51.2 51.2v563.2zM307.2 460.8h409.6v-51.2h-409.6v51.2zM307.2 665.6h409.6v-51.2h-409.6v51.2z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["help"],"grid":0},"attrs":[{}],"properties":{"order":19,"id":26,"name":"help","prevSize":24,"code":59673},"setIdx":1,"setId":1,"iconIdx":101},{"icon":{"paths":["M512 0c-169.421 0-307.2 137.779-307.2 307.2 0 78.643 15.258 164.915 45.261 256.41 23.859 72.55 56.986 148.582 98.56 226.099 70.707 131.635 140.339 220.774 143.309 224.512 4.813 6.195 12.288 9.779 20.070 9.779 7.834 0 15.258-3.584 20.122-9.779 2.97-3.686 72.602-92.826 143.309-224.512 41.574-77.517 74.701-153.549 98.56-226.099 29.952-91.494 45.21-177.766 45.21-256.41 0-169.421-137.83-307.2-307.2-307.2zM630.682 764.672c-46.234 86.374-92.979 154.982-118.682 190.822-25.6-35.635-72.038-103.885-118.221-189.952-62.874-117.146-137.779-291.738-137.779-458.342 0-141.158 114.842-256 256-256s256 114.842 256 256c0 166.298-74.65 340.582-137.318 457.472zM512 153.6c-84.685 0-153.6 68.915-153.6 153.6s68.915 153.6 153.6 153.6 153.6-68.915 153.6-153.6-68.915-153.6-153.6-153.6zM512 409.6c-56.525 0-102.4-45.875-102.4-102.4 0-56.474 45.875-102.4 102.4-102.4 56.474 0 102.4 45.926 102.4 102.4 0 56.525-45.926 102.4-102.4 102.4z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["location"],"grid":0},"attrs":[{}],"properties":{"order":25,"id":27,"name":"location, control-Map, type-Geolocation","prevSize":24,"code":59675},"setIdx":1,"setId":1,"iconIdx":102},{"icon":{"paths":["M512.273 83.782c-0.141 0.056-182.959 84.073-229.418 256.782-4.481 16.584 32.696 9.296 31.036 27.527-2.034 22.136-44.668 31.201-39.109 94.764 5.659 64.734 60.321 130.141 68.527 169.673v27.655c-0.497 8.54-4.566 31.715-18.018 43.036-7.378 6.19-17.322 8.421-30.436 6.782-18.205-2.275-25.449-14.468-28.345-24.309-4.753-16.218-0.322-35.123 10.345-44 10.724-8.924 12.17-24.842 3.236-35.564-8.934-10.712-24.858-12.161-35.582-3.218-25.995 21.64-36.887 61.52-26.491 97 9.815 33.392 36.197 55.884 70.6 60.182 4.903 0.609 9.566 0.909 14 0.909 26.623 0 44.661-10.175 55.582-19.455 32.866-27.97 35.449-74.593 35.636-79.818 0.009-0.309 0.018-0.618 0.018-0.927v-21.218h0.109v-1.418c0-12.351 10.008-22.364 22.382-22.364 11.944 0 21.609 9.346 22.273 21.109v202.491c-0.206 2.912-2.536 29.892-17.891 42.945-7.368 6.274-17.384 8.53-30.545 6.873-18.214-2.275-25.476-14.468-28.364-24.291-4.762-16.228-0.322-35.151 10.345-44.018 10.724-8.933 12.188-24.833 3.255-35.564-8.924-10.694-24.876-12.161-35.6-3.218-26.013 21.631-36.887 61.52-26.491 97 9.796 33.392 36.197 55.893 70.6 60.2 4.903 0.609 9.566 0.891 14 0.891 26.623 0 44.671-10.156 55.564-19.436 32.875-27.97 35.458-74.611 35.636-79.836 0.019-0.328 0.018-0.609 0.018-0.909v-225.636l0.127-0.055v-1c0-12.595 10.219-22.8 22.836-22.8 12.349 0 22.333 9.824 22.727 22.073v227.418c0 0.309-0 0.591 0.018 0.909 0.187 5.216 2.779 51.866 35.655 79.836 10.912 9.28 28.959 19.436 55.582 19.436 4.443 0 9.088-0.282 13.982-0.891 34.394-4.307 60.804-26.818 70.6-60.2 10.405-35.48-0.487-75.36-26.491-97-10.743-8.943-26.676-7.466-35.6 3.218-8.934 10.74-7.488 26.63 3.236 35.564 10.668 8.868 15.135 27.79 10.364 44.018-2.878 9.823-10.159 22.015-28.364 24.291-13.105 1.648-23.050-0.592-30.418-6.782-13.508-11.358-17.558-34.657-18.036-43v-201.818c0.297-12.093 10.14-21.818 22.327-21.818 12.374 0 22.4 10.003 22.4 22.364v1.418h0.073v21.218c0 0.318-0 0.628 0.018 0.927 0.178 5.216 2.779 51.848 35.655 79.818 10.912 9.28 28.941 19.455 55.564 19.455 4.434 0 9.107-0.292 14-0.891 34.394-4.298 60.786-26.818 70.582-60.2 10.405-35.48-0.487-75.351-26.491-97-10.743-8.933-26.667-7.476-35.582 3.236-8.943 10.722-7.488 26.622 3.236 35.545 10.668 8.877 15.117 27.8 10.345 44.018-2.878 9.842-10.159 22.025-28.364 24.291-13.086 1.648-23.050-0.583-30.418-6.764-13.508-11.368-17.549-34.675-18.018-43v-21.018c5.305-54.103 63.095-107.777 69.091-176.364 5.531-63.563-37.121-72.627-39.145-94.764-1.669-18.232 35.498-10.944 31.036-27.527-46.468-172.709-229.269-256.726-229.4-256.782z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["logo"],"grid":0},"attrs":[{}],"properties":{"order":31,"id":28,"name":"logo","prevSize":24,"code":59676},"setIdx":1,"setId":1,"iconIdx":103},{"icon":{"paths":["M947.2 0h-870.4c-42.342 0-76.8 34.458-76.8 76.8v870.4c0 42.342 34.458 76.8 76.8 76.8h870.4c42.342 0 76.8-34.458 76.8-76.8v-870.4c0-42.342-34.458-76.8-76.8-76.8zM972.8 947.2c0 14.157-11.443 25.6-25.6 25.6h-870.4c-14.131 0-25.6-11.443-25.6-25.6v-870.4c0-14.131 11.469-25.6 25.6-25.6h870.4c14.157 0 25.6 11.469 25.6 25.6v870.4zM665.6 460.8c56.448 0 102.4-45.926 102.4-102.4s-45.952-102.4-102.4-102.4c-56.448 0-102.4 45.926-102.4 102.4s45.952 102.4 102.4 102.4zM665.6 307.2c28.211 0 51.2 22.989 51.2 51.2s-22.989 51.2-51.2 51.2c-28.211 0-51.2-22.989-51.2-51.2s22.989-51.2 51.2-51.2zM896 102.4h-768c-14.131 0-25.6 11.469-25.6 25.6v614.4c0 14.157 11.469 25.6 25.6 25.6h768c14.157 0 25.6-11.443 25.6-25.6v-614.4c0-14.131-11.443-25.6-25.6-25.6zM153.6 716.8v-118.246l164.301-184.858c4.198-4.787 9.728-7.373 15.462-7.475 5.734-0.051 11.29 2.458 15.642 7.040l283.238 303.539h-478.643zM870.4 716.8h-168.090l-315.853-338.432c-14.285-15.334-33.331-23.603-53.709-23.347-20.326 0.256-39.219 9.011-53.094 24.627l-126.054 141.798v-367.846h716.8v563.2z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["media"],"grid":0},"attrs":[{}],"properties":{"order":30,"id":29,"name":"media, type-Assets, trigger-AssetChanged, control-StockPhoto","prevSize":24,"code":59677},"setIdx":1,"setId":1,"iconIdx":104},{"icon":{"paths":["M128 384c-70.656 0-128 57.344-128 128s57.344 128 128 128c70.656 0 128-57.344 128-128s-57.344-128-128-128zM512 384c-70.656 0-128 57.344-128 128s57.344 128 128 128c70.656 0 128-57.344 128-128s-57.344-128-128-128zM896 384c-70.656 0-128 57.344-128 128s57.344 128 128 128c70.656 0 128-57.344 128-128s-57.344-128-128-128z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["more"],"grid":0},"attrs":[{}],"properties":{"order":34,"id":30,"name":"more, dots","prevSize":24,"code":59678},"setIdx":1,"setId":1,"iconIdx":105},{"icon":{"paths":["M877.12 311.104l-66.304 66.368-228.224-228.224 66.368-66.368c25.216-25.152 66.048-25.152 91.264 0l136.896 137.024c25.216 25.216 25.216 65.984 0 91.2zM760.896 427.392l-386.176 386.112c-25.216 25.28-66.048 25.28-91.264 0l-136.96-136.896c-25.216-25.28-25.216-66.112 0-91.264l386.24-386.24 228.16 228.288zM64 896v-191.872l191.936 191.872h-191.936z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["pencil"],"grid":0},"attrs":[{}],"properties":{"order":47,"id":31,"name":"pencil","prevSize":24,"code":59679},"setIdx":1,"setId":1,"iconIdx":106},{"icon":{"paths":["M892.083 131.917c-73.523-73.498-193.152-73.498-266.65 0l-157.184 157.107c-9.958 10.035-9.958 26.214 0 36.275 10.061 9.984 26.24 9.984 36.25 0l157.133-157.107c53.504-53.555 140.672-53.555 194.176 0 53.581 53.504 53.581 140.672 0 194.176l-186.138 186.163c-53.53 53.581-140.672 53.581-194.176 0-10.086-10.010-26.24-10.010-36.275 0-10.035 10.086-10.035 26.189 0 36.25 36.787 36.736 84.992 55.117 133.325 55.117s96.589-18.432 133.376-55.117l186.163-186.214c73.498-73.472 73.498-193.152 0-266.65zM519.45 698.726l-157.082 157.082c-53.504 53.555-140.672 53.555-194.176 0-53.581-53.504-53.581-140.672 0-194.176l186.138-186.163c53.53-53.581 140.672-53.581 194.176 0 10.086 9.984 26.189 9.984 36.275 0 10.035-10.086 10.035-26.214 0-36.25-73.549-73.498-193.203-73.498-266.701 0l-186.163 186.163c-73.498 73.574-73.498 193.203 0 266.701 36.787 36.71 85.043 55.117 133.325 55.117 48.333 0 96.538-18.406 133.325-55.117l157.133-157.133c10.010-10.010 10.010-26.189 0-36.224-10.010-9.984-26.189-9.984-36.25 0z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["reference"],"grid":0},"attrs":[{}],"properties":{"order":45,"id":32,"name":"reference","prevSize":24,"code":59680},"setIdx":1,"setId":1,"iconIdx":107},{"icon":{"paths":["M800 1024h-576c-124.8 0-224-99.2-224-224v-300.8c0-124.8 99.2-224 224-224h576c124.8 0 224 99.2 224 224v300.8c0 124.8-99.2 224-224 224zM224 339.2c-89.6 0-160 70.4-160 160v300.8c0 89.6 70.4 160 160 160h576c89.6 0 160-70.4 160-160v-300.8c0-89.6-70.4-160-160-160h-576z","M828.8 201.6h-633.6c-19.2 0-32-12.8-32-32s12.8-32 32-32h630.4c19.2 0 32 12.8 32 32s-12.8 32-28.8 32z","M716.8 64h-409.6c-19.2 0-32-12.8-32-32s12.8-32 32-32h412.8c19.2 0 32 12.8 32 32s-16 32-35.2 32z","M800 416v64c0 48-38.4 83.2-83.2 83.2h-409.6c-44.8 3.2-83.2-35.2-83.2-83.2v-64h-54.4v64c0 76.8 64 140.8 140.8 140.8h406.4c76.8 0 140.8-64 140.8-140.8v-64h-57.6z"],"attrs":[{},{},{},{}],"isMulticolor":false,"isMulticolor2":false,"tags":["schemas"],"grid":0},"attrs":[{},{},{},{}],"properties":{"order":46,"id":33,"name":"schemas, search-Schema","prevSize":24,"code":59681},"setIdx":1,"setId":1,"iconIdx":108},{"icon":{"paths":["M939.776 1003.776c-27.2 27.008-71.232 27.008-98.368 0l-168.96-168.96c-66.176 38.464-142.016 62.080-224 62.080-247.744 0-448.448-200.832-448.448-448.448 0-247.744 200.704-448.448 448.448-448.448 247.68 0 448.512 200.704 448.512 448.448 0 115.136-44.672 218.944-115.904 298.304l158.656 158.656c27.008 27.136 27.008 71.168 0.064 98.368zM448.448 128.128c-176.896 0-320.32 143.36-320.32 320.32s143.424 320.32 320.32 320.32c176.96 0 320.384-143.36 320.384-320.32s-143.488-320.32-320.384-320.32z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["search"],"grid":0},"attrs":[{}],"properties":{"order":23,"id":34,"name":"search","prevSize":24,"code":59682},"setIdx":1,"setId":1,"iconIdx":109},{"icon":{"paths":["M1019.11 440.755c-1.946-13.747-14.438-23.398-28.16-21.888-16.947 1.843-34.253-0.589-50.048-7.091-52.25-21.504-77.261-81.459-55.757-133.709 6.605-15.846 16.947-29.85 30.208-40.602 10.803-8.653 12.698-24.294 4.352-35.354-28.902-37.99-62.797-71.706-100.838-100.045-10.701-8.090-25.805-6.451-34.662 3.661-28.8 33.254-75.546 44.262-116.198 27.546-40.704-16.742-66.099-57.498-63.206-101.453 0.845-13.338-8.755-25.19-21.99-27.008-47.002-6.605-94.797-6.605-142.054 0.077-13.722 1.946-23.398 14.387-21.862 28.211 1.843 16.896-0.614 34.202-7.168 49.997-21.504 52.25-81.408 77.21-133.632 55.706-15.821-6.502-29.85-16.947-40.602-30.157-8.653-10.752-24.32-12.698-35.379-4.301-37.99 28.851-71.68 62.694-100.045 100.762-8.090 10.701-6.451 25.83 3.635 34.637 33.28 28.902 44.288 75.597 27.546 116.301-16.742 40.653-57.498 66.048-101.427 63.155-13.363-0.845-25.19 8.755-26.982 21.99-6.63 47.002-6.63 94.822 0.102 142.080 1.946 13.696 14.387 23.322 28.16 21.811 16.896-1.818 34.202 0.691 50.022 7.168 52.224 21.53 77.21 81.459 55.706 133.734-6.502 15.795-16.947 29.773-30.157 40.525-10.803 8.73-12.698 24.346-4.352 35.354 28.877 38.042 62.822 71.731 100.813 100.122 1.741 1.357 3.661 2.355 5.606 3.2 9.933 4.045 21.709 1.536 29.082-6.938 28.826-33.178 75.571-44.262 116.275-27.52 40.653 16.742 66.048 57.498 63.13 101.453-0.819 13.338 8.755 25.165 22.067 27.059 47.002 6.579 94.72 6.554 142.029-0.102 13.645-1.971 23.347-14.464 21.811-28.237-1.843-16.947 0.691-34.253 7.194-50.048 21.504-52.25 81.459-77.21 133.658-55.68 15.795 6.528 29.85 16.947 40.55 30.157 8.704 10.803 24.346 12.698 35.405 4.326 37.99-28.902 71.654-62.746 100.096-100.813 7.987-10.675 6.4-25.805-3.712-34.662-33.254-28.826-44.288-75.571-27.546-116.224 16.742-40.73 57.498-66.099 101.453-63.232 13.338 0.922 25.139-8.678 27.008-21.965 6.554-47.002 6.502-94.771-0.128-142.003zM971.059 554.010c-56.141 5.274-105.702 41.114-127.642 94.464s-12.058 113.613 24.090 156.902c-17.69 21.478-37.453 41.318-58.854 59.315-12.749-11.213-27.392-20.352-43.238-26.854-78.259-32.282-168.243 5.197-200.499 83.584-6.502 15.718-10.291 32.563-11.29 49.536-27.853 2.56-55.859 2.637-83.61 0.077-5.274-56.090-41.114-105.677-94.464-127.616-53.35-21.99-113.613-11.981-156.928 24.064-21.504-17.69-41.318-37.453-59.29-58.88 11.213-12.723 20.352-27.392 26.906-43.136 32.205-78.387-5.274-168.294-83.584-200.55-15.821-6.502-32.589-10.342-49.613-11.366-2.534-27.853-2.586-55.859 0-83.558 56.090-5.299 105.626-41.088 127.565-94.438 21.965-53.402 12.058-113.638-24.090-156.902 17.69-21.555 37.478-41.395 58.88-59.341 12.749 11.213 27.392 20.352 43.213 26.854 78.285 32.256 168.218-5.248 200.474-83.558 6.528-15.795 10.342-32.589 11.366-49.613 27.853-2.509 55.808-2.56 83.558 0 5.299 56.090 41.139 105.6 94.49 127.59 53.35 21.939 113.638 12.006 156.902-24.090 21.504 17.741 41.293 37.453 59.29 58.854-11.213 12.8-20.352 27.392-26.854 43.213-32.256 78.31 5.248 168.294 83.507 200.499 15.846 6.502 32.691 10.342 49.638 11.392 2.56 27.853 2.611 55.808 0.077 83.558zM512 307.2c-113.101 0-204.8 91.699-204.8 204.8 0 113.126 91.699 204.826 204.8 204.826s204.8-91.699 204.8-204.826c0-113.101-91.699-204.8-204.8-204.8zM512 665.626c-84.813 0-153.6-68.813-153.6-153.626 0-84.838 68.787-153.6 153.6-153.6 84.838 0 153.6 68.762 153.6 153.6 0 84.813-68.762 153.626-153.6 153.626z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["settings"],"grid":0},"attrs":[{}],"properties":{"order":22,"id":35,"name":"settings, search-Setting","prevSize":24,"code":59683},"setIdx":1,"setId":1,"iconIdx":110},{"icon":{"paths":["M77.005 102.605h128v332.8c0 14.131 11.418 25.6 25.6 25.6 14.106 0 25.6-11.469 25.6-25.6v-332.8h128c14.106 0 25.6-11.469 25.6-25.6 0-14.157-11.494-25.6-25.6-25.6h-307.2c-14.182 0-25.6 11.443-25.6 25.6 0 14.106 11.418 25.6 25.6 25.6zM947.405 716.979h-179.2v-102.4h179.2c14.157 0 25.6-11.443 25.6-25.6s-11.443-25.6-25.6-25.6h-204.8c-14.182 0-25.6 11.443-25.6 25.6v358.4c0 14.157 11.418 25.6 25.6 25.6 14.157 0 25.6-11.443 25.6-25.6v-179.2h179.2c14.157 0 25.6-11.443 25.6-25.6s-11.494-25.6-25.6-25.6zM965.094 58.47c-9.958-9.933-26.112-9.933-36.045 0l-870.605 870.579c-9.958 9.984-9.958 26.086 0 36.045 10.010 9.984 26.112 9.984 36.045 0l870.605-870.579c9.958-9.933 9.958-26.086 0-36.045z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["type-boolean"],"grid":0},"attrs":[{}],"properties":{"order":21,"id":36,"name":"type-Boolean","prevSize":24,"code":59684},"setIdx":1,"setId":1,"iconIdx":111},{"icon":{"paths":["M947.2 102.4h-128v-25.6c0-14.131-11.469-25.6-25.6-25.6s-25.6 11.469-25.6 25.6v25.6h-512v-25.6c0-14.131-11.52-25.6-25.6-25.6s-25.6 11.469-25.6 25.6v25.6h-128c-42.342 0-76.8 34.458-76.8 76.8v716.8c0 42.342 34.458 76.8 76.8 76.8h870.4c42.342 0 76.8-34.458 76.8-76.8v-716.8c0-42.342-34.458-76.8-76.8-76.8zM972.8 896c0 14.131-11.469 25.6-25.6 25.6h-870.4c-14.080 0-25.6-11.469-25.6-25.6v-537.6h921.6v537.6zM972.8 307.2h-921.6v-128c0-14.080 11.52-25.6 25.6-25.6h128v76.8c0 14.080 11.52 25.6 25.6 25.6s25.6-11.52 25.6-25.6v-76.8h512v76.8c0 14.080 11.469 25.6 25.6 25.6s25.6-11.52 25.6-25.6v-76.8h128c14.131 0 25.6 11.52 25.6 25.6v128zM332.8 512h51.2c14.080 0 25.6-11.52 25.6-25.6s-11.52-25.6-25.6-25.6h-51.2c-14.080 0-25.6 11.52-25.6 25.6s11.52 25.6 25.6 25.6zM486.4 512h51.2c14.131 0 25.6-11.52 25.6-25.6s-11.469-25.6-25.6-25.6h-51.2c-14.080 0-25.6 11.52-25.6 25.6s11.52 25.6 25.6 25.6zM640 512h51.2c14.131 0 25.6-11.52 25.6-25.6s-11.469-25.6-25.6-25.6h-51.2c-14.131 0-25.6 11.52-25.6 25.6s11.469 25.6 25.6 25.6zM793.6 512h51.2c14.131 0 25.6-11.52 25.6-25.6s-11.469-25.6-25.6-25.6h-51.2c-14.131 0-25.6 11.52-25.6 25.6s11.469 25.6 25.6 25.6zM179.2 614.4h51.2c14.080 0 25.6-11.469 25.6-25.6s-11.52-25.6-25.6-25.6h-51.2c-14.080 0-25.6 11.469-25.6 25.6s11.52 25.6 25.6 25.6zM332.8 614.4h51.2c14.080 0 25.6-11.469 25.6-25.6s-11.52-25.6-25.6-25.6h-51.2c-14.080 0-25.6 11.469-25.6 25.6s11.52 25.6 25.6 25.6zM486.4 614.4h51.2c14.131 0 25.6-11.469 25.6-25.6s-11.469-25.6-25.6-25.6h-51.2c-14.080 0-25.6 11.469-25.6 25.6s11.52 25.6 25.6 25.6zM640 614.4h51.2c14.131 0 25.6-11.469 25.6-25.6s-11.469-25.6-25.6-25.6h-51.2c-14.131 0-25.6 11.469-25.6 25.6s11.469 25.6 25.6 25.6zM793.6 614.4h51.2c14.131 0 25.6-11.469 25.6-25.6s-11.469-25.6-25.6-25.6h-51.2c-14.131 0-25.6 11.469-25.6 25.6s11.469 25.6 25.6 25.6zM179.2 716.8h51.2c14.080 0 25.6-11.469 25.6-25.6s-11.52-25.6-25.6-25.6h-51.2c-14.080 0-25.6 11.469-25.6 25.6s11.52 25.6 25.6 25.6zM332.8 716.8h51.2c14.080 0 25.6-11.469 25.6-25.6s-11.52-25.6-25.6-25.6h-51.2c-14.080 0-25.6 11.469-25.6 25.6s11.52 25.6 25.6 25.6zM486.4 716.8h51.2c14.131 0 25.6-11.469 25.6-25.6s-11.469-25.6-25.6-25.6h-51.2c-14.080 0-25.6 11.469-25.6 25.6s11.52 25.6 25.6 25.6zM640 716.8h51.2c14.131 0 25.6-11.469 25.6-25.6s-11.469-25.6-25.6-25.6h-51.2c-14.131 0-25.6 11.469-25.6 25.6s11.469 25.6 25.6 25.6zM793.6 716.8h51.2c14.131 0 25.6-11.469 25.6-25.6s-11.469-25.6-25.6-25.6h-51.2c-14.131 0-25.6 11.469-25.6 25.6s11.469 25.6 25.6 25.6zM179.2 819.2h51.2c14.080 0 25.6-11.469 25.6-25.6s-11.52-25.6-25.6-25.6h-51.2c-14.080 0-25.6 11.469-25.6 25.6s11.52 25.6 25.6 25.6zM332.8 819.2h51.2c14.080 0 25.6-11.469 25.6-25.6s-11.52-25.6-25.6-25.6h-51.2c-14.080 0-25.6 11.469-25.6 25.6s11.52 25.6 25.6 25.6zM486.4 819.2h51.2c14.131 0 25.6-11.469 25.6-25.6s-11.469-25.6-25.6-25.6h-51.2c-14.080 0-25.6 11.469-25.6 25.6s11.52 25.6 25.6 25.6zM640 819.2h51.2c14.131 0 25.6-11.469 25.6-25.6s-11.469-25.6-25.6-25.6h-51.2c-14.131 0-25.6 11.469-25.6 25.6s11.469 25.6 25.6 25.6zM793.6 819.2h51.2c14.131 0 25.6-11.469 25.6-25.6s-11.469-25.6-25.6-25.6h-51.2c-14.131 0-25.6 11.469-25.6 25.6s11.469 25.6 25.6 25.6z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["type-datetime"],"grid":0},"attrs":[{}],"properties":{"order":24,"id":37,"name":"type-DateTime","prevSize":24,"code":59685},"setIdx":1,"setId":1,"iconIdx":112},{"icon":{"paths":["M179.2 256c0-28.262 22.938-51.2 51.2-51.2h25.6c14.157 0 25.6-11.443 25.6-25.6 0-14.131-11.443-25.6-25.6-25.6h-25.6c-56.55 0-102.4 45.85-102.4 102.4v179.2c0 28.262-22.938 51.2-51.2 51.2h-25.6c-14.157 0-25.6 11.469-25.6 25.6 0 14.157 11.443 25.6 25.6 25.6h25.6c28.262 0 51.2 22.938 51.2 51.2v179.2c0 56.55 45.85 102.4 102.4 102.4h25.6c14.157 0 25.6-11.443 25.6-25.6s-11.443-25.6-25.6-25.6h-25.6c-28.262 0-51.2-22.938-51.2-51.2v-179.2c0-30.746-13.85-58.061-35.328-76.8 21.478-18.765 35.328-46.029 35.328-76.8v-179.2zM972.8 486.4h-25.6c-28.262 0-51.2-22.938-51.2-51.2v-179.2c0-56.55-45.85-102.4-102.4-102.4h-25.6c-14.157 0-25.6 11.469-25.6 25.6 0 14.157 11.443 25.6 25.6 25.6h25.6c28.262 0 51.2 22.938 51.2 51.2v179.2c0 30.771 13.85 58.035 35.328 76.8-21.478 18.739-35.328 46.054-35.328 76.8v179.2c0 28.262-22.938 51.2-51.2 51.2h-25.6c-14.157 0-25.6 11.443-25.6 25.6s11.443 25.6 25.6 25.6h25.6c56.55 0 102.4-45.85 102.4-102.4v-179.2c0-28.262 22.938-51.2 51.2-51.2h25.6c14.157 0 25.6-11.443 25.6-25.6 0-14.131-11.443-25.6-25.6-25.6zM512 332.8c-14.157 0-25.6 11.469-25.6 25.6 0 14.157 11.443 25.6 25.6 25.6s25.6-11.443 25.6-25.6c0-14.131-11.443-25.6-25.6-25.6zM512 435.2c-14.157 0-25.6 11.469-25.6 25.6v204.8c0 14.157 11.443 25.6 25.6 25.6s25.6-11.443 25.6-25.6v-204.8c0-14.131-11.443-25.6-25.6-25.6z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["json"],"grid":0},"attrs":[{}],"properties":{"order":20,"id":38,"name":"type-Json, json","prevSize":24,"code":59674},"setIdx":1,"setId":1,"iconIdx":113},{"icon":{"paths":["M256 665.6h-76.8v-332.8c0-14.131-11.469-25.6-25.6-25.6h-76.8c-14.131 0-25.6 11.469-25.6 25.6s11.469 25.6 25.6 25.6h51.2v307.2h-76.8c-14.131 0-25.6 11.469-25.6 25.6s11.469 25.6 25.6 25.6h204.8c14.131 0 25.6-11.469 25.6-25.6s-11.469-25.6-25.6-25.6zM614.4 307.2h-204.8c-14.131 0-25.6 11.469-25.6 25.6s11.469 25.6 25.6 25.6h179.2v128h-179.2c-14.131 0-25.6 11.469-25.6 25.6v179.2c0 14.131 11.469 25.6 25.6 25.6h204.8c14.131 0 25.6-11.469 25.6-25.6s-11.469-25.6-25.6-25.6h-179.2v-128h179.2c14.131 0 25.6-11.469 25.6-25.6v-179.2c0-14.131-11.469-25.6-25.6-25.6zM972.8 307.2h-204.8c-14.131 0-25.6 11.469-25.6 25.6s11.469 25.6 25.6 25.6h179.2v128h-179.2c-14.131 0-25.6 11.469-25.6 25.6s11.469 25.6 25.6 25.6h179.2v128h-179.2c-14.131 0-25.6 11.469-25.6 25.6s11.469 25.6 25.6 25.6h204.8c14.131 0 25.6-11.469 25.6-25.6v-358.4c0-14.131-11.469-25.6-25.6-25.6z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["type-number"],"grid":0},"attrs":[{}],"properties":{"order":32,"id":39,"name":"type-Number","prevSize":24,"code":59686},"setIdx":1,"setId":1,"iconIdx":114},{"icon":{"paths":["M870.4 921.6h-716.8c-14.131 0-25.6 11.443-25.6 25.6s11.469 25.6 25.6 25.6h716.8c14.157 0 25.6-11.443 25.6-25.6s-11.443-25.6-25.6-25.6zM194.688 817.152c13.030 5.555 28.083-0.461 33.613-13.44l125.030-291.712h317.338l125.005 291.712c4.173 9.677 13.568 15.488 23.526 15.488 3.405 0 6.81-0.64 10.112-2.048 13.005-5.606 18.995-20.659 13.44-33.638l-131.61-306.944c-0.051-0.051-0.051-0.154-0.102-0.205l-175.488-409.6c-4.045-9.472-13.312-15.565-23.552-15.565s-19.507 6.093-23.552 15.514l-175.488 409.6c-0.051 0.051-0.051 0.154-0.102 0.205l-131.61 306.97c-5.53 13.005 0.461 28.058 13.44 33.664zM512 141.773l136.704 319.027h-273.408l136.704-319.027z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["type-string"],"grid":0},"attrs":[{}],"properties":{"order":48,"id":40,"name":"type-String","prevSize":24,"code":59687},"setIdx":1,"setId":1,"iconIdx":115},{"icon":{"paths":["M955.221 848c0-0.109 10.752 0 0 0-52.751-161.392-240.461-224-443.178-224-202.269 0-389.979 63.392-443.066 224-11.2-0.109 0-1.232 0 0 0 61.936 49.615 112 110.654 112h664.823c61.151 0 110.766-50.064 110.766-112zM290.399 288c0 123.648 99.231 336 221.645 336s221.645-212.352 221.645-336c0-123.648-99.231-224-221.645-224s-221.645 100.352-221.645 224z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["user"],"grid":0},"attrs":[{}],"properties":{"order":33,"id":41,"name":"user","prevSize":24,"code":59688},"setIdx":1,"setId":1,"iconIdx":116},{"icon":{"paths":["M469.333 614.997v281.003c0 23.552 19.115 42.667 42.667 42.667s42.667-19.115 42.667-42.667v-281.003l97.835 97.835c16.683 16.683 43.691 16.683 60.331 0s16.683-43.691 0-60.331l-170.667-170.667c-0.085-0.085-0.171-0.171-0.256-0.256-4.053-3.968-8.661-6.955-13.568-9.003-5.12-2.133-10.624-3.2-16.085-3.243-0.171 0-0.341 0-0.469 0-5.461 0.043-10.965 1.109-16.085 3.243-4.949 2.048-9.557 5.035-13.568 9.003-0.085 0.085-0.171 0.171-0.256 0.256l-170.667 170.667c-16.683 16.683-16.683 43.691 0 60.331s43.691 16.683 60.331 0zM890.411 822.101c30.379-16.555 56.149-38.443 76.672-63.915 21.333-26.411 36.949-56.619 46.379-88.576s12.629-65.835 9.003-99.584c-3.456-32.512-13.269-64.896-29.824-95.232-14.208-26.069-32.384-48.768-53.376-67.669-21.717-19.541-46.421-34.944-72.875-45.952-30.891-12.8-64.171-19.584-98.048-19.84h-22.528c-13.312-37.717-32.085-72.235-55.168-102.912-30.635-40.661-68.821-74.453-111.915-99.84s-91.179-42.411-141.568-49.536c-48.597-6.784-99.243-4.395-149.504 8.619s-95.744 35.413-134.912 64.939c-40.661 30.635-74.453 68.821-99.84 111.915s-42.411 91.179-49.493 141.568c-6.827 48.555-4.395 99.2 8.576 149.461 15.872 61.312 45.781 115.627 84.267 158.421 15.744 17.536 42.752 18.944 60.245 3.2s18.944-42.752 3.2-60.245c-29.355-32.64-52.693-74.667-65.109-122.752-10.155-39.253-11.989-78.592-6.699-116.224 5.504-39.125 18.773-76.501 38.571-110.123s46.080-63.317 77.653-87.083c30.379-22.869 65.664-40.32 104.917-50.475s78.592-11.989 116.224-6.699c39.125 5.504 76.544 18.731 110.123 38.528s63.317 46.080 87.083 77.653c22.869 30.379 40.32 65.664 50.475 104.917 4.907 18.56 21.547 32 41.301 32h53.461c22.869 0.171 45.269 4.736 65.92 13.312 17.707 7.339 34.133 17.621 48.512 30.592 13.909 12.501 25.984 27.605 35.541 45.099 11.093 20.352 17.579 41.899 19.883 63.488 2.389 22.443 0.256 45.013-6.016 66.432s-16.725 41.515-30.933 59.093c-13.611 16.896-30.763 31.445-51.115 42.581-20.693 11.264-28.331 37.205-17.024 57.899s37.205 28.331 57.899 17.024z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["upload-cloud"],"grid":0},"attrs":[{}],"properties":{"order":1,"id":2,"prevSize":24,"code":59763,"name":"upload-3"},"setIdx":1,"setId":1,"iconIdx":117},{"icon":{"paths":["M853.333 640v170.667c0 5.845-1.152 11.349-3.2 16.299-2.133 5.205-5.333 9.899-9.301 13.867s-8.661 7.125-13.867 9.301c-4.949 2.048-10.453 3.2-16.299 3.2h-597.333c-5.845 0-11.349-1.152-16.299-3.2-5.205-2.133-9.899-5.333-13.867-9.301s-7.125-8.661-9.301-13.867c-2.048-4.949-3.2-10.453-3.2-16.299v-170.667c0-23.552-19.115-42.667-42.667-42.667s-42.667 19.115-42.667 42.667v170.667c0 17.28 3.456 33.835 9.728 48.981 6.485 15.701 16 29.781 27.776 41.557s25.856 21.291 41.557 27.776c15.104 6.229 31.659 9.685 48.939 9.685h597.333c17.28 0 33.835-3.456 48.981-9.728 15.701-6.485 29.781-16 41.557-27.776s21.291-25.856 27.776-41.557c6.229-15.104 9.685-31.659 9.685-48.939v-170.667c0-23.552-19.115-42.667-42.667-42.667s-42.667 19.115-42.667 42.667zM469.333 230.997v409.003c0 23.552 19.115 42.667 42.667 42.667s42.667-19.115 42.667-42.667v-409.003l140.501 140.501c16.683 16.683 43.691 16.683 60.331 0s16.683-43.691 0-60.331l-213.333-213.333c-0.043-0.043-0.128-0.085-0.171-0.171-4.053-4.011-8.704-7.040-13.653-9.088-10.453-4.309-22.229-4.309-32.683 0-4.949 2.048-9.6 5.077-13.653 9.088-0.043 0.043-0.128 0.085-0.171 0.171l-213.333 213.333c-16.683 16.683-16.683 43.691 0 60.331s43.691 16.683 60.331 0z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["upload"],"grid":0},"attrs":[{}],"properties":{"order":1,"id":1,"prevSize":24,"code":59761,"name":"upload-4"},"setIdx":1,"setId":1,"iconIdx":118},{"icon":{"paths":["M621.254 877.254l320-320c24.994-24.992 24.994-65.516 0-90.51l-320-320c-24.994-24.992-65.516-24.992-90.51 0-24.994 24.994-24.994 65.516 0 90.51l210.746 210.746h-613.49c-35.346 0-64 28.654-64 64s28.654 64 64 64h613.49l-210.746 210.746c-12.496 12.496-18.744 28.876-18.744 45.254s6.248 32.758 18.744 45.254c24.994 24.994 65.516 24.994 90.51 0z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["arrow-right","right","next"],"grid":16},"attrs":[{}],"properties":{"order":1,"id":1,"prevSize":32,"code":59766,"name":"arrow-right"},"setIdx":1,"setId":1,"iconIdx":119},{"icon":{"paths":["M448 576h128v-256h192l-256-256-256 256h192zM640 432v98.712l293.066 109.288-421.066 157.018-421.066-157.018 293.066-109.288v-98.712l-384 144v256l512 192 512-192v-256z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["upload","load","arrow"],"grid":16},"attrs":[{}],"properties":{"order":1,"id":0,"prevSize":32,"code":59760,"name":"upload"},"setIdx":1,"setId":1,"iconIdx":120},{"icon":{"paths":["M585.143 548.557c0 9.728-3.986 18.871-10.862 25.71l-256 256c-6.839 6.839-16.018 10.862-25.71 10.862s-18.871-3.986-25.71-10.862l-256-256c-6.839-6.839-10.862-16.018-10.862-25.71 0-20.005 16.567-36.571 36.571-36.571h512c20.005 0 36.571 16.567 36.571 36.571z","M585.143 219.443c0 9.728-3.986 18.871-10.862 25.71l-256 256c-6.839 6.839-16.018 10.862-25.71 10.862s-18.871-3.986-25.71-10.862l-256-256c-6.839-6.839-10.862-16.018-10.862-25.71 0-20.005 16.567-36.571 36.571-36.571h512c20.005 0 36.571 16.567 36.571 36.571z"],"width":585,"attrs":[{},{}],"isMulticolor":false,"isMulticolor2":false,"tags":["caret-bottom"],"grid":16},"attrs":[{},{}],"properties":{"order":125,"id":0,"name":"caret-bottom","prevSize":32,"code":59755},"setIdx":1,"setId":1,"iconIdx":121},{"icon":{"paths":["M585.143 804.577c0 20.005-16.567 36.571-36.571 36.571h-512c-20.005 0-36.571-16.567-36.571-36.571 0-9.728 3.986-18.871 10.862-25.71l256-256c6.839-6.839 16.018-10.862 25.71-10.862s18.871 3.986 25.71 10.862l256 256c6.839 6.839 10.862 16.018 10.862 25.71z","M585.143 475.423c0 20.005-16.567 36.571-36.571 36.571h-512c-20.005 0-36.571-16.567-36.571-36.571 0-9.728 3.986-18.871 10.862-25.71l256-256c6.839-6.839 16.018-10.862 25.71-10.862s18.871 3.986 25.71 10.862l256 256c6.839 6.839 10.862 16.018 10.862 25.71z"],"width":585,"attrs":[{},{}],"isMulticolor":false,"isMulticolor2":false,"tags":["caret-top"],"grid":16},"attrs":[{},{}],"properties":{"order":124,"id":1,"name":"caret-top","prevSize":32,"code":59756},"setIdx":1,"setId":1,"iconIdx":122},{"icon":{"paths":["M256 102.4c-28.314 0-51.2 22.886-51.2 51.2v256h51.2v-256h307.2v153.6c0 28.314 22.886 51.2 51.2 51.2h153.6v512h-512v-460.8h-51.2v460.8c0 28.314 22.886 51.2 51.2 51.2h512c28.314 0 51.2-22.886 51.2-51.2v-548.2l-219.8-219.8h-292.2zM614.4 189.8l117.4 117.4h-117.4z","M408.906 587.72l-35.3-37 138.1-131.9 138 131.9-35.3 37-102.7-98.1z","M511.706 773.12l-138.1-131.9 35.3-37 102.8 98.1 102.7-98.1 35.3 37z"],"attrs":[{},{},{}],"isMulticolor":false,"isMulticolor2":false,"tags":["show"],"grid":16},"attrs":[{},{},{}],"properties":{"order":123,"id":2,"name":"show","prevSize":32,"code":59748},"setIdx":1,"setId":1,"iconIdx":123},{"icon":{"paths":["M256 102.4c-28.314 0-51.2 22.886-51.2 51.2v256h51.2v-256h307.2v153.6c0 28.314 22.886 51.2 51.2 51.2h153.6v512h-512v-460.8h-51.2v460.8c0 28.314 22.886 51.2 51.2 51.2h512c28.314 0 51.2-22.886 51.2-51.2v-548.2l-219.8-219.8h-292.2zM614.4 189.8l117.4 117.4h-117.4z","M348.394 15.988c-28.314 0-51.2 22.886-51.2 51.2v23.7h51.2v-23.7h307.2l204.8 204.8v512h-23.8v51.2h23.8c28.314 0 51.2-22.886 51.2-51.2v-548.2l-219.8-219.8h-292.2z","M408.906 587.72l-35.3-37 138.1-131.9 138 131.9-35.3 37-102.7-98.1z","M511.706 773.12l-138.1-131.9 35.3-37 102.8 98.1 102.7-98.1 35.3 37z"],"attrs":[{},{},{},{}],"isMulticolor":false,"isMulticolor2":false,"tags":["show-all"],"grid":16},"attrs":[{},{},{},{}],"properties":{"order":122,"id":3,"name":"show-all","prevSize":32,"code":59749},"setIdx":1,"setId":1,"iconIdx":124},{"icon":{"paths":["M256 102.4c-28.314 0-51.2 22.886-51.2 51.2v256h51.2v-256h307.2v153.6c0 28.314 22.886 51.2 51.2 51.2h153.6v512h-512v-460.8h-51.2v460.8c0 28.314 22.886 51.2 51.2 51.2h512c28.314 0 51.2-22.886 51.2-51.2v-548.2l-219.8-219.8h-292.2zM614.4 189.8l117.4 117.4h-117.4z","M408.9 418.8l-35.3 37 138 131.9 138.1-131.9-35.3-37-102.8 98.1z","M511.6 604.2l-138 131.9 35.3 37 102.7-98.1 102.8 98.1 35.3-37z"],"attrs":[{},{},{}],"isMulticolor":false,"isMulticolor2":false,"tags":["hide"],"grid":16},"attrs":[{},{},{}],"properties":{"order":121,"id":4,"name":"hide","prevSize":32,"code":59750},"setIdx":1,"setId":1,"iconIdx":125},{"icon":{"paths":["M408.9 418.8l-35.3 37 138.1 131.9 138-131.9-35.3-37-102.7 98.1z","M511.7 604.2l-138.1 131.9 35.3 37 102.8-98.1 102.7 98.1 35.3-37z","M256 102.4c-28.314 0-51.2 22.886-51.2 51.2v256h51.2v-256h307.2v153.6c0 28.314 22.886 51.2 51.2 51.2h153.6v512h-512v-460.8h-51.2v460.8c0 28.314 22.886 51.2 51.2 51.2h512c28.314 0 51.2-22.886 51.2-51.2v-548.2l-219.8-219.8h-292.2zM614.4 189.8l117.4 117.4h-117.4z","M348.394 15.988c-28.314 0-51.2 22.886-51.2 51.2v23.7h51.2v-23.7h307.2l204.8 204.8v512h-23.8v51.2h23.8c28.314 0 51.2-22.886 51.2-51.2v-548.2l-219.8-219.8h-292.2z"],"attrs":[{},{},{},{}],"isMulticolor":false,"isMulticolor2":false,"tags":["hide-all"],"grid":16},"attrs":[{},{},{},{}],"properties":{"order":120,"id":5,"name":"hide-all","prevSize":32,"code":59751},"setIdx":1,"setId":1,"iconIdx":126},{"icon":{"paths":["M512 1024c-136.76 0-265.334-53.258-362.040-149.96-96.702-96.706-149.96-225.28-149.96-362.040 0-96.838 27.182-191.134 78.606-272.692 50-79.296 120.664-143.372 204.356-185.3l43 85.832c-68.038 34.084-125.492 86.186-166.15 150.67-41.746 66.208-63.812 142.798-63.812 221.49 0 229.382 186.618 416 416 416s416-186.618 416-416c0-78.692-22.066-155.282-63.81-221.49-40.66-64.484-98.114-116.584-166.15-150.67l43-85.832c83.692 41.928 154.358 106.004 204.356 185.3 51.422 81.558 78.604 175.854 78.604 272.692 0 136.76-53.258 265.334-149.96 362.040-96.706 96.702-225.28 149.96-362.040 149.96z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["spinner","loading","loading-wheel","busy","wait"],"grid":16},"attrs":[{}],"properties":{"order":1,"id":6,"prevSize":32,"code":59737,"name":"spinner2"},"setIdx":1,"setId":1,"iconIdx":127},{"icon":{"paths":["M1024 397.050l-353.78-51.408-158.22-320.582-158.216 320.582-353.784 51.408 256 249.538-60.432 352.352 316.432-166.358 316.432 166.358-60.434-352.352 256.002-249.538z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["star-full","rate","star","favorite","bookmark"],"grid":16},"attrs":[{}],"properties":{"order":1,"id":7,"prevSize":32,"code":59741,"name":"star-full"},"setIdx":1,"setId":1,"iconIdx":128},{"icon":{"paths":["M1024 397.050l-353.78-51.408-158.22-320.582-158.216 320.582-353.784 51.408 256 249.538-60.432 352.352 316.432-166.358 316.432 166.358-60.434-352.352 256.002-249.538zM512 753.498l-223.462 117.48 42.676-248.83-180.786-176.222 249.84-36.304 111.732-226.396 111.736 226.396 249.836 36.304-180.788 176.222 42.678 248.83-223.462-117.48z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["star-empty","rate","star","favorite","bookmark"],"grid":16},"attrs":[{}],"properties":{"order":2,"id":8,"prevSize":32,"code":59742,"name":"star-empty"},"setIdx":1,"setId":1,"iconIdx":129},{"icon":{"paths":["M1024 226.4c-37.6 16.8-78.2 28-120.6 33 43.4-26 76.6-67.2 92.4-116.2-40.6 24-85.6 41.6-133.4 51-38.4-40.8-93-66.2-153.4-66.2-116 0-210 94-210 210 0 16.4 1.8 32.4 5.4 47.8-174.6-8.8-329.4-92.4-433-219.6-18 31-28.4 67.2-28.4 105.6 0 72.8 37 137.2 93.4 174.8-34.4-1-66.8-10.6-95.2-26.2 0 0.8 0 1.8 0 2.6 0 101.8 72.4 186.8 168.6 206-17.6 4.8-36.2 7.4-55.4 7.4-13.6 0-26.6-1.4-39.6-3.8 26.8 83.4 104.4 144.2 196.2 146-72 56.4-162.4 90-261 90-17 0-33.6-1-50.2-3 93.2 59.8 203.6 94.4 322.2 94.4 386.4 0 597.8-320.2 597.8-597.8 0-9.2-0.2-18.2-0.6-27.2 41-29.4 76.6-66.4 104.8-108.6z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["twitter","brand","tweet","social"],"grid":16},"attrs":[{}],"properties":{"order":1,"id":9,"prevSize":32,"code":59740,"name":"twitter"},"setIdx":1,"setId":1,"iconIdx":130},{"icon":{"paths":["M728.992 512c137.754-87.334 231.008-255.208 231.008-448 0-21.676-1.192-43.034-3.478-64h-889.042c-2.29 20.968-3.48 42.326-3.48 64 0 192.792 93.254 360.666 231.006 448-137.752 87.334-231.006 255.208-231.006 448 0 21.676 1.19 43.034 3.478 64h889.042c2.288-20.966 3.478-42.324 3.478-64 0.002-192.792-93.252-360.666-231.006-448zM160 960c0-186.912 80.162-345.414 224-397.708v-100.586c-143.838-52.29-224-210.792-224-397.706v0h704c0 186.914-80.162 345.416-224 397.706v100.586c143.838 52.294 224 210.796 224 397.708h-704zM619.626 669.594c-71.654-40.644-75.608-93.368-75.626-125.366v-64.228c0-31.994 3.804-84.914 75.744-125.664 38.504-22.364 71.808-56.348 97.048-98.336h-409.582c25.266 42.032 58.612 76.042 97.166 98.406 71.654 40.644 75.606 93.366 75.626 125.366v64.228c0 31.992-3.804 84.914-75.744 125.664-72.622 42.18-126.738 125.684-143.090 226.336h501.67c-16.364-100.708-70.53-184.248-143.212-226.406z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["hour-glass","loading","busy","wait"],"grid":16},"attrs":[{}],"properties":{"order":1,"id":10,"prevSize":32,"code":59732,"name":"hour-glass"},"setIdx":1,"setId":1,"iconIdx":131},{"icon":{"paths":["M192 512c0-12.18 0.704-24.196 2.030-36.022l-184.98-60.104c-5.916 31.14-9.050 63.264-9.050 96.126 0 147.23 62.166 279.922 161.654 373.324l114.284-157.296c-52.124-56.926-83.938-132.758-83.938-216.028zM832 512c0 83.268-31.812 159.102-83.938 216.028l114.284 157.296c99.488-93.402 161.654-226.094 161.654-373.324 0-32.862-3.132-64.986-9.048-96.126l-184.98 60.104c1.324 11.828 2.028 23.842 2.028 36.022zM576 198.408c91.934 18.662 169.544 76.742 214.45 155.826l184.978-60.102c-73.196-155.42-222.24-268.060-399.428-290.156v194.432zM233.55 354.232c44.906-79.084 122.516-137.164 214.45-155.826v-194.43c-177.188 22.096-326.23 134.736-399.426 290.154l184.976 60.102zM644.556 803.328c-40.39 18.408-85.272 28.672-132.556 28.672s-92.166-10.264-132.554-28.67l-114.292 157.31c73.206 40.366 157.336 63.36 246.846 63.36s173.64-22.994 246.848-63.36l-114.292-157.312z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["spinner","loading","loading-wheel","busy","wait"],"grid":16},"attrs":[{}],"properties":{"order":1,"id":11,"prevSize":32,"code":59731,"name":"spinner"},"setIdx":1,"setId":1,"iconIdx":132},{"icon":{"paths":["M658.744 749.256l-210.744-210.746v-282.51h128v229.49l173.256 173.254zM512 0c-282.77 0-512 229.23-512 512s229.23 512 512 512 512-229.23 512-512-229.23-512-512-512zM512 896c-212.078 0-384-171.922-384-384s171.922-384 384-384c212.078 0 384 171.922 384 384s-171.922 384-384 384z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["clock","time","schedule"],"grid":16},"attrs":[{}],"properties":{"order":1,"id":12,"prevSize":32,"code":59728,"name":"clock"},"setIdx":1,"setId":1,"iconIdx":133},{"icon":{"paths":["M128 320v640c0 35.2 28.8 64 64 64h576c35.2 0 64-28.8 64-64v-640h-704zM320 896h-64v-448h64v448zM448 896h-64v-448h64v448zM576 896h-64v-448h64v448zM704 896h-64v-448h64v448z","M848 128h-208v-80c0-26.4-21.6-48-48-48h-224c-26.4 0-48 21.6-48 48v80h-208c-26.4 0-48 21.6-48 48v80h832v-80c0-26.4-21.6-48-48-48zM576 128h-192v-63.198h192v63.198z"],"attrs":[{},{}],"isMulticolor":false,"isMulticolor2":false,"tags":["bin","trashcan","remove","delete","recycle","dispose"],"grid":16},"attrs":[{},{}],"properties":{"order":1,"id":13,"name":"bin2","prevSize":32,"code":59650},"setIdx":1,"setId":1,"iconIdx":134},{"icon":{"paths":["M512 0c-282.77 0-512 229.23-512 512s229.23 512 512 512 512-229.23 512-512-229.23-512-512-512zM512 960.002c-62.958 0-122.872-13.012-177.23-36.452l233.148-262.29c5.206-5.858 8.082-13.422 8.082-21.26v-96c0-17.674-14.326-32-32-32-112.99 0-232.204-117.462-233.374-118.626-6-6.002-14.14-9.374-22.626-9.374h-128c-17.672 0-32 14.328-32 32v192c0 12.122 6.848 23.202 17.69 28.622l110.31 55.156v187.886c-116.052-80.956-192-215.432-192-367.664 0-68.714 15.49-133.806 43.138-192h116.862c8.488 0 16.626-3.372 22.628-9.372l128-128c6-6.002 9.372-14.14 9.372-22.628v-77.412c40.562-12.074 83.518-18.588 128-18.588 70.406 0 137.004 16.26 196.282 45.2-4.144 3.502-8.176 7.164-12.046 11.036-36.266 36.264-56.236 84.478-56.236 135.764s19.97 99.5 56.236 135.764c36.434 36.432 85.218 56.264 135.634 56.26 3.166 0 6.342-0.080 9.518-0.236 13.814 51.802 38.752 186.656-8.404 372.334-0.444 1.744-0.696 3.488-0.842 5.224-81.324 83.080-194.7 134.656-320.142 134.656z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["earth","globe","language","web","internet","sphere","planet"],"defaultCode":59850,"grid":16},"attrs":[],"properties":{"ligatures":"earth, globe2","name":"earth","id":14,"order":91,"prevSize":32,"code":59850},"setIdx":1,"setId":1,"iconIdx":135},{"icon":{"paths":["M512.002 193.212v-65.212h128v-64c0-35.346-28.654-64-64.002-64h-191.998c-35.346 0-64 28.654-64 64v64h128v65.212c-214.798 16.338-384 195.802-384 414.788 0 229.75 186.25 416 416 416s416-186.25 416-416c0-218.984-169.202-398.448-384-414.788zM706.276 834.274c-60.442 60.44-140.798 93.726-226.274 93.726s-165.834-33.286-226.274-93.726c-60.44-60.44-93.726-140.8-93.726-226.274s33.286-165.834 93.726-226.274c58.040-58.038 134.448-91.018 216.114-93.548l-21.678 314.020c-1.86 26.29 12.464 37.802 31.836 37.802s33.698-11.512 31.836-37.802l-21.676-314.022c81.666 2.532 158.076 35.512 216.116 93.55 60.44 60.44 93.726 140.8 93.726 226.274s-33.286 165.834-93.726 226.274z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["stopwatch","time","speed","meter","chronometer"],"grid":16},"attrs":[{}],"properties":{"order":1,"id":15,"prevSize":32,"code":59715,"name":"elapsed"},"setIdx":1,"setId":1,"iconIdx":136},{"icon":{"paths":["M522.2 438.8v175.6h290.4c-11.8 75.4-87.8 220.8-290.4 220.8-174.8 0-317.4-144.8-317.4-323.2s142.6-323.2 317.4-323.2c99.4 0 166 42.4 204 79l139-133.8c-89.2-83.6-204.8-134-343-134-283 0-512 229-512 512s229 512 512 512c295.4 0 491.6-207.8 491.6-500.2 0-33.6-3.6-59.2-8-84.8l-483.6-0.2z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["google","brand"],"grid":16},"attrs":[{}],"properties":{"order":1,"id":16,"prevSize":32,"code":59707,"name":"google"},"setIdx":1,"setId":1,"iconIdx":137},{"icon":{"paths":["M592 448h-16v-192c0-105.87-86.13-192-192-192h-128c-105.87 0-192 86.13-192 192v192h-16c-26.4 0-48 21.6-48 48v480c0 26.4 21.6 48 48 48h544c26.4 0 48-21.6 48-48v-480c0-26.4-21.6-48-48-48zM192 256c0-35.29 28.71-64 64-64h128c35.29 0 64 28.71 64 64v192h-256v-192z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["lock","secure","private","encrypted"],"grid":16},"attrs":[{}],"properties":{"order":2,"id":17,"prevSize":32,"code":59700,"name":"lock"},"setIdx":1,"setId":1,"iconIdx":138},{"icon":{"paths":["M0.35 512l-0.35-312.074 384-52.144v364.218zM448 138.482l511.872-74.482v448h-511.872zM959.998 576l-0.126 448-511.872-72.016v-375.984zM384 943.836l-383.688-52.594-0.020-315.242h383.708z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["windows8","brand","os"],"grid":16},"attrs":[{}],"properties":{"order":1,"id":18,"prevSize":32,"code":59712,"name":"microsoft"},"setIdx":1,"setId":1,"iconIdx":139},{"icon":{"paths":["M128 128h320v768h-320zM576 128h320v768h-320z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["pause","player"],"grid":16},"attrs":[{}],"properties":{"order":2,"id":19,"prevSize":32,"code":59695,"name":"pause"},"setIdx":1,"setId":1,"iconIdx":140},{"icon":{"paths":["M192 128l640 384-640 384z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["play","player"],"grid":16},"attrs":[{}],"properties":{"order":3,"id":20,"prevSize":32,"code":59696,"name":"play"},"setIdx":1,"setId":1,"iconIdx":141},{"icon":{"paths":["M889.68 166.32c-93.608-102.216-228.154-166.32-377.68-166.32-282.77 0-512 229.23-512 512h96c0-229.75 186.25-416 416-416 123.020 0 233.542 53.418 309.696 138.306l-149.696 149.694h352v-352l-134.32 134.32z","M928 512c0 229.75-186.25 416-416 416-123.020 0-233.542-53.418-309.694-138.306l149.694-149.694h-352v352l134.32-134.32c93.608 102.216 228.154 166.32 377.68 166.32 282.77 0 512-229.23 512-512h-96z"],"attrs":[{},{}],"isMulticolor":false,"isMulticolor2":false,"tags":["loop","repeat","player","reload","refresh","update","synchronize","arrows"],"grid":16},"attrs":[{},{}],"properties":{"order":49,"id":21,"prevSize":32,"code":59694,"name":"reset"},"setIdx":1,"setId":1,"iconIdx":142},{"icon":{"paths":["M933.79 610.25c-53.726-93.054-21.416-212.304 72.152-266.488l-100.626-174.292c-28.75 16.854-62.176 26.518-97.846 26.518-107.536 0-194.708-87.746-194.708-195.99h-201.258c0.266 33.41-8.074 67.282-25.958 98.252-53.724 93.056-173.156 124.702-266.862 70.758l-100.624 174.292c28.97 16.472 54.050 40.588 71.886 71.478 53.638 92.908 21.512 211.92-71.708 266.224l100.626 174.292c28.65-16.696 61.916-26.254 97.4-26.254 107.196 0 194.144 87.192 194.7 194.958h201.254c-0.086-33.074 8.272-66.57 25.966-97.218 53.636-92.906 172.776-124.594 266.414-71.012l100.626-174.29c-28.78-16.466-53.692-40.498-71.434-71.228zM512 719.332c-114.508 0-207.336-92.824-207.336-207.334 0-114.508 92.826-207.334 207.336-207.334 114.508 0 207.332 92.826 207.332 207.334-0.002 114.51-92.824 207.334-207.332 207.334z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["cog","gear","preferences","settings","generate","control","options"],"grid":16},"attrs":[{}],"properties":{"order":1,"id":22,"prevSize":32,"code":59693,"name":"settings2"},"setIdx":1,"setId":1,"iconIdx":143},{"icon":{"paths":["M512 128c-247.424 0-448 200.576-448 448s200.576 448 448 448 448-200.576 448-448-200.576-448-448-448zM512 936c-198.824 0-360-161.178-360-360 0-198.824 161.176-360 360-360 198.822 0 360 161.176 360 360 0 198.822-161.178 360-360 360zM934.784 287.174c16.042-28.052 25.216-60.542 25.216-95.174 0-106.040-85.96-192-192-192-61.818 0-116.802 29.222-151.92 74.596 131.884 27.236 245.206 105.198 318.704 212.578v0zM407.92 74.596c-35.116-45.374-90.102-74.596-151.92-74.596-106.040 0-192 85.96-192 192 0 34.632 9.174 67.122 25.216 95.174 73.5-107.38 186.822-185.342 318.704-212.578z","M512 576v-256h-64v320h256v-64z"],"attrs":[{},{}],"isMulticolor":false,"isMulticolor2":false,"tags":["alarm","time","clock"],"grid":16},"attrs":[{},{}],"properties":{"order":2,"id":23,"prevSize":32,"code":59716,"name":"timeout"},"setIdx":1,"setId":1,"iconIdx":144},{"icon":{"paths":["M768 64c105.87 0 192 86.13 192 192v192h-128v-192c0-35.29-28.71-64-64-64h-128c-35.29 0-64 28.71-64 64v192h16c26.4 0 48 21.6 48 48v480c0 26.4-21.6 48-48 48h-544c-26.4 0-48-21.6-48-48v-480c0-26.4 21.6-48 48-48h400v-192c0-105.87 86.13-192 192-192h128z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["unlocked","lock-open"],"grid":16},"attrs":[{}],"properties":{"order":1,"id":24,"prevSize":32,"code":59699,"name":"unlocked"},"setIdx":1,"setId":1,"iconIdx":145},{"icon":{"paths":["M832 416h-320v64h-64v-96h384v-192h-32v96c0 17.664-14.336 32-32 32h-576c-17.696 0-32-14.336-32-32v-128c0-17.696 14.304-32 32-32h576c17.664 0 32 14.304 32 32h64v256h-32zM736 160h-512v32h512v-32zM544 832c0 35.328-28.672 64-64 64s-64-28.672-64-64v-320h128v320zM480 786.656c-17.696 0-32 14.336-32 32 0 17.696 14.304 32 32 32 17.664 0 32-14.304 32-32 0-17.664-14.336-32-32-32z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["paint","tool"],"grid":32},"attrs":[{}],"properties":{"order":1,"id":0,"prevSize":32,"code":59725,"name":"control-Color"},"setIdx":1,"setId":1,"iconIdx":146},{"icon":{"paths":["M1328 320c-8.832 0-16 7.168-16 16v640c0 8.832-7.168 16-16 16h-1248c-8.832 0-16-7.168-16-16v-640c0-8.832-7.168-16-16-16s-16 7.168-16 16v640c0 26.464 21.536 48 48 48h1248c26.464 0 48-21.536 48-48v-640c0-8.832-7.168-16-16-16zM1296 0h-1248c-26.464 0-48 21.536-48 48v192c0 8.832 7.168 16 16 16h1312c8.832 0 16-7.168 16-16v-192c0-26.464-21.536-48-48-48zM1312 224h-1280v-176c0-8.832 7.168-16 16-16h1248c8.832 0 16 7.168 16 16v176zM560 896c8.832 0 16-7.168 16-16v-512c0-8.832-7.168-16-16-16h-416c-8.832 0-16 7.168-16 16v512c0 8.832 7.168 16 16 16h416zM160 384h384v480h-384v-480zM720 480h480c8.832 0 16-7.168 16-16s-7.168-16-16-16h-480c-8.832 0-16 7.168-16 16s7.168 16 16 16zM720 640h480c8.832 0 16-7.168 16-16s-7.168-16-16-16h-480c-8.832 0-16 7.168-16 16s7.168 16 16 16zM720 800h480c8.832 0 16-7.168 16-16s-7.168-16-16-16h-480c-8.832 0-16 7.168-16 16s7.168 16 16 16zM96 128c0 17.673 14.327 32 32 32s32-14.327 32-32c0-17.673-14.327-32-32-32s-32 14.327-32 32zM224 128c0 17.673 14.327 32 32 32s32-14.327 32-32c0-17.673-14.327-32-32-32s-32 14.327-32 32zM352 128c0 17.673 14.327 32 32 32s32-14.327 32-32c0-17.673-14.327-32-32-32s-32 14.327-32 32z"],"width":1344,"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["browser","window","software","program"],"grid":32},"attrs":[{}],"properties":{"order":1,"id":1,"prevSize":32,"code":59701,"name":"browser"},"setIdx":1,"setId":1,"iconIdx":147},{"icon":{"paths":["M927.936 272.992l-68.288-68.288c-12.608-12.576-32.96-12.576-45.536 0l-409.44 409.44-194.752-196.16c-12.576-12.576-32.928-12.576-45.536 0l-68.288 68.288c-12.576 12.608-12.576 32.96 0 45.536l285.568 287.488c12.576 12.576 32.96 12.576 45.536 0l500.736-500.768c12.576-12.544 12.576-32.96 0-45.536z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["checkmark","tick","approve","submit"],"grid":32},"attrs":[{}],"properties":{"order":1,"id":2,"prevSize":32,"code":59714,"name":"checkmark"},"setIdx":1,"setId":1,"iconIdx":148},{"icon":{"paths":["M1020.192 401.824c-8.864-25.568-31.616-44.288-59.008-48.352l-266.432-39.616-115.808-240.448c-12.192-25.248-38.272-41.408-66.944-41.408s-54.752 16.16-66.944 41.408l-115.808 240.448-266.464 39.616c-27.36 4.064-50.112 22.784-58.944 48.352-8.8 25.632-2.144 53.856 17.184 73.12l195.264 194.944-45.28 270.432c-4.608 27.232 7.2 54.56 30.336 70.496 12.704 8.736 27.648 13.184 42.592 13.184 12.288 0 24.608-3.008 35.776-8.992l232.288-125.056 232.32 125.056c11.168 5.984 23.488 8.992 35.744 8.992 14.944 0 29.888-4.448 42.624-13.184 23.136-15.936 34.88-43.264 30.304-70.496l-45.312-270.432 195.328-194.944c19.296-19.296 25.92-47.52 17.184-73.12zM754.816 619.616c-16.384 16.32-23.808 39.328-20.064 61.888l45.312 270.432-232.32-124.992c-11.136-6.016-23.424-8.992-35.776-8.992-12.288 0-24.608 3.008-35.744 8.992l-232.32 124.992 45.312-270.432c3.776-22.56-3.648-45.568-20.032-61.888l-195.264-194.944 266.432-39.68c24.352-3.616 45.312-18.848 55.776-40.576l115.872-240.384 115.84 240.416c10.496 21.728 31.424 36.928 55.744 40.576l266.496 39.68-195.264 194.912z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["star","favorite"],"grid":32},"attrs":[{}],"properties":{"order":1,"id":3,"prevSize":32,"code":59706,"name":"control-Stars"},"setIdx":1,"setId":1,"iconIdx":149},{"icon":{"paths":["M409.6 204.8h-153.6c-28.314 0-51.2 22.886-51.2 51.2v153.6c0 28.262 22.886 51.2 51.2 51.2h153.6c28.314 0 51.2-22.938 51.2-51.2v-153.6c0-28.262-22.886-51.2-51.2-51.2zM768 204.8h-153.6c-28.314 0-51.2 22.886-51.2 51.2v153.6c0 28.262 22.886 51.2 51.2 51.2h153.6c28.314 0 51.2-22.938 51.2-51.2v-153.6c0-28.262-22.886-51.2-51.2-51.2zM409.6 563.2h-153.6c-28.314 0-51.2 22.886-51.2 51.2v153.6c0 28.262 22.886 51.2 51.2 51.2h153.6c28.314 0 51.2-22.938 51.2-51.2v-153.6c0-28.262-22.886-51.2-51.2-51.2zM768 563.2h-153.6c-28.314 0-51.2 22.886-51.2 51.2v153.6c0 28.262 22.886 51.2 51.2 51.2h153.6c28.314 0 51.2-22.938 51.2-51.2v-153.6c0-28.262-22.886-51.2-51.2-51.2z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["grid"],"grid":20},"attrs":[{}],"properties":{"order":1,"id":0,"prevSize":20,"code":59730,"name":"grid1"},"setIdx":1,"setId":1,"iconIdx":150},{"icon":{"paths":["M737.28 460.8h-296.96c-28.262 0-30.72 22.886-30.72 51.2s2.458 51.2 30.72 51.2h296.96c28.262 0 30.72-22.886 30.72-51.2s-2.458-51.2-30.72-51.2zM839.68 716.8h-399.36c-28.262 0-30.72 22.886-30.72 51.2s2.458 51.2 30.72 51.2h399.36c28.262 0 30.72-22.886 30.72-51.2s-2.458-51.2-30.72-51.2zM440.32 307.2h399.36c28.262 0 30.72-22.886 30.72-51.2s-2.458-51.2-30.72-51.2h-399.36c-28.262 0-30.72 22.886-30.72 51.2s2.458 51.2 30.72 51.2zM276.48 460.8h-92.16c-28.262 0-30.72 22.886-30.72 51.2s2.458 51.2 30.72 51.2h92.16c28.262 0 30.72-22.886 30.72-51.2s-2.458-51.2-30.72-51.2zM276.48 716.8h-92.16c-28.262 0-30.72 22.886-30.72 51.2s2.458 51.2 30.72 51.2h92.16c28.262 0 30.72-22.886 30.72-51.2s-2.458-51.2-30.72-51.2zM276.48 204.8h-92.16c-28.262 0-30.72 22.886-30.72 51.2s2.458 51.2 30.72 51.2h92.16c28.262 0 30.72-22.886 30.72-51.2s-2.458-51.2-30.72-51.2z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["list"],"grid":20},"attrs":[{}],"properties":{"order":1,"id":1,"name":"list","prevSize":20,"code":59726},"setIdx":1,"setId":1,"iconIdx":151},{"icon":{"paths":["M636.518 0c68.608 0 102.912 46.694 102.912 100.198 0 66.816-59.597 128.614-137.165 128.614-64.973 0-102.861-38.4-101.069-101.888 0-53.402 45.107-126.925 135.322-126.925zM425.421 1024c-54.17 0-93.85-33.382-55.962-180.429l62.157-260.71c10.803-41.677 12.595-58.419 0-58.419-16.23 0-86.477 28.774-128.102 57.19l-27.034-45.056c131.686-111.923 283.187-177.51 348.211-177.51 54.118 0 63.13 65.178 36.096 165.376l-71.219 274.022c-12.595 48.384-7.219 65.075 5.427 65.075 16.23 0 69.478-20.070 121.805-61.798l30.72 41.677c-128.102 130.406-268.032 180.582-322.099 180.582z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["info"],"grid":20},"attrs":[{}],"properties":{"order":1,"id":2,"prevSize":20,"code":59708,"name":"info"},"setIdx":1,"setId":1,"iconIdx":152}],"height":1024,"metadata":{"name":"icomoon"},"preferences":{"showGlyphs":true,"showCodes":true,"showQuickUse":true,"showQuickUse2":true,"showSVGs":true,"fontPref":{"prefix":"icon-","metadata":{"fontFamily":"icomoon"},"metrics":{"emSize":1024,"baseline":6.25,"whitespace":50},"embed":false},"imagePref":{"prefix":"icon-","png":true,"useClassSelector":true,"color":0,"bgColor":16777215,"name":"icomoon","classSelector":".icon"},"historySize":50,"gridSize":16}} \ No newline at end of file +{"IcoMoonType":"selection","icons":[{"icon":{"paths":["M213.333 554.667h597.333c23.552 0 42.667-19.115 42.667-42.667s-19.115-42.667-42.667-42.667h-597.333c-23.552 0-42.667 19.115-42.667 42.667s19.115 42.667 42.667 42.667z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["minus"],"grid":24},"attrs":[{}],"properties":{"order":1,"id":1,"prevSize":24,"code":59798,"name":"minus2"},"setIdx":0,"setId":1,"iconIdx":0},{"icon":{"paths":["M213.333 554.667h256v256c0 23.552 19.115 42.667 42.667 42.667s42.667-19.115 42.667-42.667v-256h256c23.552 0 42.667-19.115 42.667-42.667s-19.115-42.667-42.667-42.667h-256v-256c0-23.552-19.115-42.667-42.667-42.667s-42.667 19.115-42.667 42.667v256h-256c-23.552 0-42.667 19.115-42.667 42.667s19.115 42.667 42.667 42.667z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["plus"],"grid":24},"attrs":[{}],"properties":{"order":2,"id":0,"prevSize":24,"code":59799,"name":"plus2"},"setIdx":0,"setId":1,"iconIdx":1},{"icon":{"paths":["M512 890.112c-50.517-28.672-188.587-114.987-258.133-236.757-3.371-5.888-6.528-11.776-9.515-17.792-19.456-38.869-31.019-80.128-31.019-123.563v-269.099l298.667-112 298.667 112v269.099c0 43.435-11.563 84.693-30.976 123.605-2.987 5.973-6.187 11.904-9.515 17.792-69.589 121.771-207.659 208.043-258.133 236.757zM531.072 976.811c0 0 212.864-105.6 313.173-281.131 4.096-7.168 8.021-14.507 11.776-21.973 24.235-48.427 39.979-102.741 39.979-161.707v-298.667c0-18.176-11.392-33.707-27.691-39.936l-341.333-128c-10.069-3.797-20.693-3.499-29.952 0l-341.333 128c-17.024 6.357-27.563 22.485-27.691 39.936v298.667c0 58.965 15.744 113.28 40.021 161.749 3.712 7.467 7.637 14.763 11.776 21.973 100.309 175.531 313.173 281.131 313.173 281.131 12.459 6.229 26.453 5.803 38.144 0z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["shield"],"grid":24},"attrs":[{}],"properties":{"order":1,"id":0,"prevSize":24,"code":59797,"name":"shield"},"setIdx":0,"setId":1,"iconIdx":2},{"icon":{"paths":["M634 558q92-64 92-174 0-88-63-151t-151-63-151 63-63 151q0 46 27 96t65 78l36 26v98h172v-98zM512 86q124 0 211 87t87 211q0 156-128 244v98q0 18-12 30t-30 12h-256q-18 0-30-12t-12-30v-98q-128-88-128-244 0-124 87-211t211-87zM384 896v-42h256v42q0 18-12 30t-30 12h-172q-18 0-30-12t-12-30z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["lightbulb_outline"],"grid":24},"attrs":[{}],"properties":{"order":1,"id":0,"prevSize":24,"code":59795,"name":"lightbulb_outline"},"setIdx":0,"setId":1,"iconIdx":3},{"icon":{"paths":["M256 86v256l170 170-170 172v254h512v-256l-170-170 170-170v-256h-512zM682 704v150h-340v-150l170-170z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["hourglass_top"],"grid":24},"attrs":[{}],"properties":{"order":1,"id":0,"prevSize":24,"code":59794,"name":"hourglass_top"},"setIdx":0,"setId":1,"iconIdx":4},{"icon":{"paths":["M726 470q70 0 120 50t50 120-50 120-120 50h-86v86l-128-128 128-128v86h96q34 0 60-26t26-60-26-60-60-26h-566v-84h556zM854 214v84h-684v-84h684zM170 810v-84h256v84h-256z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["wrap_text"],"grid":24},"attrs":[{}],"properties":{"order":1,"id":0,"prevSize":24,"code":59793,"name":"wrap_text"},"setIdx":0,"setId":1,"iconIdx":5},{"icon":{"paths":["M682 342h128v84h-212v-212h84v128zM598 810v-212h212v84h-128v128h-84zM342 342v-128h84v212h-212v-84h128zM214 682v-84h212v212h-84v-128h-128z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["fullscreen_exit"],"grid":24},"attrs":[{}],"properties":{"order":1,"id":1,"prevSize":24,"code":59791,"name":"fullscreen_exit"},"setIdx":0,"setId":1,"iconIdx":6},{"icon":{"paths":["M598 214h212v212h-84v-128h-128v-84zM726 726v-128h84v212h-212v-84h128zM214 426v-212h212v84h-128v128h-84zM298 598v128h128v84h-212v-212h84z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["fullscreen"],"grid":24},"attrs":[{}],"properties":{"order":2,"id":0,"prevSize":24,"code":59792,"name":"fullscreen"},"setIdx":0,"setId":1,"iconIdx":7},{"icon":{"paths":["M470 384l60 60-154 154h392v-428h86v512h-478l154 154-60 60-256-256z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["subdirectory_arrow_left"],"grid":24},"attrs":[{}],"properties":{"order":1,"id":0,"prevSize":24,"code":59780,"name":"enter"},"setIdx":0,"setId":1,"iconIdx":8},{"icon":{"paths":["M298 384h214v42h-214v-42zM406 598q80 0 136-56t56-136-56-136-136-56-136 56-56 136 56 136 136 56zM662 598l212 212-64 64-212-212v-34l-12-12q-76 66-180 66-116 0-197-80t-81-196 81-197 197-81 196 81 80 197q0 42-20 95t-46 85l12 12h34z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["zoom_out"],"grid":24},"attrs":[{}],"properties":{"order":1,"id":4,"prevSize":24,"code":59778,"name":"zoom_out"},"setIdx":0,"setId":1,"iconIdx":9},{"icon":{"paths":["M512 426h-86v86h-42v-86h-86v-42h86v-86h42v86h86v42zM406 598q80 0 136-56t56-136-56-136-136-56-136 56-56 136 56 136 136 56zM662 598l212 212-64 64-212-212v-34l-12-12q-76 66-180 66-116 0-197-80t-81-196 81-197 197-81 196 81 80 197q0 42-20 95t-46 85l12 12h34z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["zoom_in"],"grid":24},"attrs":[{}],"properties":{"order":2,"id":3,"prevSize":24,"code":59779,"name":"zoom_in"},"setIdx":0,"setId":1,"iconIdx":10},{"icon":{"paths":["M810 896v-86h86q0 34-26 60t-60 26zM810 554v-84h86v84h-86zM640 214v-86h86v86h-86zM810 726v-86h86v86h-86zM470 982v-940h84v940h-84zM810 128q34 0 60 26t26 60h-86v-86zM128 214q0-34 26-60t60-26h170v86h-170v596h170v86h-170q-34 0-60-26t-26-60v-596zM810 384v-86h86v86h-86zM640 896v-86h86v86h-86z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["flip"],"grid":24},"attrs":[{}],"properties":{"order":1,"id":2,"name":"flip","prevSize":24,"code":59775},"setIdx":0,"setId":1,"iconIdx":11},{"icon":{"paths":["M720 660q34-46 44-106h86q-12 92-68 166zM554 764q60-10 106-44l62 62q-72 56-168 68v-86zM850 470h-86q-10-60-44-106l62-60q58 72 68 166zM664 236l-194 190v-166q-92 16-153 87t-61 165 61 165 153 87v86q-126-16-213-112t-87-226 87-226 213-112v-132z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["rotate_right"],"grid":24},"attrs":[{}],"properties":{"order":1,"id":1,"name":"rotate_right","prevSize":24,"code":59776},"setIdx":0,"setId":1,"iconIdx":12},{"icon":{"paths":["M554 174q126 16 213 112t87 226-87 226-213 112v-86q92-16 153-87t61-165-61-165-153-87v166l-194-190 194-194v132zM302 782l62-62q46 34 106 44v86q-96-12-168-68zM260 554q10 58 42 106l-60 60q-56-74-68-166h86zM304 364q-36 52-44 106h-86q12-90 70-166z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["rotate_left"],"grid":24},"attrs":[{}],"properties":{"order":2,"id":0,"name":"rotate_left","prevSize":24,"code":59777},"setIdx":0,"setId":1,"iconIdx":13},{"icon":{"paths":["M810 598v-86h-128v-128h-84v128h-128v86h128v128h84v-128h128zM854 256q36 0 60 25t24 61v426q0 36-24 61t-60 25h-684q-36 0-60-25t-24-61v-512q0-36 24-61t60-25h256l86 86h342z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["create_new_folder"],"grid":24},"attrs":[{}],"properties":{"order":1,"id":1,"prevSize":24,"code":59771,"name":"create_new_folder"},"setIdx":0,"setId":1,"iconIdx":14},{"icon":{"paths":["M426 170l86 86h342q34 0 59 26t25 60v426q0 34-25 60t-59 26h-684q-34 0-59-26t-25-60v-512q0-34 25-60t59-26h256z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["folder"],"grid":24},"attrs":[{}],"properties":{"order":2,"id":0,"prevSize":24,"code":59772,"name":"folder"},"setIdx":0,"setId":1,"iconIdx":15},{"icon":{"paths":["M512 256q70 0 120 50t50 120q0 54-64 111t-64 103h-84q0-46 20-79t44-48 44-37 20-50q0-34-26-59t-60-25-60 25-26 59h-84q0-70 50-120t120-50zM512 854q140 0 241-101t101-241-101-241-241-101-241 101-101 241 101 241 241 101zM512 86q176 0 301 125t125 301-125 301-301 125-301-125-125-301 125-301 301-125zM470 768v-86h84v86h-84z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["help_outline"],"grid":24},"attrs":[{}],"properties":{"order":1,"id":0,"prevSize":24,"code":59770,"name":"help2"},"setIdx":0,"setId":1,"iconIdx":16},{"icon":{"paths":["M236.416 92.117c-6.528-4.267-14.507-6.784-23.083-6.784-23.552 0-42.667 19.115-42.667 42.667v768c-0.043 7.765 2.133 15.872 6.784 23.083 12.757 19.84 39.125 25.557 58.965 12.8l597.333-384c4.864-3.072 9.344-7.424 12.8-12.8 12.757-19.84 6.997-46.208-12.8-58.965zM256 206.165l475.776 305.835-475.776 305.835z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["play"],"grid":24},"attrs":[{}],"properties":{"order":1,"id":0,"prevSize":24,"code":59769,"name":"trigger-Manual, play-line"},"setIdx":0,"setId":1,"iconIdx":17},{"icon":{"paths":["M128 170.667v298.667c0 58.88 23.936 112.299 62.464 150.869s91.989 62.464 150.869 62.464h409.003l-140.501 140.501c-16.683 16.683-16.683 43.691 0 60.331s43.691 16.683 60.331 0l213.333-213.333c3.925-3.925 7.083-8.619 9.259-13.824s3.243-10.795 3.243-16.341c0-10.923-4.181-21.845-12.501-30.165l-213.333-213.333c-16.683-16.683-43.691-16.683-60.331 0s-16.683 43.691 0 60.331l140.501 140.501h-409.003c-35.371 0-67.285-14.293-90.496-37.504s-37.504-55.125-37.504-90.496v-298.667c0-23.552-19.115-42.667-42.667-42.667s-42.667 19.115-42.667 42.667z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["corner-down-right"],"grid":24},"attrs":[{}],"properties":{"order":1,"id":0,"prevSize":24,"code":59767,"name":"corner-down-right"},"setIdx":0,"setId":1,"iconIdx":18},{"icon":{"paths":["M470 384v-86h84v86h-84zM512 854c188 0 342-154 342-342s-154-342-342-342-342 154-342 342 154 342 342 342zM512 86c236 0 426 190 426 426s-190 426-426 426-426-190-426-426 190-426 426-426zM470 726v-256h84v256h-84z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["info_outline"],"grid":24},"attrs":[{}],"properties":{"order":128,"id":0,"prevSize":24,"code":59764,"name":"info-outline"},"setIdx":0,"setId":1,"iconIdx":19},{"icon":{"paths":["M214 768h596v86h-596v-86zM384 682v-256h-170l298-298 298 298h-170v256h-256z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["file_upload"],"grid":24},"attrs":[{}],"properties":{"order":1,"id":0,"prevSize":24,"code":59762,"name":"upload-2"},"setIdx":0,"setId":1,"iconIdx":20},{"icon":{"paths":["M678 726h138l-70-186zM790 426l192 512h-86l-48-128h-202l-48 128h-86l192-512h86zM550 642l-34 88-132-132-214 212-60-60 218-214c-54-60-96-124-128-194h86c26 50 58 98 98 142 62-68 108-146 136-228h-478v-86h300v-84h84v84h300v86h-126c-32 100-84 196-158 278l-2 2z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["translate"],"grid":24},"attrs":[{}],"properties":{"order":1,"id":0,"prevSize":24,"code":59759,"name":"translate"},"setIdx":0,"setId":1,"iconIdx":21},{"icon":{"paths":["M854 470v84h-520l238 240-60 60-342-342 342-342 60 60-238 240h520z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["arrow_back"],"grid":24},"attrs":[{}],"properties":{"order":1,"id":1,"prevSize":24,"code":59758,"name":"arrow_back"},"setIdx":0,"setId":1,"iconIdx":22},{"icon":{"paths":["M768 512c-25.6 0-42.667 17.067-42.667 42.667v256c0 25.6-17.067 42.667-42.667 42.667h-469.333c-25.6 0-42.667-17.067-42.667-42.667v-469.333c0-25.6 17.067-42.667 42.667-42.667h256c25.6 0 42.667-17.067 42.667-42.667s-17.067-42.667-42.667-42.667h-256c-72.533 0-128 55.467-128 128v469.333c0 72.533 55.467 128 128 128h469.333c72.533 0 128-55.467 128-128v-256c0-25.6-17.067-42.667-42.667-42.667z","M934.4 110.933c-4.267-8.533-12.8-17.067-21.333-21.333-4.267-4.267-12.8-4.267-17.067-4.267h-256c-25.6 0-42.667 17.067-42.667 42.667s17.067 42.667 42.667 42.667h153.6l-396.8 396.8c-17.067 17.067-17.067 42.667 0 59.733 8.533 8.533 17.067 12.8 29.867 12.8s21.333-4.267 29.867-12.8l396.8-396.8v153.6c0 25.6 17.067 42.667 42.667 42.667s42.667-17.067 42.667-42.667v-256c0-4.267 0-12.8-4.267-17.067z"],"attrs":[{},{}],"isMulticolor":false,"isMulticolor2":false,"tags":["external-link"],"grid":24},"attrs":[{},{}],"properties":{"order":1,"id":2,"prevSize":24,"code":59757,"name":"external-link"},"setIdx":0,"setId":1,"iconIdx":23},{"icon":{"paths":["M810.667 85.333h-597.333c-72.533 0-128 55.467-128 128v597.333c0 72.533 55.467 128 128 128h597.333c72.533 0 128-55.467 128-128v-597.333c0-72.533-55.467-128-128-128zM853.333 810.667c0 25.6-17.067 42.667-42.667 42.667h-597.333c-25.6 0-42.667-17.067-42.667-42.667v-597.333c0-25.6 17.067-42.667 42.667-42.667h597.333c25.6 0 42.667 17.067 42.667 42.667v597.333z","M682.667 469.333h-341.333c-25.6 0-42.667 17.067-42.667 42.667s17.067 42.667 42.667 42.667h341.333c25.6 0 42.667-17.067 42.667-42.667s-17.067-42.667-42.667-42.667z"],"attrs":[{},{}],"isMulticolor":false,"isMulticolor2":false,"tags":["minus-square"],"grid":24},"attrs":[{},{}],"properties":{"order":1,"id":3,"prevSize":24,"code":59753,"name":"minus-square"},"setIdx":0,"setId":1,"iconIdx":24},{"icon":{"paths":["M810.667 85.333h-597.333c-72.533 0-128 55.467-128 128v597.333c0 72.533 55.467 128 128 128h597.333c72.533 0 128-55.467 128-128v-597.333c0-72.533-55.467-128-128-128zM853.333 810.667c0 25.6-17.067 42.667-42.667 42.667h-597.333c-25.6 0-42.667-17.067-42.667-42.667v-597.333c0-25.6 17.067-42.667 42.667-42.667h597.333c25.6 0 42.667 17.067 42.667 42.667v597.333z","M682.667 469.333h-128v-128c0-25.6-17.067-42.667-42.667-42.667s-42.667 17.067-42.667 42.667v128h-128c-25.6 0-42.667 17.067-42.667 42.667s17.067 42.667 42.667 42.667h128v128c0 25.6 17.067 42.667 42.667 42.667s42.667-17.067 42.667-42.667v-128h128c25.6 0 42.667-17.067 42.667-42.667s-17.067-42.667-42.667-42.667z"],"attrs":[{},{}],"isMulticolor":false,"isMulticolor2":false,"tags":["plus-square"],"grid":24},"attrs":[{},{}],"properties":{"order":1,"id":4,"name":"plus-square","prevSize":24,"code":59752},"setIdx":0,"setId":1,"iconIdx":25},{"icon":{"paths":["M170 640v-86h684v86h-684zM854 384v86h-684v-86h684z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["drag_handle"],"grid":24},"attrs":[{}],"properties":{"order":1,"id":5,"prevSize":24,"code":59745,"name":"drag2"},"setIdx":0,"setId":1,"iconIdx":26},{"icon":{"paths":["M854 682v-512h-684v598l86-86h598zM854 86c46 0 84 38 84 84v512c0 46-38 86-84 86h-598l-170 170v-768c0-46 38-84 84-84h684z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["chat_bubble_outline"],"grid":24},"attrs":[{}],"properties":{"order":133,"id":6,"name":"comments","prevSize":24,"code":59743},"setIdx":0,"setId":1,"iconIdx":27},{"icon":{"paths":["M512 128c212 0 384 172 384 384s-172 384-384 384c-88 0-170-30-234-80l60-60c50 34 110 54 174 54 166 0 298-132 298-298s-132-298-298-298-298 132-298 298h128l-172 170-170-170h128c0-212 172-384 384-384zM598 512c0 46-40 86-86 86s-86-40-86-86 40-86 86-86 86 40 86 86z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["settings_backup_restore"],"grid":24},"attrs":[{}],"properties":{"order":1,"id":7,"prevSize":24,"code":59739,"name":"backup"},"setIdx":0,"setId":1,"iconIdx":28},{"icon":{"paths":["M726 512c0 24-20 42-44 42h-426l-170 172v-598c0-24 18-42 42-42h554c24 0 44 18 44 42v384zM896 256c24 0 42 18 42 42v640l-170-170h-470c-24 0-42-18-42-42v-86h554v-384h86z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["question_answer"],"grid":24},"attrs":[{}],"properties":{"order":1,"id":8,"prevSize":24,"code":59738,"name":"support"},"setIdx":0,"setId":1,"iconIdx":29},{"icon":{"paths":["M918 384v128h-128v298h-128v-298h-128v-128h384zM106 170h556v128h-214v512h-128v-512h-214v-128z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["text_fields"],"grid":24},"attrs":[{}],"properties":{"order":75,"id":9,"prevSize":24,"code":59705,"name":"control-RichText, type-RichText"},"setIdx":0,"setId":1,"iconIdx":30},{"icon":{"paths":["M640 85.333q78 0 149.167 30.5t122.5 81.833 81.833 122.5 30.5 149.167q0 85-35 160.667t-96.667 129.167-140 77.5l21-20.667q18-18.333 28-42.667 9.333-22.667 9.333-49.333 0-6.667-0.333-9.333 59.333-41.333 93.833-105.833t34.5-139.5q0-60.667-23.667-116t-63.667-95.333-95.333-63.667-116-23.667q-55.333 0-106.5 19.833t-90 53.833-65 81.333-33.833 101h-88.667q-70.667 0-120.667 50t-50 120.667q0 38.667 15.167 71.667t39.833 54.167 54.833 33 60.833 11.833h50q11.667 29.333 30 48l37.667 37.333h-117.667q-69.667 0-128.5-34.333t-93.167-93.167-34.333-128.5 34.333-128.5 93.167-93.167 128.5-34.333h22q26.333-74.333 79.333-132.167t126.833-90.833 155.833-33zM554.667 426.667q17.667 0 30.167 12.5t12.5 30.167v281l55-55.333q12.333-12.333 30.333-12.333 18.333 0 30.5 12.167t12.167 30.5q0 18-12.333 30.333l-128 128q-12.333 12.333-30.333 12.333t-30.333-12.333l-128-128q-12.333-13-12.333-30.333 0-17.667 12.5-30.167t30.167-12.5q18 0 30.333 12.333l55 55.333v-281q0-17.667 12.5-30.167t30.167-12.5z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["cloud-download"],"grid":24},"attrs":[{}],"properties":{"order":1,"id":10,"prevSize":24,"code":59710,"name":"download"},"setIdx":0,"setId":1,"iconIdx":31},{"icon":{"paths":["M647.429 596c10.857 10.286 13.714 26.286 8 39.429-5.714 13.714-18.857 22.857-33.714 22.857h-218.286l114.857 272c8 18.857-1.143 40-19.429 48l-101.143 42.857c-18.857 8-40-1.143-48-19.429l-109.143-258.286-178.286 178.286c-6.857 6.857-16 10.857-25.714 10.857-4.571 0-9.714-1.143-13.714-2.857-13.714-5.714-22.857-18.857-22.857-33.714v-859.429c0-14.857 9.143-28 22.857-33.714 4-1.714 9.143-2.857 13.714-2.857 9.714 0 18.857 3.429 25.714 10.857z"],"attrs":[{}],"width":661,"isMulticolor":false,"isMulticolor2":false,"tags":["mouse-pointer"],"grid":14},"attrs":[{}],"properties":{"order":1,"id":0,"prevSize":28,"code":59796,"name":"mouse-pointer"},"setIdx":0,"setId":1,"iconIdx":32},{"icon":{"paths":["M32 591.125c-0.135-0.002-0.294-0.003-0.453-0.003-17.675 0-32.003 14.328-32.003 32.003s14.328 32.003 32.003 32.003c0.159 0 0.318-0.001 0.477-0.003l-0.024 0h932.5c0.135 0.002 0.294 0.003 0.453 0.003 17.675 0 32.003-14.328 32.003-32.003s-14.328-32.003-32.003-32.003c-0.159 0-0.318 0.001-0.477 0.003l0.024-0z","M283.5 192c-48.529 0.018-93.046 27.658-114.625 71.125l-165.5 330.5c-2.128 4.168-3.375 9.091-3.375 14.305 0 0.025 0 0.049 0 0.074l-0-0.004v288c0 70.313 57.687 128 128 128h768c70.313 0 128-57.687 128-128v-288c0-0.021 0-0.045 0-0.070 0-5.214-1.247-10.137-3.459-14.487l0.084 0.182-165.625-330.625c-21.582-43.39-66.034-70.95-114.5-71zM283.5 256h457c24.351 0.025 46.422 13.689 57.25 35.5-0 0.019-0 0.040-0 0.062s0 0.044 0 0.066l-0-0.003 162.25 324v280.375c0 35.725-28.275 64-64 64h-768c-35.725 0-64-28.275-64-64v-280.375l162.125-324c0.042-0.042 0.083-0.083 0.123-0.123l0.001-0.001c10.835-21.826 32.883-35.491 57.25-35.5z","M231.625 790.75c-0.135-0.002-0.293-0.003-0.453-0.003-17.675 0-32.003 14.328-32.003 32.003s14.328 32.003 32.003 32.003c0.159 0 0.318-0.001 0.477-0.003l-0.024 0c0.135 0.002 0.293 0.003 0.453 0.003 17.675 0 32.003-14.328 32.003-32.003s-14.328-32.003-32.003-32.003c-0.159 0-0.318 0.001-0.477 0.003l0.024-0z","M431.125 790.75c-0.135-0.002-0.293-0.003-0.453-0.003-17.675 0-32.003 14.328-32.003 32.003s14.328 32.003 32.003 32.003c0.159 0 0.318-0.001 0.477-0.003l-0.024 0c0.135 0.002 0.293 0.003 0.453 0.003 17.675 0 32.003-14.328 32.003-32.003s-14.328-32.003-32.003-32.003c-0.159 0-0.318 0.001-0.477 0.003l0.024-0z"],"attrs":[{},{},{},{}],"isMulticolor":false,"isMulticolor2":false,"grid":14,"tags":["backups"]},"attrs":[{},{},{},{}],"properties":{"order":146,"id":56,"name":"backups","prevSize":28,"code":59783},"setIdx":0,"setId":1,"iconIdx":33},{"icon":{"paths":["M205.75 684.876c-116.072 2.994-208.526 100.048-205.75 216.125v91.125c-0.002 0.135-0.003 0.293-0.003 0.453 0 17.675 14.328 32.003 32.003 32.003s32.003-14.328 32.003-32.003c0-0.159-0.001-0.318-0.003-0.477l0 0.024v-91.875c0.001-0.111 0.002-0.243 0.002-0.375s-0.001-0.264-0.002-0.395l0 0.020c-1.95-81.542 61.837-148.522 143.375-150.625h347.5c81.538 2.103 145.2 69.083 143.25 150.625-0.001 0.111-0.002 0.243-0.002 0.375s0.001 0.264 0.002 0.395l-0-0.020v91.875c-0.002 0.135-0.003 0.293-0.003 0.453 0 17.675 14.328 32.003 32.003 32.003s32.003-14.328 32.003-32.003c0-0.159-0.001-0.318-0.003-0.477l0 0.024v-91.125c2.776-116.077-89.553-213.131-205.625-216.125-0.13-0.002-0.284-0.003-0.438-0.003s-0.307 0.001-0.461 0.003l0.023-0h-349.125c-0.111-0.001-0.243-0.002-0.375-0.002s-0.264 0.001-0.395 0.002l0.020-0z","M418.5 158.626c-114.011 0-207.625 91.723-207.625 204.625s93.614 204.5 207.625 204.5c114.011 0 207.625-91.598 207.625-204.5s-93.614-204.625-207.625-204.625zM418.5 222.626c80.040 0 143.625 62.94 143.625 140.625s-63.585 140.5-143.625 140.5c-80.040 0-143.625-62.815-143.625-140.5s63.585-140.625 143.625-140.625z","M860.625 690.626c-0.020-0-0.043-0-0.066-0-17.675 0-32.003 14.328-32.003 32.003 0 14.674 9.876 27.042 23.344 30.818l0.225 0.054c64.84 18.992 108.818 78.567 107.875 146.125-0.001 0.074-0.001 0.162-0.001 0.25s0 0.175 0.001 0.263l-0-0.013v91.875c-0.002 0.135-0.003 0.293-0.003 0.453 0 17.675 14.328 32.003 32.003 32.003s32.003-14.328 32.003-32.003c0-0.159-0.001-0.318-0.003-0.477l0 0.024v-91.5c1.34-96.005-61.732-181.386-153.875-208.375-2.836-0.933-6.1-1.48-9.49-1.5l-0.010-0z","M684.375 164.126c-17.015 0.826-30.498 14.822-30.498 31.968 0 15.282 10.711 28.062 25.036 31.243l0.213 0.040c73.504 17.494 106.625 75.198 106.625 135s-33.121 117.506-106.625 135c-14.723 3.073-25.625 15.944-25.625 31.361 0 17.675 14.328 32.003 32.003 32.003 2.978 0 5.861-0.407 8.596-1.168l-0.225 0.053c101.451-24.146 155.875-111.76 155.875-197.25s-54.424-173.104-155.875-197.25c-2.419-0.656-5.197-1.032-8.063-1.032-0.506 0-1.008 0.012-1.508 0.035l0.071-0.003z"],"attrs":[{},{},{},{}],"isMulticolor":false,"isMulticolor2":false,"grid":14,"tags":["clients"]},"attrs":[{},{},{},{}],"properties":{"order":147,"id":55,"name":"clients","prevSize":28,"code":59784},"setIdx":0,"setId":1,"iconIdx":34},{"icon":{"paths":["M156.505 775.014c-86.098 0-156.505 70.407-156.505 156.505v64.025c-0.002 0.12-0.003 0.261-0.003 0.402 0 15.717 12.741 28.458 28.458 28.458s28.458-12.741 28.458-28.458c0-0.141-0.001-0.283-0.003-0.424l0 0.021v-64.025c0-55.341 44.253-99.594 99.594-99.594h256.1c55.341 0 99.594 44.253 99.594 99.594v64.025c-0.002 0.12-0.003 0.261-0.003 0.402 0 15.717 12.741 28.458 28.458 28.458s28.458-12.741 28.458-28.458c0-0.141-0.001-0.283-0.003-0.424l0 0.021v-64.025c0-86.098-70.407-156.505-156.505-156.505z","M284.555 390.865c-86.098 0-156.505 70.407-156.505 156.505s70.407 156.505 156.505 156.505c86.098 0 156.505-70.407 156.505-156.505s-70.407-156.505-156.505-156.505zM284.555 447.776c55.341 0 99.594 44.253 99.594 99.594s-44.253 99.594-99.594 99.594c-55.341 0-99.594-44.253-99.594-99.594s44.253-99.594 99.594-99.594z","M759.184 390.42c-15.525 0.25-28.014 12.894-28.014 28.455 0 0.157 0.001 0.313 0.004 0.469l-0-0.024v443.061c-0.002 0.12-0.003 0.261-0.003 0.402 0 15.717 12.741 28.458 28.458 28.458s28.458-12.741 28.458-28.458c0-0.141-0.001-0.283-0.003-0.424l0 0.021v-443.061c0.002-0.132 0.003-0.289 0.003-0.445 0-15.717-12.741-28.458-28.458-28.458-0.157 0-0.313 0.001-0.469 0.004l0.024-0z","M761.963 390.865c-7.832 0.065-14.899 3.283-20.005 8.445l-221.533 224.201c-5.32 5.176-8.62 12.405-8.62 20.404 0 15.717 12.741 28.458 28.458 28.458 8.11 0 15.427-3.392 20.611-8.835l0.011-0.012 201.3-203.746 201.301 203.746c5.17 5.24 12.349 8.486 20.287 8.486 15.736 0 28.492-12.756 28.492-28.492 0-7.8-3.134-14.867-8.211-20.012l0.003 0.003-221.642-224.198c-5.161-5.218-12.321-8.449-20.236-8.449-0.076 0-0.152 0-0.228 0.001l0.012-0z"],"attrs":[{},{},{},{}],"isMulticolor":false,"isMulticolor2":false,"grid":14,"tags":["contributors"]},"attrs":[{},{},{},{}],"properties":{"order":140,"id":54,"name":"contributors","prevSize":28,"code":59785},"setIdx":0,"setId":1,"iconIdx":35},{"icon":{"paths":["M512 0c-282.413 0-512 229.587-512 512s229.587 512 512 512c282.413 0 512-229.587 512-512s-229.587-512-512-512zM512 60.235c249.859 0 451.765 201.905 451.765 451.765s-201.905 451.765-451.765 451.765c-249.859 0-451.765-201.905-451.765-451.765s201.905-451.765 451.765-451.765z","M30.118 481.882c-0.127-0.002-0.276-0.003-0.426-0.003-16.635 0-30.121 13.485-30.121 30.121s13.485 30.121 30.121 30.121c0.15 0 0.299-0.001 0.448-0.003l-0.023 0h963.765c0.127 0.002 0.276 0.003 0.426 0.003 16.635 0 30.121-13.485 30.121-30.121s-13.485-30.121-30.121-30.121c-0.15 0-0.299 0.001-0.448 0.003l0.023-0z","M521.647 20.588c-8.005 0.591-15.062 4.227-20.097 9.741l-0.021 0.023c-119.234 130.527-187.021 299.957-190.706 476.706-0.004 0.175-0.006 0.381-0.006 0.588s0.002 0.413 0.006 0.619l-0-0.031c3.685 176.749 71.472 346.179 190.706 476.706 5.527 6.033 13.441 9.802 22.235 9.802s16.708-3.769 22.215-9.78l0.020-0.022c119.234-130.527 187.021-299.956 190.706-476.706 0.004-0.175 0.006-0.381 0.006-0.588s-0.002-0.413-0.006-0.619l0 0.031c-3.685-176.749-71.472-346.179-190.706-476.706-5.529-6.054-13.456-9.837-22.267-9.837-0.734 0-1.462 0.026-2.183 0.078l0.097-0.006zM523.765 106.353c92.106 114.621 149.373 253.509 152.588 401.294-3.216 147.779-60.489 286.675-152.588 401.294-92.103-114.621-149.373-253.511-152.588-401.294 3.216-147.789 60.478-286.671 152.588-401.294z"],"attrs":[{},{},{}],"isMulticolor":false,"isMulticolor2":false,"grid":14,"tags":["languages"]},"attrs":[{},{},{}],"properties":{"order":145,"id":53,"name":"languages","prevSize":28,"code":59786},"setIdx":0,"setId":1,"iconIdx":36},{"icon":{"paths":["M958.037 713.984c5.901 3.089 10.267 8.43 11.994 14.853l0.038 0.165c0.413 1.924 0.65 4.134 0.65 6.4 0 4.566-0.961 8.908-2.693 12.833l0.080-0.204-23.979 40.021c-3.089 5.901-8.43 10.267-14.853 11.994l-0.165 0.038c-1.924 0.413-4.134 0.65-6.4 0.65-4.566 0-8.908-0.961-12.833-2.693l0.204 0.080-349.867-201.984v403.883c0 0.025 0 0.055 0 0.085 0 13.196-10.697 23.893-23.893 23.893-0.030 0-0.060-0-0.090-0l0.005 0h-48.213c-0.025 0-0.055 0-0.085 0-13.196 0-23.893-10.697-23.893-23.893 0-0.030 0-0.060 0-0.090l-0 0.005v-404.053l-349.867 201.984c-3.722 1.651-8.063 2.613-12.629 2.613-2.266 0-4.476-0.237-6.608-0.687l0.208 0.037c-6.588-1.765-11.93-6.131-14.957-11.902l-0.062-0.13-24.149-39.851c-1.651-3.722-2.613-8.063-2.613-12.629 0-2.266 0.237-4.476 0.687-6.608l-0.037 0.208c1.765-6.588 6.131-11.93 11.902-14.957l0.13-0.062 349.952-201.984-350.037-201.984c-5.901-3.089-10.267-8.43-11.994-14.853l-0.038-0.165c-0.413-1.924-0.65-4.134-0.65-6.4 0-4.566 0.961-8.908 2.693-12.833l-0.080 0.204 23.979-40.021c3.089-5.901 8.43-10.267 14.853-11.994l0.165-0.038c1.924-0.413 4.134-0.65 6.4-0.65 4.566 0 8.908 0.961 12.833 2.693l-0.204-0.080 349.867 201.984v-403.968c-0.003-0.145-0.005-0.317-0.005-0.489 0-6.499 2.681-12.372 6.997-16.573l0.005-0.005c4.206-4.322 10.079-7.002 16.578-7.002 0.172 0 0.343 0.002 0.514 0.006l-0.025-0h47.957c0.145-0.003 0.317-0.005 0.489-0.005 6.499 0 12.372 2.681 16.573 6.997l0.005 0.005c4.322 4.206 7.002 10.079 7.002 16.578 0 0.172-0.002 0.343-0.006 0.514l0-0.025v403.968l349.867-201.984c3.722-1.651 8.063-2.613 12.629-2.613 2.266 0 4.476 0.237 6.608 0.687l-0.208-0.037c6.588 1.765 11.93 6.131 14.957 11.902l0.062 0.13 23.979 40.021c1.651 3.722 2.613 8.063 2.613 12.629 0 2.266-0.237 4.476-0.687 6.608l0.037-0.208c-1.765 6.588-6.131 11.93-11.902 14.957l-0.13 0.062-349.696 201.984z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"grid":14,"tags":["patterns"]},"attrs":[{}],"properties":{"order":144,"id":52,"name":"patterns","prevSize":28,"code":59787},"setIdx":0,"setId":1,"iconIdx":37},{"icon":{"paths":["M345.882 569.765c-54.454 0-93.859 39.044-121.294 72.824s-44.118 67.294-44.118 67.294c-2.389 4.219-3.798 9.265-3.798 14.641 0 16.635 13.485 30.121 30.121 30.121 12.135 0 22.594-7.176 27.364-17.516l0.077-0.187c0 0 14.348-28.391 37.059-56.353s52.544-50.588 74.588-50.588h277.059c22.044 0 51.878 22.626 74.588 50.588s37.059 56.353 37.059 56.353c4.848 10.526 15.307 17.702 27.441 17.702 16.635 0 30.121-13.485 30.121-30.121 0-5.375-1.408-10.422-3.875-14.791l0.078 0.15c0 0-16.682-33.515-44.118-67.294s-66.84-72.824-121.294-72.824z","M484.118 168.588c-89.664 0-163.059 73.277-163.059 162.941s73.395 163.059 163.059 163.059c89.664 0 162.941-73.395 162.941-163.059s-73.277-162.941-162.941-162.941zM484.118 228.824c57.11 0 102.706 45.596 102.706 102.706s-45.596 102.824-102.706 102.824c-57.11 0-102.824-45.713-102.824-102.824s45.713-102.706 102.824-102.706z","M120.471 0c-66.22 0-120.471 54.251-120.471 120.471v783.059c0 66.22 54.251 120.471 120.471 120.471h722.824c66.22 0 120.471-54.251 120.471-120.471v-783.059c0-66.22-54.251-120.471-120.471-120.471zM120.471 60.235h722.824c33.891 0 60.235 26.344 60.235 60.235v783.059c0 33.891-26.344 60.235-60.235 60.235h-722.824c-33.891 0-60.235-26.344-60.235-60.235v-783.059c0-33.891 26.344-60.235 60.235-60.235z","M391.529 782.941c-0.127-0.002-0.276-0.003-0.426-0.003-16.635 0-30.121 13.485-30.121 30.121s13.485 30.121 30.121 30.121c0.15 0 0.299-0.001 0.448-0.003l-0.023 0h180.706c0.127 0.002 0.276 0.003 0.426 0.003 16.635 0 30.121-13.485 30.121-30.121s-13.485-30.121-30.121-30.121c-0.15 0-0.299 0.001-0.448 0.003l0.023-0z"],"attrs":[{},{},{},{}],"width":964,"isMulticolor":false,"isMulticolor2":false,"grid":14,"tags":["roles"]},"attrs":[{},{},{},{}],"properties":{"order":143,"id":51,"name":"roles","prevSize":28,"code":59788},"setIdx":0,"setId":1,"iconIdx":38},{"icon":{"paths":["M855.509 941.69l7.314 34.328c0.337 1.714 0.53 3.686 0.53 5.702 0 5.892-1.648 11.398-4.508 16.084l0.077-0.136c-3.469 6.522-9.66 11.204-17.016 12.558l-0.149 0.023c-36.275 8.739-77.923 13.751-120.742 13.751-0.134 0-0.269-0-0.403-0l0.020 0c-3.435 0.087-7.48 0.136-11.536 0.136-111.713 0-214.681-37.447-297.034-100.474l1.175 0.863c-83.817-64.681-143.45-157.126-165.203-263.373l-0.49-2.867h-59.49c-0.166 0.004-0.362 0.006-0.558 0.006-7.428 0-14.139-3.064-18.941-7.997l-0.006-0.006c-4.881-4.798-7.905-11.472-7.905-18.851 0-0.196 0.002-0.391 0.006-0.585l-0 0.029v-18.237c-0.004-0.166-0.006-0.362-0.006-0.558 0-7.428 3.064-14.139 7.997-18.941l0.006-0.006c4.807-4.939 11.519-8.003 18.946-8.003 0.196 0 0.392 0.002 0.587 0.006l-0.029-0.001h47.884q-2.243-27.404-2.243-70.9c-0.029-1.956-0.045-4.265-0.045-6.578 0-24.275 1.789-48.132 5.242-71.447l-0.321 2.639h-50.615c-0.166 0.004-0.362 0.006-0.558 0.006-7.428 0-14.139-3.064-18.941-7.997l-0.006-0.006c-4.881-4.798-7.905-11.472-7.905-18.851 0-0.196 0.002-0.391 0.006-0.585l-0 0.029v-18.237c-0.004-0.166-0.006-0.362-0.006-0.558 0-7.428 3.064-14.139 7.997-18.941l0.006-0.006c4.807-4.938 11.518-8.001 18.945-8.001 0.163 0 0.325 0.001 0.487 0.004l-0.024-0h61.733c28.466-107.153 88.956-197.45 170.455-262.549l0.992-0.766c78.807-63.833 180.289-102.48 290.797-102.48 3.024 0 6.042 0.029 9.053 0.087l-0.452-0.007c37.267 0.031 73.546 4.186 108.428 12.034l-3.298-0.624c7.43 1.104 13.693 5.346 17.494 11.309l0.060 0.101c2.584 4.095 4.117 9.078 4.117 14.418 0 2.184-0.256 4.309-0.741 6.345l0.037-0.186-9.167 36.571c-1.931 6.644-5.964 12.163-11.318 15.932l-0.093 0.062c-4.144 3.232-9.425 5.183-15.163 5.183-1.919 0-3.788-0.218-5.582-0.631l0.167 0.032c-25.319-7.096-54.417-11.251-84.461-11.41l-0.092-0c-2.61-0.067-5.685-0.106-8.767-0.106-84.523 0-162.305 28.858-224.032 77.259l0.791-0.597c-63.522 50.125-110.592 118.549-133.414 197.278l-0.681 2.743h395.459c0.308-0.013 0.67-0.021 1.034-0.021 8.421 0 15.909 3.998 20.668 10.199l0.046 0.062c3.87 4.492 6.227 10.383 6.227 16.825 0 1.741-0.172 3.443-0.501 5.087l0.027-0.165-2.828 18.334c-1.095 7.053-4.844 13.073-10.174 17.116l-0.066 0.048c-4.736 3.543-10.693 5.694-17.15 5.754l-0.014 0h-409.6c-2.186 21.926-3.432 47.389-3.432 73.143s1.246 51.218 3.682 76.334l-0.25-3.191h372.541c0.308-0.013 0.67-0.021 1.034-0.021 8.421 0 15.909 3.998 20.668 10.199l0.046 0.062c3.87 4.492 6.227 10.383 6.227 16.825 0 1.741-0.172 3.443-0.501 5.087l0.027-0.165-4.584 18.237c0.031 0.413 0.049 0.895 0.049 1.38 0 6.466-3.146 12.197-7.991 15.746l-0.055 0.038c-4.513 3.345-10.136 5.433-16.235 5.655l-0.052 0.001h-356.547c20.764 82.906 67.838 152.643 131.672 201.629l0.862 0.636c62.224 46.492 140.664 74.44 225.632 74.44 3.443 0 6.875-0.046 10.296-0.137l-0.505 0.011c0.29 0.001 0.634 0.001 0.977 0.001 35.421 0 69.711-4.842 102.245-13.9l-2.675 0.636c1.85-0.447 3.975-0.704 6.159-0.704 5.341 0 10.323 1.533 14.532 4.183l-0.113-0.066c6.198 3.962 10.97 9.677 13.669 16.443l0.082 0.234z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"grid":14,"tags":["subscription"]},"attrs":[{}],"properties":{"order":142,"id":50,"name":"subscription","prevSize":28,"code":59789},"setIdx":0,"setId":1,"iconIdx":39},{"icon":{"paths":["M823.125 31.625c-17.62 0.072-31.877 14.372-31.877 32.003 0 9.085 3.786 17.286 9.865 23.111l0.011 0.011 132.375 130.875-132.375 130.875c-6.134 5.842-9.949 14.071-9.949 23.19 0 17.675 14.328 32.003 32.003 32.003 8.996 0 17.124-3.711 22.938-9.686l0.007-0.007 155.375-153.625c5.864-5.803 9.494-13.853 9.494-22.75s-3.631-16.947-9.492-22.747l-155.378-153.628c-5.815-5.942-13.917-9.625-22.879-9.625-0.043 0-0.085 0-0.128 0l0.007-0zM576 183.75c-0.135-0.002-0.293-0.003-0.453-0.003-17.675 0-32.003 14.328-32.003 32.003s14.328 32.003 32.003 32.003c0.159 0 0.318-0.001 0.477-0.003l-0.024 0h403c0.135 0.002 0.293 0.003 0.453 0.003 17.675 0 32.003-14.328 32.003-32.003s-14.328-32.003-32.003-32.003c-0.159 0-0.318 0.001-0.477 0.003l0.024-0z","M218.875 607.75c-8.624 0.212-16.371 3.805-21.997 9.497l-0.003 0.003-147.625 146c-10.536 5.383-17.624 16.16-17.624 28.591 0 2.992 0.41 5.887 1.178 8.634l-0.054-0.225c0.167 0.686 0.296 1.146 0.434 1.602l-0.059-0.227c1.502 5.803 4.423 10.792 8.375 14.75l-0-0 155.375 153.625c5.821 5.982 13.95 9.693 22.945 9.693 17.675 0 32.003-14.328 32.003-32.003 0-9.12-3.815-17.348-9.935-23.178l-0.013-0.012-101.875-100.75h327c0.135 0.002 0.293 0.003 0.453 0.003 17.675 0 32.003-14.328 32.003-32.003s-14.328-32.003-32.003-32.003c-0.159 0-0.318 0.001-0.477 0.003l0.024-0h-323.25l98.125-97c6.019-5.826 9.756-13.98 9.756-23.006 0-17.675-14.328-32.003-32.003-32.003-0.265 0-0.529 0.003-0.792 0.010l0.039-0.001z","M128 0c-70.358 0-128 57.642-128 128v192c0 70.358 57.642 128 128 128h192c70.358 0 128-57.642 128-128v-192c0-70.358-57.642-128-128-128zM128 64h192c36.010 0 64 27.99 64 64v192c0 36.010-27.99 64-64 64h-192c-36.010 0-64-27.99-64-64v-192c0-36.010 27.99-64 64-64z","M704 576c-70.358 0-128 57.642-128 128v192c0 70.358 57.642 128 128 128h192c70.358 0 128-57.642 128-128v-192c0-70.358-57.642-128-128-128zM704 640h192c36.010 0 64 27.99 64 64v192c0 36.010-27.99 64-64 64h-192c-36.010 0-64-27.99-64-64v-192c0-36.010 27.99-64 64-64z"],"attrs":[{},{},{},{}],"isMulticolor":false,"isMulticolor2":false,"grid":14,"tags":["workflows"]},"attrs":[{},{},{},{}],"properties":{"order":141,"id":49,"name":"workflows","prevSize":28,"code":59790},"setIdx":0,"setId":1,"iconIdx":40},{"icon":{"paths":["M251.429 100.571c-87.881 0-160 72.119-160 160v525.714c0 87.881 72.119 160 160 160h525.714c87.881 0 160-72.119 160-160v-525.714c0-87.881-72.119-160-160-160zM251.429 146.286h525.714c62.976 0 114.286 51.31 114.286 114.286v525.714c0 62.976-51.31 114.286-114.286 114.286h-525.714c-62.976 0-114.286-51.31-114.286-114.286v-525.714c0-62.976 51.31-114.286 114.286-114.286z","M397.714 246.857c-87.881 0-160 72.119-160 160v233.143c0 87.881 72.119 160 160 160h233.143c87.881 0 160-72.119 160-160v-233.143c0-87.881-72.119-160-160-160zM397.714 292.571h233.143c62.976 0 114.286 51.31 114.286 114.286v233.143c0 62.976-51.31 114.286-114.286 114.286h-233.143c-62.976 0-114.286-51.31-114.286-114.286v-233.143c0-62.976 51.31-114.286 114.286-114.286z","M361.143 424.368h-0.329c-12.617 0-22.857 10.24-22.857 22.857s10.24 22.857 22.857 22.857h306.944c12.617 0 22.857-10.24 22.857-22.857s-35.474-22.857-22.857-22.857h-0.329z","M402.286 561.511h-0.329c-12.617 0-22.857 10.24-22.857 22.857s10.24 22.857 22.857 22.857h224.658c12.617 0 22.857-10.24 22.857-22.857s-10.24-22.857-22.857-22.857h-0.329z"],"attrs":[{},{},{},{}],"isMulticolor":false,"isMulticolor2":false,"grid":14,"tags":["component"]},"attrs":[{},{},{},{}],"properties":{"order":139,"id":48,"name":"component","prevSize":28,"code":59782},"setIdx":0,"setId":1,"iconIdx":41},{"icon":{"paths":["M456.158 36.282c-12.145-0.032-24.18 1.32-35.941 3.974-23.536 5.313-45.906 15.872-65.238 31.342-77.826 61.631-80.817 179.217-6.302 244.772 0.028 0.028 0.084 0.086 0.113 0.114 0.020 0.018 0.038 0.039 0.058 0.057 0.037 0.039 0.074 0.076 0.112 0.112l0.001 0.001c4.727 4.044 7.287 9.964 7.097 16.182-0.003 0.018 0.003 0.038 0 0.057-0.008 0.085-0.012 0.184-0.012 0.284s0.004 0.199 0.013 0.296l-0.001-0.013c0 10.503-8.234 18.737-18.737 18.737h-290.707c-5.436-0.020-10.354 4.898-10.334 10.334v192.479c0.079 40.118 25.509 70.246 57.289 81.875 31.779 11.628 70.726 5.088 96.694-25.494 48.914-57.384 140.83-35.582 158.809 37.644 6.312 27.401 0.010 56.217-17.261 78.411-35.813 45.415-103.666 46.801-141.265 2.839-0.153-0.167-0.32-0.317-0.501-0.448l-0.010-0.007c-0.073-0.080-0.147-0.154-0.224-0.224l-0.003-0.002c-25.873-30.135-64.41-36.684-96.012-25.21-31.887 11.577-57.465 41.733-57.517 81.988v191.003c-0.020 5.436 4.898 10.354 10.334 10.334h745.955c5.436 0.020 10.354-4.898 10.334-10.334l-0.852-616.898c0.020-5.436-4.898-10.354-10.334-10.334h-222.401c-10.503 0-18.737-8.234-18.737-18.737-0.019-5.72 2.466-11.020 6.87-14.592 0.080-0.073 0.154-0.147 0.224-0.224l0.002-0.003 0.227-0.227c97.336-84.032 59.622-244.251-65.125-275.83-0.169-0.034-0.365-0.054-0.566-0.057l-0.002-0c-0.018-0.004-0.038 0.004-0.058 0h-0.113c-11.884-2.753-23.91-4.17-35.884-4.202zM454.682 105.041c6.891 0.035 13.821 0.856 20.667 2.441 73.201 17.648 95.396 109.369 38.439 158.582-30.669 26.067-37.154 65.105-25.38 96.921 11.773 31.813 42.084 57.204 82.329 57.006h164.090v499.65h-629.673l-0.795-133.884c0.026-10.44 8.193-18.619 18.623-18.68 5.89 0.174 11.341 2.823 15.103 7.324 0.055 0.060 0.111 0.116 0.169 0.17l0.002 0.002c0.028 0.028 0.086 0.087 0.114 0.113 65.15 75.665 183.646 73.404 245.737-4.769l0.058-0.058c0.076-0.085 0.151-0.178 0.22-0.275l0.007-0.010c30.825-38.562 42.246-89.164 31.058-137.234-0.010-0.168-0.030-0.324-0.062-0.475l0.004 0.021c-30.581-126.005-192.369-164.654-276.681-66.145-0.019 0.019-0.037 0.038-0.055 0.057l-0.001 0.001c-0.175 0.215-0.297 0.397-0.454 0.624-5.948 8.251-13.969 9.414-21.519 6.699-7.485-2.692-12.925-8.644-12.378-18.623v-0.172c0.003-0.041-0.003-0.073 0-0.113 0.017-0.131 0.045-0.267 0.057-0.397 0.002-0.043 0.003-0.092 0.003-0.142s-0.001-0.1-0.003-0.149l0 0.007v-133.259h233.53c40.255-0.052 70.451-25.629 82.045-57.517 11.514-31.669 4.916-70.308-25.38-96.183 0-0.008 0-0.018 0-0.028s-0-0.020-0-0.030l0 0.002c-0.064-0.053-0.108-0.117-0.172-0.17-0.106-0.123-0.218-0.234-0.337-0.337l-0.004-0.003c-43.965-37.601-42.63-105.454 2.782-141.265 11.117-8.651 23.938-14.535 37.36-17.488 6.716-1.478 13.596-2.249 20.497-2.214z"],"attrs":[{}],"width":839,"isMulticolor":false,"isMulticolor2":false,"grid":14,"tags":["noun_extension_1559208"]},"attrs":[{}],"properties":{"order":138,"id":46,"name":"plugin","prevSize":28,"code":59781},"setIdx":0,"setId":1,"iconIdx":42},{"icon":{"paths":["M340 548.571c0 4.571-2.286 9.714-5.714 13.143l-266.286 266.286c-3.429 3.429-8.571 5.714-13.143 5.714s-9.714-2.286-13.143-5.714l-28.571-28.571c-3.429-3.429-5.714-8.571-5.714-13.143s2.286-9.714 5.714-13.143l224.571-224.571-224.571-224.571c-3.429-3.429-5.714-8.571-5.714-13.143s2.286-9.714 5.714-13.143l28.571-28.571c3.429-3.429 8.571-5.714 13.143-5.714s9.714 2.286 13.143 5.714l266.286 266.286c3.429 3.429 5.714 8.571 5.714 13.143zM559.429 548.571c0 4.571-2.286 9.714-5.714 13.143l-266.286 266.286c-3.429 3.429-8.571 5.714-13.143 5.714s-9.714-2.286-13.143-5.714l-28.571-28.571c-3.429-3.429-5.714-8.571-5.714-13.143s2.286-9.714 5.714-13.143l224.571-224.571-224.571-224.571c-3.429-3.429-5.714-8.571-5.714-13.143s2.286-9.714 5.714-13.143l28.571-28.571c3.429-3.429 8.571-5.714 13.143-5.714s9.714 2.286 13.143 5.714l266.286 266.286c3.429 3.429 5.714 8.571 5.714 13.143z"],"attrs":[{}],"width":567,"isMulticolor":false,"isMulticolor2":false,"tags":["angle-double-right"],"grid":14},"attrs":[{}],"properties":{"order":1,"id":1,"prevSize":28,"code":59773,"name":"angle-double-right"},"setIdx":0,"setId":1,"iconIdx":43},{"icon":{"paths":["M358.286 786.286c0 4.571-2.286 9.714-5.714 13.143l-28.571 28.571c-3.429 3.429-8.571 5.714-13.143 5.714s-9.714-2.286-13.143-5.714l-266.286-266.286c-3.429-3.429-5.714-8.571-5.714-13.143s2.286-9.714 5.714-13.143l266.286-266.286c3.429-3.429 8.571-5.714 13.143-5.714s9.714 2.286 13.143 5.714l28.571 28.571c3.429 3.429 5.714 8.571 5.714 13.143s-2.286 9.714-5.714 13.143l-224.571 224.571 224.571 224.571c3.429 3.429 5.714 8.571 5.714 13.143zM577.714 786.286c0 4.571-2.286 9.714-5.714 13.143l-28.571 28.571c-3.429 3.429-8.571 5.714-13.143 5.714s-9.714-2.286-13.143-5.714l-266.286-266.286c-3.429-3.429-5.714-8.571-5.714-13.143s2.286-9.714 5.714-13.143l266.286-266.286c3.429-3.429 8.571-5.714 13.143-5.714s9.714 2.286 13.143 5.714l28.571 28.571c3.429 3.429 5.714 8.571 5.714 13.143s-2.286 9.714-5.714 13.143l-224.571 224.571 224.571 224.571c3.429 3.429 5.714 8.571 5.714 13.143z"],"attrs":[{}],"width":603,"isMulticolor":false,"isMulticolor2":false,"tags":["angle-double-left"],"grid":14},"attrs":[{}],"properties":{"order":2,"id":0,"prevSize":28,"code":59774,"name":"angle-double-left"},"setIdx":0,"setId":1,"iconIdx":44},{"icon":{"paths":["M938.667 85.333h-853.333c-23.552 0-42.667 19.115-42.667 42.667 0 10.539 3.797 20.181 10.069 27.563l331.264 391.68v263.424c0 16.597 9.472 31.019 23.595 38.144l170.667 85.333c21.077 10.539 46.72 2.005 57.259-19.072 3.072-6.229 4.523-12.843 4.48-19.072v-348.757l331.264-391.68c15.232-18.005 12.971-44.928-5.035-60.117-8.064-6.827-17.877-10.155-27.563-10.112z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["filter"],"grid":14},"attrs":[{}],"properties":{"order":1,"id":0,"prevSize":28,"code":59768,"name":"filter-filled"},"setIdx":0,"setId":1,"iconIdx":45},{"icon":{"paths":["M950.857 932.571v-621.714c0-9.714-8.571-18.286-18.286-18.286h-621.714c-9.714 0-18.286 8.571-18.286 18.286v621.714c0 9.714 8.571 18.286 18.286 18.286h621.714c9.714 0 18.286-8.571 18.286-18.286zM1024 310.857v621.714c0 50.286-41.143 91.429-91.429 91.429h-621.714c-50.286 0-91.429-41.143-91.429-91.429v-621.714c0-50.286 41.143-91.429 91.429-91.429h621.714c50.286 0 91.429 41.143 91.429 91.429zM804.571 91.429v91.429h-73.143v-91.429c0-9.714-8.571-18.286-18.286-18.286h-621.714c-9.714 0-18.286 8.571-18.286 18.286v621.714c0 9.714 8.571 18.286 18.286 18.286h91.429v73.143h-91.429c-50.286 0-91.429-41.143-91.429-91.429v-621.714c0-50.286 41.143-91.429 91.429-91.429h621.714c50.286 0 91.429 41.143 91.429 91.429z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["clone"],"grid":14},"attrs":[{}],"properties":{"order":1,"id":0,"prevSize":28,"code":59754,"name":"clone"},"setIdx":0,"setId":1,"iconIdx":46},{"icon":{"paths":["M498.787 330.323v-49.548h112.31v-66.065c0-49.548-39.639-89.187-89.187-89.187s-89.187 39.639-89.187 89.187v541.729l89.187 161.858 89.187-161.858v-426.116z","M360.052 716.8h-66.065c-59.458 0-105.703-46.245-105.703-105.703v-254.348c0-59.458 46.245-105.703 105.703-105.703h66.065v-42.942h-66.065c-82.581 0-148.645 66.065-148.645 148.645v254.348c0 82.581 66.065 148.645 148.645 148.645h66.065z","M852.232 260.955c-26.426-33.032-66.065-52.852-109.006-52.852h-59.458v42.942h39.639c42.942 0 82.581 19.819 109.006 52.852l145.342 181.677-142.039 178.374c-26.426 33.032-69.368 52.852-112.31 52.852h-36.335v42.942h56.155c42.942 0 85.884-19.819 112.31-52.852l178.374-221.316z"],"width":1140,"attrs":[{},{},{}],"isMulticolor":false,"isMulticolor2":false,"tags":["control-Tags"],"grid":14},"attrs":[{},{},{}],"properties":{"order":119,"id":1,"name":"control-Tags","prevSize":28,"code":59747},"setIdx":0,"setId":1,"iconIdx":47},{"icon":{"paths":["M384 179.2h614.4c14.157 0 25.6-11.443 25.6-25.6s-11.443-25.6-25.6-25.6h-614.4c-14.131 0-25.6 11.443-25.6 25.6s11.469 25.6 25.6 25.6zM998.4 486.4h-614.4c-14.131 0-25.6 11.443-25.6 25.6s11.469 25.6 25.6 25.6h614.4c14.157 0 25.6-11.443 25.6-25.6s-11.443-25.6-25.6-25.6zM998.4 844.8h-614.4c-38.406 15.539-22.811 37.543 0 51.2h614.4c14.157 0 25.6-11.443 25.6-25.6s-11.443-25.6-25.6-25.6z","M0 0v307.2h307.2v-307.2zM47.4 47.4h212.4v212.4h-212.4z","M0 716.8v307.2h307.2v-307.2zM47.4 764.2h212.4v212.4h-212.4z","M0 358.4v307.2h307.2v-307.2zM47.4 405.8h212.4v212.4h-212.4z","M89.6 89.6h128v128h-128v-128z"],"attrs":[{},{},{},{},{}],"isMulticolor":false,"isMulticolor2":false,"tags":["control-Checkboxes"],"grid":14},"attrs":[{},{},{},{},{}],"properties":{"order":118,"id":2,"name":"control-Checkboxes, control-List","prevSize":28,"code":59746},"setIdx":0,"setId":1,"iconIdx":48},{"icon":{"paths":["M159.073 665.6l-159.073-134.055 159.073-133.819 36.818 37.29-117.062 96.057 117.062 97.237z","M493.247 536.029q0 33.042-9.441 57.115-9.205 24.073-25.961 40.122-16.521 15.813-39.178 23.601-22.657 7.552-49.327 7.552-26.197 0-48.855-4.012-22.421-3.776-42.954-10.385v-323.338h57.587v78.356l-2.36 47.203q12.981-16.757 30.21-26.905 17.465-10.149 41.774-10.149 21.241 0 37.762 8.496t27.614 24.309q11.329 15.577 17.229 37.998 5.9 22.185 5.9 50.035zM432.828 538.389q0-19.825-2.832-33.75t-8.26-22.893q-5.192-8.969-12.981-12.981-7.552-4.248-17.465-4.248-14.633 0-28.086 11.801-13.217 11.801-28.086 32.098v104.79q6.844 2.596 16.757 4.248 10.149 1.652 20.533 1.652 13.689 0 24.781-5.664 11.329-5.664 19.117-16.049 8.024-10.385 12.273-25.253 4.248-15.105 4.248-33.75z","M700.682 513.608q0.472-13.453-1.416-22.893-1.652-9.441-5.664-15.577-3.776-6.136-9.441-8.968t-12.981-2.832q-12.745 0-26.433 10.621-13.453 10.385-29.738 34.458v151.756h-59.003v-239.789h52.159l2.124 34.93q5.9-9.205 13.217-16.521 7.552-7.316 16.521-12.509 9.205-5.428 20.297-8.26t24.309-2.832q18.173 0 32.098 6.372 14.161 6.136 23.601 18.409 9.677 12.273 14.161 30.918 4.72 18.409 4.012 42.718z","M864.927 397.725l159.073 133.819-159.073 134.055-36.582-37.29 116.826-96.293-116.826-97.001z"],"attrs":[{},{},{},{}],"isMulticolor":false,"isMulticolor2":false,"tags":["control-Html"],"grid":14},"attrs":[{},{},{},{}],"properties":{"order":116,"id":3,"name":"control-Html","prevSize":28,"code":59744},"setIdx":0,"setId":1,"iconIdx":49},{"icon":{"paths":["M251.429 100.58c-87.896 0-160 72.104-160 160v525.714c0 87.896 72.104 160 160 160h525.714c87.896 0 160-72.104 160-160v-525.714c0-87.896-72.104-160-160-160zM251.429 146.295h525.714c62.961 0 114.286 51.325 114.286 114.286v525.714c0 62.961-51.325 114.286-114.286 114.286h-525.714c-62.961 0-114.286-51.325-114.286-114.286v-525.714c0-62.961 51.325-114.286 114.286-114.286z","M251.429 306.295c-0.096-0.001-0.21-0.002-0.323-0.002-12.625 0-22.859 10.235-22.859 22.859s10.235 22.859 22.859 22.859c0.114 0 0.227-0.001 0.34-0.002l-0.017 0h525.714c0.096 0.001 0.21 0.002 0.323 0.002 12.625 0 22.859-10.235 22.859-22.859s-10.235-22.859-22.859-22.859c-0.114 0-0.227 0.001-0.34 0.002l0.017-0z","M251.429 443.438c-0.096-0.001-0.21-0.002-0.323-0.002-12.625 0-22.859 10.235-22.859 22.859s10.235 22.859 22.859 22.859c0.114 0 0.227-0.001 0.34-0.002l-0.017 0h297.143c0.096 0.001 0.21 0.002 0.323 0.002 12.625 0 22.859-10.235 22.859-22.859s-10.235-22.859-22.859-22.859c-0.114 0-0.227 0.001-0.34 0.002l0.017-0z","M251.429 580.58c-0.096-0.001-0.21-0.002-0.323-0.002-12.625 0-22.859 10.235-22.859 22.859s10.235 22.859 22.859 22.859c0.114 0 0.227-0.001 0.34-0.002l-0.017 0h297.143c0.096 0.001 0.21 0.002 0.323 0.002 12.625 0 22.859-10.235 22.859-22.859s-10.235-22.859-22.859-22.859c-0.114 0-0.227 0.001-0.34 0.002l0.017-0z"],"width":1029,"attrs":[{},{},{},{}],"isMulticolor":false,"isMulticolor2":false,"tags":["single-content"],"grid":14},"attrs":[{},{},{},{}],"properties":{"order":112,"id":4,"name":"single-content, search-Content, type-Component","prevSize":28,"code":59736},"setIdx":0,"setId":1,"iconIdx":50},{"icon":{"paths":["M777.143 946.286h-525.714c-89.143 0-160-70.857-160-160v-297.143c0-89.143 70.857-160 160-160h525.714c89.143 0 160 70.857 160 160v297.143c0 89.143-70.857 160-160 160zM251.429 374.857c-64 0-114.286 50.286-114.286 114.286v297.143c0 64 50.286 114.286 114.286 114.286h525.714c64 0 114.286-50.286 114.286-114.286v-297.143c0-64-50.286-114.286-114.286-114.286h-525.714z","M731.429 580.571h-457.143c-13.714 0-22.857-9.143-22.857-22.857s9.143-22.857 22.857-22.857h457.143c13.714 0 22.857 9.143 22.857 22.857s-9.143 22.857-22.857 22.857z","M502.857 740.571h-228.571c-13.714 0-22.857-9.143-22.857-22.857s9.143-22.857 22.857-22.857h228.571c13.714 0 22.857 9.143 22.857 22.857s-9.143 22.857-22.857 22.857z","M777.143 260.571h-525.714c-13.714 0-22.857-9.143-22.857-22.857s9.143-22.857 22.857-22.857h525.714c13.714 0 22.857 9.143 22.857 22.857s-9.143 22.857-22.857 22.857z","M685.714 146.286h-342.857c-13.714 0-22.857-9.143-22.857-22.857s9.143-22.857 22.857-22.857h342.857c13.714 0 22.857 9.143 22.857 22.857s-9.143 22.857-22.857 22.857z"],"width":1029,"attrs":[{},{},{},{},{}],"isMulticolor":false,"isMulticolor2":false,"tags":["multiple-content"],"grid":14},"attrs":[{},{},{},{},{}],"properties":{"order":113,"id":5,"name":"multiple-content, type-Components","prevSize":28,"code":59735},"setIdx":0,"setId":1,"iconIdx":51},{"icon":{"paths":["M832 268.8h-657.92c-15.36 0-25.6-10.24-25.6-25.6s10.24-25.6 25.6-25.6h657.92c15.36 0 25.6 10.24 25.6 25.6s-10.24 25.6-25.6 25.6z","M832 453.12h-409.6c-15.36 0-25.6-10.24-25.6-25.6s10.24-25.6 25.6-25.6h409.6c15.36 0 25.6 10.24 25.6 25.6s-10.24 25.6-25.6 25.6z","M832 642.56h-409.6c-15.36 0-25.6-10.24-25.6-25.6s10.24-25.6 25.6-25.6h409.6c15.36 0 25.6 10.24 25.6 25.6s-10.24 25.6-25.6 25.6z","M832 832h-409.6c-15.36 0-25.6-10.24-25.6-25.6s10.24-25.6 25.6-25.6h409.6c15.36 0 25.6 10.24 25.6 25.6s-10.24 25.6-25.6 25.6z"],"attrs":[{},{},{},{}],"isMulticolor":false,"isMulticolor2":false,"tags":["type-Array"],"grid":14},"attrs":[{},{},{},{}],"properties":{"order":108,"id":6,"name":"type-Array","prevSize":28,"code":59734},"setIdx":0,"setId":1,"iconIdx":52},{"icon":{"paths":["M292.571 713.143v128c0 20-16.571 36.571-36.571 36.571h-146.286c-20 0-36.571-16.571-36.571-36.571v-128c0-20 16.571-36.571 36.571-36.571h146.286c20 0 36.571 16.571 36.571 36.571zM309.714 109.714l-16 438.857c-0.571 20-17.714 36.571-37.714 36.571h-146.286c-20 0-37.143-16.571-37.714-36.571l-16-438.857c-0.571-20 15.429-36.571 35.429-36.571h182.857c20 0 36 16.571 35.429 36.571z"],"width":366,"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["exclamation"],"grid":14},"attrs":[{}],"properties":{"order":1,"id":7,"prevSize":28,"code":59733,"name":"exclamation"},"setIdx":0,"setId":1,"iconIdx":53},{"icon":{"paths":["M512 26.38l-424.96 242.8v485.64l424.96 242.8 424.96-242.8v-485.64l-424.96-242.8zM512 235.52l245.76 138.24v276.48l-245.76 138.24-245.76-138.24v-276.48l245.76-138.24z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["orleans"],"grid":14},"attrs":[{}],"properties":{"order":99,"id":8,"name":"orleans","prevSize":28,"code":59723},"setIdx":0,"setId":1,"iconIdx":54},{"icon":{"paths":["M358.4 102.4c-28.314 0-51.2 22.886-51.2 51.2v204.8h51.2v-204.8h307.2v153.6c0 28.314 22.886 51.2 51.2 51.2h153.6v512h-307.2v51.2h307.2c28.314 0 51.2-22.886 51.2-51.2v-548.2l-219.8-219.8h-292.2zM716.8 189.8l117.4 117.4h-117.4z","M153.6 640v281.6h358.4v-281.6zM179.2 640v-76.8c0-84.48 69.12-153.6 153.6-153.6s153.6 69.12 153.6 153.6v76.8h-51.2v-76.8c0-56.32-46.080-102.4-102.4-102.4s-102.4 46.080-102.4 102.4v76.8z"],"attrs":[{},{}],"isMulticolor":false,"isMulticolor2":false,"tags":["document-lock"],"grid":14},"attrs":[{},{}],"properties":{"order":97,"id":9,"name":"document-lock","prevSize":28,"code":59721},"setIdx":0,"setId":1,"iconIdx":55},{"icon":{"paths":["M358.4 102.4c-28.314 0-51.2 22.886-51.2 51.2v153.6h51.2v-153.6h307.2v153.6c0 28.314 22.886 51.2 51.2 51.2h153.6v512h-358.4v51.2h358.4c28.314 0 51.2-22.886 51.2-51.2v-548.2l-219.8-219.8h-292.2zM716.8 189.8l117.4 117.4h-117.4zM332.8 460.8l-230.4 256v51.2h102.4v153.6h256v-153.6h102.4v-51.2zM332.8 537.3l161.5 179.5h-84.7v153.6h-153.6v-153.6h-84.7z","M102.4 357.532h460.8v52.068h-460.8v-52.068z"],"attrs":[{},{}],"isMulticolor":false,"isMulticolor2":false,"tags":["document-unpublish"],"grid":14},"attrs":[{},{}],"properties":{"order":96,"id":10,"name":"document-unpublish","prevSize":28,"code":59711},"setIdx":0,"setId":1,"iconIdx":56},{"icon":{"paths":["M614.286 420.571c0 4.571-2.286 9.714-5.714 13.143l-266.286 266.286c-3.429 3.429-8.571 5.714-13.143 5.714s-9.714-2.286-13.143-5.714l-266.286-266.286c-3.429-3.429-5.714-8.571-5.714-13.143s2.286-9.714 5.714-13.143l28.571-28.571c3.429-3.429 8-5.714 13.143-5.714 4.571 0 9.714 2.286 13.143 5.714l224.571 224.571 224.571-224.571c3.429-3.429 8.571-5.714 13.143-5.714s9.714 2.286 13.143 5.714l28.571 28.571c3.429 3.429 5.714 8.571 5.714 13.143z"],"width":658,"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["angle-down"],"grid":14},"attrs":[{}],"properties":{"order":1,"id":11,"prevSize":28,"code":59648,"name":"angle-down"},"setIdx":0,"setId":1,"iconIdx":57},{"icon":{"paths":["M358.286 310.857c0 4.571-2.286 9.714-5.714 13.143l-224.571 224.571 224.571 224.571c3.429 3.429 5.714 8.571 5.714 13.143s-2.286 9.714-5.714 13.143l-28.571 28.571c-3.429 3.429-8.571 5.714-13.143 5.714s-9.714-2.286-13.143-5.714l-266.286-266.286c-3.429-3.429-5.714-8.571-5.714-13.143s2.286-9.714 5.714-13.143l266.286-266.286c3.429-3.429 8.571-5.714 13.143-5.714s9.714 2.286 13.143 5.714l28.571 28.571c3.429 3.429 5.714 8 5.714 13.143z"],"width":384,"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["angle-left"],"grid":14},"attrs":[{}],"properties":{"order":2,"id":12,"prevSize":28,"code":59649,"name":"angle-left"},"setIdx":0,"setId":1,"iconIdx":58},{"icon":{"paths":["M340 548.571c0 4.571-2.286 9.714-5.714 13.143l-266.286 266.286c-3.429 3.429-8.571 5.714-13.143 5.714s-9.714-2.286-13.143-5.714l-28.571-28.571c-3.429-3.429-5.714-8-5.714-13.143 0-4.571 2.286-9.714 5.714-13.143l224.571-224.571-224.571-224.571c-3.429-3.429-5.714-8.571-5.714-13.143s2.286-9.714 5.714-13.143l28.571-28.571c3.429-3.429 8.571-5.714 13.143-5.714s9.714 2.286 13.143 5.714l266.286 266.286c3.429 3.429 5.714 8.571 5.714 13.143z"],"width":347,"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["angle-right"],"grid":14},"attrs":[{}],"properties":{"order":67,"id":13,"prevSize":28,"code":59697,"name":"angle-right"},"setIdx":0,"setId":1,"iconIdx":59},{"icon":{"paths":["M614.286 676.571c0 4.571-2.286 9.714-5.714 13.143l-28.571 28.571c-3.429 3.429-8 5.714-13.143 5.714-4.571 0-9.714-2.286-13.143-5.714l-224.571-224.571-224.571 224.571c-3.429 3.429-8.571 5.714-13.143 5.714s-9.714-2.286-13.143-5.714l-28.571-28.571c-3.429-3.429-5.714-8.571-5.714-13.143s2.286-9.714 5.714-13.143l266.286-266.286c3.429-3.429 8.571-5.714 13.143-5.714s9.714 2.286 13.143 5.714l266.286 266.286c3.429 3.429 5.714 8.571 5.714 13.143z"],"width":658,"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["angle-up"],"grid":14},"attrs":[{}],"properties":{"order":2,"id":14,"prevSize":28,"code":59651,"name":"angle-up"},"setIdx":0,"setId":1,"iconIdx":60},{"icon":{"paths":["M592 393.6h-156.8c-57.6 0-105.6-48-105.6-105.6v-182.4c0-57.6 48-105.6 105.6-105.6h156.8c57.6 0 105.6 48 105.6 105.6v182.4c-3.2 57.6-48 105.6-105.6 105.6zM432 64c-22.4 0-41.6 19.2-41.6 41.6v182.4c0 22.4 19.2 41.6 41.6 41.6h156.8c22.4 0 41.6-19.2 41.6-41.6v-182.4c0-22.4-19.2-41.6-41.6-41.6h-156.8z","M195.2 1024c-105.6 0-195.2-89.6-195.2-195.2 0-108.8 89.6-195.2 195.2-195.2s195.2 89.6 195.2 195.2c3.2 105.6-86.4 195.2-195.2 195.2zM195.2 694.4c-73.6 0-131.2 60.8-131.2 131.2 0 73.6 60.8 134.4 131.2 134.4 73.6 0 131.2-60.8 131.2-131.2 3.2-73.6-57.6-134.4-131.2-134.4z","M828.8 1024c-108.8 0-195.2-89.6-195.2-195.2 0-108.8 89.6-195.2 195.2-195.2s195.2 89.6 195.2 195.2c0 105.6-89.6 195.2-195.2 195.2zM828.8 694.4c-73.6 0-131.2 60.8-131.2 131.2 0 73.6 60.8 131.2 131.2 131.2 73.6 0 131.2-60.8 131.2-131.2s-60.8-131.2-131.2-131.2z","M332.8 640c-6.4 0-12.8 0-16-3.2-16-9.6-19.2-28.8-9.6-44.8l83.2-137.6c9.6-16 28.8-19.2 44.8-9.6s19.2 28.8 9.6 44.8l-83.2 137.6c-6.4 6.4-16 12.8-28.8 12.8z","M691.2 640c-9.6 0-22.4-6.4-28.8-16l-83.2-137.6c-9.6-16-3.2-35.2 9.6-44.8s35.2-3.2 44.8 9.6l83.2 137.6c9.6 16 3.2 35.2-9.6 44.8-6.4 6.4-12.8 6.4-16 6.4z"],"attrs":[{},{},{},{},{}],"isMulticolor":false,"isMulticolor2":false,"tags":["api"],"grid":14},"attrs":[{},{},{},{},{}],"properties":{"order":94,"id":15,"name":"api","prevSize":28,"code":59717},"setIdx":0,"setId":1,"iconIdx":61},{"icon":{"paths":["M800 1024h-576c-124.8 0-224-99.2-224-224v-576c0-124.8 99.2-224 224-224h576c124.8 0 224 99.2 224 224v576c0 124.8-99.2 224-224 224zM224 64c-89.6 0-160 70.4-160 160v576c0 89.6 70.4 160 160 160h576c89.6 0 160-70.4 160-160v-576c0-89.6-70.4-160-160-160h-576z","M771.2 860.8h-438.4c-12.8 0-22.4-6.4-28.8-19.2s-3.2-25.6 3.2-35.2l300.8-355.2c6.4-6.4 16-12.8 25.6-12.8s19.2 6.4 25.6 12.8l192 275.2c3.2 3.2 3.2 6.4 3.2 9.6 16 44.8 3.2 73.6-6.4 89.6-22.4 32-70.4 35.2-76.8 35.2zM403.2 796.8h371.2c6.4 0 22.4-3.2 25.6-9.6 3.2-3.2 3.2-12.8 0-25.6l-166.4-236.8-230.4 272z","M332.8 502.4c-76.8 0-140.8-64-140.8-140.8s64-140.8 140.8-140.8 140.8 64 140.8 140.8-60.8 140.8-140.8 140.8zM332.8 284.8c-41.6 0-76.8 32-76.8 76.8s35.2 76.8 76.8 76.8 76.8-35.2 76.8-76.8-32-76.8-76.8-76.8z"],"attrs":[{},{},{}],"isMulticolor":false,"isMulticolor2":false,"tags":["assets"],"grid":14},"attrs":[{},{},{}],"properties":{"order":95,"id":16,"name":"assets, search-Asset","prevSize":28,"code":59720},"setIdx":0,"setId":1,"iconIdx":62},{"icon":{"paths":["M932.571 548.571c0 20-16.571 36.571-36.571 36.571h-128c0 71.429-15.429 125.143-38.286 165.714l118.857 119.429c14.286 14.286 14.286 37.143 0 51.429-6.857 7.429-16.571 10.857-25.714 10.857s-18.857-3.429-25.714-10.857l-113.143-112.571s-74.857 68.571-172 68.571v-512h-73.143v512c-103.429 0-178.857-75.429-178.857-75.429l-104.571 118.286c-7.429 8-17.143 12-27.429 12-8.571 0-17.143-2.857-24.571-9.143-14.857-13.714-16-36.571-2.857-52l115.429-129.714c-20-39.429-33.143-90.286-33.143-156.571h-128c-20 0-36.571-16.571-36.571-36.571s16.571-36.571 36.571-36.571h128v-168l-98.857-98.857c-14.286-14.286-14.286-37.143 0-51.429s37.143-14.286 51.429 0l98.857 98.857h482.286l98.857-98.857c14.286-14.286 37.143-14.286 51.429 0s14.286 37.143 0 51.429l-98.857 98.857v168h128c20 0 36.571 16.571 36.571 36.571zM658.286 219.429h-365.714c0-101.143 81.714-182.857 182.857-182.857s182.857 81.714 182.857 182.857z"],"width":951,"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["bug"],"grid":14},"attrs":[{}],"properties":{"order":1,"id":17,"prevSize":28,"code":59709,"name":"bug"},"setIdx":0,"setId":1,"iconIdx":63},{"icon":{"paths":["M585.143 402.286c0 9.714-4 18.857-10.857 25.714l-256 256c-6.857 6.857-16 10.857-25.714 10.857s-18.857-4-25.714-10.857l-256-256c-6.857-6.857-10.857-16-10.857-25.714 0-20 16.571-36.571 36.571-36.571h512c20 0 36.571 16.571 36.571 36.571z"],"width":585,"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["caret-down"],"grid":14},"attrs":[{}],"properties":{"order":4,"id":18,"prevSize":28,"code":59692,"name":"caret-down"},"setIdx":0,"setId":1,"iconIdx":64},{"icon":{"paths":["M365.714 256v512c0 20-16.571 36.571-36.571 36.571-9.714 0-18.857-4-25.714-10.857l-256-256c-6.857-6.857-10.857-16-10.857-25.714s4-18.857 10.857-25.714l256-256c6.857-6.857 16-10.857 25.714-10.857 20 0 36.571 16.571 36.571 36.571z"],"width":402,"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["caret-left"],"grid":14},"attrs":[{}],"properties":{"order":2,"id":19,"prevSize":28,"code":59690,"name":"caret-left"},"setIdx":0,"setId":1,"iconIdx":65},{"icon":{"paths":["M329.143 512c0 9.714-4 18.857-10.857 25.714l-256 256c-6.857 6.857-16 10.857-25.714 10.857-20 0-36.571-16.571-36.571-36.571v-512c0-20 16.571-36.571 36.571-36.571 9.714 0 18.857 4 25.714 10.857l256 256c6.857 6.857 10.857 16 10.857 25.714z"],"width":329,"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["caret-right"],"grid":14},"attrs":[{}],"properties":{"order":1,"id":20,"prevSize":28,"code":59689,"name":"caret-right"},"setIdx":0,"setId":1,"iconIdx":66},{"icon":{"paths":["M585.143 694.857c0 20-16.571 36.571-36.571 36.571h-512c-20 0-36.571-16.571-36.571-36.571 0-9.714 4-18.857 10.857-25.714l256-256c6.857-6.857 16-10.857 25.714-10.857s18.857 4 25.714 10.857l256 256c6.857 6.857 10.857 16 10.857 25.714z"],"width":585,"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["caret-up"],"grid":14},"attrs":[{}],"properties":{"order":3,"id":21,"prevSize":28,"code":59691,"name":"caret-up"},"setIdx":0,"setId":1,"iconIdx":67},{"icon":{"paths":["M800 1024h-576c-124.8 0-224-99.2-224-224v-576c0-124.8 99.2-224 224-224h576c124.8 0 224 99.2 224 224v576c0 124.8-99.2 224-224 224zM224 64c-89.6 0-160 70.4-160 160v576c0 89.6 70.4 160 160 160h576c89.6 0 160-70.4 160-160v-576c0-89.6-70.4-160-160-160h-576z","M480 448h-211.2c-57.6 0-105.6-48-105.6-105.6v-73.6c0-57.6 48-105.6 105.6-105.6h211.2c57.6 0 105.6 48 105.6 105.6v73.6c0 57.6-48 105.6-105.6 105.6zM268.8 227.2c-22.4 0-41.6 19.2-41.6 41.6v73.6c0 22.4 19.2 41.6 41.6 41.6h211.2c22.4 0 41.6-19.2 41.6-41.6v-73.6c0-22.4-19.2-41.6-41.6-41.6h-211.2z","M828.8 611.2h-633.6c-19.2 0-32-12.8-32-32s12.8-32 32-32h630.4c19.2 0 32 12.8 32 32s-12.8 32-28.8 32z","M553.6 777.6h-358.4c-19.2 0-32-12.8-32-32s12.8-32 32-32h355.2c19.2 0 32 12.8 32 32s-12.8 32-28.8 32z"],"attrs":[{},{},{},{}],"isMulticolor":false,"isMulticolor2":false,"tags":["content"],"grid":14},"attrs":[{},{},{},{}],"properties":{"order":93,"id":22,"name":"contents, trigger-ContentChanged","prevSize":28,"code":59718},"setIdx":0,"setId":1,"iconIdx":68},{"icon":{"paths":["M947.2 102.4h-128v-25.6c0-14.131-11.469-25.6-25.6-25.6s-25.6 11.469-25.6 25.6v25.6h-512v-25.6c0-14.131-11.52-25.6-25.6-25.6s-25.6 11.469-25.6 25.6v25.6h-128c-42.342 0-76.8 34.458-76.8 76.8v716.8c0 42.342 34.458 76.8 76.8 76.8h870.4c42.342 0 76.8-34.458 76.8-76.8v-716.8c0-42.342-34.458-76.8-76.8-76.8zM972.8 896c0 14.131-11.469 25.6-25.6 25.6h-870.4c-14.080 0-25.6-11.469-25.6-25.6v-537.6h921.6v537.6zM972.8 307.2h-921.6v-128c0-14.080 11.52-25.6 25.6-25.6h128v76.8c0 14.080 11.52 25.6 25.6 25.6s25.6-11.52 25.6-25.6v-76.8h512v76.8c0 14.080 11.469 25.6 25.6 25.6s25.6-11.52 25.6-25.6v-76.8h128c14.131 0 25.6 11.52 25.6 25.6v128zM332.8 512h51.2c14.080 0 25.6-11.52 25.6-25.6s-11.52-25.6-25.6-25.6h-51.2c-14.080 0-25.6 11.52-25.6 25.6s11.52 25.6 25.6 25.6zM486.4 512h51.2c14.131 0 25.6-11.52 25.6-25.6s-11.469-25.6-25.6-25.6h-51.2c-14.080 0-25.6 11.52-25.6 25.6s11.52 25.6 25.6 25.6zM640 512h51.2c14.131 0 25.6-11.52 25.6-25.6s-11.469-25.6-25.6-25.6h-51.2c-14.131 0-25.6 11.52-25.6 25.6s11.469 25.6 25.6 25.6zM793.6 512h51.2c14.131 0 25.6-11.52 25.6-25.6s-11.469-25.6-25.6-25.6h-51.2c-14.131 0-25.6 11.52-25.6 25.6s11.469 25.6 25.6 25.6zM179.2 614.4h51.2c14.080 0 25.6-11.469 25.6-25.6s-11.52-25.6-25.6-25.6h-51.2c-14.080 0-25.6 11.469-25.6 25.6s11.52 25.6 25.6 25.6zM332.8 614.4h51.2c14.080 0 25.6-11.469 25.6-25.6s-11.52-25.6-25.6-25.6h-51.2c-14.080 0-25.6 11.469-25.6 25.6s11.52 25.6 25.6 25.6zM486.4 614.4h51.2c14.131 0 25.6-11.469 25.6-25.6s-11.469-25.6-25.6-25.6h-51.2c-14.080 0-25.6 11.469-25.6 25.6s11.52 25.6 25.6 25.6zM640 614.4h51.2c14.131 0 25.6-11.469 25.6-25.6s-11.469-25.6-25.6-25.6h-51.2c-14.131 0-25.6 11.469-25.6 25.6s11.469 25.6 25.6 25.6zM793.6 614.4h51.2c14.131 0 25.6-11.469 25.6-25.6s-11.469-25.6-25.6-25.6h-51.2c-14.131 0-25.6 11.469-25.6 25.6s11.469 25.6 25.6 25.6zM179.2 716.8h51.2c14.080 0 25.6-11.469 25.6-25.6s-11.52-25.6-25.6-25.6h-51.2c-14.080 0-25.6 11.469-25.6 25.6s11.52 25.6 25.6 25.6zM332.8 716.8h51.2c14.080 0 25.6-11.469 25.6-25.6s-11.52-25.6-25.6-25.6h-51.2c-14.080 0-25.6 11.469-25.6 25.6s11.52 25.6 25.6 25.6zM486.4 716.8h51.2c14.131 0 25.6-11.469 25.6-25.6s-11.469-25.6-25.6-25.6h-51.2c-14.080 0-25.6 11.469-25.6 25.6s11.52 25.6 25.6 25.6zM640 716.8h51.2c14.131 0 25.6-11.469 25.6-25.6s-11.469-25.6-25.6-25.6h-51.2c-14.131 0-25.6 11.469-25.6 25.6s11.469 25.6 25.6 25.6zM793.6 716.8h51.2c14.131 0 25.6-11.469 25.6-25.6s-11.469-25.6-25.6-25.6h-51.2c-14.131 0-25.6 11.469-25.6 25.6s11.469 25.6 25.6 25.6zM179.2 819.2h51.2c14.080 0 25.6-11.469 25.6-25.6s-11.52-25.6-25.6-25.6h-51.2c-14.080 0-25.6 11.469-25.6 25.6s11.52 25.6 25.6 25.6zM332.8 819.2h51.2c14.080 0 25.6-11.469 25.6-25.6s-11.52-25.6-25.6-25.6h-51.2c-14.080 0-25.6 11.469-25.6 25.6s11.52 25.6 25.6 25.6zM486.4 819.2h51.2c14.131 0 25.6-11.469 25.6-25.6s-11.469-25.6-25.6-25.6h-51.2c-14.080 0-25.6 11.469-25.6 25.6s11.52 25.6 25.6 25.6zM640 819.2h51.2c14.131 0 25.6-11.469 25.6-25.6s-11.469-25.6-25.6-25.6h-51.2c-14.131 0-25.6 11.469-25.6 25.6s11.469 25.6 25.6 25.6zM793.6 819.2h51.2c14.131 0 25.6-11.469 25.6-25.6s-11.469-25.6-25.6-25.6h-51.2c-14.131 0-25.6 11.469-25.6 25.6s11.469 25.6 25.6 25.6z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["control-date"],"grid":14},"attrs":[{}],"properties":{"order":71,"id":23,"name":"control-Date","prevSize":28,"code":59702},"setIdx":0,"setId":1,"iconIdx":69},{"icon":{"paths":["M486.4 409.6h51.2c14.080 0 25.6 11.52 25.6 25.6s-11.52 25.6-25.6 25.6h-51.2c-14.080 0-25.6-11.52-25.6-25.6s11.52-25.6 25.6-25.6zM230.4 614.4c14.080 0 25.6 11.469 25.6 25.6s-11.52 25.6-25.6 25.6h-51.2c-14.080 0-25.6-11.469-25.6-25.6s11.52-25.6 25.6-25.6h51.2zM230.4 512c14.080 0 25.6 11.469 25.6 25.6s-11.52 25.6-25.6 25.6h-51.2c-14.080 0-25.6-11.469-25.6-25.6s11.52-25.6 25.6-25.6h51.2zM51.2 742.4v-435.2h665.6v102.4h51.2v-281.6c0-42.342-34.458-76.8-76.8-76.8h-128v-25.6c0-14.131-11.469-25.6-25.6-25.6s-25.6 11.469-25.6 25.6v25.6h-256v-25.6c0-14.131-11.52-25.6-25.6-25.6s-25.6 11.469-25.6 25.6v25.6h-128c-42.342 0-76.8 34.458-76.8 76.8v614.4c0 42.342 34.458 76.8 76.8 76.8h332.8v-51.2h-332.8c-14.080 0-25.6-11.469-25.6-25.6zM51.2 128c0-14.080 11.52-25.6 25.6-25.6h128v76.8c0 14.080 11.52 25.6 25.6 25.6s25.6-11.52 25.6-25.6v-76.8h256v76.8c0 14.080 11.469 25.6 25.6 25.6s25.6-11.52 25.6-25.6v-76.8h128c14.131 0 25.6 11.52 25.6 25.6v128h-665.6v-128zM384 409.6c14.080 0 25.6 11.52 25.6 25.6s-11.52 25.6-25.6 25.6h-51.2c-14.080 0-25.6-11.52-25.6-25.6s11.52-25.6 25.6-25.6h51.2zM742.4 460.8c-155.546 0-281.6 126.054-281.6 281.6s126.054 281.6 281.6 281.6 281.6-126.054 281.6-281.6-126.054-281.6-281.6-281.6zM742.4 972.8c-127.232 0-230.4-103.168-230.4-230.4s103.168-230.4 230.4-230.4 230.4 103.168 230.4 230.4-103.168 230.4-230.4 230.4zM384 512c14.080 0 25.6 11.469 25.6 25.6s-11.52 25.6-25.6 25.6h-51.2c-14.080 0-25.6-11.469-25.6-25.6s11.52-25.6 25.6-25.6h51.2zM384 614.4c14.080 0 25.6 11.469 25.6 25.6s-11.52 25.6-25.6 25.6h-51.2c-14.080 0-25.6-11.469-25.6-25.6s11.52-25.6 25.6-25.6h51.2zM844.8 716.8c14.131 0 25.6 11.469 25.6 25.6s-11.469 25.6-25.6 25.6h-102.4c-14.131 0-25.6-11.469-25.6-25.6v-102.4c0-14.131 11.469-25.6 25.6-25.6s25.6 11.469 25.6 25.6v76.8h76.8z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["control-date-time"],"grid":14},"attrs":[{}],"properties":{"order":70,"id":24,"name":"control-DateTime","prevSize":28,"code":59703},"setIdx":0,"setId":1,"iconIdx":70},{"icon":{"paths":["M793.6 609.416h-61.838v-28.108h-0.783q-21.135 33.092-62.034 33.092-37.573 0-60.469-26.912-22.896-27.112-22.896-75.554 0-50.635 25.244-81.136t66.144-30.501q38.747 0 54.011 28.308h0.783v-121.405h61.838v302.216zM732.936 510.139v-15.35q0-19.935-11.35-33.092t-29.549-13.157q-20.548 0-32.093 16.546-11.546 16.347-11.546 45.053 0 26.912 11.154 41.465t30.919 14.553q18.786 0 30.528-15.35 11.937-15.35 11.937-40.668zM548.594 609.416h-61.643v-116.421q0-44.455-32.093-44.455-15.264 0-24.853 13.357t-9.589 33.292v114.228h-61.839v-117.617q0-43.259-31.506-43.259-15.851 0-25.44 12.758-9.393 12.758-9.393 34.687v113.431h-61.838v-204.135h61.838v31.896h0.783q9.589-16.347 26.81-26.514 17.417-10.366 37.964-10.366 42.465 0 58.12 38.076 22.896-38.076 67.318-38.076 65.361 0 65.361 82.133v126.987zM0 0v204.8h76.8v76.8h51.2v-76.8h76.8v-204.8zM819.2 0v204.8h204.8v-204.8zM51.2 51.2h102.4v102.4h-102.4zM870.4 51.2h102.4v102.4h-102.4zM281.6 76.8v51.2h102.4v-51.2zM486.4 76.8v51.2h102.4v-51.2zM691.2 76.8v51.2h102.4v-51.2zM896 281.6v102.4h51.2v-102.4zM76.8 384v102.4h51.2v-102.4zM896 486.4v102.4h51.2v-102.4zM76.8 588.8v102.4h51.2v-102.4zM896 691.2v102.4h51.2v-102.4zM76.8 793.6v25.6h-76.8v204.8h204.8v-76.8h76.8v-51.2h-76.8v-76.8h-76.8v-25.6zM819.2 819.2v76.8h-25.6v51.2h25.6v76.8h204.8v-204.8zM51.2 870.4h102.4v102.4h-102.4zM870.4 870.4h102.4v102.4h-102.4zM384 896v51.2h102.4v-51.2zM588.8 896v51.2h102.4v-51.2z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["control-Markdown"],"grid":14},"attrs":[{}],"properties":{"order":72,"id":25,"name":"control-Markdown","prevSize":28,"code":59704},"setIdx":0,"setId":1,"iconIdx":71},{"icon":{"paths":["M292.571 713.143v109.714c0 30.286-24.571 54.857-54.857 54.857h-182.857c-30.286 0-54.857-24.571-54.857-54.857v-109.714c0-30.286 24.571-54.857 54.857-54.857h182.857c30.286 0 54.857 24.571 54.857 54.857zM292.571 420.571v109.714c0 30.286-24.571 54.857-54.857 54.857h-182.857c-30.286 0-54.857-24.571-54.857-54.857v-109.714c0-30.286 24.571-54.857 54.857-54.857h182.857c30.286 0 54.857 24.571 54.857 54.857zM658.286 713.143v109.714c0 30.286-24.571 54.857-54.857 54.857h-182.857c-30.286 0-54.857-24.571-54.857-54.857v-109.714c0-30.286 24.571-54.857 54.857-54.857h182.857c30.286 0 54.857 24.571 54.857 54.857zM292.571 128v109.714c0 30.286-24.571 54.857-54.857 54.857h-182.857c-30.286 0-54.857-24.571-54.857-54.857v-109.714c0-30.286 24.571-54.857 54.857-54.857h182.857c30.286 0 54.857 24.571 54.857 54.857zM658.286 420.571v109.714c0 30.286-24.571 54.857-54.857 54.857h-182.857c-30.286 0-54.857-24.571-54.857-54.857v-109.714c0-30.286 24.571-54.857 54.857-54.857h182.857c30.286 0 54.857 24.571 54.857 54.857zM1024 713.143v109.714c0 30.286-24.571 54.857-54.857 54.857h-182.857c-30.286 0-54.857-24.571-54.857-54.857v-109.714c0-30.286 24.571-54.857 54.857-54.857h182.857c30.286 0 54.857 24.571 54.857 54.857zM658.286 128v109.714c0 30.286-24.571 54.857-54.857 54.857h-182.857c-30.286 0-54.857-24.571-54.857-54.857v-109.714c0-30.286 24.571-54.857 54.857-54.857h182.857c30.286 0 54.857 24.571 54.857 54.857zM1024 420.571v109.714c0 30.286-24.571 54.857-54.857 54.857h-182.857c-30.286 0-54.857-24.571-54.857-54.857v-109.714c0-30.286 24.571-54.857 54.857-54.857h182.857c30.286 0 54.857 24.571 54.857 54.857zM1024 128v109.714c0 30.286-24.571 54.857-54.857 54.857h-182.857c-30.286 0-54.857-24.571-54.857-54.857v-109.714c0-30.286 24.571-54.857 54.857-54.857h182.857c30.286 0 54.857 24.571 54.857 54.857z"],"width":1024,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["th"],"defaultCode":61450,"grid":14},"attrs":[],"properties":{"name":"grid","id":26,"order":83,"prevSize":28,"code":61450},"setIdx":0,"setId":1,"iconIdx":72},{"icon":{"paths":["M877.714 768v73.143c0 20-16.571 36.571-36.571 36.571h-804.571c-20 0-36.571-16.571-36.571-36.571v-73.143c0-20 16.571-36.571 36.571-36.571h804.571c20 0 36.571 16.571 36.571 36.571zM877.714 475.429v73.143c0 20-16.571 36.571-36.571 36.571h-804.571c-20 0-36.571-16.571-36.571-36.571v-73.143c0-20 16.571-36.571 36.571-36.571h804.571c20 0 36.571 16.571 36.571 36.571zM877.714 182.857v73.143c0 20-16.571 36.571-36.571 36.571h-804.571c-20 0-36.571-16.571-36.571-36.571v-73.143c0-20 16.571-36.571 36.571-36.571h804.571c20 0 36.571 16.571 36.571 36.571z"],"width":877.7142857142857,"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["bars","navicon","reorder"],"defaultCode":61641,"grid":14},"attrs":[],"properties":{"name":"list1","id":27,"order":89,"prevSize":28,"code":61641},"setIdx":0,"setId":1,"iconIdx":73},{"icon":{"paths":["M512 64c-131.696 0-239.125 107.4-239.125 239 0 65.8 24.831 146.717 65.375 215.25 19.653 33.221 43.902 63.853 71.75 87.125-59.423 7.524-122.009 9.415-172.125 32-79.809 35.967-144.343 94.74-172.375 178.625-1.5 9.499 0 0-1.5 9v0.499c0 73.995 60.563 134.501 134.375 134.501h627.125c73.888 0 134.5-60.506 134.5-134.5l-1.5-9.375c-27.845-84.263-92.273-143.119-172.125-179-50.17-22.544-112.844-24.421-172.375-31.875 27.792-23.26 52.002-53.831 71.625-87 40.544-68.533 65.375-149.45 65.375-215.25 0-131.6-107.304-239-239-239zM512 124c99.241 0 179 79.875 179 179 0 49.562-21.877 125.381-57 184.75s-81.435 98.75-122 98.75c-40.565 0-86.877-39.381-122-98.75s-57.125-135.188-57.125-184.75c0-99.125 79.884-179 179.125-179zM512 646.5c92.551 0 180.829 14.406 249.75 45.375 66.784 30.009 113.649 74.724 136.5 137.75-2.447 39.259-32.9 70.375-72.75 70.375h-627.125c-39.678 0-70.116-31.051-72.625-70.25 22.978-62.705 69.953-107.523 136.75-137.625 68.937-31.067 157.205-45.625 249.5-45.625z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["user-o"],"grid":14},"attrs":[{}],"properties":{"order":64,"id":28,"name":"user-o, type-UserInfo","prevSize":28,"code":59698},"setIdx":0,"setId":1,"iconIdx":74},{"icon":{"paths":["M217.6 992c-3.2 0-3.2 0-6.4 0h-3.2c-144-25.6-208-144-208-249.6 0-99.2 57.6-208 185.6-240v-147.2c0-19.2 12.8-32 32-32s32 12.8 32 32v172.8c0 16-12.8 28.8-25.6 32-108.8 16-160 102.4-160 182.4s48 166.4 153.6 185.6h6.4c16 3.2 28.8 19.2 25.6 38.4-3.2 16-16 25.6-32 25.6z","M774.4 1001.6c0 0 0 0 0 0-102.4 0-211.2-60.8-243.2-185.6h-176c-19.2 0-32-12.8-32-32s12.8-32 32-32h201.6c16 0 28.8 12.8 32 25.6 16 108.8 102.4 156.8 182.4 160 80 0 166.4-48 185.6-153.6v-3.2c3.2-16 19.2-28.8 38.4-25.6 16 3.2 28.8 19.2 25.6 38.4v3.2c-22.4 140.8-140.8 204.8-246.4 204.8z","M787.2 678.4c-19.2 0-32-12.8-32-32v-176c0-16 12.8-28.8 25.6-32 108.8-16 156.8-102.4 160-182.4 0-80-48-166.4-153.6-185.6h-3.2c-19.2-6.4-32-22.4-28.8-38.4s19.2-28.8 38.4-25.6h3.2c144 25.6 208 144 208 249.6 0 99.2-60.8 208-185.6 240v150.4c0 16-16 32-32 32z","M41.6 246.4c-3.2 0-3.2 0-6.4 0-16-3.2-28.8-19.2-25.6-35.2v-3.2c25.6-144 140.8-208 246.4-208 0 0 3.2 0 3.2 0 99.2 0 208 60.8 240 185.6h147.2c19.2 0 32 12.8 32 32s-12.8 32-32 32h-172.8c-16 0-28.8-12.8-32-25.6-16-108.8-102.4-156.8-182.4-160-80 0-166.4 48-185.6 153.6v3.2c-3.2 16-16 25.6-32 25.6z","M256 387.2c-32 0-67.2-12.8-92.8-38.4-51.2-51.2-51.2-134.4 0-185.6 25.6-22.4 57.6-35.2 92.8-35.2s67.2 12.8 92.8 38.4c25.6 25.6 38.4 57.6 38.4 92.8s-12.8 67.2-38.4 92.8c-25.6 22.4-57.6 35.2-92.8 35.2zM256 192c-16 0-32 6.4-44.8 19.2-25.6 25.6-25.6 67.2 0 92.8s67.2 25.6 92.8 0c12.8-12.8 19.2-28.8 19.2-48s-6.4-32-19.2-44.8-28.8-19.2-48-19.2z","M771.2 873.6c-32 0-67.2-12.8-92.8-38.4-51.2-51.2-51.2-134.4 0-185.6 25.6-25.6 57.6-38.4 92.8-38.4s67.2 12.8 92.8 38.4c25.6 25.6 38.4 57.6 38.4 92.8s-12.8 67.2-38.4 92.8c-28.8 25.6-60.8 38.4-92.8 38.4zM771.2 678.4c-19.2 0-35.2 6.4-48 19.2-25.6 25.6-25.6 67.2 0 92.8s67.2 25.6 92.8 0c12.8-12.8 19.2-28.8 19.2-48s-6.4-35.2-19.2-48-28.8-16-44.8-16z","M745.6 387.2c-32 0-67.2-12.8-92.8-38.4s-38.4-57.6-38.4-92.8 12.8-67.2 38.4-92.8c25.6-22.4 60.8-35.2 92.8-35.2s67.2 12.8 92.8 38.4c51.2 51.2 51.2 134.4 0 185.6v0c-25.6 22.4-57.6 35.2-92.8 35.2zM745.6 192c-19.2 0-35.2 6.4-48 19.2s-19.2 28.8-19.2 48 6.4 35.2 19.2 48c25.6 25.6 67.2 25.6 92.8 0s25.6-67.2 0-92.8c-9.6-16-25.6-22.4-44.8-22.4z","M259.2 873.6c-32 0-67.2-12.8-92.8-38.4s-38.4-57.6-38.4-92.8 12.8-67.2 38.4-92.8c25.6-22.4 57.6-35.2 92.8-35.2s67.2 12.8 92.8 38.4c51.2 51.2 51.2 134.4 0 185.6v0c-25.6 22.4-57.6 35.2-92.8 35.2zM259.2 678.4c-19.2 0-35.2 6.4-48 19.2s-19.2 28.8-19.2 48 6.4 35.2 19.2 48c25.6 25.6 67.2 25.6 92.8 0s25.6-67.2 0-92.8c-9.6-16-25.6-22.4-44.8-22.4z"],"attrs":[{},{},{},{},{},{},{},{}],"isMulticolor":false,"isMulticolor2":false,"tags":["webhooks"],"grid":14},"attrs":[{},{},{},{},{},{},{},{}],"properties":{"order":92,"id":29,"name":"rules, search-Rule","prevSize":28,"code":59719},"setIdx":0,"setId":1,"iconIdx":75},{"icon":{"paths":["M512 682.667h-341.333c-5.845 0-11.349-1.152-16.299-3.2-5.205-2.133-9.899-5.333-13.867-9.301s-7.125-8.661-9.301-13.867c-2.048-4.949-3.2-10.453-3.2-16.299v-426.667c0-5.845 1.152-11.349 3.2-16.299 2.133-5.205 5.333-9.899 9.301-13.867s8.661-7.125 13.867-9.301c4.949-2.048 10.453-3.2 16.299-3.2h682.667c5.845 0 11.349 1.152 16.299 3.2 5.205 2.133 9.899 5.333 13.867 9.301s7.125 8.661 9.301 13.867c2.048 4.949 3.2 10.453 3.2 16.299v426.667c0 5.845-1.152 11.349-3.2 16.299-2.133 5.205-5.333 9.899-9.301 13.867s-8.661 7.125-13.867 9.301c-4.949 2.048-10.453 3.2-16.299 3.2zM469.333 768v85.333h-128c-23.552 0-42.667 19.115-42.667 42.667s19.115 42.667 42.667 42.667h341.333c23.552 0 42.667-19.115 42.667-42.667s-19.115-42.667-42.667-42.667h-128v-85.333h298.667c17.28 0 33.835-3.456 48.981-9.728 15.701-6.485 29.781-16 41.557-27.776s21.291-25.856 27.776-41.557c6.229-15.104 9.685-31.659 9.685-48.939v-426.667c0-17.28-3.456-33.835-9.728-48.981-6.485-15.701-16-29.781-27.776-41.557s-25.856-21.291-41.557-27.776c-15.104-6.229-31.659-9.685-48.939-9.685h-682.667c-17.28 0-33.835 3.456-48.981 9.728-15.659 6.485-29.739 16-41.515 27.776s-21.291 25.856-27.776 41.515c-6.272 15.147-9.728 31.701-9.728 48.981v426.667c0 17.28 3.456 33.835 9.728 48.981 6.485 15.701 16 29.781 27.776 41.557s25.856 21.291 41.557 27.776c15.104 6.229 31.659 9.685 48.939 9.685z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["monitor"],"grid":0},"attrs":[{}],"properties":{"order":132,"id":0,"prevSize":24,"code":59765,"name":"type-UI"},"setIdx":0,"setId":1,"iconIdx":76},{"icon":{"paths":["M66.337 575.491l276.668-171.531v-57.177l-331.627 207.614v42.189l331.627 207.614-0-57.177z","M957.663 575.49l-276.668-171.531v-57.177l331.627 207.614v42.189l-331.627 207.614 0-57.177z","M583.295 214.183l-200.825 621.623 53.007 17.527 200.837-621.623z"],"attrs":[{},{},{}],"isMulticolor":false,"isMulticolor2":false,"tags":["prerender"],"grid":0},"attrs":[{},{},{}],"properties":{"order":114,"id":0,"name":"prerender","prevSize":24,"code":59724},"setIdx":0,"setId":1,"iconIdx":77},{"icon":{"paths":["M1024 512c0 282.77-229.23 512-512 512s-512-229.23-512-512c0-282.77 229.23-512 512-512s512 229.23 512 512z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["circle"],"grid":0},"attrs":[{}],"properties":{"order":106,"id":1,"name":"circle","prevSize":24,"code":59729},"setIdx":0,"setId":1,"iconIdx":78},{"icon":{"paths":["M512 0c-15.36 0-25.6 10.24-25.6 25.6s10.24 25.6 25.6 25.6h128v870.4h-128c-15.36 0-25.6 10.24-25.6 25.6s10.24 25.6 25.6 25.6h307.2c15.36 0 25.6-10.24 25.6-25.6s-10.24-25.6-25.6-25.6h-128v-870.4h128c15.36 0 25.6-10.24 25.6-25.6s-10.24-25.6-25.6-25.6h-307.2zM51.2 204.8c-28.16 0-51.2 23.040-51.2 51.2v460.8c0 28.16 23.040 51.2 51.2 51.2h537.6v-51.2h-512c-15.36 0-25.6-10.24-25.6-25.6v-409.6c0-15.36 10.24-25.6 25.6-25.6h512v-51.2h-537.6zM742.4 204.8v51.2h204.8c15.36 0 25.6 10.24 25.6 25.6v409.6c0 15.36-10.24 25.6-25.6 25.6h-204.8v51.2h230.4c28.16 0 51.2-23.040 51.2-51.2v-460.8c0-28.16-23.040-51.2-51.2-51.2h-230.4z","M386.56 606.72c0 12.8-7.68 23.040-20.48 25.6-28.16 10.24-58.88 15.36-92.16 15.36-35.84 0-66.56-10.24-84.48-25.6s-25.6-38.4-25.6-66.56 10.24-51.2 25.6-66.56c17.92-17.92 46.080-23.040 84.48-23.040h69.12v-38.4c0-35.84-25.6-53.76-64-53.76-23.040 0-46.080 7.68-69.12 20.48-2.56 2.56-5.12 2.56-10.24 2.56-10.24 0-20.48-7.68-20.48-20.48 0-7.68 2.56-12.8 10.24-17.92 30.72-20.48 61.44-25.6 92.16-25.6 56.32 0 104.96 30.72 104.96 92.16v181.76zM345.6 501.76h-69.12c-61.44 0-69.12 28.16-69.12 53.76s7.68 56.32 69.12 56.32c23.040 0 46.080-2.56 69.12-10.24v-99.84z"],"attrs":[{},{}],"isMulticolor":false,"isMulticolor2":false,"tags":["control-Slug"],"grid":0},"attrs":[{},{}],"properties":{"order":103,"id":2,"name":"control-Slug","prevSize":24,"code":59727},"setIdx":0,"setId":1,"iconIdx":79},{"icon":{"paths":["M295.954 822.751h-94.705c-47.353 0-88.786-41.434-88.786-88.786v-491.283c0-47.353 41.434-88.786 88.786-88.786h94.705v-59.191h-94.705c-82.867 0-147.977 65.11-147.977 147.977v491.283c0 82.867 65.11 147.977 147.977 147.977h94.705v-59.191z","M970.728 473.526c-82.867-171.653-201.249-378.821-272.277-378.821h-112.462v59.191h112.462c35.514 11.838 136.139 177.572 213.087 337.387-76.948 153.896-177.572 325.549-213.087 337.387h-112.462v59.191h112.462c71.029 0 183.491-207.168 272.277-384.74l5.919-11.838-5.919-17.757z","M266.358 337.341v260.462h59.191v-260.462z","M479.422 337.341v260.462h59.191v-260.462z"],"attrs":[{},{},{},{}],"isMulticolor":false,"isMulticolor2":false,"tags":["Tags"],"grid":0},"attrs":[{},{},{},{}],"properties":{"order":98,"id":3,"name":"type-Tags","prevSize":24,"code":59722},"setIdx":0,"setId":1,"iconIdx":80},{"icon":{"paths":["M512 102.4c-200.4 0-366.954 144.072-402.4 334.2-0.031 0.165-0.069 0.335-0.1 0.5-2.974 16.061-4.76 32.441-5.8 49.1-0.017 0.271-0.084 0.529-0.1 0.8 0.019 0.004 0.080-0.004 0.1 0-0.503 8.31-1.3 16.564-1.3 25 0 226.202 183.398 409.6 409.6 409.6 208.165 0 379.707-155.44 405.8-356.5 0.004-0.033-0.004-0.067 0-0.1 1.94-14.978 3.124-30.16 3.4-45.6 0.044-2.487 0.4-4.903 0.4-7.4 0-226.202-183.398-409.6-409.6-409.6zM512 153.6c185.461 0 337.902 140.924 356.4 321.5-35.181-21.812-84.232-39.9-151.6-39.9-85.35 0-140.891 41.606-194.6 81.9-49.152 36.864-95.55 71.7-163.8 71.7-86.067 0-135.862-54.67-175.9-98.6-9.001-9.901-17.11-17.483-25.4-25.3 23.131-175.603 172.981-311.3 354.9-311.3zM716.8 486.4c77.828 0 125.173 28.221 152.2 52.8-13.96 185.173-168.254 331.2-357 331.2-190.097 0-345.175-148.14-357.2-335.2 41.826 45.372 102.577 104.8 203.6 104.8 85.35 0 140.891-41.606 194.6-81.9 49.152-36.915 95.55-71.7 163.8-71.7z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["activity"],"grid":0},"attrs":[{}],"properties":{"order":12,"id":4,"name":"activity, history, time","prevSize":24,"code":59652},"setIdx":0,"setId":1,"iconIdx":81},{"icon":{"paths":["M512 0c-35.392 0-64 28.608-64 64v384h-384c-35.392 0-64 28.608-64 64s28.608 64 64 64h384v384c0 35.392 28.608 64 64 64s64-28.608 64-64v-384h384c35.392 0 64-28.608 64-64s-28.608-64-64-64h-384v-384c0-35.392-28.608-64-64-64z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["add"],"grid":0},"attrs":[{}],"properties":{"order":13,"id":5,"name":"add, plus","prevSize":24,"code":59653},"setIdx":0,"setId":1,"iconIdx":82},{"icon":{"paths":["M512 102.4c-226.202 0-409.6 183.398-409.6 409.6s183.398 409.6 409.6 409.6c226.202 0 409.6-183.398 409.6-409.6s-183.398-409.6-409.6-409.6zM512 153.6c197.632 0 358.4 160.819 358.4 358.4s-160.768 358.4-358.4 358.4c-197.632 0-358.4-160.819-358.4-358.4s160.768-358.4 358.4-358.4zM691.9 333c-12.893 0.002-25.782 4.882-35.5 14.6l-222.2 221.9-67.7-67.5c-19.19-19.294-51.085-19.215-70.3 0-19.15 19.15-19.15 51.050 0 70.2 0.198 0.2 26.198 26.681 52 53 12.95 13.209 25.761 26.372 35.2 36 4.719 4.814 8.607 8.755 11.2 11.4 1.296 1.322 2.293 2.281 2.9 2.9 0.279 0.282 0.488 0.486 0.6 0.6 0.001 0.001 7.591-7.429 14.6-14.3l-14.5 14.4 0.2 0.2v0.1c19.43 19.327 51.57 19.327 71 0v-0.1l258.1-257.6c19.546-19.447 19.521-51.885-0.1-71.3-9.731-9.679-22.607-14.502-35.5-14.5z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["check-circle"],"grid":0},"attrs":[{}],"properties":{"order":14,"id":6,"name":"check-circle","prevSize":24,"code":59654},"setIdx":0,"setId":1,"iconIdx":83},{"icon":{"paths":["M512 1024c-282.778 0-512-229.222-512-512s229.222-512 512-512 512 229.222 512 512-229.222 512-512 512zM855.808 270.592c-19.2-19.2-50.278-19.2-69.478 0l-376.73 376.73-171.878-171.93c-19.2-19.2-50.278-19.2-69.478 0s-19.2 50.278 0 69.478c0 0 201.523 205.261 204.8 208.486 9.984 10.138 23.347 14.643 36.557 14.080 13.21 0.563 26.573-3.942 36.608-14.029 3.277-3.226 409.6-413.286 409.6-413.286 19.2-19.2 19.2-50.33 0-69.53z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["check-circle-filled"],"grid":0},"attrs":[{}],"properties":{"order":27,"id":7,"name":"check-circle-filled","prevSize":24,"code":59655},"setIdx":0,"setId":1,"iconIdx":84},{"icon":{"paths":["M601.024 512l276.736 276.736c24.512 24.576 24.512 64.384 0 89.024-24.64 24.576-64.384 24.576-89.024 0l-276.736-276.736-276.736 276.736c-24.512 24.576-64.384 24.576-89.024 0-24.512-24.64-24.512-64.448 0-89.024l276.736-276.736-276.736-276.736c-24.512-24.576-24.512-64.384 0-89.024 24.64-24.576 64.512-24.576 89.024 0l276.736 276.736 276.736-276.736c24.64-24.576 64.384-24.576 89.024 0 24.512 24.64 24.512 64.448 0 89.024l-276.736 276.736z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["close"],"grid":0},"attrs":[{}],"properties":{"order":28,"id":8,"name":"close","prevSize":24,"code":59656},"setIdx":0,"setId":1,"iconIdx":85},{"icon":{"paths":["M409.6 435.2h-153.6v51.2h153.6v-51.2zM409.6 332.8h-153.6v51.2h153.6v-51.2zM256 691.2h409.6v-51.2h-409.6v51.2zM409.6 230.4h-153.6v51.2h153.6v-51.2zM870.4 179.2h-51.2v-51.2c0-28.262-22.938-51.2-51.2-51.2h-614.4c-28.262 0-51.2 22.938-51.2 51.2v665.6c0 28.262 22.938 51.2 51.2 51.2h51.2v51.2c0 28.262 22.938 51.2 51.2 51.2h614.4c28.262 0 51.2-22.938 51.2-51.2v-665.6c0-28.262-22.938-51.2-51.2-51.2zM179.2 793.6c-14.157 0-25.6-11.443-25.6-25.6v-614.4c0-14.131 11.443-25.6 25.6-25.6h563.2c14.157 0 25.6 11.469 25.6 25.6v614.4c0 14.157-11.443 25.6-25.6 25.6h-563.2zM870.4 870.4c0 14.157-11.443 25.6-25.6 25.6h-563.2c-14.157 0-25.6-11.443-25.6-25.6v-25.6h512c28.262 0 51.2-22.938 51.2-51.2v-563.2h25.6c14.157 0 25.6 11.469 25.6 25.6v614.4zM614.4 230.4h-102.4c-28.262 0-51.2 22.938-51.2 51.2v153.6c0 28.262 22.938 51.2 51.2 51.2h102.4c28.262 0 51.2-22.938 51.2-51.2v-153.6c0-28.262-22.938-51.2-51.2-51.2zM614.4 435.2h-102.4v-153.6h102.4v153.6zM256 588.8h409.6v-51.2h-409.6v51.2z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["content"],"grid":0},"attrs":[{}],"properties":{"order":37,"id":9,"name":"type-References","prevSize":24,"code":59657},"setIdx":0,"setId":1,"iconIdx":86},{"icon":{"paths":["M793.6 844.8c0 14.157-11.443 25.6-25.6 25.6h-665.6c-14.131 0-25.6-11.443-25.6-25.6v-665.6c0-14.157 11.469-25.6 25.6-25.6h665.6c14.157 0 25.6 11.443 25.6 25.6v102.4h51.2v-128c0-28.262-22.938-51.2-51.2-51.2h-716.8c-28.262 0-51.2 22.938-51.2 51.2v716.8c0 28.262 22.938 51.2 51.2 51.2h716.8c28.262 0 51.2-22.938 51.2-51.2v-281.6h-51.2v256zM991.078 237.747c-9.958-9.958-26.035-9.958-35.968 0l-391.91 391.91-238.31-238.31c-9.958-9.958-26.061-9.958-35.942 0-9.958 9.907-9.958 26.010 0 35.942l254.874 254.874c0.461 0.538 0.614 1.203 1.126 1.69 5.043 5.018 11.674 7.475 18.278 7.373 6.605 0.102 13.235-2.355 18.278-7.373 0.512-0.512 0.666-1.178 1.126-1.69l408.448-408.474c9.933-9.933 9.933-26.035 0-35.942z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["control-checkbox"],"grid":0},"attrs":[{}],"properties":{"order":38,"id":10,"name":"control-Checkbox","prevSize":24,"code":59658},"setIdx":0,"setId":1,"iconIdx":87},{"icon":{"paths":["M51.2 0c-28.262 0-51.2 22.938-51.2 51.2v281.6c0 28.262 22.938 51.2 51.2 51.2h921.6c28.262 0 51.2-22.938 51.2-51.2v-281.6c0-28.262-22.938-51.2-51.2-51.2h-921.6zM76.8 51.2h512v281.6h-512c-14.157 0-25.6-11.443-25.6-25.6v-230.4c0-14.157 11.443-25.6 25.6-25.6zM640 51.2h307.2c14.157 0 25.6 11.443 25.6 25.6v230.4c0 14.157-11.443 25.6-25.6 25.6h-307.2v-281.6zM716.8 153.6c-0.41 0.358 89.139 102.938 89.6 102.4 0.512 0 89.6-95.36 89.6-102.4 0 0.384-172.16 0-179.2 0zM128 435.2c-42.394 0-76.8 34.406-76.8 76.8s34.406 76.8 76.8 76.8c42.394 0 76.8-34.406 76.8-76.8s-34.406-76.8-76.8-76.8zM128 486.4c14.157 0 25.6 11.443 25.6 25.6s-11.443 25.6-25.6 25.6c-14.157 0-25.6-11.443-25.6-25.6s11.443-25.6 25.6-25.6zM307.2 486.4c-14.157 0-25.6 11.443-25.6 25.6s11.443 25.6 25.6 25.6h640c14.157 0 25.6-11.443 25.6-25.6s-11.443-25.6-25.6-25.6h-640zM128 640c-42.394 0-76.8 34.381-76.8 76.8s34.406 76.8 76.8 76.8c42.394 0 76.8-34.381 76.8-76.8s-34.406-76.8-76.8-76.8zM128 691.2c14.157 0 25.6 11.443 25.6 25.6s-11.443 25.6-25.6 25.6c-14.157 0-25.6-11.443-25.6-25.6s11.443-25.6 25.6-25.6zM307.2 691.2c-14.157 0-25.6 11.443-25.6 25.6s11.443 25.6 25.6 25.6h640c14.157 0 25.6-11.443 25.6-25.6s-11.443-25.6-25.6-25.6h-640zM128 844.8c-42.394 0-76.8 34.381-76.8 76.8s34.406 76.8 76.8 76.8c42.394 0 76.8-34.381 76.8-76.8s-34.406-76.8-76.8-76.8zM128 896c14.157 0 25.6 11.443 25.6 25.6s-11.443 25.6-25.6 25.6c-14.157 0-25.6-11.443-25.6-25.6s11.443-25.6 25.6-25.6zM307.2 896c-14.157 0-25.6 11.443-25.6 25.6s11.443 25.6 25.6 25.6h640c14.157 0 25.6-11.443 25.6-25.6s-11.443-25.6-25.6-25.6h-640z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["control-dropdown"],"grid":0},"attrs":[{}],"properties":{"order":39,"id":11,"name":"control-Dropdown","prevSize":24,"code":59659},"setIdx":0,"setId":1,"iconIdx":88},{"icon":{"paths":["M512 0c-14.157 0-25.6 11.443-25.6 25.6s11.443 25.6 25.6 25.6h128v870.4h-128c-14.157 0-25.6 11.443-25.6 25.6s11.443 25.6 25.6 25.6h307.2c14.157 0 25.6-11.443 25.6-25.6s-11.443-25.6-25.6-25.6h-128v-870.4h128c14.157 0 25.6-11.443 25.6-25.6s-11.443-25.6-25.6-25.6h-307.2zM51.2 204.8c-28.262 0-51.2 22.938-51.2 51.2v460.8c0 28.262 22.938 51.2 51.2 51.2h537.6v-51.2h-512c-14.131 0-25.6-11.443-25.6-25.6v-409.6c0-14.157 11.469-25.6 25.6-25.6h512v-51.2h-537.6zM742.4 204.8v51.2h204.8c14.157 0 25.6 11.443 25.6 25.6v409.6c0 14.157-11.443 25.6-25.6 25.6h-204.8v51.2h230.4c28.262 0 51.2-22.938 51.2-51.2v-460.8c0-28.262-22.938-51.2-51.2-51.2h-230.4zM285.9 307c-0.589 0.051-1.161 0.048-1.75 0.15-8.243 0.051-16.396 4.474-20.85 13.050l-132.55 306.25c-6.656 12.749-2.866 28.981 8.5 36.2 11.341 7.219 25.97 2.749 32.6-10l27.65-63.85h170.5c0.512 0 0.914-0.224 1.4-0.25l27.45 64.050c6.63 12.749 21.136 17.269 32.4 10.050s15.005-23.451 8.4-36.2l-131.3-306.25c-4.454-8.576-12.432-12.973-20.65-13.050-0.614-0.102-1.211-0.099-1.8-0.15zM285.9 389.15l63.65 148.45h-127.9l64.25-148.45z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["control-input"],"grid":0},"attrs":[{}],"properties":{"order":41,"id":12,"name":"control-Input","prevSize":24,"code":59660},"setIdx":0,"setId":1,"iconIdx":89},{"icon":{"paths":["M153.6 716.8c-84.787 0-153.6 68.813-153.6 153.6s68.813 153.6 153.6 153.6c84.787 0 153.6-68.813 153.6-153.6s-68.813-153.6-153.6-153.6zM153.6 972.8c-56.55 0-102.4-45.85-102.4-102.4s45.85-102.4 102.4-102.4c56.55 0 102.4 45.85 102.4 102.4s-45.85 102.4-102.4 102.4zM384 179.2h614.4c14.157 0 25.6-11.443 25.6-25.6s-11.443-25.6-25.6-25.6h-614.4c-14.131 0-25.6 11.443-25.6 25.6s11.469 25.6 25.6 25.6zM998.4 486.4h-614.4c-14.131 0-25.6 11.443-25.6 25.6s11.469 25.6 25.6 25.6h614.4c14.157 0 25.6-11.443 25.6-25.6s-11.443-25.6-25.6-25.6zM153.6 0c-84.787 0-153.6 68.787-153.6 153.6s68.813 153.6 153.6 153.6c84.787 0 153.6-68.787 153.6-153.6s-68.813-153.6-153.6-153.6zM153.6 256c-56.55 0-102.4-45.85-102.4-102.4s45.85-102.4 102.4-102.4c56.55 0 102.4 45.85 102.4 102.4s-45.85 102.4-102.4 102.4zM153.6 358.4c-84.787 0-153.6 68.787-153.6 153.6 0 84.787 68.813 153.6 153.6 153.6s153.6-68.813 153.6-153.6c0-84.813-68.813-153.6-153.6-153.6zM153.6 614.4c-56.55 0-102.4-45.85-102.4-102.4s45.85-102.4 102.4-102.4c56.55 0 102.4 45.85 102.4 102.4s-45.85 102.4-102.4 102.4zM153.6 102.4c-28.262 0-51.2 22.938-51.2 51.2s22.938 51.2 51.2 51.2c28.262 0 51.2-22.938 51.2-51.2s-22.938-51.2-51.2-51.2zM998.4 844.8h-614.4c-14.131 0-25.6 11.443-25.6 25.6s11.469 25.6 25.6 25.6h614.4c14.157 0 25.6-11.443 25.6-25.6s-11.443-25.6-25.6-25.6z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["control-radio"],"grid":0},"attrs":[{}],"properties":{"order":42,"id":13,"name":"control-Radio","prevSize":24,"code":59661},"setIdx":0,"setId":1,"iconIdx":90},{"icon":{"paths":["M0 0v204.8h76.8v76.8h51.2v-76.8h76.8v-204.8h-204.8zM819.2 0v204.8h204.8v-204.8h-204.8zM51.2 51.2h102.4v102.4h-102.4v-102.4zM870.4 51.2h102.4v102.4h-102.4v-102.4zM281.6 76.8v51.2h102.4v-51.2h-102.4zM486.4 76.8v51.2h102.4v-51.2h-102.4zM691.2 76.8v51.2h102.4v-51.2h-102.4zM333.25 204.8c-7.091-0.307-14.348 2.097-19.75 7.55l-74.75 74.75c-10.317 10.291-10.317 27.083 0 37.4s27.059 10.317 37.35 0l68.45-68.5h141.85v486.4h-50.7c-7.117-0.307-14.348 2.097-19.75 7.55l-23.6 23.55c-10.317 10.317-10.317 27.083 0 37.4 10.291 10.317 27.109 10.317 37.4 0l17.25-17.3h129.75l18.050 18c10.394 10.368 27.181 10.368 37.6 0 10.368-10.394 10.368-27.181 0-37.6l-24-24c-5.478-5.478-12.682-7.907-19.85-7.6h-50.95v-486.4h141.55l69.25 69.2c10.394 10.368 27.155 10.368 37.6 0 10.368-10.368 10.368-27.181 0-37.6l-75.2-75.2c-5.478-5.478-12.706-7.907-19.9-7.6h-357.65zM896 281.6v102.4h51.2v-102.4h-51.2zM76.8 384v102.4h51.2v-102.4h-51.2zM896 486.4v102.4h51.2v-102.4h-51.2zM76.8 588.8v102.4h51.2v-102.4h-51.2zM896 691.2v102.4h51.2v-102.4h-51.2zM76.8 793.6v25.6h-76.8v204.8h204.8v-76.8h76.8v-51.2h-76.8v-76.8h-76.8v-25.6h-51.2zM819.2 819.2v76.8h-25.6v51.2h25.6v76.8h204.8v-204.8h-204.8zM51.2 870.4h102.4v102.4h-102.4v-102.4zM870.4 870.4h102.4v102.4h-102.4v-102.4zM384 896v51.2h102.4v-51.2h-102.4zM588.8 896v51.2h102.4v-51.2h-102.4z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["control-textarea"],"grid":0},"attrs":[{}],"properties":{"order":17,"id":14,"name":"control-TextArea","prevSize":24,"code":59662},"setIdx":0,"setId":1,"iconIdx":91},{"icon":{"paths":["M332.8 25.6c-127.258 0-230.4 103.142-230.4 230.4s103.142 230.4 230.4 230.4h358.4c127.258 0 230.4-103.142 230.4-230.4s-103.142-230.4-230.4-230.4h-358.4zM332.8 76.8h358.4c98.97 0 179.2 80.23 179.2 179.2s-80.23 179.2-179.2 179.2h-358.4c-98.97 0-179.2-80.23-179.2-179.2s80.23-179.2 179.2-179.2zM332.8 128c-70.707 0-128 57.293-128 128s57.293 128 128 128c70.707 0 128-57.293 128-128s-57.293-128-128-128zM332.8 179.2c42.419 0 76.8 34.381 76.8 76.8s-34.381 76.8-76.8 76.8c-42.419 0-76.8-34.381-76.8-76.8s34.381-76.8 76.8-76.8zM332.8 537.6c-127.258 0-230.4 103.142-230.4 230.4s103.142 230.4 230.4 230.4h358.4c127.258 0 230.4-103.142 230.4-230.4s-103.142-230.4-230.4-230.4h-358.4zM332.8 588.8h358.4c98.97 0 179.2 80.23 179.2 179.2s-80.23 179.2-179.2 179.2h-358.4c-98.97 0-179.2-80.23-179.2-179.2s80.23-179.2 179.2-179.2zM691.2 640c-70.707 0-128 57.293-128 128s57.293 128 128 128c70.707 0 128-57.293 128-128s-57.293-128-128-128zM691.2 691.2c42.419 0 76.8 34.381 76.8 76.8s-34.381 76.8-76.8 76.8c-42.419 0-76.8-34.381-76.8-76.8s34.381-76.8 76.8-76.8z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["control-toggle"],"grid":0},"attrs":[{}],"properties":{"order":16,"id":15,"name":"control-Toggle","prevSize":24,"code":59663},"setIdx":0,"setId":1,"iconIdx":92},{"icon":{"paths":["M204.8 51.2c-56.525 0-102.4 45.875-102.4 102.4v512c0 56.525 45.875 102.4 102.4 102.4h409.6c56.525 0 102.4-45.875 102.4-102.4v-512c0-56.525-45.875-102.4-102.4-102.4h-409.6zM204.8 102.4h409.6c28.262 0 51.2 22.886 51.2 51.2v512c0 28.314-22.938 51.2-51.2 51.2h-409.6c-28.262 0-51.2-22.886-51.2-51.2v-512c0-28.314 22.938-51.2 51.2-51.2zM768 204.8v51.2c28.262 0 51.2 22.886 51.2 51.2v512c0 28.314-22.938 51.2-51.2 51.2h-409.6c-28.262 0-51.2-22.886-51.2-51.2h-51.2c0 56.525 45.875 102.4 102.4 102.4h409.6c56.525 0 102.4-45.875 102.4-102.4v-512c0-56.525-45.875-102.4-102.4-102.4z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["copy"],"grid":0},"attrs":[{}],"properties":{"order":90,"id":16,"name":"copy","prevSize":24,"code":59664},"setIdx":0,"setId":1,"iconIdx":93},{"icon":{"paths":["M828.8 1024h-633.6c-105.6 0-195.2-89.6-195.2-195.2v-320c0-281.6 227.2-508.8 505.6-508.8 288 0 518.4 230.4 518.4 518.4v310.4c0 105.6-89.6 195.2-195.2 195.2zM505.6 64c-243.2 0-441.6 198.4-441.6 441.6v320c0 73.6 60.8 134.4 131.2 134.4h630.4c73.6 0 131.2-60.8 131.2-131.2v-310.4c3.2-249.6-201.6-454.4-451.2-454.4z","M512 668.8c-3.2 0-6.4 0-6.4 0-32-3.2-64-19.2-80-48l-192-278.4c-9.6-9.6-9.6-25.6-0-38.4 9.6-9.6 25.6-12.8 38.4-6.4l294.4 172.8c28.8 16 48 44.8 51.2 76.8s-6.4 64-28.8 89.6c-19.2 22.4-48 32-76.8 32zM364.8 428.8l108.8 160c6.4 9.6 19.2 19.2 32 19.2s25.6-3.2 35.2-12.8c9.6-9.6 12.8-22.4 9.6-35.2s-9.6-22.4-19.2-32l-166.4-99.2z","M678.4 364.8c-6.4 0-12.8-3.2-19.2-6.4-16-9.6-19.2-28.8-9.6-44.8l54.4-83.2c9.6-16 28.8-19.2 44.8-9.6 19.2 12.8 22.4 35.2 12.8 48l-54.4 83.2c-6.4 9.6-16 12.8-28.8 12.8z"],"attrs":[{},{},{}],"isMulticolor":false,"isMulticolor2":false,"tags":["dashboard"],"grid":0},"attrs":[{},{},{}],"properties":{"order":26,"id":17,"name":"dashboard, search-Dashboard","prevSize":24,"code":59665},"setIdx":0,"setId":1,"iconIdx":94},{"icon":{"paths":["M597.35 819.2c14.131 0 25.6-11.469 25.6-25.6v-307.2c0-14.080-11.469-25.6-25.6-25.6s-25.6 11.52-25.6 25.6v307.2c0 14.131 11.418 25.6 25.6 25.6zM776.55 204.8h-153.6v-51.2c0-28.314-22.886-51.2-51.2-51.2h-102.4c-28.262 0-51.2 22.886-51.2 51.2v51.2h-153.6c-28.262 0-51.2 22.886-51.2 51.2v102.4c0 28.314 22.938 51.2 51.2 51.2v460.8c0 28.314 22.938 51.2 51.2 51.2h409.6c28.314 0 51.2-22.886 51.2-51.2v-460.8c28.314 0 51.2-22.886 51.2-51.2v-102.4c0-28.314-22.938-51.2-51.2-51.2zM469.35 153.6h102.4v51.2h-102.4v-51.2zM725.35 870.4h-409.6v-460.8h409.6v460.8zM776.55 358.4h-512v-102.4h512v102.4zM443.75 819.2c14.131 0 25.6-11.469 25.6-25.6v-307.2c0-14.080-11.469-25.6-25.6-25.6s-25.6 11.52-25.6 25.6v307.2c0 14.131 11.469 25.6 25.6 25.6z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["delete"],"grid":0},"attrs":[{}],"properties":{"order":29,"id":18,"name":"delete, bin","prevSize":24,"code":59666},"setIdx":0,"setId":1,"iconIdx":95},{"icon":{"paths":["M832 128h-192v-64c0-35.392-28.608-64-64-64h-128c-35.328 0-64 28.608-64 64v64h-192c-35.328 0-64 28.608-64 64v128c0 35.392 28.672 64 64 64v512c0 35.392 28.672 64 64 64h512c35.392 0 64-28.608 64-64v-512c35.392 0 64-28.608 64-64v-128c0-35.392-28.608-64-64-64zM448 64h128v64h-128v-64zM448 800c0 17.664-14.336 32-32 32s-32-14.336-32-32v-320c0-17.6 14.336-32 32-32s32 14.4 32 32v320zM640 800c0 17.664-14.336 32-32 32s-32-14.336-32-32v-320c0-17.6 14.336-32 32-32s32 14.4 32 32v320zM832 320h-640v-128h640v128z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["delete-filled"],"grid":0},"attrs":[{}],"properties":{"order":36,"id":19,"name":"delete-filled","prevSize":24,"code":59667},"setIdx":0,"setId":1,"iconIdx":96},{"icon":{"paths":["M358.4 102.4c-28.314 0-51.2 22.886-51.2 51.2v256h51.2v-256h307.2v153.6c0 28.314 22.886 51.2 51.2 51.2h153.6v512h-358.4v51.2h358.4c28.314 0 51.2-22.886 51.2-51.2v-548.2l-219.8-219.8h-343.4zM716.8 189.8l117.4 117.4h-117.4v-117.4zM332.8 460.8c-127.232 0-230.4 103.168-230.4 230.4s103.168 230.4 230.4 230.4c127.232 0 230.4-103.168 230.4-230.4s-103.168-230.4-230.4-230.4zM332.8 512c98.816 0 179.2 80.384 179.2 179.2s-80.384 179.2-179.2 179.2c-98.816 0-179.2-80.384-179.2-179.2s80.384-179.2 179.2-179.2zM227.2 665.6c-12.39 0-22.4 10.061-22.4 22.4v6.4c0 12.39 10.010 22.4 22.4 22.4h211.2c12.39 0 22.4-10.010 22.4-22.4v-6.4c0-12.39-10.061-22.4-22.4-22.4h-211.2z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["document-delete"],"grid":0},"attrs":[{}],"properties":{"order":35,"id":20,"name":"document-delete","prevSize":24,"code":59668},"setIdx":0,"setId":1,"iconIdx":97},{"icon":{"paths":["M358.4 102.4c-28.314 0-51.2 22.886-51.2 51.2v256h51.2v-256h307.2v153.6c0 28.314 22.886 51.2 51.2 51.2h153.6v512h-358.4v51.2h358.4c28.314 0 51.2-22.886 51.2-51.2v-548.2l-219.8-219.8h-343.4zM716.8 189.8l117.4 117.4h-117.4v-117.4zM332.8 460.8c-127.232 0-230.4 103.168-230.4 230.4s103.168 230.4 230.4 230.4c127.232 0 230.4-103.168 230.4-230.4s-103.168-230.4-230.4-230.4zM332.8 512c39.934 0 76.475 13.533 106.3 35.7l-250.4 249c-21.807-29.683-35.1-65.924-35.1-105.5 0-98.816 80.384-179.2 179.2-179.2zM477 585.7c21.785 29.674 35 65.947 35 105.5 0 98.816-80.384 179.2-179.2 179.2-39.906 0-76.386-13.561-106.2-35.7l250.4-249z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["document-disable"],"grid":0},"attrs":[{}],"properties":{"order":40,"id":21,"name":"document-disable","prevSize":24,"code":59669},"setIdx":0,"setId":1,"iconIdx":98},{"icon":{"paths":["M358.4 102.4c-28.314 0-51.2 22.886-51.2 51.2v256h51.2v-256h307.2v153.6c0 28.314 22.886 51.2 51.2 51.2h153.6v512h-358.4v51.2h358.4c28.314 0 51.2-22.886 51.2-51.2v-548.2l-219.8-219.8h-343.4zM716.8 189.8l117.4 117.4h-117.4v-117.4zM332.8 460.8l-230.4 256v51.2h102.4v153.6h256v-153.6h102.4v-51.2l-230.4-256zM332.8 537.3l161.5 179.5h-84.7v153.6h-153.6v-153.6h-84.7l161.5-179.5z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["document-publish"],"grid":0},"attrs":[{}],"properties":{"order":44,"id":22,"name":"document-publish","prevSize":24,"code":59670},"setIdx":0,"setId":1,"iconIdx":99},{"icon":{"paths":["M665.6 51.2v102.4h102.4v-102.4h-102.4zM460.8 153.6h102.4v-102.4h-102.4v102.4zM460.8 358.4h102.4v-102.4h-102.4v102.4zM665.6 358.4h102.4v-102.4h-102.4v102.4zM665.6 563.2h102.4v-102.4h-102.4v102.4zM460.8 563.2h102.4v-102.4h-102.4v102.4zM460.8 768h102.4v-102.4h-102.4v102.4zM665.6 768h102.4v-102.4h-102.4v102.4zM665.6 972.8h102.4v-102.4h-102.4v102.4zM460.8 972.8h102.4v-102.4h-102.4v102.4zM256 153.6h102.4v-102.4h-102.4v102.4zM256 358.4h102.4v-102.4h-102.4v102.4zM256 563.2h102.4v-102.4h-102.4v102.4zM256 768h102.4v-102.4h-102.4v102.4zM256 972.8h102.4v-102.4h-102.4v102.4z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["drag"],"grid":0},"attrs":[{}],"properties":{"order":43,"id":23,"name":"drag","prevSize":24,"code":59671},"setIdx":0,"setId":1,"iconIdx":100},{"icon":{"paths":["M846.72 170.667l-281.984 333.397c-6.272 7.381-10.069 17.024-10.069 27.563v295.339l-85.333-42.667v-252.672c0.043-9.685-3.285-19.499-10.069-27.563l-281.984-333.397zM938.667 85.333h-853.333c-23.552 0-42.667 19.115-42.667 42.667 0 10.539 3.797 20.181 10.069 27.563l331.264 391.68v263.424c0 16.597 9.472 31.019 23.595 38.144l170.667 85.333c21.077 10.539 46.72 2.005 57.259-19.072 3.072-6.229 4.523-12.843 4.48-19.072v-348.757l331.264-391.68c15.232-18.005 12.971-44.928-5.035-60.117-8.064-6.827-17.877-10.155-27.563-10.112z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["filter"],"grid":0},"attrs":[{}],"properties":{"order":18,"id":24,"name":"filter","prevSize":24,"code":59672},"setIdx":0,"setId":1,"iconIdx":101},{"icon":{"paths":["M512 0c-282.88 0-512 229.248-512 512 0 226.24 146.688 418.112 350.080 485.76 25.6 4.8 35.008-11.008 35.008-24.64 0-12.16-0.448-44.352-0.64-87.040-142.464 30.912-172.48-68.672-172.48-68.672-23.296-59.136-56.96-74.88-56.96-74.88-46.4-31.744 3.584-31.104 3.584-31.104 51.392 3.584 78.4 52.736 78.4 52.736 45.696 78.272 119.872 55.68 149.12 42.56 4.608-33.088 17.792-55.68 32.448-68.48-113.728-12.8-233.216-56.832-233.216-252.992 0-55.872 19.84-101.568 52.672-137.408-5.76-12.928-23.040-64.96 4.48-135.488 0 0 42.88-13.76 140.8 52.48 40.96-11.392 84.48-17.024 128-17.28 43.52 0.256 87.040 5.888 128 17.28 97.28-66.24 140.16-52.48 140.16-52.48 27.52 70.528 10.24 122.56 5.12 135.488 32.64 35.84 52.48 81.536 52.48 137.408 0 196.672-119.68 240-233.6 252.608 17.92 15.36 34.56 46.72 34.56 94.72 0 68.48-0.64 123.52-0.64 140.16 0 13.44 8.96 29.44 35.2 24.32 204.864-67.136 351.424-259.136 351.424-485.056 0-282.752-229.248-512-512-512z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["brand","github"],"grid":0},"attrs":[{}],"properties":{"order":77,"id":25,"name":"github","prevSize":24,"code":59713},"setIdx":0,"setId":1,"iconIdx":102},{"icon":{"paths":["M512 512h-204.8v51.2h204.8v-51.2zM768 153.6h-51.2c0-28.314-22.886-51.2-51.2-51.2h-307.2c-28.314 0-51.2 22.886-51.2 51.2h-51.2c-28.314 0-51.2 22.886-51.2 51.2v665.6c0 28.314 22.886 51.2 51.2 51.2h512c28.314 0 51.2-22.886 51.2-51.2v-665.6c0-28.314-22.886-51.2-51.2-51.2zM358.4 153.6h307.2v51.2h-307.2v-51.2zM768 819.2c0 28.314-22.886 51.2-51.2 51.2h-409.6c-28.314 0-51.2-22.886-51.2-51.2v-563.2c0-28.314 22.886-51.2 51.2-51.2 0 28.314 22.886 51.2 51.2 51.2h307.2c28.314 0 51.2-22.886 51.2-51.2 28.314 0 51.2 22.886 51.2 51.2v563.2zM307.2 460.8h409.6v-51.2h-409.6v51.2zM307.2 665.6h409.6v-51.2h-409.6v51.2z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["help"],"grid":0},"attrs":[{}],"properties":{"order":19,"id":26,"name":"help","prevSize":24,"code":59673},"setIdx":0,"setId":1,"iconIdx":103},{"icon":{"paths":["M512 0c-169.421 0-307.2 137.779-307.2 307.2 0 78.643 15.258 164.915 45.261 256.41 23.859 72.55 56.986 148.582 98.56 226.099 70.707 131.635 140.339 220.774 143.309 224.512 4.813 6.195 12.288 9.779 20.070 9.779 7.834 0 15.258-3.584 20.122-9.779 2.97-3.686 72.602-92.826 143.309-224.512 41.574-77.517 74.701-153.549 98.56-226.099 29.952-91.494 45.21-177.766 45.21-256.41 0-169.421-137.83-307.2-307.2-307.2zM630.682 764.672c-46.234 86.374-92.979 154.982-118.682 190.822-25.6-35.635-72.038-103.885-118.221-189.952-62.874-117.146-137.779-291.738-137.779-458.342 0-141.158 114.842-256 256-256s256 114.842 256 256c0 166.298-74.65 340.582-137.318 457.472zM512 153.6c-84.685 0-153.6 68.915-153.6 153.6s68.915 153.6 153.6 153.6 153.6-68.915 153.6-153.6-68.915-153.6-153.6-153.6zM512 409.6c-56.525 0-102.4-45.875-102.4-102.4 0-56.474 45.875-102.4 102.4-102.4 56.474 0 102.4 45.926 102.4 102.4 0 56.525-45.926 102.4-102.4 102.4z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["location"],"grid":0},"attrs":[{}],"properties":{"order":25,"id":27,"name":"location, control-Map, type-Geolocation","prevSize":24,"code":59675},"setIdx":0,"setId":1,"iconIdx":104},{"icon":{"paths":["M512.273 83.782c-0.141 0.056-182.959 84.073-229.418 256.782-4.481 16.584 32.696 9.296 31.036 27.527-2.034 22.136-44.668 31.201-39.109 94.764 5.659 64.734 60.321 130.141 68.527 169.673v27.655c-0.497 8.54-4.566 31.715-18.018 43.036-7.378 6.19-17.322 8.421-30.436 6.782-18.205-2.275-25.449-14.468-28.345-24.309-4.753-16.218-0.322-35.123 10.345-44 10.724-8.924 12.17-24.842 3.236-35.564-8.934-10.712-24.858-12.161-35.582-3.218-25.995 21.64-36.887 61.52-26.491 97 9.815 33.392 36.197 55.884 70.6 60.182 4.903 0.609 9.566 0.909 14 0.909 26.623 0 44.661-10.175 55.582-19.455 32.866-27.97 35.449-74.593 35.636-79.818 0.009-0.309 0.018-0.618 0.018-0.927v-21.218h0.109v-1.418c0-12.351 10.008-22.364 22.382-22.364 11.944 0 21.609 9.346 22.273 21.109v202.491c-0.206 2.912-2.536 29.892-17.891 42.945-7.368 6.274-17.384 8.53-30.545 6.873-18.214-2.275-25.476-14.468-28.364-24.291-4.762-16.228-0.322-35.151 10.345-44.018 10.724-8.933 12.188-24.833 3.255-35.564-8.924-10.694-24.876-12.161-35.6-3.218-26.013 21.631-36.887 61.52-26.491 97 9.796 33.392 36.197 55.893 70.6 60.2 4.903 0.609 9.566 0.891 14 0.891 26.623 0 44.671-10.156 55.564-19.436 32.875-27.97 35.458-74.611 35.636-79.836 0.019-0.328 0.018-0.609 0.018-0.909v-225.636l0.127-0.055v-1c0-12.595 10.219-22.8 22.836-22.8 12.349 0 22.333 9.824 22.727 22.073v227.418c0 0.309-0 0.591 0.018 0.909 0.187 5.216 2.779 51.866 35.655 79.836 10.912 9.28 28.959 19.436 55.582 19.436 4.443 0 9.088-0.282 13.982-0.891 34.394-4.307 60.804-26.818 70.6-60.2 10.405-35.48-0.487-75.36-26.491-97-10.743-8.943-26.676-7.466-35.6 3.218-8.934 10.74-7.488 26.63 3.236 35.564 10.668 8.868 15.135 27.79 10.364 44.018-2.878 9.823-10.159 22.015-28.364 24.291-13.105 1.648-23.050-0.592-30.418-6.782-13.508-11.358-17.558-34.657-18.036-43v-201.818c0.297-12.093 10.14-21.818 22.327-21.818 12.374 0 22.4 10.003 22.4 22.364v1.418h0.073v21.218c0 0.318-0 0.628 0.018 0.927 0.178 5.216 2.779 51.848 35.655 79.818 10.912 9.28 28.941 19.455 55.564 19.455 4.434 0 9.107-0.292 14-0.891 34.394-4.298 60.786-26.818 70.582-60.2 10.405-35.48-0.487-75.351-26.491-97-10.743-8.933-26.667-7.476-35.582 3.236-8.943 10.722-7.488 26.622 3.236 35.545 10.668 8.877 15.117 27.8 10.345 44.018-2.878 9.842-10.159 22.025-28.364 24.291-13.086 1.648-23.050-0.583-30.418-6.764-13.508-11.368-17.549-34.675-18.018-43v-21.018c5.305-54.103 63.095-107.777 69.091-176.364 5.531-63.563-37.121-72.627-39.145-94.764-1.669-18.232 35.498-10.944 31.036-27.527-46.468-172.709-229.269-256.726-229.4-256.782z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["logo"],"grid":0},"attrs":[{}],"properties":{"order":31,"id":28,"name":"logo","prevSize":24,"code":59676},"setIdx":0,"setId":1,"iconIdx":105},{"icon":{"paths":["M947.2 0h-870.4c-42.342 0-76.8 34.458-76.8 76.8v870.4c0 42.342 34.458 76.8 76.8 76.8h870.4c42.342 0 76.8-34.458 76.8-76.8v-870.4c0-42.342-34.458-76.8-76.8-76.8zM972.8 947.2c0 14.157-11.443 25.6-25.6 25.6h-870.4c-14.131 0-25.6-11.443-25.6-25.6v-870.4c0-14.131 11.469-25.6 25.6-25.6h870.4c14.157 0 25.6 11.469 25.6 25.6v870.4zM665.6 460.8c56.448 0 102.4-45.926 102.4-102.4s-45.952-102.4-102.4-102.4c-56.448 0-102.4 45.926-102.4 102.4s45.952 102.4 102.4 102.4zM665.6 307.2c28.211 0 51.2 22.989 51.2 51.2s-22.989 51.2-51.2 51.2c-28.211 0-51.2-22.989-51.2-51.2s22.989-51.2 51.2-51.2zM896 102.4h-768c-14.131 0-25.6 11.469-25.6 25.6v614.4c0 14.157 11.469 25.6 25.6 25.6h768c14.157 0 25.6-11.443 25.6-25.6v-614.4c0-14.131-11.443-25.6-25.6-25.6zM153.6 716.8v-118.246l164.301-184.858c4.198-4.787 9.728-7.373 15.462-7.475 5.734-0.051 11.29 2.458 15.642 7.040l283.238 303.539h-478.643zM870.4 716.8h-168.090l-315.853-338.432c-14.285-15.334-33.331-23.603-53.709-23.347-20.326 0.256-39.219 9.011-53.094 24.627l-126.054 141.798v-367.846h716.8v563.2z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["media"],"grid":0},"attrs":[{}],"properties":{"order":30,"id":29,"name":"media, type-Assets, trigger-AssetChanged, control-StockPhoto","prevSize":24,"code":59677},"setIdx":0,"setId":1,"iconIdx":106},{"icon":{"paths":["M128 384c-70.656 0-128 57.344-128 128s57.344 128 128 128c70.656 0 128-57.344 128-128s-57.344-128-128-128zM512 384c-70.656 0-128 57.344-128 128s57.344 128 128 128c70.656 0 128-57.344 128-128s-57.344-128-128-128zM896 384c-70.656 0-128 57.344-128 128s57.344 128 128 128c70.656 0 128-57.344 128-128s-57.344-128-128-128z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["more"],"grid":0},"attrs":[{}],"properties":{"order":34,"id":30,"name":"more, dots","prevSize":24,"code":59678},"setIdx":0,"setId":1,"iconIdx":107},{"icon":{"paths":["M877.12 311.104l-66.304 66.368-228.224-228.224 66.368-66.368c25.216-25.152 66.048-25.152 91.264 0l136.896 137.024c25.216 25.216 25.216 65.984 0 91.2zM760.896 427.392l-386.176 386.112c-25.216 25.28-66.048 25.28-91.264 0l-136.96-136.896c-25.216-25.28-25.216-66.112 0-91.264l386.24-386.24 228.16 228.288zM64 896v-191.872l191.936 191.872h-191.936z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["pencil"],"grid":0},"attrs":[{}],"properties":{"order":47,"id":31,"name":"pencil","prevSize":24,"code":59679},"setIdx":0,"setId":1,"iconIdx":108},{"icon":{"paths":["M892.083 131.917c-73.523-73.498-193.152-73.498-266.65 0l-157.184 157.107c-9.958 10.035-9.958 26.214 0 36.275 10.061 9.984 26.24 9.984 36.25 0l157.133-157.107c53.504-53.555 140.672-53.555 194.176 0 53.581 53.504 53.581 140.672 0 194.176l-186.138 186.163c-53.53 53.581-140.672 53.581-194.176 0-10.086-10.010-26.24-10.010-36.275 0-10.035 10.086-10.035 26.189 0 36.25 36.787 36.736 84.992 55.117 133.325 55.117s96.589-18.432 133.376-55.117l186.163-186.214c73.498-73.472 73.498-193.152 0-266.65zM519.45 698.726l-157.082 157.082c-53.504 53.555-140.672 53.555-194.176 0-53.581-53.504-53.581-140.672 0-194.176l186.138-186.163c53.53-53.581 140.672-53.581 194.176 0 10.086 9.984 26.189 9.984 36.275 0 10.035-10.086 10.035-26.214 0-36.25-73.549-73.498-193.203-73.498-266.701 0l-186.163 186.163c-73.498 73.574-73.498 193.203 0 266.701 36.787 36.71 85.043 55.117 133.325 55.117 48.333 0 96.538-18.406 133.325-55.117l157.133-157.133c10.010-10.010 10.010-26.189 0-36.224-10.010-9.984-26.189-9.984-36.25 0z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["reference"],"grid":0},"attrs":[{}],"properties":{"order":45,"id":32,"name":"reference","prevSize":24,"code":59680},"setIdx":0,"setId":1,"iconIdx":109},{"icon":{"paths":["M800 1024h-576c-124.8 0-224-99.2-224-224v-300.8c0-124.8 99.2-224 224-224h576c124.8 0 224 99.2 224 224v300.8c0 124.8-99.2 224-224 224zM224 339.2c-89.6 0-160 70.4-160 160v300.8c0 89.6 70.4 160 160 160h576c89.6 0 160-70.4 160-160v-300.8c0-89.6-70.4-160-160-160h-576z","M828.8 201.6h-633.6c-19.2 0-32-12.8-32-32s12.8-32 32-32h630.4c19.2 0 32 12.8 32 32s-12.8 32-28.8 32z","M716.8 64h-409.6c-19.2 0-32-12.8-32-32s12.8-32 32-32h412.8c19.2 0 32 12.8 32 32s-16 32-35.2 32z","M800 416v64c0 48-38.4 83.2-83.2 83.2h-409.6c-44.8 3.2-83.2-35.2-83.2-83.2v-64h-54.4v64c0 76.8 64 140.8 140.8 140.8h406.4c76.8 0 140.8-64 140.8-140.8v-64h-57.6z"],"attrs":[{},{},{},{}],"isMulticolor":false,"isMulticolor2":false,"tags":["schemas"],"grid":0},"attrs":[{},{},{},{}],"properties":{"order":46,"id":33,"name":"schemas, search-Schema","prevSize":24,"code":59681},"setIdx":0,"setId":1,"iconIdx":110},{"icon":{"paths":["M939.776 1003.776c-27.2 27.008-71.232 27.008-98.368 0l-168.96-168.96c-66.176 38.464-142.016 62.080-224 62.080-247.744 0-448.448-200.832-448.448-448.448 0-247.744 200.704-448.448 448.448-448.448 247.68 0 448.512 200.704 448.512 448.448 0 115.136-44.672 218.944-115.904 298.304l158.656 158.656c27.008 27.136 27.008 71.168 0.064 98.368zM448.448 128.128c-176.896 0-320.32 143.36-320.32 320.32s143.424 320.32 320.32 320.32c176.96 0 320.384-143.36 320.384-320.32s-143.488-320.32-320.384-320.32z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["search"],"grid":0},"attrs":[{}],"properties":{"order":23,"id":34,"name":"search","prevSize":24,"code":59682},"setIdx":0,"setId":1,"iconIdx":111},{"icon":{"paths":["M1019.11 440.755c-1.946-13.747-14.438-23.398-28.16-21.888-16.947 1.843-34.253-0.589-50.048-7.091-52.25-21.504-77.261-81.459-55.757-133.709 6.605-15.846 16.947-29.85 30.208-40.602 10.803-8.653 12.698-24.294 4.352-35.354-28.902-37.99-62.797-71.706-100.838-100.045-10.701-8.090-25.805-6.451-34.662 3.661-28.8 33.254-75.546 44.262-116.198 27.546-40.704-16.742-66.099-57.498-63.206-101.453 0.845-13.338-8.755-25.19-21.99-27.008-47.002-6.605-94.797-6.605-142.054 0.077-13.722 1.946-23.398 14.387-21.862 28.211 1.843 16.896-0.614 34.202-7.168 49.997-21.504 52.25-81.408 77.21-133.632 55.706-15.821-6.502-29.85-16.947-40.602-30.157-8.653-10.752-24.32-12.698-35.379-4.301-37.99 28.851-71.68 62.694-100.045 100.762-8.090 10.701-6.451 25.83 3.635 34.637 33.28 28.902 44.288 75.597 27.546 116.301-16.742 40.653-57.498 66.048-101.427 63.155-13.363-0.845-25.19 8.755-26.982 21.99-6.63 47.002-6.63 94.822 0.102 142.080 1.946 13.696 14.387 23.322 28.16 21.811 16.896-1.818 34.202 0.691 50.022 7.168 52.224 21.53 77.21 81.459 55.706 133.734-6.502 15.795-16.947 29.773-30.157 40.525-10.803 8.73-12.698 24.346-4.352 35.354 28.877 38.042 62.822 71.731 100.813 100.122 1.741 1.357 3.661 2.355 5.606 3.2 9.933 4.045 21.709 1.536 29.082-6.938 28.826-33.178 75.571-44.262 116.275-27.52 40.653 16.742 66.048 57.498 63.13 101.453-0.819 13.338 8.755 25.165 22.067 27.059 47.002 6.579 94.72 6.554 142.029-0.102 13.645-1.971 23.347-14.464 21.811-28.237-1.843-16.947 0.691-34.253 7.194-50.048 21.504-52.25 81.459-77.21 133.658-55.68 15.795 6.528 29.85 16.947 40.55 30.157 8.704 10.803 24.346 12.698 35.405 4.326 37.99-28.902 71.654-62.746 100.096-100.813 7.987-10.675 6.4-25.805-3.712-34.662-33.254-28.826-44.288-75.571-27.546-116.224 16.742-40.73 57.498-66.099 101.453-63.232 13.338 0.922 25.139-8.678 27.008-21.965 6.554-47.002 6.502-94.771-0.128-142.003zM971.059 554.010c-56.141 5.274-105.702 41.114-127.642 94.464s-12.058 113.613 24.090 156.902c-17.69 21.478-37.453 41.318-58.854 59.315-12.749-11.213-27.392-20.352-43.238-26.854-78.259-32.282-168.243 5.197-200.499 83.584-6.502 15.718-10.291 32.563-11.29 49.536-27.853 2.56-55.859 2.637-83.61 0.077-5.274-56.090-41.114-105.677-94.464-127.616-53.35-21.99-113.613-11.981-156.928 24.064-21.504-17.69-41.318-37.453-59.29-58.88 11.213-12.723 20.352-27.392 26.906-43.136 32.205-78.387-5.274-168.294-83.584-200.55-15.821-6.502-32.589-10.342-49.613-11.366-2.534-27.853-2.586-55.859 0-83.558 56.090-5.299 105.626-41.088 127.565-94.438 21.965-53.402 12.058-113.638-24.090-156.902 17.69-21.555 37.478-41.395 58.88-59.341 12.749 11.213 27.392 20.352 43.213 26.854 78.285 32.256 168.218-5.248 200.474-83.558 6.528-15.795 10.342-32.589 11.366-49.613 27.853-2.509 55.808-2.56 83.558 0 5.299 56.090 41.139 105.6 94.49 127.59 53.35 21.939 113.638 12.006 156.902-24.090 21.504 17.741 41.293 37.453 59.29 58.854-11.213 12.8-20.352 27.392-26.854 43.213-32.256 78.31 5.248 168.294 83.507 200.499 15.846 6.502 32.691 10.342 49.638 11.392 2.56 27.853 2.611 55.808 0.077 83.558zM512 307.2c-113.101 0-204.8 91.699-204.8 204.8 0 113.126 91.699 204.826 204.8 204.826s204.8-91.699 204.8-204.826c0-113.101-91.699-204.8-204.8-204.8zM512 665.626c-84.813 0-153.6-68.813-153.6-153.626 0-84.838 68.787-153.6 153.6-153.6 84.838 0 153.6 68.762 153.6 153.6 0 84.813-68.762 153.626-153.6 153.626z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["settings"],"grid":0},"attrs":[{}],"properties":{"order":22,"id":35,"name":"settings, search-Setting","prevSize":24,"code":59683},"setIdx":0,"setId":1,"iconIdx":112},{"icon":{"paths":["M77.005 102.605h128v332.8c0 14.131 11.418 25.6 25.6 25.6 14.106 0 25.6-11.469 25.6-25.6v-332.8h128c14.106 0 25.6-11.469 25.6-25.6 0-14.157-11.494-25.6-25.6-25.6h-307.2c-14.182 0-25.6 11.443-25.6 25.6 0 14.106 11.418 25.6 25.6 25.6zM947.405 716.979h-179.2v-102.4h179.2c14.157 0 25.6-11.443 25.6-25.6s-11.443-25.6-25.6-25.6h-204.8c-14.182 0-25.6 11.443-25.6 25.6v358.4c0 14.157 11.418 25.6 25.6 25.6 14.157 0 25.6-11.443 25.6-25.6v-179.2h179.2c14.157 0 25.6-11.443 25.6-25.6s-11.494-25.6-25.6-25.6zM965.094 58.47c-9.958-9.933-26.112-9.933-36.045 0l-870.605 870.579c-9.958 9.984-9.958 26.086 0 36.045 10.010 9.984 26.112 9.984 36.045 0l870.605-870.579c9.958-9.933 9.958-26.086 0-36.045z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["type-boolean"],"grid":0},"attrs":[{}],"properties":{"order":21,"id":36,"name":"type-Boolean","prevSize":24,"code":59684},"setIdx":0,"setId":1,"iconIdx":113},{"icon":{"paths":["M947.2 102.4h-128v-25.6c0-14.131-11.469-25.6-25.6-25.6s-25.6 11.469-25.6 25.6v25.6h-512v-25.6c0-14.131-11.52-25.6-25.6-25.6s-25.6 11.469-25.6 25.6v25.6h-128c-42.342 0-76.8 34.458-76.8 76.8v716.8c0 42.342 34.458 76.8 76.8 76.8h870.4c42.342 0 76.8-34.458 76.8-76.8v-716.8c0-42.342-34.458-76.8-76.8-76.8zM972.8 896c0 14.131-11.469 25.6-25.6 25.6h-870.4c-14.080 0-25.6-11.469-25.6-25.6v-537.6h921.6v537.6zM972.8 307.2h-921.6v-128c0-14.080 11.52-25.6 25.6-25.6h128v76.8c0 14.080 11.52 25.6 25.6 25.6s25.6-11.52 25.6-25.6v-76.8h512v76.8c0 14.080 11.469 25.6 25.6 25.6s25.6-11.52 25.6-25.6v-76.8h128c14.131 0 25.6 11.52 25.6 25.6v128zM332.8 512h51.2c14.080 0 25.6-11.52 25.6-25.6s-11.52-25.6-25.6-25.6h-51.2c-14.080 0-25.6 11.52-25.6 25.6s11.52 25.6 25.6 25.6zM486.4 512h51.2c14.131 0 25.6-11.52 25.6-25.6s-11.469-25.6-25.6-25.6h-51.2c-14.080 0-25.6 11.52-25.6 25.6s11.52 25.6 25.6 25.6zM640 512h51.2c14.131 0 25.6-11.52 25.6-25.6s-11.469-25.6-25.6-25.6h-51.2c-14.131 0-25.6 11.52-25.6 25.6s11.469 25.6 25.6 25.6zM793.6 512h51.2c14.131 0 25.6-11.52 25.6-25.6s-11.469-25.6-25.6-25.6h-51.2c-14.131 0-25.6 11.52-25.6 25.6s11.469 25.6 25.6 25.6zM179.2 614.4h51.2c14.080 0 25.6-11.469 25.6-25.6s-11.52-25.6-25.6-25.6h-51.2c-14.080 0-25.6 11.469-25.6 25.6s11.52 25.6 25.6 25.6zM332.8 614.4h51.2c14.080 0 25.6-11.469 25.6-25.6s-11.52-25.6-25.6-25.6h-51.2c-14.080 0-25.6 11.469-25.6 25.6s11.52 25.6 25.6 25.6zM486.4 614.4h51.2c14.131 0 25.6-11.469 25.6-25.6s-11.469-25.6-25.6-25.6h-51.2c-14.080 0-25.6 11.469-25.6 25.6s11.52 25.6 25.6 25.6zM640 614.4h51.2c14.131 0 25.6-11.469 25.6-25.6s-11.469-25.6-25.6-25.6h-51.2c-14.131 0-25.6 11.469-25.6 25.6s11.469 25.6 25.6 25.6zM793.6 614.4h51.2c14.131 0 25.6-11.469 25.6-25.6s-11.469-25.6-25.6-25.6h-51.2c-14.131 0-25.6 11.469-25.6 25.6s11.469 25.6 25.6 25.6zM179.2 716.8h51.2c14.080 0 25.6-11.469 25.6-25.6s-11.52-25.6-25.6-25.6h-51.2c-14.080 0-25.6 11.469-25.6 25.6s11.52 25.6 25.6 25.6zM332.8 716.8h51.2c14.080 0 25.6-11.469 25.6-25.6s-11.52-25.6-25.6-25.6h-51.2c-14.080 0-25.6 11.469-25.6 25.6s11.52 25.6 25.6 25.6zM486.4 716.8h51.2c14.131 0 25.6-11.469 25.6-25.6s-11.469-25.6-25.6-25.6h-51.2c-14.080 0-25.6 11.469-25.6 25.6s11.52 25.6 25.6 25.6zM640 716.8h51.2c14.131 0 25.6-11.469 25.6-25.6s-11.469-25.6-25.6-25.6h-51.2c-14.131 0-25.6 11.469-25.6 25.6s11.469 25.6 25.6 25.6zM793.6 716.8h51.2c14.131 0 25.6-11.469 25.6-25.6s-11.469-25.6-25.6-25.6h-51.2c-14.131 0-25.6 11.469-25.6 25.6s11.469 25.6 25.6 25.6zM179.2 819.2h51.2c14.080 0 25.6-11.469 25.6-25.6s-11.52-25.6-25.6-25.6h-51.2c-14.080 0-25.6 11.469-25.6 25.6s11.52 25.6 25.6 25.6zM332.8 819.2h51.2c14.080 0 25.6-11.469 25.6-25.6s-11.52-25.6-25.6-25.6h-51.2c-14.080 0-25.6 11.469-25.6 25.6s11.52 25.6 25.6 25.6zM486.4 819.2h51.2c14.131 0 25.6-11.469 25.6-25.6s-11.469-25.6-25.6-25.6h-51.2c-14.080 0-25.6 11.469-25.6 25.6s11.52 25.6 25.6 25.6zM640 819.2h51.2c14.131 0 25.6-11.469 25.6-25.6s-11.469-25.6-25.6-25.6h-51.2c-14.131 0-25.6 11.469-25.6 25.6s11.469 25.6 25.6 25.6zM793.6 819.2h51.2c14.131 0 25.6-11.469 25.6-25.6s-11.469-25.6-25.6-25.6h-51.2c-14.131 0-25.6 11.469-25.6 25.6s11.469 25.6 25.6 25.6z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["type-datetime"],"grid":0},"attrs":[{}],"properties":{"order":24,"id":37,"name":"type-DateTime","prevSize":24,"code":59685},"setIdx":0,"setId":1,"iconIdx":114},{"icon":{"paths":["M179.2 256c0-28.262 22.938-51.2 51.2-51.2h25.6c14.157 0 25.6-11.443 25.6-25.6 0-14.131-11.443-25.6-25.6-25.6h-25.6c-56.55 0-102.4 45.85-102.4 102.4v179.2c0 28.262-22.938 51.2-51.2 51.2h-25.6c-14.157 0-25.6 11.469-25.6 25.6 0 14.157 11.443 25.6 25.6 25.6h25.6c28.262 0 51.2 22.938 51.2 51.2v179.2c0 56.55 45.85 102.4 102.4 102.4h25.6c14.157 0 25.6-11.443 25.6-25.6s-11.443-25.6-25.6-25.6h-25.6c-28.262 0-51.2-22.938-51.2-51.2v-179.2c0-30.746-13.85-58.061-35.328-76.8 21.478-18.765 35.328-46.029 35.328-76.8v-179.2zM972.8 486.4h-25.6c-28.262 0-51.2-22.938-51.2-51.2v-179.2c0-56.55-45.85-102.4-102.4-102.4h-25.6c-14.157 0-25.6 11.469-25.6 25.6 0 14.157 11.443 25.6 25.6 25.6h25.6c28.262 0 51.2 22.938 51.2 51.2v179.2c0 30.771 13.85 58.035 35.328 76.8-21.478 18.739-35.328 46.054-35.328 76.8v179.2c0 28.262-22.938 51.2-51.2 51.2h-25.6c-14.157 0-25.6 11.443-25.6 25.6s11.443 25.6 25.6 25.6h25.6c56.55 0 102.4-45.85 102.4-102.4v-179.2c0-28.262 22.938-51.2 51.2-51.2h25.6c14.157 0 25.6-11.443 25.6-25.6 0-14.131-11.443-25.6-25.6-25.6zM512 332.8c-14.157 0-25.6 11.469-25.6 25.6 0 14.157 11.443 25.6 25.6 25.6s25.6-11.443 25.6-25.6c0-14.131-11.443-25.6-25.6-25.6zM512 435.2c-14.157 0-25.6 11.469-25.6 25.6v204.8c0 14.157 11.443 25.6 25.6 25.6s25.6-11.443 25.6-25.6v-204.8c0-14.131-11.443-25.6-25.6-25.6z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["json"],"grid":0},"attrs":[{}],"properties":{"order":20,"id":38,"name":"type-Json, json","prevSize":24,"code":59674},"setIdx":0,"setId":1,"iconIdx":115},{"icon":{"paths":["M256 665.6h-76.8v-332.8c0-14.131-11.469-25.6-25.6-25.6h-76.8c-14.131 0-25.6 11.469-25.6 25.6s11.469 25.6 25.6 25.6h51.2v307.2h-76.8c-14.131 0-25.6 11.469-25.6 25.6s11.469 25.6 25.6 25.6h204.8c14.131 0 25.6-11.469 25.6-25.6s-11.469-25.6-25.6-25.6zM614.4 307.2h-204.8c-14.131 0-25.6 11.469-25.6 25.6s11.469 25.6 25.6 25.6h179.2v128h-179.2c-14.131 0-25.6 11.469-25.6 25.6v179.2c0 14.131 11.469 25.6 25.6 25.6h204.8c14.131 0 25.6-11.469 25.6-25.6s-11.469-25.6-25.6-25.6h-179.2v-128h179.2c14.131 0 25.6-11.469 25.6-25.6v-179.2c0-14.131-11.469-25.6-25.6-25.6zM972.8 307.2h-204.8c-14.131 0-25.6 11.469-25.6 25.6s11.469 25.6 25.6 25.6h179.2v128h-179.2c-14.131 0-25.6 11.469-25.6 25.6s11.469 25.6 25.6 25.6h179.2v128h-179.2c-14.131 0-25.6 11.469-25.6 25.6s11.469 25.6 25.6 25.6h204.8c14.131 0 25.6-11.469 25.6-25.6v-358.4c0-14.131-11.469-25.6-25.6-25.6z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["type-number"],"grid":0},"attrs":[{}],"properties":{"order":32,"id":39,"name":"type-Number","prevSize":24,"code":59686},"setIdx":0,"setId":1,"iconIdx":116},{"icon":{"paths":["M870.4 921.6h-716.8c-14.131 0-25.6 11.443-25.6 25.6s11.469 25.6 25.6 25.6h716.8c14.157 0 25.6-11.443 25.6-25.6s-11.443-25.6-25.6-25.6zM194.688 817.152c13.030 5.555 28.083-0.461 33.613-13.44l125.030-291.712h317.338l125.005 291.712c4.173 9.677 13.568 15.488 23.526 15.488 3.405 0 6.81-0.64 10.112-2.048 13.005-5.606 18.995-20.659 13.44-33.638l-131.61-306.944c-0.051-0.051-0.051-0.154-0.102-0.205l-175.488-409.6c-4.045-9.472-13.312-15.565-23.552-15.565s-19.507 6.093-23.552 15.514l-175.488 409.6c-0.051 0.051-0.051 0.154-0.102 0.205l-131.61 306.97c-5.53 13.005 0.461 28.058 13.44 33.664zM512 141.773l136.704 319.027h-273.408l136.704-319.027z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["type-string"],"grid":0},"attrs":[{}],"properties":{"order":48,"id":40,"name":"type-String","prevSize":24,"code":59687},"setIdx":0,"setId":1,"iconIdx":117},{"icon":{"paths":["M955.221 848c0-0.109 10.752 0 0 0-52.751-161.392-240.461-224-443.178-224-202.269 0-389.979 63.392-443.066 224-11.2-0.109 0-1.232 0 0 0 61.936 49.615 112 110.654 112h664.823c61.151 0 110.766-50.064 110.766-112zM290.399 288c0 123.648 99.231 336 221.645 336s221.645-212.352 221.645-336c0-123.648-99.231-224-221.645-224s-221.645 100.352-221.645 224z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["user"],"grid":0},"attrs":[{}],"properties":{"order":33,"id":41,"name":"user","prevSize":24,"code":59688},"setIdx":0,"setId":1,"iconIdx":118},{"icon":{"paths":["M469.333 614.997v281.003c0 23.552 19.115 42.667 42.667 42.667s42.667-19.115 42.667-42.667v-281.003l97.835 97.835c16.683 16.683 43.691 16.683 60.331 0s16.683-43.691 0-60.331l-170.667-170.667c-0.085-0.085-0.171-0.171-0.256-0.256-4.053-3.968-8.661-6.955-13.568-9.003-5.12-2.133-10.624-3.2-16.085-3.243-0.171 0-0.341 0-0.469 0-5.461 0.043-10.965 1.109-16.085 3.243-4.949 2.048-9.557 5.035-13.568 9.003-0.085 0.085-0.171 0.171-0.256 0.256l-170.667 170.667c-16.683 16.683-16.683 43.691 0 60.331s43.691 16.683 60.331 0zM890.411 822.101c30.379-16.555 56.149-38.443 76.672-63.915 21.333-26.411 36.949-56.619 46.379-88.576s12.629-65.835 9.003-99.584c-3.456-32.512-13.269-64.896-29.824-95.232-14.208-26.069-32.384-48.768-53.376-67.669-21.717-19.541-46.421-34.944-72.875-45.952-30.891-12.8-64.171-19.584-98.048-19.84h-22.528c-13.312-37.717-32.085-72.235-55.168-102.912-30.635-40.661-68.821-74.453-111.915-99.84s-91.179-42.411-141.568-49.536c-48.597-6.784-99.243-4.395-149.504 8.619s-95.744 35.413-134.912 64.939c-40.661 30.635-74.453 68.821-99.84 111.915s-42.411 91.179-49.493 141.568c-6.827 48.555-4.395 99.2 8.576 149.461 15.872 61.312 45.781 115.627 84.267 158.421 15.744 17.536 42.752 18.944 60.245 3.2s18.944-42.752 3.2-60.245c-29.355-32.64-52.693-74.667-65.109-122.752-10.155-39.253-11.989-78.592-6.699-116.224 5.504-39.125 18.773-76.501 38.571-110.123s46.080-63.317 77.653-87.083c30.379-22.869 65.664-40.32 104.917-50.475s78.592-11.989 116.224-6.699c39.125 5.504 76.544 18.731 110.123 38.528s63.317 46.080 87.083 77.653c22.869 30.379 40.32 65.664 50.475 104.917 4.907 18.56 21.547 32 41.301 32h53.461c22.869 0.171 45.269 4.736 65.92 13.312 17.707 7.339 34.133 17.621 48.512 30.592 13.909 12.501 25.984 27.605 35.541 45.099 11.093 20.352 17.579 41.899 19.883 63.488 2.389 22.443 0.256 45.013-6.016 66.432s-16.725 41.515-30.933 59.093c-13.611 16.896-30.763 31.445-51.115 42.581-20.693 11.264-28.331 37.205-17.024 57.899s37.205 28.331 57.899 17.024z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["upload-cloud"],"grid":0},"attrs":[{}],"properties":{"order":1,"id":2,"prevSize":24,"code":59763,"name":"upload-3"},"setIdx":0,"setId":1,"iconIdx":119},{"icon":{"paths":["M853.333 640v170.667c0 5.845-1.152 11.349-3.2 16.299-2.133 5.205-5.333 9.899-9.301 13.867s-8.661 7.125-13.867 9.301c-4.949 2.048-10.453 3.2-16.299 3.2h-597.333c-5.845 0-11.349-1.152-16.299-3.2-5.205-2.133-9.899-5.333-13.867-9.301s-7.125-8.661-9.301-13.867c-2.048-4.949-3.2-10.453-3.2-16.299v-170.667c0-23.552-19.115-42.667-42.667-42.667s-42.667 19.115-42.667 42.667v170.667c0 17.28 3.456 33.835 9.728 48.981 6.485 15.701 16 29.781 27.776 41.557s25.856 21.291 41.557 27.776c15.104 6.229 31.659 9.685 48.939 9.685h597.333c17.28 0 33.835-3.456 48.981-9.728 15.701-6.485 29.781-16 41.557-27.776s21.291-25.856 27.776-41.557c6.229-15.104 9.685-31.659 9.685-48.939v-170.667c0-23.552-19.115-42.667-42.667-42.667s-42.667 19.115-42.667 42.667zM469.333 230.997v409.003c0 23.552 19.115 42.667 42.667 42.667s42.667-19.115 42.667-42.667v-409.003l140.501 140.501c16.683 16.683 43.691 16.683 60.331 0s16.683-43.691 0-60.331l-213.333-213.333c-0.043-0.043-0.128-0.085-0.171-0.171-4.053-4.011-8.704-7.040-13.653-9.088-10.453-4.309-22.229-4.309-32.683 0-4.949 2.048-9.6 5.077-13.653 9.088-0.043 0.043-0.128 0.085-0.171 0.171l-213.333 213.333c-16.683 16.683-16.683 43.691 0 60.331s43.691 16.683 60.331 0z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["upload"],"grid":0},"attrs":[{}],"properties":{"order":1,"id":1,"prevSize":24,"code":59761,"name":"upload-4"},"setIdx":0,"setId":1,"iconIdx":120},{"icon":{"paths":["M621.254 877.254l320-320c24.994-24.992 24.994-65.516 0-90.51l-320-320c-24.994-24.992-65.516-24.992-90.51 0-24.994 24.994-24.994 65.516 0 90.51l210.746 210.746h-613.49c-35.346 0-64 28.654-64 64s28.654 64 64 64h613.49l-210.746 210.746c-12.496 12.496-18.744 28.876-18.744 45.254s6.248 32.758 18.744 45.254c24.994 24.994 65.516 24.994 90.51 0z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["arrow-right","right","next"],"grid":16},"attrs":[{}],"properties":{"order":1,"id":1,"prevSize":32,"code":59766,"name":"arrow-right"},"setIdx":0,"setId":1,"iconIdx":121},{"icon":{"paths":["M448 576h128v-256h192l-256-256-256 256h192zM640 432v98.712l293.066 109.288-421.066 157.018-421.066-157.018 293.066-109.288v-98.712l-384 144v256l512 192 512-192v-256z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["upload","load","arrow"],"grid":16},"attrs":[{}],"properties":{"order":1,"id":0,"prevSize":32,"code":59760,"name":"upload"},"setIdx":0,"setId":1,"iconIdx":122},{"icon":{"paths":["M585.143 548.557c0 9.728-3.986 18.871-10.862 25.71l-256 256c-6.839 6.839-16.018 10.862-25.71 10.862s-18.871-3.986-25.71-10.862l-256-256c-6.839-6.839-10.862-16.018-10.862-25.71 0-20.005 16.567-36.571 36.571-36.571h512c20.005 0 36.571 16.567 36.571 36.571z","M585.143 219.443c0 9.728-3.986 18.871-10.862 25.71l-256 256c-6.839 6.839-16.018 10.862-25.71 10.862s-18.871-3.986-25.71-10.862l-256-256c-6.839-6.839-10.862-16.018-10.862-25.71 0-20.005 16.567-36.571 36.571-36.571h512c20.005 0 36.571 16.567 36.571 36.571z"],"width":585,"attrs":[{},{}],"isMulticolor":false,"isMulticolor2":false,"tags":["caret-bottom"],"grid":16},"attrs":[{},{}],"properties":{"order":125,"id":0,"name":"caret-bottom","prevSize":32,"code":59755},"setIdx":0,"setId":1,"iconIdx":123},{"icon":{"paths":["M585.143 804.577c0 20.005-16.567 36.571-36.571 36.571h-512c-20.005 0-36.571-16.567-36.571-36.571 0-9.728 3.986-18.871 10.862-25.71l256-256c6.839-6.839 16.018-10.862 25.71-10.862s18.871 3.986 25.71 10.862l256 256c6.839 6.839 10.862 16.018 10.862 25.71z","M585.143 475.423c0 20.005-16.567 36.571-36.571 36.571h-512c-20.005 0-36.571-16.567-36.571-36.571 0-9.728 3.986-18.871 10.862-25.71l256-256c6.839-6.839 16.018-10.862 25.71-10.862s18.871 3.986 25.71 10.862l256 256c6.839 6.839 10.862 16.018 10.862 25.71z"],"width":585,"attrs":[{},{}],"isMulticolor":false,"isMulticolor2":false,"tags":["caret-top"],"grid":16},"attrs":[{},{}],"properties":{"order":124,"id":1,"name":"caret-top","prevSize":32,"code":59756},"setIdx":0,"setId":1,"iconIdx":124},{"icon":{"paths":["M256 102.4c-28.314 0-51.2 22.886-51.2 51.2v256h51.2v-256h307.2v153.6c0 28.314 22.886 51.2 51.2 51.2h153.6v512h-512v-460.8h-51.2v460.8c0 28.314 22.886 51.2 51.2 51.2h512c28.314 0 51.2-22.886 51.2-51.2v-548.2l-219.8-219.8h-292.2zM614.4 189.8l117.4 117.4h-117.4z","M408.906 587.72l-35.3-37 138.1-131.9 138 131.9-35.3 37-102.7-98.1z","M511.706 773.12l-138.1-131.9 35.3-37 102.8 98.1 102.7-98.1 35.3 37z"],"attrs":[{},{},{}],"isMulticolor":false,"isMulticolor2":false,"tags":["show"],"grid":16},"attrs":[{},{},{}],"properties":{"order":123,"id":2,"name":"show","prevSize":32,"code":59748},"setIdx":0,"setId":1,"iconIdx":125},{"icon":{"paths":["M256 102.4c-28.314 0-51.2 22.886-51.2 51.2v256h51.2v-256h307.2v153.6c0 28.314 22.886 51.2 51.2 51.2h153.6v512h-512v-460.8h-51.2v460.8c0 28.314 22.886 51.2 51.2 51.2h512c28.314 0 51.2-22.886 51.2-51.2v-548.2l-219.8-219.8h-292.2zM614.4 189.8l117.4 117.4h-117.4z","M348.394 15.988c-28.314 0-51.2 22.886-51.2 51.2v23.7h51.2v-23.7h307.2l204.8 204.8v512h-23.8v51.2h23.8c28.314 0 51.2-22.886 51.2-51.2v-548.2l-219.8-219.8h-292.2z","M408.906 587.72l-35.3-37 138.1-131.9 138 131.9-35.3 37-102.7-98.1z","M511.706 773.12l-138.1-131.9 35.3-37 102.8 98.1 102.7-98.1 35.3 37z"],"attrs":[{},{},{},{}],"isMulticolor":false,"isMulticolor2":false,"tags":["show-all"],"grid":16},"attrs":[{},{},{},{}],"properties":{"order":122,"id":3,"name":"show-all","prevSize":32,"code":59749},"setIdx":0,"setId":1,"iconIdx":126},{"icon":{"paths":["M256 102.4c-28.314 0-51.2 22.886-51.2 51.2v256h51.2v-256h307.2v153.6c0 28.314 22.886 51.2 51.2 51.2h153.6v512h-512v-460.8h-51.2v460.8c0 28.314 22.886 51.2 51.2 51.2h512c28.314 0 51.2-22.886 51.2-51.2v-548.2l-219.8-219.8h-292.2zM614.4 189.8l117.4 117.4h-117.4z","M408.9 418.8l-35.3 37 138 131.9 138.1-131.9-35.3-37-102.8 98.1z","M511.6 604.2l-138 131.9 35.3 37 102.7-98.1 102.8 98.1 35.3-37z"],"attrs":[{},{},{}],"isMulticolor":false,"isMulticolor2":false,"tags":["hide"],"grid":16},"attrs":[{},{},{}],"properties":{"order":121,"id":4,"name":"hide","prevSize":32,"code":59750},"setIdx":0,"setId":1,"iconIdx":127},{"icon":{"paths":["M408.9 418.8l-35.3 37 138.1 131.9 138-131.9-35.3-37-102.7 98.1z","M511.7 604.2l-138.1 131.9 35.3 37 102.8-98.1 102.7 98.1 35.3-37z","M256 102.4c-28.314 0-51.2 22.886-51.2 51.2v256h51.2v-256h307.2v153.6c0 28.314 22.886 51.2 51.2 51.2h153.6v512h-512v-460.8h-51.2v460.8c0 28.314 22.886 51.2 51.2 51.2h512c28.314 0 51.2-22.886 51.2-51.2v-548.2l-219.8-219.8h-292.2zM614.4 189.8l117.4 117.4h-117.4z","M348.394 15.988c-28.314 0-51.2 22.886-51.2 51.2v23.7h51.2v-23.7h307.2l204.8 204.8v512h-23.8v51.2h23.8c28.314 0 51.2-22.886 51.2-51.2v-548.2l-219.8-219.8h-292.2z"],"attrs":[{},{},{},{}],"isMulticolor":false,"isMulticolor2":false,"tags":["hide-all"],"grid":16},"attrs":[{},{},{},{}],"properties":{"order":120,"id":5,"name":"hide-all","prevSize":32,"code":59751},"setIdx":0,"setId":1,"iconIdx":128},{"icon":{"paths":["M512 1024c-136.76 0-265.334-53.258-362.040-149.96-96.702-96.706-149.96-225.28-149.96-362.040 0-96.838 27.182-191.134 78.606-272.692 50-79.296 120.664-143.372 204.356-185.3l43 85.832c-68.038 34.084-125.492 86.186-166.15 150.67-41.746 66.208-63.812 142.798-63.812 221.49 0 229.382 186.618 416 416 416s416-186.618 416-416c0-78.692-22.066-155.282-63.81-221.49-40.66-64.484-98.114-116.584-166.15-150.67l43-85.832c83.692 41.928 154.358 106.004 204.356 185.3 51.422 81.558 78.604 175.854 78.604 272.692 0 136.76-53.258 265.334-149.96 362.040-96.706 96.702-225.28 149.96-362.040 149.96z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["spinner","loading","loading-wheel","busy","wait"],"grid":16},"attrs":[{}],"properties":{"order":1,"id":6,"prevSize":32,"code":59737,"name":"spinner2"},"setIdx":0,"setId":1,"iconIdx":129},{"icon":{"paths":["M1024 397.050l-353.78-51.408-158.22-320.582-158.216 320.582-353.784 51.408 256 249.538-60.432 352.352 316.432-166.358 316.432 166.358-60.434-352.352 256.002-249.538z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["star-full","rate","star","favorite","bookmark"],"grid":16},"attrs":[{}],"properties":{"order":1,"id":7,"prevSize":32,"code":59741,"name":"star-full"},"setIdx":0,"setId":1,"iconIdx":130},{"icon":{"paths":["M1024 397.050l-353.78-51.408-158.22-320.582-158.216 320.582-353.784 51.408 256 249.538-60.432 352.352 316.432-166.358 316.432 166.358-60.434-352.352 256.002-249.538zM512 753.498l-223.462 117.48 42.676-248.83-180.786-176.222 249.84-36.304 111.732-226.396 111.736 226.396 249.836 36.304-180.788 176.222 42.678 248.83-223.462-117.48z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["star-empty","rate","star","favorite","bookmark"],"grid":16},"attrs":[{}],"properties":{"order":2,"id":8,"prevSize":32,"code":59742,"name":"star-empty"},"setIdx":0,"setId":1,"iconIdx":131},{"icon":{"paths":["M1024 226.4c-37.6 16.8-78.2 28-120.6 33 43.4-26 76.6-67.2 92.4-116.2-40.6 24-85.6 41.6-133.4 51-38.4-40.8-93-66.2-153.4-66.2-116 0-210 94-210 210 0 16.4 1.8 32.4 5.4 47.8-174.6-8.8-329.4-92.4-433-219.6-18 31-28.4 67.2-28.4 105.6 0 72.8 37 137.2 93.4 174.8-34.4-1-66.8-10.6-95.2-26.2 0 0.8 0 1.8 0 2.6 0 101.8 72.4 186.8 168.6 206-17.6 4.8-36.2 7.4-55.4 7.4-13.6 0-26.6-1.4-39.6-3.8 26.8 83.4 104.4 144.2 196.2 146-72 56.4-162.4 90-261 90-17 0-33.6-1-50.2-3 93.2 59.8 203.6 94.4 322.2 94.4 386.4 0 597.8-320.2 597.8-597.8 0-9.2-0.2-18.2-0.6-27.2 41-29.4 76.6-66.4 104.8-108.6z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["twitter","brand","tweet","social"],"grid":16},"attrs":[{}],"properties":{"order":1,"id":9,"prevSize":32,"code":59740,"name":"twitter"},"setIdx":0,"setId":1,"iconIdx":132},{"icon":{"paths":["M728.992 512c137.754-87.334 231.008-255.208 231.008-448 0-21.676-1.192-43.034-3.478-64h-889.042c-2.29 20.968-3.48 42.326-3.48 64 0 192.792 93.254 360.666 231.006 448-137.752 87.334-231.006 255.208-231.006 448 0 21.676 1.19 43.034 3.478 64h889.042c2.288-20.966 3.478-42.324 3.478-64 0.002-192.792-93.252-360.666-231.006-448zM160 960c0-186.912 80.162-345.414 224-397.708v-100.586c-143.838-52.29-224-210.792-224-397.706v0h704c0 186.914-80.162 345.416-224 397.706v100.586c143.838 52.294 224 210.796 224 397.708h-704zM619.626 669.594c-71.654-40.644-75.608-93.368-75.626-125.366v-64.228c0-31.994 3.804-84.914 75.744-125.664 38.504-22.364 71.808-56.348 97.048-98.336h-409.582c25.266 42.032 58.612 76.042 97.166 98.406 71.654 40.644 75.606 93.366 75.626 125.366v64.228c0 31.992-3.804 84.914-75.744 125.664-72.622 42.18-126.738 125.684-143.090 226.336h501.67c-16.364-100.708-70.53-184.248-143.212-226.406z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["hour-glass","loading","busy","wait"],"grid":16},"attrs":[{}],"properties":{"order":1,"id":10,"prevSize":32,"code":59732,"name":"hour-glass"},"setIdx":0,"setId":1,"iconIdx":133},{"icon":{"paths":["M192 512c0-12.18 0.704-24.196 2.030-36.022l-184.98-60.104c-5.916 31.14-9.050 63.264-9.050 96.126 0 147.23 62.166 279.922 161.654 373.324l114.284-157.296c-52.124-56.926-83.938-132.758-83.938-216.028zM832 512c0 83.268-31.812 159.102-83.938 216.028l114.284 157.296c99.488-93.402 161.654-226.094 161.654-373.324 0-32.862-3.132-64.986-9.048-96.126l-184.98 60.104c1.324 11.828 2.028 23.842 2.028 36.022zM576 198.408c91.934 18.662 169.544 76.742 214.45 155.826l184.978-60.102c-73.196-155.42-222.24-268.060-399.428-290.156v194.432zM233.55 354.232c44.906-79.084 122.516-137.164 214.45-155.826v-194.43c-177.188 22.096-326.23 134.736-399.426 290.154l184.976 60.102zM644.556 803.328c-40.39 18.408-85.272 28.672-132.556 28.672s-92.166-10.264-132.554-28.67l-114.292 157.31c73.206 40.366 157.336 63.36 246.846 63.36s173.64-22.994 246.848-63.36l-114.292-157.312z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["spinner","loading","loading-wheel","busy","wait"],"grid":16},"attrs":[{}],"properties":{"order":1,"id":11,"prevSize":32,"code":59731,"name":"spinner"},"setIdx":0,"setId":1,"iconIdx":134},{"icon":{"paths":["M658.744 749.256l-210.744-210.746v-282.51h128v229.49l173.256 173.254zM512 0c-282.77 0-512 229.23-512 512s229.23 512 512 512 512-229.23 512-512-229.23-512-512-512zM512 896c-212.078 0-384-171.922-384-384s171.922-384 384-384c212.078 0 384 171.922 384 384s-171.922 384-384 384z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["clock","time","schedule"],"grid":16},"attrs":[{}],"properties":{"order":1,"id":12,"prevSize":32,"code":59728,"name":"clock"},"setIdx":0,"setId":1,"iconIdx":135},{"icon":{"paths":["M128 320v640c0 35.2 28.8 64 64 64h576c35.2 0 64-28.8 64-64v-640h-704zM320 896h-64v-448h64v448zM448 896h-64v-448h64v448zM576 896h-64v-448h64v448zM704 896h-64v-448h64v448z","M848 128h-208v-80c0-26.4-21.6-48-48-48h-224c-26.4 0-48 21.6-48 48v80h-208c-26.4 0-48 21.6-48 48v80h832v-80c0-26.4-21.6-48-48-48zM576 128h-192v-63.198h192v63.198z"],"attrs":[{},{}],"isMulticolor":false,"isMulticolor2":false,"tags":["bin","trashcan","remove","delete","recycle","dispose"],"grid":16},"attrs":[{},{}],"properties":{"order":1,"id":13,"name":"bin2","prevSize":32,"code":59650},"setIdx":0,"setId":1,"iconIdx":136},{"icon":{"paths":["M512 0c-282.77 0-512 229.23-512 512s229.23 512 512 512 512-229.23 512-512-229.23-512-512-512zM512 960.002c-62.958 0-122.872-13.012-177.23-36.452l233.148-262.29c5.206-5.858 8.082-13.422 8.082-21.26v-96c0-17.674-14.326-32-32-32-112.99 0-232.204-117.462-233.374-118.626-6-6.002-14.14-9.374-22.626-9.374h-128c-17.672 0-32 14.328-32 32v192c0 12.122 6.848 23.202 17.69 28.622l110.31 55.156v187.886c-116.052-80.956-192-215.432-192-367.664 0-68.714 15.49-133.806 43.138-192h116.862c8.488 0 16.626-3.372 22.628-9.372l128-128c6-6.002 9.372-14.14 9.372-22.628v-77.412c40.562-12.074 83.518-18.588 128-18.588 70.406 0 137.004 16.26 196.282 45.2-4.144 3.502-8.176 7.164-12.046 11.036-36.266 36.264-56.236 84.478-56.236 135.764s19.97 99.5 56.236 135.764c36.434 36.432 85.218 56.264 135.634 56.26 3.166 0 6.342-0.080 9.518-0.236 13.814 51.802 38.752 186.656-8.404 372.334-0.444 1.744-0.696 3.488-0.842 5.224-81.324 83.080-194.7 134.656-320.142 134.656z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["earth","globe","language","web","internet","sphere","planet"],"defaultCode":59850,"grid":16},"attrs":[],"properties":{"ligatures":"earth, globe2","name":"earth","id":14,"order":91,"prevSize":32,"code":59850},"setIdx":0,"setId":1,"iconIdx":137},{"icon":{"paths":["M512.002 193.212v-65.212h128v-64c0-35.346-28.654-64-64.002-64h-191.998c-35.346 0-64 28.654-64 64v64h128v65.212c-214.798 16.338-384 195.802-384 414.788 0 229.75 186.25 416 416 416s416-186.25 416-416c0-218.984-169.202-398.448-384-414.788zM706.276 834.274c-60.442 60.44-140.798 93.726-226.274 93.726s-165.834-33.286-226.274-93.726c-60.44-60.44-93.726-140.8-93.726-226.274s33.286-165.834 93.726-226.274c58.040-58.038 134.448-91.018 216.114-93.548l-21.678 314.020c-1.86 26.29 12.464 37.802 31.836 37.802s33.698-11.512 31.836-37.802l-21.676-314.022c81.666 2.532 158.076 35.512 216.116 93.55 60.44 60.44 93.726 140.8 93.726 226.274s-33.286 165.834-93.726 226.274z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["stopwatch","time","speed","meter","chronometer"],"grid":16},"attrs":[{}],"properties":{"order":1,"id":15,"prevSize":32,"code":59715,"name":"elapsed"},"setIdx":0,"setId":1,"iconIdx":138},{"icon":{"paths":["M522.2 438.8v175.6h290.4c-11.8 75.4-87.8 220.8-290.4 220.8-174.8 0-317.4-144.8-317.4-323.2s142.6-323.2 317.4-323.2c99.4 0 166 42.4 204 79l139-133.8c-89.2-83.6-204.8-134-343-134-283 0-512 229-512 512s229 512 512 512c295.4 0 491.6-207.8 491.6-500.2 0-33.6-3.6-59.2-8-84.8l-483.6-0.2z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["google","brand"],"grid":16},"attrs":[{}],"properties":{"order":1,"id":16,"prevSize":32,"code":59707,"name":"google"},"setIdx":0,"setId":1,"iconIdx":139},{"icon":{"paths":["M592 448h-16v-192c0-105.87-86.13-192-192-192h-128c-105.87 0-192 86.13-192 192v192h-16c-26.4 0-48 21.6-48 48v480c0 26.4 21.6 48 48 48h544c26.4 0 48-21.6 48-48v-480c0-26.4-21.6-48-48-48zM192 256c0-35.29 28.71-64 64-64h128c35.29 0 64 28.71 64 64v192h-256v-192z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["lock","secure","private","encrypted"],"grid":16},"attrs":[{}],"properties":{"order":2,"id":17,"prevSize":32,"code":59700,"name":"lock"},"setIdx":0,"setId":1,"iconIdx":140},{"icon":{"paths":["M0.35 512l-0.35-312.074 384-52.144v364.218zM448 138.482l511.872-74.482v448h-511.872zM959.998 576l-0.126 448-511.872-72.016v-375.984zM384 943.836l-383.688-52.594-0.020-315.242h383.708z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["windows8","brand","os"],"grid":16},"attrs":[{}],"properties":{"order":1,"id":18,"prevSize":32,"code":59712,"name":"microsoft"},"setIdx":0,"setId":1,"iconIdx":141},{"icon":{"paths":["M128 128h320v768h-320zM576 128h320v768h-320z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["pause","player"],"grid":16},"attrs":[{}],"properties":{"order":2,"id":19,"prevSize":32,"code":59695,"name":"pause"},"setIdx":0,"setId":1,"iconIdx":142},{"icon":{"paths":["M192 128l640 384-640 384z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["play","player"],"grid":16},"attrs":[{}],"properties":{"order":3,"id":20,"prevSize":32,"code":59696,"name":"play"},"setIdx":0,"setId":1,"iconIdx":143},{"icon":{"paths":["M889.68 166.32c-93.608-102.216-228.154-166.32-377.68-166.32-282.77 0-512 229.23-512 512h96c0-229.75 186.25-416 416-416 123.020 0 233.542 53.418 309.696 138.306l-149.696 149.694h352v-352l-134.32 134.32z","M928 512c0 229.75-186.25 416-416 416-123.020 0-233.542-53.418-309.694-138.306l149.694-149.694h-352v352l134.32-134.32c93.608 102.216 228.154 166.32 377.68 166.32 282.77 0 512-229.23 512-512h-96z"],"attrs":[{},{}],"isMulticolor":false,"isMulticolor2":false,"tags":["loop","repeat","player","reload","refresh","update","synchronize","arrows"],"grid":16},"attrs":[{},{}],"properties":{"order":49,"id":21,"prevSize":32,"code":59694,"name":"reset"},"setIdx":0,"setId":1,"iconIdx":144},{"icon":{"paths":["M933.79 610.25c-53.726-93.054-21.416-212.304 72.152-266.488l-100.626-174.292c-28.75 16.854-62.176 26.518-97.846 26.518-107.536 0-194.708-87.746-194.708-195.99h-201.258c0.266 33.41-8.074 67.282-25.958 98.252-53.724 93.056-173.156 124.702-266.862 70.758l-100.624 174.292c28.97 16.472 54.050 40.588 71.886 71.478 53.638 92.908 21.512 211.92-71.708 266.224l100.626 174.292c28.65-16.696 61.916-26.254 97.4-26.254 107.196 0 194.144 87.192 194.7 194.958h201.254c-0.086-33.074 8.272-66.57 25.966-97.218 53.636-92.906 172.776-124.594 266.414-71.012l100.626-174.29c-28.78-16.466-53.692-40.498-71.434-71.228zM512 719.332c-114.508 0-207.336-92.824-207.336-207.334 0-114.508 92.826-207.334 207.336-207.334 114.508 0 207.332 92.826 207.332 207.334-0.002 114.51-92.824 207.334-207.332 207.334z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["cog","gear","preferences","settings","generate","control","options"],"grid":16},"attrs":[{}],"properties":{"order":1,"id":22,"prevSize":32,"code":59693,"name":"settings2"},"setIdx":0,"setId":1,"iconIdx":145},{"icon":{"paths":["M512 128c-247.424 0-448 200.576-448 448s200.576 448 448 448 448-200.576 448-448-200.576-448-448-448zM512 936c-198.824 0-360-161.178-360-360 0-198.824 161.176-360 360-360 198.822 0 360 161.176 360 360 0 198.822-161.178 360-360 360zM934.784 287.174c16.042-28.052 25.216-60.542 25.216-95.174 0-106.040-85.96-192-192-192-61.818 0-116.802 29.222-151.92 74.596 131.884 27.236 245.206 105.198 318.704 212.578v0zM407.92 74.596c-35.116-45.374-90.102-74.596-151.92-74.596-106.040 0-192 85.96-192 192 0 34.632 9.174 67.122 25.216 95.174 73.5-107.38 186.822-185.342 318.704-212.578z","M512 576v-256h-64v320h256v-64z"],"attrs":[{},{}],"isMulticolor":false,"isMulticolor2":false,"tags":["alarm","time","clock"],"grid":16},"attrs":[{},{}],"properties":{"order":2,"id":23,"prevSize":32,"code":59716,"name":"timeout"},"setIdx":0,"setId":1,"iconIdx":146},{"icon":{"paths":["M768 64c105.87 0 192 86.13 192 192v192h-128v-192c0-35.29-28.71-64-64-64h-128c-35.29 0-64 28.71-64 64v192h16c26.4 0 48 21.6 48 48v480c0 26.4-21.6 48-48 48h-544c-26.4 0-48-21.6-48-48v-480c0-26.4 21.6-48 48-48h400v-192c0-105.87 86.13-192 192-192h128z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["unlocked","lock-open"],"grid":16},"attrs":[{}],"properties":{"order":1,"id":24,"prevSize":32,"code":59699,"name":"unlocked"},"setIdx":0,"setId":1,"iconIdx":147},{"icon":{"paths":["M832 416h-320v64h-64v-96h384v-192h-32v96c0 17.664-14.336 32-32 32h-576c-17.696 0-32-14.336-32-32v-128c0-17.696 14.304-32 32-32h576c17.664 0 32 14.304 32 32h64v256h-32zM736 160h-512v32h512v-32zM544 832c0 35.328-28.672 64-64 64s-64-28.672-64-64v-320h128v320zM480 786.656c-17.696 0-32 14.336-32 32 0 17.696 14.304 32 32 32 17.664 0 32-14.304 32-32 0-17.664-14.336-32-32-32z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["paint","tool"],"grid":32},"attrs":[{}],"properties":{"order":1,"id":0,"prevSize":32,"code":59725,"name":"control-Color"},"setIdx":0,"setId":1,"iconIdx":148},{"icon":{"paths":["M1328 320c-8.832 0-16 7.168-16 16v640c0 8.832-7.168 16-16 16h-1248c-8.832 0-16-7.168-16-16v-640c0-8.832-7.168-16-16-16s-16 7.168-16 16v640c0 26.464 21.536 48 48 48h1248c26.464 0 48-21.536 48-48v-640c0-8.832-7.168-16-16-16zM1296 0h-1248c-26.464 0-48 21.536-48 48v192c0 8.832 7.168 16 16 16h1312c8.832 0 16-7.168 16-16v-192c0-26.464-21.536-48-48-48zM1312 224h-1280v-176c0-8.832 7.168-16 16-16h1248c8.832 0 16 7.168 16 16v176zM560 896c8.832 0 16-7.168 16-16v-512c0-8.832-7.168-16-16-16h-416c-8.832 0-16 7.168-16 16v512c0 8.832 7.168 16 16 16h416zM160 384h384v480h-384v-480zM720 480h480c8.832 0 16-7.168 16-16s-7.168-16-16-16h-480c-8.832 0-16 7.168-16 16s7.168 16 16 16zM720 640h480c8.832 0 16-7.168 16-16s-7.168-16-16-16h-480c-8.832 0-16 7.168-16 16s7.168 16 16 16zM720 800h480c8.832 0 16-7.168 16-16s-7.168-16-16-16h-480c-8.832 0-16 7.168-16 16s7.168 16 16 16zM96 128c0 17.673 14.327 32 32 32s32-14.327 32-32c0-17.673-14.327-32-32-32s-32 14.327-32 32zM224 128c0 17.673 14.327 32 32 32s32-14.327 32-32c0-17.673-14.327-32-32-32s-32 14.327-32 32zM352 128c0 17.673 14.327 32 32 32s32-14.327 32-32c0-17.673-14.327-32-32-32s-32 14.327-32 32z"],"width":1344,"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["browser","window","software","program"],"grid":32},"attrs":[{}],"properties":{"order":1,"id":1,"prevSize":32,"code":59701,"name":"browser"},"setIdx":0,"setId":1,"iconIdx":149},{"icon":{"paths":["M927.936 272.992l-68.288-68.288c-12.608-12.576-32.96-12.576-45.536 0l-409.44 409.44-194.752-196.16c-12.576-12.576-32.928-12.576-45.536 0l-68.288 68.288c-12.576 12.608-12.576 32.96 0 45.536l285.568 287.488c12.576 12.576 32.96 12.576 45.536 0l500.736-500.768c12.576-12.544 12.576-32.96 0-45.536z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["checkmark","tick","approve","submit"],"grid":32},"attrs":[{}],"properties":{"order":1,"id":2,"prevSize":32,"code":59714,"name":"checkmark"},"setIdx":0,"setId":1,"iconIdx":150},{"icon":{"paths":["M1020.192 401.824c-8.864-25.568-31.616-44.288-59.008-48.352l-266.432-39.616-115.808-240.448c-12.192-25.248-38.272-41.408-66.944-41.408s-54.752 16.16-66.944 41.408l-115.808 240.448-266.464 39.616c-27.36 4.064-50.112 22.784-58.944 48.352-8.8 25.632-2.144 53.856 17.184 73.12l195.264 194.944-45.28 270.432c-4.608 27.232 7.2 54.56 30.336 70.496 12.704 8.736 27.648 13.184 42.592 13.184 12.288 0 24.608-3.008 35.776-8.992l232.288-125.056 232.32 125.056c11.168 5.984 23.488 8.992 35.744 8.992 14.944 0 29.888-4.448 42.624-13.184 23.136-15.936 34.88-43.264 30.304-70.496l-45.312-270.432 195.328-194.944c19.296-19.296 25.92-47.52 17.184-73.12zM754.816 619.616c-16.384 16.32-23.808 39.328-20.064 61.888l45.312 270.432-232.32-124.992c-11.136-6.016-23.424-8.992-35.776-8.992-12.288 0-24.608 3.008-35.744 8.992l-232.32 124.992 45.312-270.432c3.776-22.56-3.648-45.568-20.032-61.888l-195.264-194.944 266.432-39.68c24.352-3.616 45.312-18.848 55.776-40.576l115.872-240.384 115.84 240.416c10.496 21.728 31.424 36.928 55.744 40.576l266.496 39.68-195.264 194.912z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["star","favorite"],"grid":32},"attrs":[{}],"properties":{"order":1,"id":3,"prevSize":32,"code":59706,"name":"control-Stars"},"setIdx":0,"setId":1,"iconIdx":151},{"icon":{"paths":["M409.6 204.8h-153.6c-28.314 0-51.2 22.886-51.2 51.2v153.6c0 28.262 22.886 51.2 51.2 51.2h153.6c28.314 0 51.2-22.938 51.2-51.2v-153.6c0-28.262-22.886-51.2-51.2-51.2zM768 204.8h-153.6c-28.314 0-51.2 22.886-51.2 51.2v153.6c0 28.262 22.886 51.2 51.2 51.2h153.6c28.314 0 51.2-22.938 51.2-51.2v-153.6c0-28.262-22.886-51.2-51.2-51.2zM409.6 563.2h-153.6c-28.314 0-51.2 22.886-51.2 51.2v153.6c0 28.262 22.886 51.2 51.2 51.2h153.6c28.314 0 51.2-22.938 51.2-51.2v-153.6c0-28.262-22.886-51.2-51.2-51.2zM768 563.2h-153.6c-28.314 0-51.2 22.886-51.2 51.2v153.6c0 28.262 22.886 51.2 51.2 51.2h153.6c28.314 0 51.2-22.938 51.2-51.2v-153.6c0-28.262-22.886-51.2-51.2-51.2z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["grid"],"grid":20},"attrs":[{}],"properties":{"order":1,"id":0,"prevSize":20,"code":59730,"name":"grid1"},"setIdx":0,"setId":1,"iconIdx":152},{"icon":{"paths":["M737.28 460.8h-296.96c-28.262 0-30.72 22.886-30.72 51.2s2.458 51.2 30.72 51.2h296.96c28.262 0 30.72-22.886 30.72-51.2s-2.458-51.2-30.72-51.2zM839.68 716.8h-399.36c-28.262 0-30.72 22.886-30.72 51.2s2.458 51.2 30.72 51.2h399.36c28.262 0 30.72-22.886 30.72-51.2s-2.458-51.2-30.72-51.2zM440.32 307.2h399.36c28.262 0 30.72-22.886 30.72-51.2s-2.458-51.2-30.72-51.2h-399.36c-28.262 0-30.72 22.886-30.72 51.2s2.458 51.2 30.72 51.2zM276.48 460.8h-92.16c-28.262 0-30.72 22.886-30.72 51.2s2.458 51.2 30.72 51.2h92.16c28.262 0 30.72-22.886 30.72-51.2s-2.458-51.2-30.72-51.2zM276.48 716.8h-92.16c-28.262 0-30.72 22.886-30.72 51.2s2.458 51.2 30.72 51.2h92.16c28.262 0 30.72-22.886 30.72-51.2s-2.458-51.2-30.72-51.2zM276.48 204.8h-92.16c-28.262 0-30.72 22.886-30.72 51.2s2.458 51.2 30.72 51.2h92.16c28.262 0 30.72-22.886 30.72-51.2s-2.458-51.2-30.72-51.2z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["list"],"grid":20},"attrs":[{}],"properties":{"order":1,"id":1,"name":"list","prevSize":20,"code":59726},"setIdx":0,"setId":1,"iconIdx":153},{"icon":{"paths":["M636.518 0c68.608 0 102.912 46.694 102.912 100.198 0 66.816-59.597 128.614-137.165 128.614-64.973 0-102.861-38.4-101.069-101.888 0-53.402 45.107-126.925 135.322-126.925zM425.421 1024c-54.17 0-93.85-33.382-55.962-180.429l62.157-260.71c10.803-41.677 12.595-58.419 0-58.419-16.23 0-86.477 28.774-128.102 57.19l-27.034-45.056c131.686-111.923 283.187-177.51 348.211-177.51 54.118 0 63.13 65.178 36.096 165.376l-71.219 274.022c-12.595 48.384-7.219 65.075 5.427 65.075 16.23 0 69.478-20.070 121.805-61.798l30.72 41.677c-128.102 130.406-268.032 180.582-322.099 180.582z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["info"],"grid":20},"attrs":[{}],"properties":{"order":1,"id":2,"prevSize":20,"code":59708,"name":"info"},"setIdx":0,"setId":1,"iconIdx":154}],"height":1024,"metadata":{"name":"icomoon"},"preferences":{"showGlyphs":true,"showCodes":true,"showQuickUse":true,"showQuickUse2":true,"showSVGs":true,"fontPref":{"prefix":"icon-","metadata":{"fontFamily":"icomoon"},"metrics":{"emSize":1024,"baseline":6.25,"whitespace":50},"embed":false},"imagePref":{"prefix":"icon-","png":true,"useClassSelector":true,"color":0,"bgColor":16777215,"name":"icomoon","classSelector":".icon"},"historySize":50,"gridSize":16}} \ No newline at end of file diff --git a/frontend/src/app/theme/icomoon/style.css b/frontend/src/app/theme/icomoon/style.css index c159d9679..3ddda8df6 100644 --- a/frontend/src/app/theme/icomoon/style.css +++ b/frontend/src/app/theme/icomoon/style.css @@ -1,10 +1,10 @@ @font-face { font-family: 'icomoon'; - src: url('fonts/icomoon.eot?7vouhu'); - src: url('fonts/icomoon.eot?7vouhu#iefix') format('embedded-opentype'), - url('fonts/icomoon.ttf?7vouhu') format('truetype'), - url('fonts/icomoon.woff?7vouhu') format('woff'), - url('fonts/icomoon.svg?7vouhu#icomoon') format('svg'); + src: url('fonts/icomoon.eot?5rrlgz'); + src: url('fonts/icomoon.eot?5rrlgz#iefix') format('embedded-opentype'), + url('fonts/icomoon.ttf?5rrlgz') format('truetype'), + url('fonts/icomoon.woff?5rrlgz') format('woff'), + url('fonts/icomoon.svg?5rrlgz#icomoon') format('svg'); font-weight: normal; font-style: normal; font-display: block; @@ -274,6 +274,9 @@ .icon-user-o:before { content: "\e932"; } +.icon-type-UserInfo:before { + content: "\e932"; +} .icon-rules:before { content: "\e947"; } diff --git a/tools/TestSuite/TestSuite.ApiTests/ContentUserTests.cs b/tools/TestSuite/TestSuite.ApiTests/ContentUserTests.cs new file mode 100644 index 000000000..c3333f361 --- /dev/null +++ b/tools/TestSuite/TestSuite.ApiTests/ContentUserTests.cs @@ -0,0 +1,100 @@ +// ========================================================================== +// Squidex Headless CMS +// ========================================================================== +// Copyright (c) Squidex UG (haftungsbeschraenkt) +// All rights reserved. Licensed under the MIT license. +// ========================================================================== + +using Newtonsoft.Json.Linq; +using Squidex.ClientLibrary; +using TestSuite.Fixtures; + +#pragma warning disable SA1300 // Element should begin with upper-case letter +#pragma warning disable SA1507 // Code should not contain multiple blank lines in a row + +namespace TestSuite.ApiTests; + +public sealed class ContentUserTests(CreatedAppFixture fixture) : IClassFixture +{ + private readonly string schemaName = $"schema-{Guid.NewGuid()}"; + + public CreatedAppFixture _ { get; } = fixture; + + [Fact] + public async Task Should_login_with_user_credentials() + { + var apiKey = Guid.NewGuid().ToString(); + + // STEP 1: Create schema. + var createSchemaRequest = new CreateSchemaDto + { + Name = schemaName, + Fields = + [ + new UpsertSchemaFieldDto + { + Name = "userInfo", + Properties = new UserInfoFieldPropertiesDto(), + }, + ], + IsPublished = true, + }; + + await _.Client.Schemas.PostSchemaAsync(createSchemaRequest); + + + // STEP 2: Create user. + var client = _.Client.DynamicContents(schemaName); + + await client.CreateAsync( + new DynamicData + { + ["userInfo"] = new JObject + { + ["iv"] = new JObject + { + ["role"] = "Reader", + // This API key is used for authentication later. + ["apiKey"] = apiKey, + }, + }, + }, + ContentCreateOptions.AsPublish); + + // STEP 3: Login. + var apiKeyClient = new SquidexClient(new SquidexOptions + { + Url = _.Url, + ApiKey = apiKey, + ClientId = null!, + ClientSecret = null!, + AppName = _.AppName, + }); + + var apiKeyContents = apiKeyClient.DynamicContents(schemaName); + + try + { + using var cts = new CancellationTokenSource(TimeSpan.FromSeconds(30)); + + while (!cts.IsCancellationRequested) + { + try + { + await apiKeyContents.GetAsync(ct: cts.Token); + return; + } + catch (SquidexException ex) when (ex.StatusCode == 401) + { + } + + await Task.Delay(200, cts.Token); + } + } + catch (OperationCanceledException) + { + } + + Assert.Fail(); + } +} diff --git a/tools/TestSuite/TestSuite.ApiTests/GraphQLSubscriptionTests.cs b/tools/TestSuite/TestSuite.ApiTests/GraphQLSubscriptionTests.cs index fcd02b62b..c93386336 100644 --- a/tools/TestSuite/TestSuite.ApiTests/GraphQLSubscriptionTests.cs +++ b/tools/TestSuite/TestSuite.ApiTests/GraphQLSubscriptionTests.cs @@ -124,11 +124,12 @@ public class GraphQLSubscriptionTests(ContentFixture fixture) : IClassFixture CreateClient() { - var accessToken = await _.Client.Options.Authenticator.GetBearerTokenAsync(_.AppName, default); + var accessToken = await _.Client.Options.Authenticator.GetAuthTokenAsync(_.AppName, default); + var (queryName, queryValue) = accessToken.SerializeAsQuery(); var options = new GraphQLHttpClientOptions { - EndPoint = new Uri(_.Client.GenerateUrl($"/api/content/{_.AppName}/graphql?access_token={accessToken}")!), + EndPoint = new Uri(_.Client.GenerateUrl($"/api/content/{_.AppName}/graphql?{queryName}={queryValue}")!), }; var client = new GraphQLHttpClient(options, new NewtonsoftJsonSerializer()); diff --git a/tools/TestSuite/TestSuite.ApiTests/TestSuite.ApiTests.csproj b/tools/TestSuite/TestSuite.ApiTests/TestSuite.ApiTests.csproj index 48293e319..62a35c251 100644 --- a/tools/TestSuite/TestSuite.ApiTests/TestSuite.ApiTests.csproj +++ b/tools/TestSuite/TestSuite.ApiTests/TestSuite.ApiTests.csproj @@ -16,8 +16,8 @@ - - + + diff --git a/tools/TestSuite/TestSuite.Shared/TestSuite.Shared.csproj b/tools/TestSuite/TestSuite.Shared/TestSuite.Shared.csproj index 54753ea80..4b4ee6fde 100644 --- a/tools/TestSuite/TestSuite.Shared/TestSuite.Shared.csproj +++ b/tools/TestSuite/TestSuite.Shared/TestSuite.Shared.csproj @@ -17,9 +17,9 @@ - - - + + +