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 } }