using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using xIdentityHelper;
using xCommons.Attributes;
using xCommons.Extensions;
using xExceptions.Constants;
using xIdentityModels.Constants;
using xIdentityModels.Models;
using static IdentityServer4.IdentityServerConstants;
namespace xIds.Controllers
{
public partial class AccountController
{
//
#region CanRegister ...
///
/// Check a UserName is Available For Registration or not
///
/// an string value which represent desired username
/// a boolean value
[AllowAnonymous]
[RequireXPowered]
[HttpGet("CanRegisterUserName/{userName?}")]
public async Task> CanRegisterUserName(
[FromRoute] string userName
)
{
//
// Validate Args ...
if (userName.IsNullOrEmpty())
{
return BadRequest(
XException.InvalidArgs
.ToXError()
);
}
//
// Do Action ...
try
{
//
var result = await IdentityManager
.CanRegister(userName);
//
// Return Result
return Ok(result);
}
catch (Exception ex)
{
//
var result = GetExceptionActionResult(ex);
//
return result;
}
}
///
/// Check a Mobile Number is Available For Registration or not
///
/// an string value which represent desired mobile number
/// a boolean value
[AllowAnonymous]
[RequireXPowered]
[HttpGet("CanRegisterMobileNumber/{mobileNumber?}")]
public async Task> CanRegisterMobileNumber(
[FromRoute] string mobileNumber
)
{
//
// Validate Args ...
if (mobileNumber.IsNullOrEmpty())
{
return BadRequest(
XException.InvalidArgs
.ToXError()
);
}
if (!mobileNumber.IsValidMobileNumber())
{
return BadRequest(
XException.InvalidMobileNumber
.ToXError()
);
}
//
// Do Action ...
try
{
//
var result = await IdentityManager
.CanRegister(mobileNumber);
//
// Return Result
return Ok(result);
}
catch (Exception ex)
{
//
var result = GetExceptionActionResult(ex);
//
return result;
}
}
///
/// Check a Email Address is Available For Registration or not
///
/// an string value which represent desired email address
/// a boolean value
[AllowAnonymous]
[RequireXPowered]
[HttpGet("CanRegisterEmail/{email?}")]
public async Task> CanRegisterEmail(
[FromRoute] string email
)
{
//
// Validate Args ...
if (email.IsNullOrEmpty())
{
return BadRequest(
XException.InvalidArgs
.ToXError()
);
}
if (!email.IsValidEmail())
{
return BadRequest(
XException.InvalidEmailAddress
.ToXError()
);
}
//
// Do Action ...
try
{
//
var result = await IdentityManager
.CanRegister(email);
//
// Return Result
return Ok(result);
}
catch (Exception ex)
{
//
var result = GetExceptionActionResult(ex);
//
return result;
}
}
#endregion
//
#region Confirmations ...
///
/// Check User is Confirmed Email or not
///
/// a boolean value
[RequireXPowered]
[HttpGet("IsConfirmedEmail")]
[Authorize(Policy = XPolicies.User)]
[Authorize(Policy = LocalApi.PolicyName)]
public async Task> IsConfirmedEmail()
{
//
// Do Action ...
try
{
//
var result = await IdentityManager
.IsConfirmedEmail(User.Identity.Name);
//
// Return Result
return Ok(result);
}
catch (Exception ex)
{
//
var result = GetExceptionActionResult(ex);
//
return result;
}
}
///
/// Check User is Confirmed Mobile or not
///
/// a boolean value
[RequireXPowered]
[HttpGet("IsConfirmedMobile")]
[Authorize(Policy = XPolicies.User)]
[Authorize(Policy = LocalApi.PolicyName)]
public async Task> IsConfirmedMobile()
{
//
// Do Action ...
try
{
//
var result = await IdentityManager
.IsConfirmedMobile(User.Identity.Name);
//
// Return Result
return Ok(result);
}
catch (Exception ex)
{
//
var result = GetExceptionActionResult(ex);
//
return result;
}
}
///
/// Confirm Registration
///
///
/// for this action you have to provide:
/// - Lang: client device currently used locale, such as: en-US.
/// - ActionToken: user's requested action token for this action.
/// - Device: user's client device which is an instance of XDevice.
/// - ReturnUrl: client application Login URL.
///
/// Sample request:
///
/// {
/// "lang": "fa-IR",
/// "actionToken": ""
/// "returnUrl": "http://localhost/login",
/// "device": {
/// "os":"Mac",
/// "browser":"Chrome",
/// "osVersion":"mac-os-x-15",
/// "userAgent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) x-framework-test/0.0.0 Chrome/87.0.4280.141 Electron/11.2.0 Safari/537.36",
/// "deviceType":3,
/// "identifier":"[Mac]-[mac-os-x-15]-[3]-[Chrome]-[Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) x-framework-test/0.0.0 Chrome/87.0.4280.141 Electron/11.2.0 Safari/537.36]",
/// "token":"96f400dd9aa5c57a8cec9d6f4775bad3"
/// }
/// }
///
///
/// an instance of XActionRequest class which provider requirement for action
///
[AllowAnonymous]
[RequireXPowered]
[HttpPost("ConfirmRegistration")]
public async Task ConfirmRegistration(
[FromBody] XActionRequest model
)
{
//
// Do Action ...
try
{
//
// Validate Args ...
if (!ModelState.IsValid)
{
XException.InvalidArgs.Throw();
}
await ValidationProvider
.GroupValidationBuilder()
.AddNotEmpty(
model.Lang,
model.ActionToken,
model.ReturnUrl
)
.AddNotNull(model.Device)
.ValidateGroupAsync();
//
// Get Request ...
await IdentityManager
.ConfirmRegistration(
model.Lang,
model.Device,
model.ActionToken,
model.ReturnUrl
);
//
return Ok();
}
catch (Exception ex)
{
//
var exResult = GetExceptionActionResult(ex);
return exResult;
}
}
///
/// Confirm Requested Mobile Number
///
///
/// for this action you have to provide:
/// - Lang: client device currently used locale, such as: en-US.
/// - ActionToken: user's requested action token for this action.
/// - Device: user's client device which is an instance of XDevice.
/// - MobileVerificationCode: a verification code which produced due Request Action.
///
/// Sample request:
///
/// {
/// "lang": "fa-IR",
/// "actionToken": ""
/// "mobileVerificationCode": "",
/// "device": {
/// "os":"Mac",
/// "browser":"Chrome",
/// "osVersion":"mac-os-x-15",
/// "userAgent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) x-framework-test/0.0.0 Chrome/87.0.4280.141 Electron/11.2.0 Safari/537.36",
/// "deviceType":3,
/// "identifier":"[Mac]-[mac-os-x-15]-[3]-[Chrome]-[Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) x-framework-test/0.0.0 Chrome/87.0.4280.141 Electron/11.2.0 Safari/537.36]",
/// "token":"96f400dd9aa5c57a8cec9d6f4775bad3"
/// }
/// }
///
///
/// an instance of XActionRequest class which provider requirement for action
/// an instance of XActionResponse
[AllowAnonymous]
[RequireXPowered]
[HttpPost("ConfirmMobileNumber")]
public async Task> ConfirmMobileNumber(
[FromBody] XActionRequest model
)
{
//
// Do Action ...
try
{
//
// Validate Args ...
if (!ModelState.IsValid)
{
XException.InvalidArgs.Throw();
}
await ValidationProvider
.GroupValidationBuilder()
.AddNotEmpty(
model.Lang,
model.ActionToken,
model.MobileVerificationCode
)
.AddNotNull(model.Device)
.ValidateGroupAsync();
//
// Get Request ...
var result = await IdentityManager
.ConfirmMobileNumber(
model.Lang,
model.Device,
model.ActionToken,
model.MobileVerificationCode
);
//
return Ok(result
.ToDynamicObject());
}
catch (Exception ex)
{
//
var exResult = GetExceptionActionResult(ex);
return exResult;
}
}
///
/// Confirm Requested Email Address
///
///
/// for this action you have to provide:
/// - Lang: client device currently used locale, such as: en-US.
/// - ActionToken: user's requested action token for this action.
/// - Device: user's client device which is an instance of XDevice.
/// - EmailVerificationCode: a verification code which produced due Request Action.
///
/// Sample request:
///
/// {
/// "lang": "fa-IR",
/// "actionToken": ""
/// "emailVerificationCode": "",
/// "device": {
/// "os":"Mac",
/// "browser":"Chrome",
/// "osVersion":"mac-os-x-15",
/// "userAgent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) x-framework-test/0.0.0 Chrome/87.0.4280.141 Electron/11.2.0 Safari/537.36",
/// "deviceType":3,
/// "identifier":"[Mac]-[mac-os-x-15]-[3]-[Chrome]-[Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) x-framework-test/0.0.0 Chrome/87.0.4280.141 Electron/11.2.0 Safari/537.36]",
/// "token":"96f400dd9aa5c57a8cec9d6f4775bad3"
/// }
/// }
///
///
/// an instance of XActionRequest class which provider requirement for action
/// an instance of XActionResponse
[AllowAnonymous]
[RequireXPowered]
[HttpPost("ConfirmEmailAddress")]
public async Task> ConfirmEmailAddress(
[FromBody] XActionRequest model
)
{
//
// Do Action ...
try
{
//
// Validate Args ...
if (!ModelState.IsValid)
{
XException.InvalidArgs.Throw();
}
await ValidationProvider
.GroupValidationBuilder()
.AddNotEmpty(
model.Lang,
model.ActionToken,
model.EmailVerificationCode
)
.AddNotNull(model.Device)
.ValidateGroupAsync();
//
// Get Request ...
var result = await IdentityManager
.ConfirmEmailAddress(
model.Lang,
model.Device,
model.ActionToken,
model.EmailVerificationCode
);
//
return Ok(result
.ToDynamicObject());
}
catch (Exception ex)
{
//
var exResult = GetExceptionActionResult(ex);
return exResult;
}
}
#endregion
//
#region Request for Actions ...
///
/// Request For Mobile Number Change/Confirm
///
///
/// for this action you have to provide:
/// - Lang: client device currently used locale, such as: en-US.
/// - Password: user's current active password.
/// - MobileNumber: which phone number is going to confirm.
/// - Device: user's client device which is an instance of XDevice.
///
/// Sample request:
///
/// {
/// "lang": "fa-IR",
/// "password": "",
/// "mobileNumber": "",
/// "device": {
/// "os":"Mac",
/// "browser":"Chrome",
/// "osVersion":"mac-os-x-15",
/// "userAgent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) x-framework-test/0.0.0 Chrome/87.0.4280.141 Electron/11.2.0 Safari/537.36",
/// "deviceType":3,
/// "identifier":"[Mac]-[mac-os-x-15]-[3]-[Chrome]-[Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) x-framework-test/0.0.0 Chrome/87.0.4280.141 Electron/11.2.0 Safari/537.36]",
/// "token":"96f400dd9aa5c57a8cec9d6f4775bad3"
/// }
/// }
///
///
/// an instance of XActionRequest class which provider requirement for action
/// an instance of XActionResponse
[AllowAnonymous]
[RequireXPowered]
[HttpPost("RequestConfirmMobile")]
public async Task> RequestConfirmMobile(
[FromBody] XActionRequest model
)
{
//
// Do Action ...
try
{
//
// Validate Args ...
if (!ModelState.IsValid)
{
XException.InvalidArgs.Throw();
}
await ValidationProvider
.GroupValidationBuilder()
.AddNotEmpty(
model.Lang,
model.Password,
model.MobileNumber
)
.AddNotNull(model.Device)
.AddMobileNumber(model.MobileNumber)
.ValidateGroupAsync();
//
// Get UserSelect By Param ...
var userSelectByParam = GetUserSelectByParam(
model,
excludes: new List {
XUserSelectBy.Email,
XUserSelectBy.MobileNumber
});
//
// Get Request ...
var result = await IdentityManager
.RequestConfirmMobile(
model.Lang,
model.Device,
userSelectByParam,
model.Password,
model.MobileNumber
);
//
return Ok(result
.ToDynamicObject());
}
catch (Exception ex)
{
//
var exResult = GetExceptionActionResult(ex);
return exResult;
}
}
///
/// Request For Email Address Change/Confirm
///
///
/// for this action you have to provide:
/// - Lang: client device currently used locale, such as: en-US.
/// - Password: user's current active password.
/// - Email: which email address is going to confirm.
/// - Device: user's client device which is an instance of XDevice.
///
/// Sample request:
///
/// {
/// "lang": "fa-IR",
/// "password": "",
/// "email": "",
/// "device": {
/// "os":"Mac",
/// "browser":"Chrome",
/// "osVersion":"mac-os-x-15",
/// "userAgent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) x-framework-test/0.0.0 Chrome/87.0.4280.141 Electron/11.2.0 Safari/537.36",
/// "deviceType":3,
/// "identifier":"[Mac]-[mac-os-x-15]-[3]-[Chrome]-[Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) x-framework-test/0.0.0 Chrome/87.0.4280.141 Electron/11.2.0 Safari/537.36]",
/// "token":"96f400dd9aa5c57a8cec9d6f4775bad3"
/// }
/// }
///
///
/// an instance of XActionRequest class which provider requirement for action
/// an instance of XActionResponse
[AllowAnonymous]
[RequireXPowered]
[HttpPost("RequestConfirmEmail")]
public async Task> RequestConfirmEmail(
[FromBody] XActionRequest model
)
{
//
// Do Action ...
try
{
//
// Validate Args ...
if (!ModelState.IsValid)
{
XException.InvalidArgs.Throw();
}
await ValidationProvider
.GroupValidationBuilder()
.AddNotEmpty(
model.Lang,
model.Email,
model.Password)
.AddNotNull(model.Device)
.AddEmailAddress(model.Email)
.ValidateGroupAsync();
//
// Get UserSelect By Param ...
var userSelectByParam = GetUserSelectByParam(
model,
excludes: new List {
XUserSelectBy.Email,
XUserSelectBy.MobileNumber
});
//
// Get Request ...
var result = await IdentityManager
.RequestConfirmEmail(
model.Lang,
model.Device,
userSelectByParam,
model.Password,
model.Email
);
//
return Ok(result
.ToDynamicObject());
}
catch (Exception ex)
{
//
var exResult = GetExceptionActionResult(ex);
return exResult;
}
}
///
/// Request Reset Password Action
///
///
/// for this action you have to provide:
/// - Lang: client device currently used locale, such as: en-US.
/// - Device: user's client device which is an instance of XDevice.
/// - ReturnUrl: client application ResetPassword URL.
///
/// Sample request:
///
/// {
/// "lang": "fa-IR",
/// "returnUrl": "http://localhost/reset-password",
/// "device": {
/// "os":"Mac",
/// "browser":"Chrome",
/// "osVersion":"mac-os-x-15",
/// "userAgent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) x-framework-test/0.0.0 Chrome/87.0.4280.141 Electron/11.2.0 Safari/537.36",
/// "deviceType":3,
/// "identifier":"[Mac]-[mac-os-x-15]-[3]-[Chrome]-[Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) x-framework-test/0.0.0 Chrome/87.0.4280.141 Electron/11.2.0 Safari/537.36]",
/// "token":"96f400dd9aa5c57a8cec9d6f4775bad3"
/// }
/// }
///
///
/// an instance of XActionRequest class which provider requirement for action
/// an instance of XActionResponse
[AllowAnonymous]
[RequireXPowered]
[HttpPost("RequestResetPassword")]
public async Task> RequestResetPassword(
[FromBody] XActionRequest model
)
{
//
// Do Action ...
try
{
//
// Validate Args ...
if (!ModelState.IsValid)
{
XException.InvalidArgs.Throw();
}
await ValidationProvider
.GroupValidationBuilder()
.AddNotEmpty(
model.Lang,
model.ReturnUrl)
.AddNotNull(model.Device)
.AddUrl(model.ReturnUrl)
.ValidateGroupAsync();
//
// Get UserSelect By Param ...
var userSelectByParam = GetUserSelectByParam(model);
//
// Get Request ...
var result = await IdentityManager
.RequestResetPassword(
model.Lang,
model.Device,
userSelectByParam,
model.ReturnUrl
);
//
return Ok(result
.ToDynamicObject());
}
catch (Exception ex)
{
//
var exResult = GetExceptionActionResult(ex);
return exResult;
}
}
///
/// Reset a User's Password
///
///
/// for this action you have to provide:
/// - Lang: client device currently used locale, such as: en-US.
/// - ActionToken: user's requested action token for this action.
/// - NewPassword: user's new password to change.
/// - Device: user's client device which is an instance of XDevice.
/// - ReturnUrl: client application Login URL.
///
/// Sample request:
///
/// {
/// "lang": "fa-IR",
/// "actionToken": "",
/// "newPassword": "",
/// "returnUrl": "http://localhost/login",
/// "device": {
/// "os":"Mac",
/// "browser":"Chrome",
/// "osVersion":"mac-os-x-15",
/// "userAgent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) x-framework-test/0.0.0 Chrome/87.0.4280.141 Electron/11.2.0 Safari/537.36",
/// "deviceType":3,
/// "identifier":"[Mac]-[mac-os-x-15]-[3]-[Chrome]-[Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) x-framework-test/0.0.0 Chrome/87.0.4280.141 Electron/11.2.0 Safari/537.36]",
/// "token":"96f400dd9aa5c57a8cec9d6f4775bad3"
/// }
/// }
///
///
/// an instance of XActionRequest class which provider requirement for action
///
[AllowAnonymous]
[RequireXPowered]
[HttpPost("ResetPassword")]
public async Task ResetPassword(
[FromBody] XActionRequest model
)
{
//
// Do Action ...
try
{
//
// Validate Args ...
if (!ModelState.IsValid)
{
XException.InvalidArgs.Throw();
}
await ValidationProvider
.GroupValidationBuilder()
.AddNotEmpty(
model.Lang,
model.ActionToken,
model.NewPassword,
model.ReturnUrl)
.AddNotNull(model.Device)
.ValidateGroupAsync();
//
// Get Request ...
await IdentityManager
.ResetPassword(
model.Lang,
model.Device,
model.ActionToken,
model.NewPassword,
model.ReturnUrl
);
//
return Ok();
}
catch (Exception ex)
{
//
var exResult = GetExceptionActionResult(ex);
return exResult;
}
}
///
/// Request Registration Confirm
///
///
/// for this action you have to provide:
/// - a UserSelectedBy identifier which represet User.
/// - Lang: client device currently used locale, such as: en-US.
/// - Password: user's current active password.
/// - Device: user's client device which is an instance of XDevice.
/// - ReturnUrl: client application Confirm Registration URL.
///
/// Sample request:
///
/// {
/// "lang": "fa-IR",
/// "userId": ""
/// "password": "",
/// "returnUrl": "http://localhost/confirm",
/// "device": {
/// "os":"Mac",
/// "browser":"Chrome",
/// "osVersion":"mac-os-x-15",
/// "userAgent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) x-framework-test/0.0.0 Chrome/87.0.4280.141 Electron/11.2.0 Safari/537.36",
/// "deviceType":3,
/// "identifier":"[Mac]-[mac-os-x-15]-[3]-[Chrome]-[Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) x-framework-test/0.0.0 Chrome/87.0.4280.141 Electron/11.2.0 Safari/537.36]",
/// "token":"96f400dd9aa5c57a8cec9d6f4775bad3"
/// }
/// }
///
///
/// an instance of XActionRequest class which provider requirement for action
///
[AllowAnonymous]
[RequireXPowered]
[HttpPost("RequestConfirmRegistration")]
public async Task RequestConfirmRegistration(
[FromBody] XActionRequest model
)
{
//
// Do Action ...
try
{
//
// Validate Args ...
if (!ModelState.IsValid)
{
XException.InvalidArgs.Throw();
}
await ValidationProvider
.GroupValidationBuilder()
.AddNotEmpty(
model.Lang,
model.Password,
model.ReturnUrl)
.AddNotNull(model.Device)
.AddUrl(model.ReturnUrl)
.ValidateGroupAsync();
//
// Get UserSelect By Param ...
var userSelectByParam = GetUserSelectByParam(model);
//
// Get Request ...
await IdentityManager
.RequestConfirmRegistration(
model.Lang,
model.Device,
userSelectByParam,
model.Password,
model.ReturnUrl
);
//
return Ok();
}
catch (Exception ex)
{
//
var exResult = GetExceptionActionResult(ex);
return exResult;
}
}
#endregion
//
#region Registration ...
///
/// Invite a User to Register on Dashboard
///
///
/// for this action you have to provide:
/// - Lang: client device currently used locale, such as: en-US.
/// - Email: which email address is going to invite.
/// - Device: user's client device which is an instance of XDevice.
/// - ReturnUrl: client application Registration URL.
/// notice in this step you had to provide all this informations as FormData
///
/// Sample request:
///
/// {
/// "lang": "fa-IR",
/// "email": "",
/// "returnUrl": "",
/// "device": {
/// "os":"Mac",
/// "browser":"Chrome",
/// "osVersion":"mac-os-x-15",
/// "userAgent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) x-framework-test/0.0.0 Chrome/87.0.4280.141 Electron/11.2.0 Safari/537.36",
/// "deviceType":3,
/// "identifier":"[Mac]-[mac-os-x-15]-[3]-[Chrome]-[Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) x-framework-test/0.0.0 Chrome/87.0.4280.141 Electron/11.2.0 Safari/537.36]",
/// "token":"96f400dd9aa5c57a8cec9d6f4775bad3"
/// }
/// }
///
///
/// an instance of XActionRequest class which provider requirement for action
/// an instance of XActionResponse
[RequireXPowered]
[HttpPost("InviteUser")]
[Authorize(Policy = LocalApi.PolicyName)]
[Authorize(Policy = XPolicies.EnabledAdmin)]
[Authorize(Policy = XPolicies.EnabledAgent)]
public async Task> InviteUser(
[FromBody] XActionRequest model
)
{
//
// Do Action ...
try
{
//
// Validate Args ...
if (!ModelState.IsValid)
{
XException.InvalidArgs.Throw();
}
//
await ValidationProvider
.GroupValidationBuilder()
.AddNotEmpty(
model.Lang,
model.Email,
model.ReturnUrl)
.AddEmailAddress(model.Email)
.AddNotNull(model.Device)
.ValidateGroupAsync();
//
var result = await IdentityManager
.InviteUser(
model.Lang,
model.Device,
model.Email,
model.ReturnUrl);
//
return Ok(result
.ToDynamicObject());
}
catch (Exception ex)
{
//
var result = GetExceptionActionResult(ex);
return result;
}
}
///
/// Recieve some Basic Informations and Start Registration Proccess
/// if they Valid
///
/// Registration Proccess Starts with Invoking this Action
///
///
/// for this action you have to provide:
/// - Lang: client device currently used locale, such as: en-US.
/// - FirstName: user's FirstName.
/// - LastName: user's LastName.
/// - DateOfBirth: user's dob date.
/// - MobileNumber: user's MobileNumber optional.
/// - Email: user's Email optional.
/// - ActionToken: user's requested action token for this action (if user invited).
/// - Device: user's client device which is an instance of XDevice.
///
/// Sample request:
///
/// {
/// "lang": "fa-IR",
/// "firstName": "",
/// "lastName": "",
/// "dateOfBirth": "",
/// "email": "",
/// "mobileNumber": "",
/// "actionToken": "",
/// "device": {
/// "os":"Mac",
/// "browser":"Chrome",
/// "osVersion":"mac-os-x-15",
/// "userAgent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) x-framework-test/0.0.0 Chrome/87.0.4280.141 Electron/11.2.0 Safari/537.36",
/// "deviceType":3,
/// "identifier":"[Mac]-[mac-os-x-15]-[3]-[Chrome]-[Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) x-framework-test/0.0.0 Chrome/87.0.4280.141 Electron/11.2.0 Safari/537.36]",
/// "token":"96f400dd9aa5c57a8cec9d6f4775bad3"
/// }
/// }
///
///
/// an instance of XActionRequest class which provider requirement for action
/// an instance of XActionResponse
[AllowAnonymous]
[RequireXPowered]
[HttpPost("RequestRegistration")]
public async Task> RequestRegistration(
[FromBody] XActionRequest model
)
{
//
// Do Action ...
try
{
//
// Validate Args ...
if (!ModelState.IsValid)
{
XException.InvalidArgs.Throw();
}
await ValidationProvider
.GroupValidationBuilder()
.AddNotEmpty(
model.Lang,
model.FirstName,
model.LastName)
.AddNotNull(
model.Device,
model.DateOfBirth)
.ValidateGroupAsync();
//
// Check Date Of Birth ...
if (!model.DateOfBirth.HasValue)
{
XException.InvalidArgs.Throw(); ;
}
//
// Validate Mobile Number if Exists ...
if (!model.MobileNumber.IsNullOrEmpty())
{
ValidationProvider.MobileNumber(model.MobileNumber);
}
//
// Validate Email Address if Exists ...
if (!model.Email.IsNullOrEmpty())
{
ValidationProvider.EmailAddress(model.Email);
}
//
// Get Request ...
var result = await IdentityManager
.RequestRegistration(
model.Lang,
model.Device,
model.ActionToken,
model.FirstName,
model.LastName,
model.DateOfBirth.GetValueOrDefault(),
model.MobileNumber,
model.Email
);
//
return Ok(result
.ToDynamicObject());
}
catch (Exception ex)
{
//
var exResult = GetExceptionActionResult(ex);
//
return exResult;
}
}
///
/// Add User Account Informations
///
///
/// for this action you have to provide:
/// - Lang: client device currently used locale, such as: en-US.
/// - ActionToken: user's requested action token for this action.
/// - UserName: user name.
/// - Password: assigne password.
/// - Device: user's client device which is an instance of XDevice.
///
/// Sample request:
///
/// {
/// "lang": "fa-IR",
/// "userName": "",
/// "password": "",
/// "actionToken": "",
/// "device": {
/// "os":"Mac",
/// "browser":"Chrome",
/// "osVersion":"mac-os-x-15",
/// "userAgent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) x-framework-test/0.0.0 Chrome/87.0.4280.141 Electron/11.2.0 Safari/537.36",
/// "deviceType":3,
/// "identifier":"[Mac]-[mac-os-x-15]-[3]-[Chrome]-[Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) x-framework-test/0.0.0 Chrome/87.0.4280.141 Electron/11.2.0 Safari/537.36]",
/// "token":"96f400dd9aa5c57a8cec9d6f4775bad3"
/// }
/// }
///
///
/// an instance of XActionRequest class which provider requirement for action
/// an instance of XActionResponse
[AllowAnonymous]
[RequireXPowered]
[HttpPost("AddAccountInfo")]
public async Task> AddAccountInfo(
[FromBody] XActionRequest model
)
{
//
// Do Action ...
try
{
//
// Validate Args ...
if (!ModelState.IsValid)
{
XException.InvalidArgs.Throw();
}
await ValidationProvider
.GroupValidationBuilder()
.AddNotEmpty(
model.Lang,
model.ActionToken,
model.UserName,
model.Password)
.AddNotNull(model.Device)
.ValidateGroupAsync();
//
// Get Request ...
var result = await IdentityManager
.AddAcountInfo(
model.Lang,
model.Device,
model.ActionToken,
model.UserName,
model.Password);
//
return Ok(result
.ToDynamicObject());
}
catch (Exception ex)
{
//
var exResult = GetExceptionActionResult(ex);
return exResult;
}
}
///
/// Upload and Attach a Profile Image for User. this is an Optional Step
///
/// user's requested action token
/// an instance of IFormFile for user's Avatar
/// an instance of XActionResponse
[AllowAnonymous]
[RequireXPowered]
[HttpPost("AttachProfileImage")]
public async Task> AttachProfileImage(
[FromForm] string actionToken, [FromForm] IFormFile file
)
{
//
// Do Action ...
try
{
//
// Validate Args ...
await ValidationProvider
.GroupValidationBuilder()
.AddNotEmpty(actionToken)
.AddNotNull(file)
.ValidateGroupAsync();
//
var result = await IdentityManager
.AttachProfileImage(actionToken, file);
//
return Ok(result
.ToDynamicObject());
}
catch (Exception ex)
{
//
var exResult = GetExceptionActionResult(ex);
return exResult;
}
}
///
/// Finish Registrationn Proccess
///
///
/// for this action you have to provide:
/// - a proper User Identifier such as: (UserId, UserName, Email or MobileNumber).
/// - Lang: client device currently used locale, such as: en-US.
/// - ActionToken: user's requested action token for this action.
/// - Password: assigne password.
/// - Device: user's client device which is an instance of XDevice.
/// - ReturnUrl: client application Login URL.
///
/// Sample request:
///
/// {
/// "lang": "fa-IR",
/// "userName": "",
/// "password": "",
/// "returnUrl": "",
/// "device": {
/// "os":"Mac",
/// "browser":"Chrome",
/// "osVersion":"mac-os-x-15",
/// "userAgent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) x-framework-test/0.0.0 Chrome/87.0.4280.141 Electron/11.2.0 Safari/537.36",
/// "deviceType":3,
/// "identifier":"[Mac]-[mac-os-x-15]-[3]-[Chrome]-[Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) x-framework-test/0.0.0 Chrome/87.0.4280.141 Electron/11.2.0 Safari/537.36]",
/// "token":"96f400dd9aa5c57a8cec9d6f4775bad3"
/// }
/// }
///
///
/// an instance of XActionRequest class which provider requirement for action
///
[AllowAnonymous]
[RequireXPowered]
[HttpPost("FinishRegistration")]
public async Task FinishRegistration(
[FromBody] XActionRequest model
)
{
//
// Do Action ...
try
{
//
// Validate Args ...
if (!ModelState.IsValid)
{
XException.InvalidArgs.Throw();
}
await ValidationProvider
.GroupValidationBuilder()
.AddNotEmpty(
model.Lang,
model.Password,
model.ReturnUrl)
.AddNotNull(model.Device)
.AddUrl(model.ReturnUrl)
.ValidateGroupAsync();
//
var userSelectByParam = IdentityManager
.GetUserSelectByParam(model);
ValidationProvider
.NotEmpty(userSelectByParam);
//
// Get Request ...
await IdentityManager
.FinishRegistration(
model.Lang,
model.Device,
userSelectByParam,
model.Password,
model.ReturnUrl
);
//
return Ok();
}
catch (Exception ex)
{
//
var exResult = GetExceptionActionResult(ex);
//
return exResult;
}
}
#endregion
}
}