// ========================================================================== // Squidex Headless CMS // ========================================================================== // Copyright (c) Squidex UG (haftungsbeschränkt) // All rights reserved. Licensed under the MIT license. // ========================================================================== using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; using Squidex.Areas.Api.Controllers.Schemas.Models; using Squidex.Domain.Apps.Entities.Schemas.Commands; using Squidex.Infrastructure.Commands; using Squidex.Shared; using Squidex.Web; namespace Squidex.Areas.Api.Controllers.Schemas { /// /// Manages and retrieves information about schemas. /// [ApiExplorerSettings(GroupName = nameof(Schemas))] public sealed class SchemaFieldsController : ApiController { public SchemaFieldsController(ICommandBus commandBus) : base(commandBus) { } /// /// Add a schema field. /// /// The name of the app. /// The name of the schema. /// The field object that needs to be added to the schema. /// /// 201 => Schema field created. /// 400 => Schema field properties not valid. /// 404 => Schema or app not found. /// 409 => Schema field name already in use. /// [HttpPost] [Route("apps/{app}/schemas/{name}/fields/")] [ProducesResponseType(typeof(EntityCreatedDto), 201)] [ProducesResponseType(typeof(ErrorDto), 409)] [ProducesResponseType(typeof(ErrorDto), 400)] [ApiPermission(Permissions.AppSchemasUpdate)] [ApiCosts(1)] public async Task PostField(string app, string name, [FromBody] AddFieldDto request) { var context = await CommandBus.PublishAsync(request.ToCommand()); var result = context.Result>(); var response = EntityCreatedDto.FromResult(result); return StatusCode(201, response); } /// /// Add a nested schema field. /// /// The name of the app. /// The name of the schema. /// The parent field id. /// The field object that needs to be added to the schema. /// /// 201 => Schema field created. /// 400 => Schema field properties not valid. /// 409 => Schema field name already in use. /// 404 => Schema, field or app not found. /// [HttpPost] [Route("apps/{app}/schemas/{name}/fields/{parentId:long}/nested/")] [ProducesResponseType(typeof(EntityCreatedDto), 201)] [ProducesResponseType(typeof(ErrorDto), 409)] [ProducesResponseType(typeof(ErrorDto), 400)] [ApiPermission(Permissions.AppSchemasUpdate)] [ApiCosts(1)] public async Task PostNestedField(string app, string name, long parentId, [FromBody] AddFieldDto request) { var context = await CommandBus.PublishAsync(request.ToCommand(parentId)); var result = context.Result>(); var response = EntityCreatedDto.FromResult(result); return StatusCode(201, response); } /// /// Reorders the fields. /// /// The name of the app. /// The name of the schema. /// The request that contains the field ids. /// /// 204 => Schema fields reorderd. /// 400 => Schema field ids do not cover the fields of the schema. /// 404 => Schema or app not found. /// [HttpPut] [Route("apps/{app}/schemas/{name}/fields/ordering/")] [ProducesResponseType(typeof(ErrorDto), 400)] [ApiPermission(Permissions.AppSchemasUpdate)] [ApiCosts(1)] public async Task PutSchemaFieldOrdering(string app, string name, [FromBody] ReorderFieldsDto request) { await CommandBus.PublishAsync(request.ToCommand()); return NoContent(); } /// /// Reorders the nested fields. /// /// The name of the app. /// The name of the schema. /// The parent field id. /// The request that contains the field ids. /// /// 204 => Schema fields reorderd. /// 400 => Schema field ids do not cover the fields of the schema. /// 404 => Schema, field or app not found. /// [HttpPut] [Route("apps/{app}/schemas/{name}/fields/{parentId:long}/nested/ordering/")] [ProducesResponseType(typeof(ErrorDto), 400)] [ApiPermission(Permissions.AppSchemasUpdate)] [ApiCosts(1)] public async Task PutNestedFieldOrdering(string app, string name, long parentId, [FromBody] ReorderFieldsDto request) { await CommandBus.PublishAsync(request.ToCommand(parentId)); return NoContent(); } /// /// Update a schema field. /// /// The name of the app. /// The name of the schema. /// The id of the field to update. /// The field object that needs to be added to the schema. /// /// 204 => Schema field updated. /// 400 => Schema field properties not valid or field is locked. /// 404 => Schema, field or app not found. /// [HttpPut] [Route("apps/{app}/schemas/{name}/fields/{id:long}/")] [ProducesResponseType(typeof(ErrorDto), 400)] [ApiPermission(Permissions.AppSchemasUpdate)] [ApiCosts(1)] public async Task PutField(string app, string name, long id, [FromBody] UpdateFieldDto request) { await CommandBus.PublishAsync(request.ToCommand(id)); return NoContent(); } /// /// Update a nested schema field. /// /// The name of the app. /// The name of the schema. /// The parent field id. /// The id of the field to update. /// The field object that needs to be added to the schema. /// /// 204 => Schema field updated. /// 400 => Schema field properties not valid or field is locked. /// 404 => Schema, field or app not found. /// [HttpPut] [Route("apps/{app}/schemas/{name}/fields/{parentId:long}/nested/{id:long}/")] [ProducesResponseType(typeof(ErrorDto), 400)] [ApiPermission(Permissions.AppSchemasUpdate)] [ApiCosts(1)] public async Task PutNestedField(string app, string name, long parentId, long id, [FromBody] UpdateFieldDto request) { await CommandBus.PublishAsync(request.ToCommand(id, parentId)); return NoContent(); } /// /// Lock a schema field. /// /// The name of the app. /// The name of the schema. /// The id of the field to lock. /// /// 204 => Schema field shown. /// 400 => Schema field already locked. /// 404 => Schema, field or app not found. /// /// /// A locked field cannot be updated or deleted. /// [HttpPut] [Route("apps/{app}/schemas/{name}/fields/{id:long}/lock/")] [ProducesResponseType(typeof(ErrorDto), 400)] [ApiPermission(Permissions.AppSchemasUpdate)] [ApiCosts(1)] public async Task LockField(string app, string name, long id) { await CommandBus.PublishAsync(new LockField { FieldId = id }); return NoContent(); } /// /// Lock a nested schema field. /// /// The name of the app. /// The name of the schema. /// The parent field id. /// The id of the field to lock. /// /// 204 => Schema field hidden. /// 400 => Schema field already hidden. /// 404 => Field, schema, or app not found. /// /// /// A locked field cannot be edited or deleted. /// [HttpPut] [Route("apps/{app}/schemas/{name}/fields/{parentId:long}/nested/{id:long}/lock/")] [ProducesResponseType(typeof(ErrorDto), 400)] [ApiPermission(Permissions.AppSchemasUpdate)] [ApiCosts(1)] public async Task LockNestedField(string app, string name, long parentId, long id) { await CommandBus.PublishAsync(new LockField { ParentFieldId = parentId, FieldId = id }); return NoContent(); } /// /// Hide a schema field. /// /// The name of the app. /// The name of the schema. /// The id of the field to hide. /// /// 204 => Schema field hidden. /// 400 => Schema field already hidden. /// 404 => Schema, field or app not found. /// /// /// A hidden field is not part of the API response, but can still be edited in the portal. /// [HttpPut] [Route("apps/{app}/schemas/{name}/fields/{id:long}/hide/")] [ProducesResponseType(typeof(ErrorDto), 400)] [ApiPermission(Permissions.AppSchemasUpdate)] [ApiCosts(1)] public async Task HideField(string app, string name, long id) { await CommandBus.PublishAsync(new HideField { FieldId = id }); return NoContent(); } /// /// Hide a nested schema field. /// /// The name of the app. /// The name of the schema. /// The parent field id. /// The id of the field to hide. /// /// 204 => Schema field hidden. /// 400 => Schema field already hidden. /// 404 => Field, schema, or app not found. /// /// /// A hidden field is not part of the API response, but can still be edited in the portal. /// [HttpPut] [Route("apps/{app}/schemas/{name}/fields/{parentId:long}/nested/{id:long}/hide/")] [ProducesResponseType(typeof(ErrorDto), 400)] [ApiPermission(Permissions.AppSchemasUpdate)] [ApiCosts(1)] public async Task HideNestedField(string app, string name, long parentId, long id) { await CommandBus.PublishAsync(new HideField { ParentFieldId = parentId, FieldId = id }); return NoContent(); } /// /// Show a schema field. /// /// The name of the app. /// The name of the schema. /// The id of the field to show. /// /// 204 => Schema field shown. /// 400 => Schema field already visible. /// 404 => Schema, field or app not found. /// /// /// A hidden field is not part of the API response, but can still be edited in the portal. /// [HttpPut] [Route("apps/{app}/schemas/{name}/fields/{id:long}/show/")] [ProducesResponseType(typeof(ErrorDto), 400)] [ApiPermission(Permissions.AppSchemasUpdate)] [ApiCosts(1)] public async Task ShowField(string app, string name, long id) { await CommandBus.PublishAsync(new ShowField { FieldId = id }); return NoContent(); } /// /// Show a nested schema field. /// /// The name of the app. /// The name of the schema. /// The parent field id. /// The id of the field to show. /// /// 204 => Schema field shown. /// 400 => Schema field already visible. /// 404 => Schema, field or app not found. /// /// /// A hidden field is not part of the API response, but can still be edited in the portal. /// [HttpPut] [Route("apps/{app}/schemas/{name}/fields/{parentId:long}/nested/{id:long}/show/")] [ProducesResponseType(typeof(ErrorDto), 400)] [ApiPermission(Permissions.AppSchemasUpdate)] [ApiCosts(1)] public async Task ShowNestedField(string app, string name, long parentId, long id) { await CommandBus.PublishAsync(new ShowField { ParentFieldId = parentId, FieldId = id }); return NoContent(); } /// /// Enable a schema field. /// /// The name of the app. /// The name of the schema. /// The id of the field to enable. /// /// 204 => Schema field enabled. /// 400 => Schema field already enabled. /// 404 => Schema, field or app not found. /// /// /// A disabled field cannot not be edited in the squidex portal anymore, but will be part of the API response. /// [HttpPut] [Route("apps/{app}/schemas/{name}/fields/{id:long}/enable/")] [ProducesResponseType(typeof(ErrorDto), 400)] [ApiPermission(Permissions.AppSchemasUpdate)] [ApiCosts(1)] public async Task EnableField(string app, string name, long id) { await CommandBus.PublishAsync(new EnableField { FieldId = id }); return NoContent(); } /// /// Enable a nested schema field. /// /// The name of the app. /// The name of the schema. /// The parent field id. /// The id of the field to enable. /// /// 204 => Schema field enabled. /// 400 => Schema field already enabled. /// 404 => Schema, field or app not found. /// /// /// A disabled field cannot not be edited in the squidex portal anymore, but will be part of the API response. /// [HttpPut] [Route("apps/{app}/schemas/{name}/fields/{parentId:long}/nested/{id:long}/enable/")] [ProducesResponseType(typeof(ErrorDto), 400)] [ApiPermission(Permissions.AppSchemasUpdate)] [ApiCosts(1)] public async Task EnableNestedField(string app, string name, long parentId, long id) { await CommandBus.PublishAsync(new EnableField { ParentFieldId = parentId, FieldId = id }); return NoContent(); } /// /// Disable a schema field. /// /// The name of the app. /// The name of the schema. /// The id of the field to disable. /// /// 204 => Schema field disabled. /// 400 => Schema field already disabled. /// 404 => Schema, field or app not found. /// /// /// A disabled field cannot not be edited in the squidex portal anymore, but will be part of the API response. /// [HttpPut] [Route("apps/{app}/schemas/{name}/fields/{id:long}/disable/")] [ProducesResponseType(typeof(ErrorDto), 400)] [ApiPermission(Permissions.AppSchemasUpdate)] [ApiCosts(1)] public async Task DisableField(string app, string name, long id) { await CommandBus.PublishAsync(new DisableField { FieldId = id }); return NoContent(); } /// /// Disable nested a schema field. /// /// The name of the app. /// The name of the schema. /// The parent field id. /// The id of the field to disable. /// /// 204 => Schema field disabled. /// 400 => Schema field already disabled. /// 404 => Schema, field or app not found. /// /// /// A disabled field cannot not be edited in the squidex portal anymore, but will be part of the API response. /// [HttpPut] [Route("apps/{app}/schemas/{name}/fields/{parentId:long}/nested/{id:long}/disable/")] [ProducesResponseType(typeof(ErrorDto), 400)] [ApiPermission(Permissions.AppSchemasUpdate)] [ApiCosts(1)] public async Task DisableNestedField(string app, string name, long parentId, long id) { await CommandBus.PublishAsync(new DisableField { ParentFieldId = parentId, FieldId = id }); return NoContent(); } /// /// Delete a schema field. /// /// The name of the app. /// The name of the schema. /// The id of the field to disable. /// /// 204 => Schema field deleted. /// 400 => Field is locked. /// 404 => Schema, field or app not found. /// [HttpDelete] [Route("apps/{app}/schemas/{name}/fields/{id:long}/")] [ApiPermission(Permissions.AppSchemasUpdate)] [ApiCosts(1)] public async Task DeleteField(string app, string name, long id) { await CommandBus.PublishAsync(new DeleteField { FieldId = id }); return NoContent(); } /// /// Delete a nested schema field. /// /// The name of the app. /// The name of the schema. /// The parent field id. /// The id of the field to disable. /// /// 204 => Schema field deleted. /// 400 => Field is locked. /// 404 => Schema, field or app not found. /// [HttpDelete] [Route("apps/{app}/schemas/{name}/fields/{parentId:long}/nested/{id:long}/")] [ApiPermission(Permissions.AppSchemasUpdate)] [ApiCosts(1)] public async Task DeleteNestedField(string app, string name, long parentId, long id) { await CommandBus.PublishAsync(new DeleteField { ParentFieldId = parentId, FieldId = id }); return NoContent(); } } }