diff --git a/backend/i18n/translate.bat b/backend/i18n/translate.bat index 0fb87e19f..d300b75d8 100644 --- a/backend/i18n/translate.bat +++ b/backend/i18n/translate.bat @@ -1,8 +1,8 @@ cd translator\Squidex.Translator -dotnet run translate check-backend C:\Users\federica.pisu\squidex\mysquidex\squidex -dotnet run translate check-frontend C:\Users\federica.pisu\squidex\mysquidex\squidex +dotnet run translate check-backend ..\..\..\.. +dotnet run translate check-frontend ..\..\..\.. -dotnet run translate gen-frontend C:\Users\federica.pisu\squidex\mysquidex\squidex -dotnet run translate gen-backend C:\Users\federica.pisu\squidex\mysquidex\squidex +dotnet run translate gen-frontend ..\..\..\.. +dotnet run translate gen-backend ..\..\..\.. diff --git a/backend/i18n/translate.sh b/backend/i18n/translate.sh index 74b698a95..9a039d81d 100755 --- a/backend/i18n/translate.sh +++ b/backend/i18n/translate.sh @@ -1,10 +1,8 @@ #!/bin/bash -PATH=${1:-/Squidex} - cd translator/Squidex.Translator -/usr/local/share/dotnet/dotnet run translate check-backend $1 -/usr/local/share/dotnet/dotnet run translate check-frontend $1 +/usr/local/share/dotnet/dotnet run translate check-backend ../../../.. +/usr/local/share/dotnet/dotnet run translate check-frontend ../../../.. -/usr/local/share/dotnet/dotnet run translate gen-frontend $1 -/usr/local/share/dotnet/dotnet run translate gen-backend $1 \ No newline at end of file +/usr/local/share/dotnet/dotnet run translate gen-frontend ../../../.. +/usr/local/share/dotnet/dotnet run translate gen-backend ../../../.. \ No newline at end of file diff --git a/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/AppMutationsGraphType.cs b/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/AppMutationsGraphType.cs deleted file mode 100644 index 0da986ba6..000000000 --- a/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/AppMutationsGraphType.cs +++ /dev/null @@ -1,344 +0,0 @@ -// ========================================================================== -// Squidex Headless CMS -// ========================================================================== -// Copyright (c) Squidex UG (haftungsbeschraenkt) -// All rights reserved. Licensed under the MIT license. -// ========================================================================== - -using System; -using System.Collections.Generic; -using System.Threading.Tasks; -using GraphQL; -using GraphQL.Resolvers; -using GraphQL.Types; -using Newtonsoft.Json.Linq; -using Squidex.Domain.Apps.Core.Contents; -using Squidex.Domain.Apps.Entities.Contents.Commands; -using Squidex.Domain.Apps.Entities.Schemas; -using Squidex.Infrastructure; -using Squidex.Infrastructure.Commands; - -namespace Squidex.Domain.Apps.Entities.Contents.GraphQL.Types -{ - public sealed class AppMutationsGraphType : ObjectGraphType - { - public AppMutationsGraphType(IGraphModel model, IEnumerable schemas) - { - foreach (var schema in schemas) - { - var schemaId = schema.NamedId(); - var schemaType = schema.TypeName(); - var schemaName = schema.DisplayName(); - - var contentType = model.GetContentType(schema.Id); - var contentDataType = model.GetContentDataType(schema.Id); - - var resultType = new ContentDataChangedResultGraphType(schemaType, schemaName, contentDataType); - - var inputType = new ContentDataGraphInputType(model, schema); - - AddContentCreate(schemaId, schemaType, schemaName, inputType, contentDataType, contentType); - AddContentUpdate(schemaType, schemaName, inputType, resultType); - AddContentPatch(schemaType, schemaName, inputType, resultType); - AddContentPublish(schemaType, schemaName); - AddContentUnpublish(schemaType, schemaName); - AddContentArchive(schemaType, schemaName); - AddContentRestore(schemaType, schemaName); - AddContentDelete(schemaType, schemaName); - } - - Description = "The app mutations."; - } - - private void AddContentCreate(NamedId schemaId, string schemaType, string schemaName, ContentDataGraphInputType inputType, IGraphType contentDataType, IGraphType contentType) - { - AddField(new FieldType - { - Name = $"create{schemaType}Content", - Arguments = new QueryArguments - { - new QueryArgument(AllTypes.None) - { - Name = "data", - Description = $"The data for the {schemaName} content.", - DefaultValue = null, - ResolvedType = new NonNullGraphType(inputType), - }, - new QueryArgument(AllTypes.None) - { - Name = "publish", - Description = "Set to true to autopublish content.", - DefaultValue = false, - ResolvedType = AllTypes.Boolean - }, - new QueryArgument(AllTypes.None) - { - Name = "expectedVersion", - Description = "The expected version", - DefaultValue = EtagVersion.Any, - ResolvedType = AllTypes.Int - } - }, - ResolvedType = new NonNullGraphType(contentType), - Resolver = ResolveAsync(async (c, publish) => - { - var argPublish = c.GetArgument("publish"); - - var contentData = GetContentData(c); - - var command = new CreateContent { SchemaId = schemaId, Data = contentData, Publish = argPublish }; - var commandContext = await publish(command); - - var result = commandContext.Result>(); - var response = ContentEntity.Create(command, result); - - return (IContentEntity)ContentEntity.Create(command, result); - }), - Description = $"Creates an {schemaName} content." - }); - } - - private void AddContentUpdate(string schemaType, string schemaName, ContentDataGraphInputType inputType, IGraphType resultType) - { - AddField(new FieldType - { - Name = $"update{schemaType}Content", - Arguments = new QueryArguments - { - new QueryArgument(AllTypes.None) - { - Name = "id", - Description = $"The id of the {schemaName} content (GUID)", - DefaultValue = string.Empty, - ResolvedType = AllTypes.NonNullGuid - }, - new QueryArgument(AllTypes.None) - { - Name = "data", - Description = $"The data for the {schemaName} content.", - DefaultValue = null, - ResolvedType = new NonNullGraphType(inputType), - }, - new QueryArgument(AllTypes.None) - { - Name = "expectedVersion", - Description = "The expected version", - DefaultValue = EtagVersion.Any, - ResolvedType = AllTypes.Int - } - }, - ResolvedType = new NonNullGraphType(resultType), - Resolver = ResolveAsync(async (c, publish) => - { - var contentId = c.GetArgument("id"); - var contentData = GetContentData(c); - - var command = new UpdateContent { ContentId = contentId, Data = contentData }; - var commandContext = await publish(command); - - var result = commandContext.Result(); - - return result; - }), - Description = $"Update an {schemaName} content by id." - }); - } - - private void AddContentPatch(string schemaType, string schemaName, ContentDataGraphInputType inputType, IGraphType resultType) - { - AddField(new FieldType - { - Name = $"patch{schemaType}Content", - Arguments = new QueryArguments - { - new QueryArgument(AllTypes.None) - { - Name = "id", - Description = $"The id of the {schemaName} content (GUID)", - DefaultValue = string.Empty, - ResolvedType = AllTypes.NonNullGuid - }, - new QueryArgument(AllTypes.None) - { - Name = "data", - Description = $"The data for the {schemaName} content.", - DefaultValue = null, - ResolvedType = new NonNullGraphType(inputType), - }, - new QueryArgument(AllTypes.None) - { - Name = "expectedVersion", - Description = "The expected version", - DefaultValue = EtagVersion.Any, - ResolvedType = AllTypes.Int - } - }, - ResolvedType = new NonNullGraphType(resultType), - Resolver = ResolveAsync(async (c, publish) => - { - var contentId = c.GetArgument("id"); - var contentData = GetContentData(c); - - var command = new PatchContent { ContentId = contentId, Data = contentData }; - var commandContext = await publish(command); - - var result = commandContext.Result(); - - return result; - }), - Description = $"Patch a {schemaName} content." - }); - } - - private void AddContentPublish(string schemaType, string schemaName) - { - AddField(new FieldType - { - Name = $"publish{schemaType}Content", - Arguments = CreateIdArguments(schemaName), - ResolvedType = AllTypes.CommandVersion, - Resolver = ResolveAsync((c, publish) => - { - var contentId = c.GetArgument("id"); - - var command = new ChangeContentStatus { ContentId = contentId, Status = Status.Published }; - - return publish(command); - }), - Description = $"Publish a {schemaName} content." - }); - } - - private void AddContentUnpublish(string schemaType, string schemaName) - { - AddField(new FieldType - { - Name = $"unpublish{schemaType}Content", - Arguments = CreateIdArguments(schemaName), - ResolvedType = AllTypes.CommandVersion, - Resolver = ResolveAsync((c, publish) => - { - var contentId = c.GetArgument("id"); - - var command = new ChangeContentStatus { ContentId = contentId, Status = Status.Draft }; - - return publish(command); - }), - Description = $"Unpublish a {schemaName} content." - }); - } - - private void AddContentArchive(string schemaType, string schemaName) - { - AddField(new FieldType - { - Name = $"archive{schemaType}Content", - Arguments = CreateIdArguments(schemaName), - ResolvedType = AllTypes.CommandVersion, - Resolver = ResolveAsync((c, publish) => - { - var contentId = c.GetArgument("id"); - - var command = new ChangeContentStatus { ContentId = contentId, Status = Status.Archived }; - - return publish(command); - }), - Description = $"Archive a {schemaName} content." - }); - } - - private void AddContentRestore(string schemaType, string schemaName) - { - AddField(new FieldType - { - Name = $"restore{schemaType}Content", - Arguments = CreateIdArguments(schemaName), - ResolvedType = AllTypes.CommandVersion, - Resolver = ResolveAsync((c, publish) => - { - var contentId = c.GetArgument("id"); - - var command = new ChangeContentStatus { ContentId = contentId, Status = Status.Draft }; - - return publish(command); - }), - Description = $"Restore a {schemaName} content." - }); - } - - private void AddContentDelete(string schemaType, string schemaName) - { - AddField(new FieldType - { - Name = $"delete{schemaType}Content", - Arguments = CreateIdArguments(schemaName), - ResolvedType = AllTypes.CommandVersion, - Resolver = ResolveAsync((c, publish) => - { - var contentId = c.GetArgument("id"); - - var command = new DeleteContent { ContentId = contentId }; - - return publish(command); - }), - Description = $"Delete an {schemaName} content." - }); - } - - private static QueryArguments CreateIdArguments(string schemaName) - { - return new QueryArguments - { - new QueryArgument(AllTypes.None) - { - Name = "id", - Description = $"The id of the {schemaName} content (GUID)", - DefaultValue = string.Empty, - ResolvedType = AllTypes.NonNullGuid - }, - new QueryArgument(AllTypes.None) - { - Name = "expectedVersion", - Description = "The expected version", - DefaultValue = EtagVersion.Any, - ResolvedType = AllTypes.Int - } - }; - } - - private static IFieldResolver ResolveAsync(Func>, Task> action) - { - return new FuncFieldResolver>(async c => - { - var e = (GraphQLExecutionContext)c.UserContext; - - try - { - return await action(c, command => - { - command.ExpectedVersion = c.GetArgument("expectedVersion", EtagVersion.Any); - - return e.CommandBus.PublishAsync(command); - }); - } - catch (ValidationException ex) - { - c.Errors.Add(new ExecutionError(ex.Message)); - - throw; - } - catch (DomainException ex) - { - c.Errors.Add(new ExecutionError(ex.Message)); - - throw; - } - }); - } - - private static NamedContentData GetContentData(ResolveFieldContext c) - { - return JObject.FromObject(c.GetArgument("data")).ToObject(); - } - } -} diff --git a/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/ContentDataGraphInputType.cs b/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/ContentDataGraphInputType.cs deleted file mode 100644 index 0186366a9..000000000 --- a/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/ContentDataGraphInputType.cs +++ /dev/null @@ -1,70 +0,0 @@ -// ========================================================================== -// Squidex Headless CMS -// ========================================================================== -// Copyright (c) Squidex UG (haftungsbeschränkt) -// All rights reserved. Licensed under the MIT license. -// ========================================================================== - -using System.Linq; -using GraphQL.Types; -using Squidex.Domain.Apps.Entities.Schemas; -using Squidex.Infrastructure; - -namespace Squidex.Domain.Apps.Entities.Contents.GraphQL.Types -{ - public sealed class ContentDataGraphInputType : InputObjectGraphType - { - public ContentDataGraphInputType(IGraphModel model, ISchemaEntity schema) - { - var schemaType = schema.TypeName(); - var schemaName = schema.DisplayName(); - - Name = $"{schemaType}InputDto"; - - foreach (var field in schema.SchemaDef.Fields.Where(x => !x.IsHidden)) - { - var inputType = model.GetInputGraphType(field); - - if (inputType != null) - { - if (field.RawProperties.IsRequired) - { - inputType = new NonNullGraphType(inputType); - } - - var fieldName = field.RawProperties.Label.WithFallback(field.Name); - - var fieldGraphType = new InputObjectGraphType - { - Name = $"{schemaType}Data{field.Name.ToPascalCase()}InputDto" - }; - - var partition = model.ResolvePartition(field.Partitioning); - - foreach (var partitionItem in partition) - { - fieldGraphType.AddField(new FieldType - { - Name = partitionItem.Key, - Resolver = null, - ResolvedType = inputType, - Description = field.RawProperties.Hints - }); - } - - fieldGraphType.Description = $"The input structure of the {fieldName} of a {schemaName} content type."; - - AddField(new FieldType - { - Name = field.Name.ToCamelCase(), - Resolver = null, - ResolvedType = fieldGraphType, - Description = $"The {fieldName} field." - }); - } - } - - Description = $"The structure of a {schemaName} content type."; - } - } -} diff --git a/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/GeolocationInputGraphType.cs b/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/GeolocationInputGraphType.cs deleted file mode 100644 index 73ba49b5c..000000000 --- a/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/GeolocationInputGraphType.cs +++ /dev/null @@ -1,31 +0,0 @@ -// ========================================================================== -// Squidex Headless CMS -// ========================================================================== -// Copyright (c) Squidex UG (haftungsbeschraenkt) -// All rights reserved. Licensed under the MIT license. -// ========================================================================== - -using GraphQL.Types; - -namespace Squidex.Domain.Apps.Entities.Contents.GraphQL.Types -{ - public sealed class GeolocationInputGraphType : InputObjectGraphType - { - public GeolocationInputGraphType() - { - Name = "GeolocationInputDto"; - - AddField(new FieldType - { - Name = "latitude", - ResolvedType = AllTypes.NonNullFloat - }); - - AddField(new FieldType - { - Name = "longitude", - ResolvedType = AllTypes.NonNullFloat - }); - } - } -} diff --git a/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/InputFieldExtensions.cs b/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/InputFieldExtensions.cs deleted file mode 100644 index 84af9a8f0..000000000 --- a/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/InputFieldExtensions.cs +++ /dev/null @@ -1,20 +0,0 @@ -// ========================================================================== -// Squidex Headless CMS -// ========================================================================== -// Copyright (c) Squidex UG (haftungsbeschraenkt) -// All rights reserved. Licensed under the MIT license. -// ========================================================================== - -using GraphQL.Types; -using Squidex.Domain.Apps.Core.Schemas; - -namespace Squidex.Domain.Apps.Entities.Contents.GraphQL.Types -{ - public static class InputFieldExtensions - { - public static IGraphType GetInputGraphType(this IField field) - { - return field.Accept(InputFieldVisitor.Default); - } - } -} diff --git a/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/InputFieldVisitor.cs b/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/InputFieldVisitor.cs deleted file mode 100644 index e000e13e5..000000000 --- a/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/InputFieldVisitor.cs +++ /dev/null @@ -1,71 +0,0 @@ -// ========================================================================== -// Squidex Headless CMS -// ========================================================================== -// Copyright (c) Squidex UG (haftungsbeschraenkt) -// All rights reserved. Licensed under the MIT license. -// ========================================================================== - -using GraphQL.Types; -using Squidex.Domain.Apps.Core.Schemas; - -namespace Squidex.Domain.Apps.Entities.Contents.GraphQL.Types -{ - public sealed class InputFieldVisitor : IFieldVisitor - { - public static readonly InputFieldVisitor Default = new InputFieldVisitor(); - - private InputFieldVisitor() - { - } - - public IGraphType Visit(IArrayField field) - { - return AllTypes.NoopArray; - } - - public IGraphType Visit(IField field) - { - return AllTypes.References; - } - - public IGraphType Visit(IField field) - { - return AllTypes.Boolean; - } - - public IGraphType Visit(IField field) - { - return AllTypes.Date; - } - - public IGraphType Visit(IField field) - { - return AllTypes.GeolocationInput; - } - - public IGraphType Visit(IField field) - { - return AllTypes.Json; - } - - public IGraphType Visit(IField field) - { - return AllTypes.Float; - } - - public IGraphType Visit(IField field) - { - return AllTypes.References; - } - - public IGraphType Visit(IField field) - { - return AllTypes.String; - } - - public IGraphType Visit(IField field) - { - return AllTypes.Tags; - } - } -} diff --git a/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/NestedInputGraphType.cs b/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/NestedInputGraphType.cs deleted file mode 100644 index 44434370d..000000000 --- a/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/NestedInputGraphType.cs +++ /dev/null @@ -1,47 +0,0 @@ -// ========================================================================== -// Squidex Headless CMS -// ========================================================================== -// Copyright (c) Squidex UG (haftungsbeschraenkt) -// All rights reserved. Licensed under the MIT license. -// ========================================================================== - -using System.Linq; -using GraphQL.Types; -using Squidex.Domain.Apps.Core.Schemas; -using Squidex.Domain.Apps.Entities.Schemas; -using Squidex.Infrastructure; - -namespace Squidex.Domain.Apps.Entities.Contents.GraphQL.Types -{ - public sealed class NestedInputGraphType : InputObjectGraphType - { - public NestedInputGraphType(IGraphModel model, ISchemaEntity schema, IArrayField field) - { - var schemaType = schema.TypeName(); - var schemaName = schema.DisplayName(); - - var fieldType = field.TypeName(); - var fieldName = field.DisplayName(); - - Name = $"{schemaType}{fieldName}ChildDto"; - - foreach (var nestedField in field.Fields.Where(x => !x.IsHidden)) - { - var fieldInfo = model.GetGraphType(schema, nestedField); - - if (fieldInfo.ResolveType != null) - { - AddField(new FieldType - { - Name = nestedField.Name.ToCamelCase(), - Resolver = null, - ResolvedType = fieldInfo.ResolveType, - Description = $"The {fieldName}/{nestedField.DisplayName()} nested field." - }); - } - } - - Description = $"The structure of a {schemaName}.{fieldName} nested schema."; - } - } -}