using System; using System.Collections.Generic; using System.Linq; using System.Threading; using System.Threading.Tasks; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore.Query; using Microsoft.Extensions.Logging; using xCommons.Configurations; using xCommons.Extensions; using xCommons.Providers; using xExceptions.Constants; using xIdentityService.Controllers; using xIdentityService.Interfaces; using xModels.Base; using xModels.Dtos; using xPushService.Base; using xPushService.Interfaces; namespace xPushService.Controllers { [AllowAnonymous] public abstract class XBaseProvidedController : XBaseIdentityApiV1Controller, IXBaseProvidedController where TEntity : XBaseEntity where TDto : XBaseEntityDto where THub : XBaseDtoHub { private readonly IXBaseProvided provider; private readonly Func, IOrderedQueryable> defaultOrderBuilder; private readonly Func, IIncludableQueryable> defaultIncludeBuilder; protected XBaseProvidedController( ILogger> logger, XAppConfiguration appConfiguration, IXIdentityProvider identityProvider, XValidationProvider validationProvider, IXBaseProvided provider, Func, IOrderedQueryable> defaultOrderBuilder = null, Func, IIncludableQueryable> defaultIncludeBuilder = null ) : base( logger, appConfiguration, identityProvider, validationProvider ) { this.provider = provider; this.defaultOrderBuilder = defaultOrderBuilder; this.defaultIncludeBuilder = defaultIncludeBuilder; } // #region Retrieve ... /// /// Get Specified Item by ID ... /// /// /// /// /// [HttpGet("{id}")] public virtual async Task> Get( [FromRoute] TKey id, [FromQuery] bool useDefaultIncludes = false, CancellationToken cancellationToken = default ) { // try { // // Validate ... if (!ModelState.IsValid) { XException.InvalidArgs.Throw(); } ValidationProvider.NotNull(id); // var result = await provider.Get( id: id, includeBuilder: !useDefaultIncludes ? null : defaultIncludeBuilder, cancellationToken: cancellationToken ); // return Ok(result.ToDynamicObject()); } catch (Exception ex) { // var result = GetExceptionActionResult(ex); return result; } } /// /// Get All Exists Items ... /// /// /// /// /// [HttpGet("")] public virtual async Task>> GetAll( [FromQuery] bool useDefaultOrders = false, [FromQuery] bool useDefaultIncludes = false, CancellationToken cancellationToken = default ) { // try { // // Validate ... if (!ModelState.IsValid) { XException.InvalidArgs.Throw(); } // var result = await provider.GetAll( orderBuilder: !useDefaultOrders ? null : defaultOrderBuilder, includeBuilder: !useDefaultIncludes ? null : defaultIncludeBuilder, cancellationToken: cancellationToken ); // return Ok(result.ToDynamicObject()); } catch (Exception ex) { // var result = GetExceptionActionResult(ex); return result; } } /// /// Find an item by providing a Conditional Expression ... /// /// /// /// /// [HttpGet("Find/One")] public virtual async Task> FindOne( [FromRoute] string query, [FromQuery] bool useDefaultIncludes = false, CancellationToken cancellationToken = default ) { // try { // // Validate ... if (!ModelState.IsValid) { XException.InvalidArgs.Throw(); } await ValidationProvider .GroupValidationBuilder() .AddNotEmpty(query) .ValidateGroupAsync(); // var result = await provider.FindOne( includeBuilder: !useDefaultIncludes ? null : defaultIncludeBuilder, cancellationToken: cancellationToken, predicate: x => x.PropValuesContains(query) ); // return Ok(result.ToDynamicObject()); } catch (Exception ex) { // var result = GetExceptionActionResult(ex); return result; } } /// /// Find a collection of Items by proving a Query Search ... /// /// /// /// /// /// [HttpGet("Find/Many")] public virtual async Task>> FindMany( [FromRoute] string query, [FromQuery] bool useDefaultOrders = false, [FromQuery] bool useDefaultIncludes = false, CancellationToken cancellationToken = default ) { // try { // // Validate ... if (!ModelState.IsValid) { XException.InvalidArgs.Throw(); } await ValidationProvider .GroupValidationBuilder() .AddNotEmpty(query) .ValidateGroupAsync(); // var result = await provider.FindMany( orderBuilder: !useDefaultOrders ? null : defaultOrderBuilder, includeBuilder: !useDefaultIncludes ? null : defaultIncludeBuilder, cancellationToken: cancellationToken, predicate: x => x.PropValuesContains(query) ); // return Ok(result.ToDynamicObject()); } catch (Exception ex) { // var result = GetExceptionActionResult(ex); return result; } } /// /// Retrieve Items based on XQuery Pagination structure ... /// /// /// /// /// /// [HttpGet("Query")] public virtual async Task>> Query( [FromQuery] XQuery query, [FromQuery] bool useDefaultOrders = false, [FromQuery] bool useDefaultIncludes = false, CancellationToken cancellationToken = default ) { // try { // // Validate ... if (!ModelState.IsValid) { XException.InvalidArgs.Throw(); } await ValidationProvider .GroupValidationBuilder() .AddNotNull(query) .ValidateGroupAsync(); // var result = await provider.Query( query: query, predicate: null, orderBuilder: !useDefaultOrders ? null : defaultOrderBuilder, includeBuilder: !useDefaultIncludes ? null : defaultIncludeBuilder, cancellationToken: cancellationToken ); // return Ok(result.ToDynamicObject()); } catch (Exception ex) { // var result = GetExceptionActionResult(ex); return result; } } /// /// Retrieve Owned Items based on XQuery Pagination structure ... /// /// /// /// /// /// [HttpGet("Query/Owned")] public virtual async Task>> QueryOwned( [FromQuery] XQuery query, [FromQuery] bool useDefaultOrders = false, [FromQuery] bool useDefaultIncludes = false, CancellationToken cancellationToken = default ) { // try { // // Validate ... if (!ModelState.IsValid) { XException.InvalidArgs.Throw(); } await ValidationProvider .GroupValidationBuilder() .AddNotNull(query) .ValidateGroupAsync(); // var userInfo = await GetUserInfo(); // var result = await provider.QueryOwned( query: query, predicate: null, userInfo: userInfo, orderBuilder: !useDefaultOrders ? null : defaultOrderBuilder, includeBuilder: !useDefaultIncludes ? null : defaultIncludeBuilder, cancellationToken: cancellationToken ); // return Ok(result.ToDynamicObject()); } catch (Exception ex) { // var result = GetExceptionActionResult(ex); return result; } } #endregion // #region Add/Update/Remove ... /// /// Add an item ... /// /// /// /// [HttpPost("")] public virtual async Task> Add( [FromBody] TDto item, CancellationToken cancellationToken = default ) { // try { // // Validate ... if (!ModelState.IsValid) { XException.InvalidArgs.Throw(); } await ValidationProvider .GroupValidationBuilder() .AddNotNull(item) .ValidateGroupAsync(); // var userInfo = await GetUserInfo(); var connectionId = GetConnectionId(); // var result = await provider.Add( item: item, userInfo: userInfo, connectionId: connectionId, cancellationToken: cancellationToken ); // return Ok(result.ToDynamicObject()); } catch (Exception ex) { // var result = GetExceptionActionResult(ex); return result; } } /// /// Update an item values ... /// /// /// /// /// [HttpPut("{id}")] public virtual async Task> Update( [FromRoute] TKey id, [FromBody] TDto item, CancellationToken cancellationToken = default ) { // try { // // Validate ... if (!ModelState.IsValid) { XException.InvalidArgs.Throw(); } await ValidationProvider .GroupValidationBuilder() .AddNotNull(id) .AddNotNull(item) .ValidateGroupAsync(); // var userInfo = await GetUserInfo(); var connectionId = GetConnectionId(); // var result = await provider.Update( id: id, item: item, userInfo: userInfo, connectionId: connectionId, cancellationToken: cancellationToken ); // return Ok(result.ToDynamicObject()); } catch (Exception ex) { // var result = GetExceptionActionResult(ex); return result; } } /// /// Remove an Item ... /// /// /// /// [HttpDelete("{id}")] public virtual async Task> Remove( [FromRoute] TKey id, CancellationToken cancellationToken = default ) { // try { // // Validate ... if (!ModelState.IsValid) { XException.InvalidArgs.Throw(); } await ValidationProvider .GroupValidationBuilder() .AddNotNull(id) .ValidateGroupAsync(); // var userInfo = await GetUserInfo(); var connectionId = GetConnectionId(); // var result = await provider.Remove( id: id, userInfo: userInfo, connectionId: connectionId, cancellationToken: cancellationToken ); // return Ok(result.ToDynamicObject()); } catch (Exception ex) { // var result = GetExceptionActionResult(ex); return result; } } #endregion } }