/// <summary> /// CreateUserAsync /// </summary> /// <param name="mobile"></param> /// <param name="email"></param> /// <param name="loginName"></param> /// <param name="password"></param> /// <param name="mobileConfirmed"></param> /// <param name="emailConfirmed"></param> /// <param name="lastUser"></param> /// <param name="transactionContext"></param> /// <returns></returns> /// <exception cref="IdentityException"></exception> /// <exception cref="DatabaseException"></exception> public async Task <User> CreateUserAsync(string mobile, string?email, string?loginName, string?password, bool mobileConfirmed, bool emailConfirmed, string lastUser, TransactionContext?transactionContext = null) { ThrowIf.NotMobile(mobile, nameof(mobile), true); ThrowIf.NotEmail(email, nameof(email), true); ThrowIf.NotLoginName(loginName, nameof(loginName), true); ThrowIf.NotPassword(password, nameof(password), true); if (mobile == null && email == null && loginName == null) { throw Exceptions.IdentityMobileEmailLoginNameAllNull(); } if (!mobileConfirmed && !emailConfirmed && password == null) { throw Exceptions.IdentityNothingConfirmed(); } bool ownTrans = transactionContext == null; TransactionContext transContext = transactionContext ?? await _transaction.BeginTransactionAsync <User>().ConfigureAwait(false); try { long count = await _userRepo.CountUserAsync(loginName, mobile, email, transContext).ConfigureAwait(false); if (count != 0) { throw Exceptions.IdentityAlreadyTaken(mobile: mobile, email: email, loginName: loginName); } User user = new User(loginName, mobile, email, password, mobileConfirmed, emailConfirmed); await _userRepo.AddAsync(user, lastUser, transContext).ConfigureAwait(false); if (ownTrans) { await transContext.CommitAsync().ConfigureAwait(false); } return(user); } catch { if (ownTrans) { await transContext.RollbackAsync().ConfigureAwait(false); } throw; } }