public async Task <ServiceProviderResponse> CreateOrUpdateCredentialAssignments( [FromHeader(Constant.OperationTrackingIdHeader)] string requestId, string account, [FromBody] CredentialAssignment request) { await ValidateAccount(account); Validator.ArgumentNotNull(request, nameof(request)); Validator.ArgumentNotNullOrEmpty(request.Provider, nameof(request.Provider)); Validator.ArgumentNotNullOrEmpty(request.ConnectorId, nameof(request.ConnectorId)); Validator.IsTrue <ArgumentException>(request.ChannelType != ChannelType.Invalid, nameof(request.ChannelType), "Invalid channel type."); var identifier = new ConnectorIdentifier(request.Provider, request.ConnectorId); var credential = await this.credentialManager.GetConnectorCredentialByIdAsync(identifier); Validator.IsTrue <ResourceNotFoundException>(credential != null, nameof(credential), "Credential '{0}' does not exist.", identifier); Validator.IsTrue <ArgumentException>(credential.ChannelType == request.ChannelType, nameof(request.ChannelType), "Credential '{0}' is for channel type '{1}' but not '{2}'", identifier, credential.ChannelType.ToString(), request.ChannelType.ToString()); if (string.IsNullOrEmpty(request.ExtendedCode)) { // Auto-assign account code var otherAccounts = await this.credentialManager.ListCredentialAssignmentsById(identifier, false); if (otherAccounts != null && otherAccounts.Count > 0) { var last = otherAccounts.Where(a => a.ExtendedCode != null).OrderBy(a => a.ExtendedCode).LastOrDefault(); if (int.TryParse(last.ExtendedCode, out int code) && code < Math.Pow(10, SmsConstant.ExtendedCodeCompanyLength) - 1) { request.ExtendedCode = (code + 1).ToString().PadLeft(SmsConstant.ExtendedCodeCompanyLength, '0'); } else { throw new ApplicationException($"Failed the generate new code. The last one is '{last.ExtendedCode}'"); } } else { request.ExtendedCode = 1.ToString().PadLeft(SmsConstant.ExtendedCodeCompanyLength, '0'); } } await this.credentialManager.CreateOrUpdateCredentialAssignmentAsync(request.ToDataContract(account)); var assignmentList = await this.credentialManager.ListCredentialAssignmentsByAccountAsync(account, ChannelType.Both, false); var response = assignmentList?.Select(a => new CredentialAssignment(a)).ToList(); return(ServiceProviderResponse.CreateJsonResponse(HttpStatusCode.OK, response)); }