From ab8d774c93aa29ae04cba443e289bd283e566907 Mon Sep 17 00:00:00 2001 From: Sebastian Date: Sun, 4 Dec 2016 00:29:28 +0100 Subject: [PATCH] No Api for languages --- src/Squidex.Core/Schemas/Schema.cs | 2 +- .../Dispatching/ActionContextDispatcher.cs | 2 +- .../Dispatching/ActionDispatcher.cs | 2 +- .../Dispatching/FuncDispatcher.cs | 2 +- .../Apps/MongoAppRepository.cs | 1 - src/Squidex.Write/Apps/AppDomainObject.cs | 26 ++-- src/Squidex.Write/Apps/AppLanguages.cs | 5 - .../Apps/Commands/ConfigureLanguages.cs | 26 ---- .../Schemas/SchemaDomainObject.cs | 18 +-- .../Api/Apps/AppContributorsController.cs | 10 +- .../Controllers/Api/Apps/AppController.cs | 6 +- .../Api/Apps/AppLanguagesController.cs | 65 +++++++-- ...igureLanguagesDto.cs => AddLanguageDto.cs} | 11 +- .../Api/Apps/Models/SetMasterLanguageDto.cs | 18 +++ .../Api/Schemas/SchemaFieldsController.cs | 32 ++--- .../Api/Schemas/SchemasController.cs | 14 +- .../Controllers/Api/Users/UsersController.cs | 2 +- .../Apps/AppCommandHandlerTests.cs | 1 - .../Apps/AppDomainObjectTests.cs | 135 +++++++++++++++++- 19 files changed, 267 insertions(+), 111 deletions(-) delete mode 100644 src/Squidex.Write/Apps/Commands/ConfigureLanguages.cs rename src/Squidex/Controllers/Api/Apps/Models/{ConfigureLanguagesDto.cs => AddLanguageDto.cs} (67%) create mode 100644 src/Squidex/Controllers/Api/Apps/Models/SetMasterLanguageDto.cs diff --git a/src/Squidex.Core/Schemas/Schema.cs b/src/Squidex.Core/Schemas/Schema.cs index ebe7d7cd3..da270cf7f 100644 --- a/src/Squidex.Core/Schemas/Schema.cs +++ b/src/Squidex.Core/Schemas/Schema.cs @@ -129,7 +129,7 @@ namespace Squidex.Core.Schemas if (!fieldsById.TryGetValue(fieldId, out field)) { - throw new DomainObjectNotFoundException(fieldId.ToString(), typeof(Field)); + throw new DomainObjectNotFoundException(fieldId.ToString(), "Fields", typeof(Field)); } var newField = updater(field); diff --git a/src/Squidex.Infrastructure/Dispatching/ActionContextDispatcher.cs b/src/Squidex.Infrastructure/Dispatching/ActionContextDispatcher.cs index 1fbede363..b14d6896a 100644 --- a/src/Squidex.Infrastructure/Dispatching/ActionContextDispatcher.cs +++ b/src/Squidex.Infrastructure/Dispatching/ActionContextDispatcher.cs @@ -21,7 +21,7 @@ namespace Squidex.Infrastructure.Dispatching { Handlers = typeof(TTarget) - .GetMethods() + .GetMethods(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance) .Where(Helper.HasRightName) .Where(Helper.HasRightParameters) .Select(ActionContextDispatcherFactory.CreateActionHandler) diff --git a/src/Squidex.Infrastructure/Dispatching/ActionDispatcher.cs b/src/Squidex.Infrastructure/Dispatching/ActionDispatcher.cs index c05984f61..0949b8542 100644 --- a/src/Squidex.Infrastructure/Dispatching/ActionDispatcher.cs +++ b/src/Squidex.Infrastructure/Dispatching/ActionDispatcher.cs @@ -21,7 +21,7 @@ namespace Squidex.Infrastructure.Dispatching { Handlers = typeof(TTarget) - .GetMethods() + .GetMethods(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance) .Where(Helper.HasRightName) .Where(Helper.HasRightParameters) .Select(ActionDispatcherFactory.CreateActionHandler) diff --git a/src/Squidex.Infrastructure/Dispatching/FuncDispatcher.cs b/src/Squidex.Infrastructure/Dispatching/FuncDispatcher.cs index b9d018441..eb427fffd 100644 --- a/src/Squidex.Infrastructure/Dispatching/FuncDispatcher.cs +++ b/src/Squidex.Infrastructure/Dispatching/FuncDispatcher.cs @@ -21,7 +21,7 @@ namespace Squidex.Infrastructure.Dispatching { Handlers = typeof(TTarget) - .GetMethods() + .GetMethods(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance) .Where(Helper.HasRightName) .Where(Helper.HasRightParameters) .Where(Helper.HasRightReturnType) diff --git a/src/Squidex.Store.MongoDb/Apps/MongoAppRepository.cs b/src/Squidex.Store.MongoDb/Apps/MongoAppRepository.cs index 2c59f7f63..2e073952d 100644 --- a/src/Squidex.Store.MongoDb/Apps/MongoAppRepository.cs +++ b/src/Squidex.Store.MongoDb/Apps/MongoAppRepository.cs @@ -7,7 +7,6 @@ // ========================================================================== using System.Collections.Generic; -using System.Linq; using System.Threading.Tasks; using MongoDB.Driver; using Squidex.Events.Apps; diff --git a/src/Squidex.Write/Apps/AppDomainObject.cs b/src/Squidex.Write/Apps/AppDomainObject.cs index 92d4a1778..38fd1e1af 100644 --- a/src/Squidex.Write/Apps/AppDomainObject.cs +++ b/src/Squidex.Write/Apps/AppDomainObject.cs @@ -7,21 +7,21 @@ // ========================================================================== using System; +using System.Collections.Generic; using Squidex.Core.Apps; using Squidex.Events.Apps; using Squidex.Infrastructure; using Squidex.Infrastructure.CQRS; +using Squidex.Infrastructure.CQRS.Commands; using Squidex.Infrastructure.CQRS.Events; using Squidex.Infrastructure.Dispatching; -using Squidex.Write.Apps.Commands; -using System.Collections.Generic; -using Squidex.Infrastructure.CQRS.Commands; using Squidex.Infrastructure.Reflection; +using Squidex.Write.Apps.Commands; // ReSharper disable InvertIf namespace Squidex.Write.Apps { - public sealed class AppDomainObject : DomainObject + public class AppDomainObject : DomainObject { private static readonly Language DefaultLanguage = Language.GetLanguage("en"); private readonly AppContributors contributors = new AppContributors(); @@ -44,47 +44,47 @@ namespace Squidex.Write.Apps { } - public void On(AppCreated @event) + protected void On(AppCreated @event) { name = @event.Name; } - public void On(AppContributorAssigned @event) + protected void On(AppContributorAssigned @event) { contributors.Assign(@event.ContributorId, @event.Permission); } - public void On(AppContributorRemoved @event) + protected void On(AppContributorRemoved @event) { contributors.Remove(@event.ContributorId); } - public void On(AppClientAttached @event) + protected void On(AppClientAttached @event) { clients.Add(@event.Id, @event.Secret, @event.ExpiresUtc); } - public void On(AppClientRenamed @event) + protected void On(AppClientRenamed @event) { clients.Rename(@event.Id, @event.Name); } - public void On(AppClientRevoked @event) + protected void On(AppClientRevoked @event) { clients.Revoke(@event.Id); } - public void On(AppLanguageAdded @event) + protected void On(AppLanguageAdded @event) { languages.Add(@event.Language); } - public void On(AppLanguageRemoved @event) + protected void On(AppLanguageRemoved @event) { languages.Remove(@event.Language); } - public void On(AppMasterLanguageSet @event) + protected void On(AppMasterLanguageSet @event) { languages.SetMasterLanguage(@event.Language); } diff --git a/src/Squidex.Write/Apps/AppLanguages.cs b/src/Squidex.Write/Apps/AppLanguages.cs index 446d2e7ef..923da974c 100644 --- a/src/Squidex.Write/Apps/AppLanguages.cs +++ b/src/Squidex.Write/Apps/AppLanguages.cs @@ -18,11 +18,6 @@ namespace Squidex.Write.Apps private readonly HashSet languages = new HashSet(); private Language masterLanguage; - public IReadOnlyCollection Languages - { - get { return languages; } - } - public void Add(Language language) { Func message = () => "Cannot add language"; diff --git a/src/Squidex.Write/Apps/Commands/ConfigureLanguages.cs b/src/Squidex.Write/Apps/Commands/ConfigureLanguages.cs deleted file mode 100644 index 7552db122..000000000 --- a/src/Squidex.Write/Apps/Commands/ConfigureLanguages.cs +++ /dev/null @@ -1,26 +0,0 @@ -// ========================================================================== -// ConfigureLanguages.cs -// Squidex Headless CMS -// ========================================================================== -// Copyright (c) Squidex Group -// All rights reserved. -// ========================================================================== - -using System.Collections.Generic; -using Squidex.Infrastructure; - -namespace Squidex.Write.Apps.Commands -{ - public sealed class ConfigureLanguages : AppAggregateCommand, IValidatable - { - public List Languages { get; set; } - - public void Validate(IList errors) - { - if (Languages == null || Languages.Count == 0) - { - errors.Add(new ValidationError("Languages need at least one element.", nameof(Languages))); - } - } - } -} diff --git a/src/Squidex.Write/Schemas/SchemaDomainObject.cs b/src/Squidex.Write/Schemas/SchemaDomainObject.cs index 41656c759..119ffc840 100644 --- a/src/Squidex.Write/Schemas/SchemaDomainObject.cs +++ b/src/Squidex.Write/Schemas/SchemaDomainObject.cs @@ -50,47 +50,47 @@ namespace Squidex.Write.Schemas schema = schema.AddOrUpdateField(registry.CreateField(@event.FieldId, @event.Name, @event.Properties)); } - public void On(SchemaCreated @event) + protected void On(SchemaCreated @event) { schema = Schema.Create(@event.Name, @event.Properties); } - public void On(FieldUpdated @event) + protected void On(FieldUpdated @event) { schema = schema.UpdateField(@event.FieldId, @event.Properties); } - public void On(FieldHidden @event) + protected void On(FieldHidden @event) { schema = schema.HideField(@event.FieldId); } - public void On(FieldShown @event) + protected void On(FieldShown @event) { schema = schema.ShowField(@event.FieldId); } - public void On(FieldDisabled @event) + protected void On(FieldDisabled @event) { schema = schema.DisableField(@event.FieldId); } - public void On(FieldEnabled @event) + protected void On(FieldEnabled @event) { schema = schema.EnableField(@event.FieldId); } - public void On(SchemaUpdated @event) + protected void On(SchemaUpdated @event) { schema = schema.Update(@event.Properties); } - public void On(FieldDeleted @event) + protected void On(FieldDeleted @event) { schema = schema.DeleteField(@event.FieldId); } - public void On(SchemaDeleted @event) + protected void On(SchemaDeleted @event) { isDeleted = true; } diff --git a/src/Squidex/Controllers/Api/Apps/AppContributorsController.cs b/src/Squidex/Controllers/Api/Apps/AppContributorsController.cs index c9d3d9d85..aacfc6750 100644 --- a/src/Squidex/Controllers/Api/Apps/AppContributorsController.cs +++ b/src/Squidex/Controllers/Api/Apps/AppContributorsController.cs @@ -66,7 +66,7 @@ namespace Squidex.Controllers.Api.Apps /// Assign contributor to app. /// /// The name of the app. - /// Contributor object that needs to be added to the app. + /// Contributor object that needs to be added to the app. /// /// 204 => User assigned to app. /// 400 => User is already assigned to the app or not found. @@ -74,10 +74,10 @@ namespace Squidex.Controllers.Api.Apps /// [HttpPost] [Route("apps/{app}/contributors/")] - [ProducesResponseType(typeof(ErrorDto[]), 400)] - public async Task PostContributor(string app, [FromBody] AssignContributorDto model) + [ProducesResponseType(typeof(ErrorDto), 400)] + public async Task PostContributor(string app, [FromBody] AssignContributorDto request) { - await CommandBus.PublishAsync(SimpleMapper.Map(model, new AssignContributor())); + await CommandBus.PublishAsync(SimpleMapper.Map(request, new AssignContributor())); return NoContent(); } @@ -93,7 +93,7 @@ namespace Squidex.Controllers.Api.Apps /// [HttpDelete] [Route("apps/{app}/contributors/{id}/")] - [ProducesResponseType(typeof(ErrorDto[]), 400)] + [ProducesResponseType(typeof(ErrorDto), 400)] public async Task DeleteContributor(string app, string id) { await CommandBus.PublishAsync(new RemoveContributor { ContributorId = id }); diff --git a/src/Squidex/Controllers/Api/Apps/AppController.cs b/src/Squidex/Controllers/Api/Apps/AppController.cs index 666be4c1a..7af80751b 100644 --- a/src/Squidex/Controllers/Api/Apps/AppController.cs +++ b/src/Squidex/Controllers/Api/Apps/AppController.cs @@ -71,7 +71,7 @@ namespace Squidex.Controllers.Api.Apps /// /// Create a new app. /// - /// The app object that needs to be added to squidex. + /// The app object that needs to be added to squidex. /// /// 201 => App created. /// 400 => App object is not valid. @@ -86,9 +86,9 @@ namespace Squidex.Controllers.Api.Apps [ProducesResponseType(typeof(EntityCreatedDto), 201)] [ProducesResponseType(typeof(ErrorDto), 400)] [ProducesResponseType(typeof(ErrorDto), 409)] - public async Task PostApp([FromBody] CreateAppDto model) + public async Task PostApp([FromBody] CreateAppDto request) { - var command = SimpleMapper.Map(model, new CreateApp()); + var command = SimpleMapper.Map(request, new CreateApp()); var context = await CommandBus.PublishAsync(command); var result = context.Result(); diff --git a/src/Squidex/Controllers/Api/Apps/AppLanguagesController.cs b/src/Squidex/Controllers/Api/Apps/AppLanguagesController.cs index d749943bd..2712ee423 100644 --- a/src/Squidex/Controllers/Api/Apps/AppLanguagesController.cs +++ b/src/Squidex/Controllers/Api/Apps/AppLanguagesController.cs @@ -14,6 +14,7 @@ using NSwag.Annotations; using Squidex.Infrastructure.CQRS.Commands; using Squidex.Infrastructure.Reflection; using Squidex.Controllers.Api.Apps.Models; +using Squidex.Infrastructure; using Squidex.Pipeline; using Squidex.Read.Apps.Services; using Squidex.Write.Apps.Commands; @@ -63,26 +64,66 @@ namespace Squidex.Controllers.Api.Apps } /// - /// Configure the app languages. + /// Attaches an app language. /// /// The name of the app. - /// The language configuration for the app. + /// The language to add to the app. /// - /// 204 => App languages configured. - /// 400 => Language configuration is empty or contains an invalid language. + /// 201 => App language created. + /// 400 => Language is an invalid language. /// 404 => App not found. /// - /// - /// The ordering of the languages matterns: When you retrieve a content with a localized content squidex tries - /// to resolve the correct language for these properties. When there is no value for a property in the specified language, - /// the previous languages from languages list is uses as a fallback. - /// [HttpPost] [Route("apps/{app}/languages/")] - [ProducesResponseType(typeof(ErrorDto[]), 400)] - public async Task PostLanguages(string app, [FromBody] ConfigureLanguagesDto model) + [ProducesResponseType(typeof(LanguageDto), 201)] + [ProducesResponseType(typeof(ErrorDto), 400)] + public async Task PostLanguage(string app, [FromBody] AddLanguageDto request) { - await CommandBus.PublishAsync(SimpleMapper.Map(model, new ConfigureLanguages())); + await CommandBus.PublishAsync(SimpleMapper.Map(request, new AddLanguage())); + + var response = SimpleMapper.Map(request.Language, new LanguageDto()); + + return StatusCode(201, response); + } + + /// + /// Updates an app language. + /// + /// The name of the app. + /// The language to delete from the app. + /// The language properties. + /// + /// 204 => App language updated. + /// 400 => Language is an invalid language. + /// 404 => App not found. + /// + [HttpPut] + [Route("apps/{app}/languages/{language}")] + public async Task Update(string app, string language, [FromBody] SetMasterLanguageDto model) + { + if (model.IsMasterLanguage) + { + await CommandBus.PublishAsync(new SetMasterLanguage { Language = Language.GetLanguage(language) }); + } + + return NoContent(); + } + + /// + /// Deletes an app language. + /// + /// The name of the app. + /// The language to delete from the app. + /// + /// 204 => App language deleted. + /// 400 => Language is an invalid language. + /// 404 => App not found. + /// + [HttpDelete] + [Route("apps/{app}/languages/{language}")] + public async Task DeleteLanguage(string app, string language) + { + await CommandBus.PublishAsync(new RemoveLanguage { Language = Language.GetLanguage(language) }); return NoContent(); } diff --git a/src/Squidex/Controllers/Api/Apps/Models/ConfigureLanguagesDto.cs b/src/Squidex/Controllers/Api/Apps/Models/AddLanguageDto.cs similarity index 67% rename from src/Squidex/Controllers/Api/Apps/Models/ConfigureLanguagesDto.cs rename to src/Squidex/Controllers/Api/Apps/Models/AddLanguageDto.cs index 2978cfdf7..3cde113d6 100644 --- a/src/Squidex/Controllers/Api/Apps/Models/ConfigureLanguagesDto.cs +++ b/src/Squidex/Controllers/Api/Apps/Models/AddLanguageDto.cs @@ -1,21 +1,22 @@ // ========================================================================== -// ConfigureLanguagesDto.cs +// AddLanguageDto.cs // Squidex Headless CMS // ========================================================================== // Copyright (c) Squidex Group // All rights reserved. // ========================================================================== -using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; using Squidex.Infrastructure; namespace Squidex.Controllers.Api.Apps.Models { - public sealed class ConfigureLanguagesDto + public class AddLanguageDto { /// - /// The list of languages to configure the app. + /// The language to add. /// - public List Languages { get; set; } + [Required] + public Language Language { get; set; } } } diff --git a/src/Squidex/Controllers/Api/Apps/Models/SetMasterLanguageDto.cs b/src/Squidex/Controllers/Api/Apps/Models/SetMasterLanguageDto.cs new file mode 100644 index 000000000..6379b6ba1 --- /dev/null +++ b/src/Squidex/Controllers/Api/Apps/Models/SetMasterLanguageDto.cs @@ -0,0 +1,18 @@ +// ========================================================================== +// SetMasterLanguageDto.cs +// Squidex Headless CMS +// ========================================================================== +// Copyright (c) Squidex Group +// All rights reserved. +// ========================================================================== + +namespace Squidex.Controllers.Api.Apps.Models +{ + public class SetMasterLanguageDto + { + /// + /// Set the value to true to make the language to the master language. + /// + public bool IsMasterLanguage { get; set; } + } +} diff --git a/src/Squidex/Controllers/Api/Schemas/SchemaFieldsController.cs b/src/Squidex/Controllers/Api/Schemas/SchemaFieldsController.cs index 5225833f8..dd0196da9 100644 --- a/src/Squidex/Controllers/Api/Schemas/SchemaFieldsController.cs +++ b/src/Squidex/Controllers/Api/Schemas/SchemaFieldsController.cs @@ -36,21 +36,21 @@ namespace Squidex.Controllers.Api.Schemas /// /// The name of the app. /// The name of the schema. - /// The field object that needs to be added to the schema. + /// The field object that needs to be added to the schema. /// - /// 201 => Field created. - /// 409 => Field name already in use. + /// 201 => Schema field created. + /// 409 => Schema field name already in use. /// 404 => App or schema not found. - /// 404 => Field properties not valid. + /// 404 => Schema field properties not valid. /// [HttpPost] [Route("apps/{app}/schemas/{name}/fields/")] [ProducesResponseType(typeof(EntityCreatedDto), 201)] [ProducesResponseType(typeof(ErrorDto), 409)] [ProducesResponseType(typeof(ErrorDto), 400)] - public async Task PostField(string app, string name, [FromBody] AddFieldDto model) + public async Task PostField(string app, string name, [FromBody] AddFieldDto request) { - var command = new AddField { Name = model.Name, Properties = model.Properties.ToProperties() }; + var command = new AddField { Name = request.Name, Properties = request.Properties.ToProperties() }; var context = await CommandBus.PublishAsync(command); var result = context.Result(); @@ -63,20 +63,20 @@ namespace Squidex.Controllers.Api.Schemas /// /// The name of the app. /// The name of the schema. - /// The field object that needs to be added to the schema. + /// The field object that needs to be added to the schema. /// - /// 204 => Field created. - /// 409 => Field name already in use. + /// 204 => Schema field created. + /// 409 => Schema field name already in use. /// 404 => App, schema or field not found. - /// 404 => Field properties not valid. + /// 404 => Schema field properties not valid. /// [HttpPut] [Route("apps/{app}/schemas/{name}/fields/{id:long}/")] [ProducesResponseType(typeof(ErrorDto), 409)] [ProducesResponseType(typeof(ErrorDto), 400)] - public async Task PutField(string app, string name, long id, [FromBody] UpdateFieldDto model) + public async Task PutField(string app, string name, long id, [FromBody] UpdateFieldDto request) { - var command = new UpdateField { FieldId = id, Properties = model.Properties.ToProperties() }; + var command = new UpdateField { FieldId = id, Properties = request.Properties.ToProperties() }; await CommandBus.PublishAsync(command); @@ -90,7 +90,7 @@ namespace Squidex.Controllers.Api.Schemas /// The name of the schema. /// The id of the field to hide. /// - /// 400 => Field already hidden. + /// 400 => Schema field already hidden. /// 204 => Schema field hidden. /// 404 => App, schema or field not found. /// @@ -116,7 +116,7 @@ namespace Squidex.Controllers.Api.Schemas /// The name of the schema. /// The id of the field to shows. /// - /// 400 => Field already visible. + /// 400 => Schema field already visible. /// 204 => Schema field shown. /// 404 => App, schema or field not found. /// @@ -142,7 +142,7 @@ namespace Squidex.Controllers.Api.Schemas /// The name of the schema. /// The id of the field to enable. /// - /// 400 => Field already enabled. + /// 400 => Schema field already enabled. /// 204 => Schema field enabled. /// 404 => App, schema or field not found. /// @@ -169,7 +169,7 @@ namespace Squidex.Controllers.Api.Schemas /// The name of the schema. /// The id of the field to disable. /// - /// 400 => Field already disabled. + /// 400 => Schema field already disabled. /// 204 => Schema field disabled. /// 404 => App, schema or field not found. /// diff --git a/src/Squidex/Controllers/Api/Schemas/SchemasController.cs b/src/Squidex/Controllers/Api/Schemas/SchemasController.cs index 6247c4cc2..8f8a82210 100644 --- a/src/Squidex/Controllers/Api/Schemas/SchemasController.cs +++ b/src/Squidex/Controllers/Api/Schemas/SchemasController.cs @@ -85,7 +85,7 @@ namespace Squidex.Controllers.Api.Schemas /// /// Create a new schema. /// - /// The schema object that needs to be added to the app. + /// The schema object that needs to be added to the app. /// The name of the app to create the schema to. /// /// 201 => Schema created. @@ -97,13 +97,13 @@ namespace Squidex.Controllers.Api.Schemas [ProducesResponseType(typeof(EntityCreatedDto), 201)] [ProducesResponseType(typeof(ErrorDto), 400)] [ProducesResponseType(typeof(ErrorDto), 409)] - public async Task PostSchema(string app, [FromBody] CreateSchemaDto model) + public async Task PostSchema(string app, [FromBody] CreateSchemaDto request) { - var command = SimpleMapper.Map(model, new CreateSchema { AggregateId = Guid.NewGuid() }); + var command = SimpleMapper.Map(request, new CreateSchema { AggregateId = Guid.NewGuid() }); await CommandBus.PublishAsync(command); - return CreatedAtAction(nameof(GetSchema), new { name = model.Name }, new EntityCreatedDto { Id = command.Name }); + return CreatedAtAction(nameof(GetSchema), new { name = request.Name }, new EntityCreatedDto { Id = command.Name }); } /// @@ -111,15 +111,15 @@ namespace Squidex.Controllers.Api.Schemas /// /// The app where the schema is a part of. /// The name of the schema. - /// The schema object that needs to updated. + /// The schema object that needs to updated. /// /// 204 => Schema updated. /// [HttpPut] [Route("apps/{app}/schemas/{name}/")] - public async Task PutSchema(string app, string name, [FromBody] UpdateSchemaDto model) + public async Task PutSchema(string app, string name, [FromBody] UpdateSchemaDto request) { - var command = SimpleMapper.Map(model, new UpdateSchema()); + var command = SimpleMapper.Map(request, new UpdateSchema()); await CommandBus.PublishAsync(command); diff --git a/src/Squidex/Controllers/Api/Users/UsersController.cs b/src/Squidex/Controllers/Api/Users/UsersController.cs index f28149b03..bb2e7bf55 100644 --- a/src/Squidex/Controllers/Api/Users/UsersController.cs +++ b/src/Squidex/Controllers/Api/Users/UsersController.cs @@ -61,7 +61,7 @@ namespace Squidex.Controllers.Api.Users /// The id of the user (GUID). /// /// 200 => User found. - /// 400 => User not found. + /// 404 => User not found. /// [HttpGet] [Route("users/{id}/")] diff --git a/tests/Squidex.Write.Tests/Apps/AppCommandHandlerTests.cs b/tests/Squidex.Write.Tests/Apps/AppCommandHandlerTests.cs index 8f2ae246a..a8d32b650 100644 --- a/tests/Squidex.Write.Tests/Apps/AppCommandHandlerTests.cs +++ b/tests/Squidex.Write.Tests/Apps/AppCommandHandlerTests.cs @@ -7,7 +7,6 @@ // ========================================================================== using System; -using System.Collections.Generic; using System.Threading.Tasks; using FluentAssertions; using Moq; diff --git a/tests/Squidex.Write.Tests/Apps/AppDomainObjectTests.cs b/tests/Squidex.Write.Tests/Apps/AppDomainObjectTests.cs index 795232050..7318b726e 100644 --- a/tests/Squidex.Write.Tests/Apps/AppDomainObjectTests.cs +++ b/tests/Squidex.Write.Tests/Apps/AppDomainObjectTests.cs @@ -164,7 +164,7 @@ namespace Squidex.Write.Apps } [Fact] - public void AttachClient_should_throw_if_name_already_exists() + public void AttachClient_should_throw_if_id_already_exists() { CreateApp(); @@ -191,7 +191,7 @@ namespace Squidex.Write.Apps } [Fact] - public void RevokeKey_should_throw_if_not_created() + public void RevokeClient_should_throw_if_not_created() { Assert.Throws(() => sut.RevokeClient(new RevokeClient { Id = "not-found" })); } @@ -230,7 +230,7 @@ namespace Squidex.Write.Apps } [Fact] - public void RenameKey_should_throw_if_not_created() + public void RenameClient_should_throw_if_not_created() { Assert.Throws(() => sut.RenameClient(new RenameClient { Id = "not-found", Name = clientNewName })); } @@ -268,6 +268,135 @@ namespace Squidex.Write.Apps }); } + [Fact] + public void AddLanguage_should_throw_if_not_created() + { + Assert.Throws(() => sut.AddLanguage(new AddLanguage { Language = Language.GetLanguage("de") })); + } + + [Fact] + public void AddLanguage_should_throw_if_command_is_not_valid() + { + CreateApp(); + + Assert.Throws(() => sut.AddLanguage(new AddLanguage())); + } + + [Fact] + public void AddLanguage_should_throw_if_language_already_exists() + { + CreateApp(); + + Assert.Throws(() => sut.AddLanguage(new AddLanguage { Language = Language.GetLanguage("en") })); + } + + [Fact] + public void AddLanguage_should_create_events() + { + CreateApp(); + + sut.AddLanguage(new AddLanguage { Language = Language.GetLanguage("de") }); + + sut.GetUncomittedEvents().Select(x => x.Payload).ToArray() + .ShouldBeEquivalentTo( + new IEvent[] + { + new AppLanguageAdded { Language = Language.GetLanguage("de") } + }); + } + + [Fact] + public void RemoveLanguage_should_throw_if_not_created() + { + Assert.Throws(() => sut.RemoveLanguage(new RemoveLanguage { Language = Language.GetLanguage("en") })); + } + + [Fact] + public void RemoveLanguage_should_throw_if_command_is_not_valid() + { + CreateApp(); + + Assert.Throws(() => sut.RemoveLanguage(new RemoveLanguage())); + } + + [Fact] + public void RemoveLanguage_should_throw_if_language_not_found() + { + CreateApp(); + + Assert.Throws(() => sut.RemoveLanguage(new RemoveLanguage { Language = Language.GetLanguage("de") })); + } + + [Fact] + public void RemoveLanguage_should_throw_if_master_language() + { + CreateApp(); + + Assert.Throws(() => sut.RemoveLanguage(new RemoveLanguage { Language = Language.GetLanguage("en") })); + } + + [Fact] + public void RemoveLanguage_should_create_events() + { + CreateApp(); + + sut.AddLanguage(new AddLanguage { Language = Language.GetLanguage("de") }); + sut.RemoveLanguage(new RemoveLanguage { Language = Language.GetLanguage("de") }); + + sut.GetUncomittedEvents().Select(x => x.Payload).Skip(1).ToArray() + .ShouldBeEquivalentTo( + new IEvent[] + { + new AppLanguageRemoved { Language = Language.GetLanguage("de") } + }); + } + + [Fact] + public void SetMasterLanguage_should_throw_if_not_created() + { + Assert.Throws(() => sut.SetMasterLanguage(new SetMasterLanguage { Language = Language.GetLanguage("en") })); + } + + [Fact] + public void SetMasterLanguage_should_throw_if_command_is_not_valid() + { + CreateApp(); + + Assert.Throws(() => sut.SetMasterLanguage(new SetMasterLanguage())); + } + + [Fact] + public void SetMasterLanguage_should_throw_if_language_not_found() + { + CreateApp(); + + Assert.Throws(() => sut.SetMasterLanguage(new SetMasterLanguage { Language = Language.GetLanguage("de") })); + } + + [Fact] + public void SetMasterLanguage_should_throw_if_already_master_language() + { + CreateApp(); + + Assert.Throws(() => sut.SetMasterLanguage(new SetMasterLanguage { Language = Language.GetLanguage("en") })); + } + + [Fact] + public void SetMasterLanguage_should_create_events() + { + CreateApp(); + + sut.AddLanguage(new AddLanguage { Language = Language.GetLanguage("de") }); + sut.SetMasterLanguage(new SetMasterLanguage { Language = Language.GetLanguage("de") }); + + sut.GetUncomittedEvents().Select(x => x.Payload).Skip(1).ToArray() + .ShouldBeEquivalentTo( + new IEvent[] + { + new AppMasterLanguageSet { Language = Language.GetLanguage("de") } + }); + } + private void CreateApp() { sut.Create(new CreateApp { Name = TestName, User = user });