1142 lines
44 KiB
C#
1142 lines
44 KiB
C#
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.Extensions;
|
|
using xIdentityModels.Models;
|
|
|
|
namespace xApi.Controllers {
|
|
public partial class AccountController {
|
|
//
|
|
#region Registration ...
|
|
/// <summary>
|
|
/// Check a UserName is Available For Registration or not
|
|
/// </summary>
|
|
/// <param name="userName">an string value which represent desired username</param>
|
|
/// <returns>a boolean value</returns>
|
|
[AllowAnonymous]
|
|
[RequireXPowered]
|
|
[HttpGet ("CanRegisterUserName/{userName?}")]
|
|
public async Task<ActionResult<bool>> CanRegisterUserName (
|
|
[FromRoute] string userName
|
|
) {
|
|
//
|
|
// Do Action ...
|
|
try {
|
|
//
|
|
// Validate Args ...
|
|
ValidationProvider.NotEmpty (userName);
|
|
|
|
//
|
|
// Validate Type ...
|
|
var type = userName.GetUserSelectByType ();
|
|
if (type != XUserSelectBy.Username) {
|
|
XException.InvalidArgs.Throw ();
|
|
}
|
|
|
|
//
|
|
var result = await identityProvider
|
|
.CanRegister (userName);
|
|
|
|
//
|
|
// Return Result
|
|
return Ok (result);
|
|
} catch (Exception ex) {
|
|
//
|
|
var result = GetExceptionActionResult (ex);
|
|
|
|
//
|
|
return result;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Check a Mobile Number is Available For Registration or not
|
|
/// </summary>
|
|
/// <param name="mobileNumber">an string value which represent desired mobile number</param>
|
|
/// <returns>a boolean value</returns>
|
|
[AllowAnonymous]
|
|
[RequireXPowered]
|
|
[HttpGet ("CanRegisterMobileNumber/{mobileNumber?}")]
|
|
public async Task<ActionResult<bool>> CanRegisterMobileNumber (
|
|
[FromRoute] string mobileNumber
|
|
) {
|
|
//
|
|
// Do Action ...
|
|
try {
|
|
//
|
|
// Validate Args ...
|
|
ValidationProvider.NotEmpty (mobileNumber);
|
|
|
|
//
|
|
// Validate Type ...
|
|
var type = mobileNumber.GetUserSelectByType ();
|
|
if (type != XUserSelectBy.MobileNumber) {
|
|
XException.InvalidArgs.Throw ();
|
|
}
|
|
|
|
//
|
|
var result = await identityProvider
|
|
.CanRegister (mobileNumber);
|
|
|
|
//
|
|
// Return Result
|
|
return Ok (result);
|
|
} catch (Exception ex) {
|
|
//
|
|
var result = GetExceptionActionResult (ex);
|
|
|
|
//
|
|
return result;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Check a Email Address is Available For Registration or not
|
|
/// </summary>
|
|
/// <param name="email">an string value which represent desired email address</param>
|
|
/// <returns>a boolean value</returns>
|
|
[AllowAnonymous]
|
|
[RequireXPowered]
|
|
[HttpGet ("CanRegisterEmail/{email?}")]
|
|
public async Task<ActionResult<bool>> CanRegisterEmail (
|
|
[FromRoute] string email
|
|
) {
|
|
//
|
|
// Do Action ...
|
|
try {
|
|
//
|
|
// Validate Args ...
|
|
ValidationProvider.NotEmpty (email);
|
|
|
|
//
|
|
// Validate Type ...
|
|
var type = email.GetUserSelectByType ();
|
|
if (type != XUserSelectBy.Email) {
|
|
XException.InvalidArgs.Throw ();
|
|
}
|
|
|
|
//
|
|
var result = await identityProvider
|
|
.CanRegister (email);
|
|
|
|
//
|
|
// Return Result
|
|
return Ok (result);
|
|
} catch (Exception ex) {
|
|
//
|
|
var result = GetExceptionActionResult (ex);
|
|
|
|
//
|
|
return result;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Invite a User to Register on Dashboard
|
|
/// </summary>
|
|
/// <remarks>
|
|
/// 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"
|
|
/// }
|
|
/// }
|
|
///
|
|
/// </remarks>
|
|
/// <param name="model">an instance of <see>XActionRequest</see> class which provider requirement for action</param>
|
|
/// <returns>an instance of <see>XActionResponse</see></returns>
|
|
[RequireXPowered]
|
|
[HttpPost ("InviteUser")]
|
|
[Authorize (Policy = XPolicies.EnabledAdmin)]
|
|
[Authorize (Policy = XPolicies.EnabledAgent)]
|
|
public async Task<ActionResult<XActionResponse>> 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 ();
|
|
|
|
//
|
|
// Get Request ...
|
|
var tokens = await RetrieveTokensAsXTokenResponse ();
|
|
var result = await identityProvider
|
|
.InviteUser (
|
|
tokens,
|
|
model
|
|
);
|
|
|
|
//
|
|
return Ok (result
|
|
.ToDynamicObject ());
|
|
} catch (Exception ex) {
|
|
//
|
|
var result = GetExceptionActionResult (ex);
|
|
return result;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Recieve some Basic Informations and Start Registration Proccess
|
|
/// if they Valid
|
|
///
|
|
/// Registration Proccess Starts with Invoking this Action
|
|
/// </summary>
|
|
/// <remarks>
|
|
/// 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"
|
|
/// }
|
|
/// }
|
|
///
|
|
/// </remarks>
|
|
/// <param name="model">an instance of <see>XActionRequest</see> class which provider requirement for action</param>
|
|
/// <returns>an instance of <see>XActionResponse</see></returns>
|
|
[AllowAnonymous]
|
|
[RequireXPowered]
|
|
[HttpPost ("RequestRegistration")]
|
|
public async Task<ActionResult<XActionResponse>> 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 ();
|
|
|
|
//
|
|
// Get Request ...
|
|
var result = await identityProvider
|
|
.RequestRegistration (
|
|
model
|
|
);
|
|
|
|
//
|
|
return Ok (result
|
|
.ToDynamicObject ());
|
|
} catch (Exception ex) {
|
|
//
|
|
var exResult = GetExceptionActionResult (ex);
|
|
|
|
//
|
|
return exResult;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Add User Account Informations
|
|
/// </summary>
|
|
/// <remarks>
|
|
/// 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"
|
|
/// }
|
|
/// }
|
|
///
|
|
/// </remarks>
|
|
/// <param name="model">an instance of <see>XActionRequest</see> class which provider requirement for action</param>
|
|
/// <returns>an instance of <see>XActionResponse</see></returns>
|
|
[AllowAnonymous]
|
|
[RequireXPowered]
|
|
[HttpPost ("AddAccountInfo")]
|
|
public async Task<ActionResult<XActionResponse>> 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 identityProvider
|
|
.AddAccountInfo (
|
|
model
|
|
);
|
|
|
|
//
|
|
return Ok (result
|
|
.ToDynamicObject ());
|
|
} catch (Exception ex) {
|
|
//
|
|
var exResult = GetExceptionActionResult (ex);
|
|
return exResult;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Upload and Attach a Profile Image for User. this is an Optional Step
|
|
/// </summary>
|
|
/// <param name="actionToken">user's requested action token</param>
|
|
/// <param name="file">an instance of <see>IFormFile</see> for user's Avatar</param>
|
|
/// <returns>an instance of <see>XActionResponse</see></returns>
|
|
[AllowAnonymous]
|
|
[RequireXPowered]
|
|
[HttpPost ("AttachProfileImage")]
|
|
public async Task<ActionResult<XActionResponse>> AttachProfileImage (
|
|
[FromForm] string actionToken, [FromForm] IFormFile file
|
|
) {
|
|
//
|
|
// Do Action ...
|
|
try {
|
|
//
|
|
// Validate Args ...
|
|
await ValidationProvider
|
|
.GroupValidationBuilder ()
|
|
.AddNotEmpty (actionToken)
|
|
.AddNotNull (file)
|
|
.ValidateGroupAsync ();
|
|
|
|
//
|
|
var result = await identityProvider
|
|
.AttachProfileImage (
|
|
actionToken,
|
|
file
|
|
);
|
|
|
|
//
|
|
return Ok (result
|
|
.ToDynamicObject ());
|
|
} catch (Exception ex) {
|
|
//
|
|
var exResult = GetExceptionActionResult (ex);
|
|
return exResult;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Finish Registrationn Proccess
|
|
/// </summary>
|
|
/// <remarks>
|
|
/// 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"
|
|
/// }
|
|
/// }
|
|
///
|
|
/// </remarks>
|
|
/// <param name="model">an instance of <see>XActionRequest</see> class which provider requirement for action</param>
|
|
/// <returns></returns>
|
|
[AllowAnonymous]
|
|
[RequireXPowered]
|
|
[HttpPost ("FinishRegistration")]
|
|
public async Task<ActionResult> 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 = identityProvider
|
|
.GetUserSelectByParam (model);
|
|
ValidationProvider
|
|
.NotEmpty (userSelectByParam);
|
|
|
|
//
|
|
// Get Request ...
|
|
await identityProvider
|
|
.FinishRegistration (model);
|
|
|
|
//
|
|
return Ok ();
|
|
} catch (Exception ex) {
|
|
//
|
|
var exResult = GetExceptionActionResult (ex);
|
|
|
|
//
|
|
return exResult;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Check User is Confirmed Email or not
|
|
/// </summary>
|
|
/// <returns>a boolean value</returns>
|
|
[RequireXPowered]
|
|
[HttpGet ("IsConfirmedEmail")]
|
|
[Authorize (Policy = XPolicies.User)]
|
|
public async Task<ActionResult<bool>> IsConfirmedEmail () {
|
|
//
|
|
// Do Action ...
|
|
try {
|
|
//
|
|
// Get Result ...
|
|
var tokens = await RetrieveTokensAsXTokenResponse ();
|
|
var result = await identityProvider
|
|
.IsConfirmedEmail (
|
|
tokens,
|
|
User.Identity.Name
|
|
);
|
|
|
|
//
|
|
// Return Result
|
|
return Ok (result);
|
|
} catch (Exception ex) {
|
|
//
|
|
var result = GetExceptionActionResult (ex);
|
|
|
|
//
|
|
return result;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Check User is Confirmed Mobile or not
|
|
/// </summary>
|
|
/// <returns>a boolean value</returns>
|
|
[RequireXPowered]
|
|
[HttpGet ("IsConfirmedMobile")]
|
|
[Authorize (Policy = XPolicies.User)]
|
|
public async Task<ActionResult<bool>> IsConfirmedMobile () {
|
|
//
|
|
// Do Action ...
|
|
try {
|
|
//
|
|
// Get Result ...
|
|
var tokens = await RetrieveTokensAsXTokenResponse ();
|
|
var result = await identityProvider
|
|
.IsConfirmedMobile (
|
|
tokens,
|
|
User.Identity.Name
|
|
);
|
|
|
|
//
|
|
// Return Result
|
|
return Ok (result);
|
|
} catch (Exception ex) {
|
|
//
|
|
var result = GetExceptionActionResult (ex);
|
|
|
|
//
|
|
return result;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Request Registration Confirm
|
|
/// </summary>
|
|
/// <remarks>
|
|
/// 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"
|
|
/// }
|
|
/// }
|
|
///
|
|
/// </remarks>
|
|
/// <param name="model">an instance of <see>XActionRequest</see> class which provider requirement for action</param>
|
|
/// <returns></returns>
|
|
[AllowAnonymous]
|
|
[RequireXPowered]
|
|
[HttpPost ("RequestConfirmRegistration")]
|
|
public async Task<ActionResult> 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 = model.GetUserSelectByParam ();
|
|
ValidationProvider.NotEmpty (userSelectByParam);
|
|
|
|
//
|
|
await identityProvider
|
|
.RequestConfirmRegistration (model);
|
|
|
|
//
|
|
return Ok ();
|
|
} catch (Exception ex) {
|
|
//
|
|
var exResult = GetExceptionActionResult (ex);
|
|
return exResult;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Confirm Registration
|
|
/// </summary>
|
|
/// <remarks>
|
|
/// 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"
|
|
/// }
|
|
/// }
|
|
///
|
|
/// </remarks>
|
|
/// <param name="model">an instance of <see>XActionRequest</see> class which provider requirement for action</param>
|
|
/// <returns></returns>
|
|
[AllowAnonymous]
|
|
[RequireXPowered]
|
|
[HttpPost ("ConfirmRegistration")]
|
|
public async Task<ActionResult> 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 identityProvider
|
|
.ConfirmRegistration (model);
|
|
|
|
//
|
|
return Ok ();
|
|
} catch (Exception ex) {
|
|
//
|
|
var exResult = GetExceptionActionResult (ex);
|
|
return exResult;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Request For Mobile Number Change/Confirm
|
|
/// </summary>
|
|
/// <remarks>
|
|
/// 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"
|
|
/// }
|
|
/// }
|
|
///
|
|
/// </remarks>
|
|
/// <param name="model">an instance of <see>XActionRequest</see> class which provider requirement for action</param>
|
|
/// <returns>an instance of <see>XActionResponse</see></returns>
|
|
[AllowAnonymous]
|
|
[RequireXPowered]
|
|
[HttpPost ("RequestConfirmMobile")]
|
|
public async Task<ActionResult<XActionResponse>> 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> {
|
|
XUserSelectBy.Email,
|
|
XUserSelectBy.MobileNumber
|
|
});
|
|
|
|
//
|
|
// Get Request ...
|
|
var result = await identityProvider
|
|
.RequestConfirmMobile (model);
|
|
|
|
//
|
|
return Ok (result
|
|
.ToDynamicObject ());
|
|
} catch (Exception ex) {
|
|
//
|
|
var exResult = GetExceptionActionResult (ex);
|
|
return exResult;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Confirm Requested Mobile Number
|
|
/// </summary>
|
|
/// <remarks>
|
|
/// 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"
|
|
/// }
|
|
/// }
|
|
///
|
|
/// </remarks>
|
|
/// <param name="model">an instance of <see>XActionRequest</see> class which provider requirement for action</param>
|
|
/// <returns>an instance of <see>XActionResponse</see></returns>
|
|
[AllowAnonymous]
|
|
[RequireXPowered]
|
|
[HttpPost ("ConfirmMobileNumber")]
|
|
public async Task<ActionResult<XActionResponse>> ConfirmMobileNumber (
|
|
[FromBody] XActionRequest model
|
|
) {
|
|
//
|
|
// Do Action ...
|
|
try {
|
|
//
|
|
// Validate Args ...
|
|
if (!ModelState.IsValid) {
|
|
XException.InvalidArgs.Throw ();
|
|
}
|
|
await ValidationProvider
|
|
.GroupValidationBuilder ()
|
|
.AddNotEmpty (
|
|
model.Lang,
|
|
model.MobileVerificationCode,
|
|
model.ActionToken
|
|
)
|
|
.AddNotNull (model.Device)
|
|
.ValidateGroupAsync ();
|
|
|
|
//
|
|
// Get Request ...
|
|
var result = await identityProvider
|
|
.ConfirmMobileNumber (model);
|
|
|
|
//
|
|
return Ok (result
|
|
.ToDynamicObject ());
|
|
} catch (Exception ex) {
|
|
//
|
|
var exResult = GetExceptionActionResult (ex);
|
|
return exResult;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Request For Email Address Change/Confirm
|
|
/// </summary>
|
|
/// <remarks>
|
|
/// 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"
|
|
/// }
|
|
/// }
|
|
///
|
|
/// </remarks>
|
|
/// <param name="model">an instance of <see>XActionRequest</see> class which provider requirement for action</param>
|
|
/// <returns>an instance of <see>XActionResponse</see></returns>
|
|
[AllowAnonymous]
|
|
[RequireXPowered]
|
|
[HttpPost ("RequestConfirmEmail")]
|
|
public async Task<ActionResult<XActionResponse>> 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> {
|
|
XUserSelectBy.Email,
|
|
XUserSelectBy.MobileNumber
|
|
});
|
|
|
|
//
|
|
// Get Request ...
|
|
var result = await identityProvider
|
|
.RequestConfirmEmail (model);
|
|
|
|
//
|
|
return Ok (result
|
|
.ToDynamicObject ());
|
|
} catch (Exception ex) {
|
|
//
|
|
var exResult = GetExceptionActionResult (ex);
|
|
return exResult;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Confirm Requested Email Address
|
|
/// </summary>
|
|
/// <remarks>
|
|
/// 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"
|
|
/// }
|
|
/// }
|
|
///
|
|
/// </remarks>
|
|
/// <param name="model">an instance of <see>XActionRequest</see> class which provider requirement for action</param>
|
|
/// <returns>an instance of <see>XActionResponse</see></returns>
|
|
[AllowAnonymous]
|
|
[RequireXPowered]
|
|
[HttpPost ("ConfirmEmailAddress")]
|
|
public async Task<ActionResult<XActionResponse>> ConfirmEmailAddress (
|
|
[FromBody] XActionRequest model
|
|
) {
|
|
//
|
|
// Do Action ...
|
|
try {
|
|
//
|
|
// Validate Args ...
|
|
if (!ModelState.IsValid) {
|
|
XException.InvalidArgs.Throw ();
|
|
}
|
|
await ValidationProvider
|
|
.GroupValidationBuilder ()
|
|
.AddNotEmpty (
|
|
model.Lang,
|
|
model.EmailVerificationCode,
|
|
model.ActionToken
|
|
)
|
|
.AddNotNull (model.Device)
|
|
.ValidateGroupAsync ();
|
|
|
|
//
|
|
// Get Request ...
|
|
var result = await identityProvider
|
|
.ConfirmEmailAddress (model);
|
|
|
|
//
|
|
return Ok (result
|
|
.ToDynamicObject ());
|
|
} catch (Exception ex) {
|
|
//
|
|
var exResult = GetExceptionActionResult (ex);
|
|
return exResult;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Request Reset Password Action
|
|
/// </summary>
|
|
/// <remarks>
|
|
/// 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"
|
|
/// }
|
|
/// }
|
|
///
|
|
/// </remarks>
|
|
/// <param name="model">an instance of <see>XActionRequest</see> class which provider requirement for action</param>
|
|
/// <returns>an instance of <see>XActionResponse</see></returns>
|
|
[AllowAnonymous]
|
|
[RequireXPowered]
|
|
[HttpPost ("RequestResetPassword")]
|
|
public async Task<ActionResult<XActionResponse>> 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,
|
|
excludes : new List<XUserSelectBy> {
|
|
XUserSelectBy.Email,
|
|
XUserSelectBy.MobileNumber
|
|
});
|
|
|
|
//
|
|
// Get Request ...
|
|
var result = await identityProvider
|
|
.RequestResetPassword (model);
|
|
|
|
//
|
|
return Ok (result
|
|
.ToDynamicObject ());
|
|
} catch (Exception ex) {
|
|
//
|
|
var exResult = GetExceptionActionResult (ex);
|
|
return exResult;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Reset a User's Password
|
|
/// </summary>
|
|
/// <remarks>
|
|
/// 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"
|
|
/// }
|
|
/// }
|
|
///
|
|
/// </remarks>
|
|
/// <param name="model">an instance of <see>XActionRequest</see> class which provider requirement for action</param>
|
|
/// <returns></returns>
|
|
[AllowAnonymous]
|
|
[RequireXPowered]
|
|
[HttpPost ("ResetPassword")]
|
|
public async Task<ActionResult> 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 identityProvider
|
|
.ResetPassword (model);
|
|
|
|
//
|
|
return Ok ();
|
|
} catch (Exception ex) {
|
|
//
|
|
var exResult = GetExceptionActionResult (ex);
|
|
return exResult;
|
|
}
|
|
}
|
|
#endregion
|
|
}
|
|
} |