using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
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 xTermsAndConditionsService.Interfaces;
namespace xTermsAndConditionsService.Controllers
{
///
/// a Base Controller Implementation for Providing Base Actions of
/// Terms and Conditions Provided Actions ...
///
[AllowAnonymous]
public abstract class XTermsAndComditionsControllerBase : XBaseIdentityApiV1Controller, IXTermsAndComditionsController
{
private readonly IXTermsAndComditionsProvider provider;
protected XTermsAndComditionsControllerBase(
ILogger logger,
XAppConfiguration appConfiguration,
IXIdentityProvider identityProvider,
IXTermsAndComditionsProvider provider,
XValidationProvider validationProvider
) : base(
logger,
appConfiguration,
identityProvider,
validationProvider
)
{
this.provider = provider;
}
//
#region Actions ...
///
/// Retrieved all Exists Languages Terms and Conditions ...
///
///
[HttpGet("Terms/Languages")]
public virtual async Task>> TermsLanguages(
CancellationToken cancellationToken = default
)
{
//
try
{
//
var result = await provider.TermsLanguages(
cancellationToken: cancellationToken
);
//
return Ok(result.ToDynamicObject());
}
catch (Exception ex)
{
//
var result = GetExceptionActionResult(ex);
return result;
}
}
///
/// Check Has Terms and Conditions based on Specified Language ...
///
/// if null, used Default Language ...
///
[HttpGet("Terms/{language}/Has")]
public virtual async Task> HasTerms(
[FromRoute] string language = null,
CancellationToken cancellationToken = default
)
{
//
try
{
//
// Validate ...
if (!ModelState.IsValid)
{
XException.InvalidArgs.Throw();
}
await ValidationProvider
.GroupValidationBuilder()
.AddNotEmpty(language)
.ValidateGroupAsync();
//
var result = await provider.HasTerms(
language: language,
cancellationToken: cancellationToken
);
//
return Ok(result);
}
catch (Exception ex)
{
//
var result = GetExceptionActionResult(ex);
return result;
}
}
///
/// Retrieve Terms and Conditions for Specified Language ...
///
/// if null, used Default Language ...
///
[HttpGet("Terms/{language}")]
public virtual async Task> GetTerms(
[FromRoute] string language = null,
CancellationToken cancellationToken = default
)
{
//
try
{
//
// Validate ...
if (!ModelState.IsValid)
{
XException.InvalidArgs.Throw();
}
await ValidationProvider
.GroupValidationBuilder()
.AddNotEmpty(language)
.ValidateGroupAsync();
//
var result = await provider.GetTerms(
language: language,
cancellationToken: cancellationToken
);
//
return Ok(result);
}
catch (Exception ex)
{
//
var result = GetExceptionActionResult(ex);
return result;
}
}
///
/// Add Terms and Conditions for Specified Language ...
///
///
///
///
[HttpPost("Terms/{language}")]
public virtual async Task> AddTerms(
[FromRoute] string language,
[FromBody] XBaseValueContainer terms,
CancellationToken cancellationToken = default
)
{
//
try
{
//
// Validate ...
if (!ModelState.IsValid)
{
XException.InvalidArgs.Throw();
}
await ValidationProvider
.GroupValidationBuilder()
.AddNotEmpty(language)
.AddNotNull(terms)
.AddNotEmpty(terms.Value)
.ValidateGroupAsync();
//
var userInfo = await GetUserInfo();
var connectionId = GetConnectionId();
//
var result = await provider.AddTerms(
language: language,
terms: terms.Value,
userInfo: userInfo,
connectionId: connectionId,
cancellationToken: cancellationToken
);
//
return Ok(result);
}
catch (Exception ex)
{
//
var result = GetExceptionActionResult(ex);
return result;
}
}
///
/// Remove Terms and Conditions of Specified Language ...
///
///
///
[HttpDelete("Terms/{language}")]
public virtual async Task> RemoveTerms(
[FromRoute] string language,
CancellationToken cancellationToken = default
)
{
//
try
{
//
// Validate ...
if (!ModelState.IsValid)
{
XException.InvalidArgs.Throw();
}
await ValidationProvider
.GroupValidationBuilder()
.AddNotEmpty(language)
.ValidateGroupAsync();
//
var userInfo = await GetUserInfo();
var connectionId = GetConnectionId();
//
var result = await provider.RemoveTerms(
language: language,
userInfo: userInfo,
connectionId: connectionId,
cancellationToken: cancellationToken
);
//
return Ok(result);
}
catch (Exception ex)
{
//
var result = GetExceptionActionResult(ex);
return result;
}
}
///
/// Update Terms and Conditions of Specified Language ...
///
///
///
///
[HttpPut("Terms/{language}")]
public virtual async Task> UpdateTerms(
[FromRoute] string language,
[FromBody] XBaseValueContainer terms,
CancellationToken cancellationToken = default
)
{
//
try
{
//
// Validate ...
if (!ModelState.IsValid)
{
XException.InvalidArgs.Throw();
}
await ValidationProvider
.GroupValidationBuilder()
.AddNotEmpty(language)
.AddNotNull(terms)
.AddNotEmpty(terms.Value)
.ValidateGroupAsync();
//
var userInfo = await GetUserInfo();
var connectionId = GetConnectionId();
//
var result = await provider.UpdateTerms(
language: language,
terms: terms.Value,
userInfo: userInfo,
connectionId: connectionId,
cancellationToken: cancellationToken
);
//
return Ok(result);
}
catch (Exception ex)
{
//
var result = GetExceptionActionResult(ex);
return result;
}
}
#endregion
}
}