public static CredentialAssignment ToModel(this ConnectorCredentialAssignmentEntity entity)
        {
            var assignment = new CredentialAssignment();

            assignment.EngagementAccount = entity.EngagementAccount;
            assignment.Provider          = entity.Provider;
            assignment.ConnectorId       = entity.Id;
            assignment.Enabled           = entity.Enabled;
            assignment.Active            = entity.Active;

            return(assignment);
        }
        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));
        }
        public async Task <ServiceProviderResponse> CreateOrUpdateCredentialAssignments(
            [FromHeader(Constant.OperationTrackingIdHeader)] string requestId,
            string account,
            [FromBody] CredentialAssignment request)
        {
            var currentAccount = await EnsureAccount(account, requestId);

            Validator.ArgumentNotNull(request, nameof(request));
            Validator.ArgumentNotNullOrEmpty(request.Provider, nameof(request.Provider));
            Validator.ArgumentNotNullOrEmpty(request.ConnectorId, nameof(request.ConnectorId));

            request.EngagementAccount = currentAccount.EngagementAccount;
            await this.credentialManager.CreateOrUpdateCredentialAssignmentAsync(request);

            var response = await this.credentialManager.ListCredentialAssignmentsByAccountAsync(currentAccount.EngagementAccount, false);

            return(ServiceProviderResponse.CreateJsonResponse(HttpStatusCode.OK, response));
        }
Exemple #4
0
        public async Task CreateOrUpdateCredentialAssignmentAsync(CredentialAssignment credentialAssignment)
        {
            using (var ctx = new EmailServiceDbEntities(this.connectionString))
            {
                var entities = await ctx.ConnectorCredentialAssignments.Where(
                    c => c.EngagementAccount == credentialAssignment.EngagementAccount).ToListAsync();

                var entity = entities?.SingleOrDefault(
                    e => e.Provider == credentialAssignment.Provider &&
                    e.Id == credentialAssignment.ConnectorId);

                if (entity != null)
                {
                    entity.Enabled  = credentialAssignment.Enabled;
                    entity.Active   = credentialAssignment.Active;
                    entity.Modified = DateTime.UtcNow;
                }
                else
                {
                    entity = new ConnectorCredentialAssignmentEntity();
                    entity.EngagementAccount = credentialAssignment.EngagementAccount;
                    entity.Provider          = credentialAssignment.Provider;
                    entity.Id      = credentialAssignment.ConnectorId;
                    entity.Enabled = credentialAssignment.Enabled;
                    entity.Active  = credentialAssignment.Active;
                    entity.Created = entity.Modified = DateTime.UtcNow;

                    ctx.ConnectorCredentialAssignments.Add(entity);
                }

                // Make sure at most 1 active credential
                if (credentialAssignment.Active)
                {
                    foreach (var entry in entities.Where(e => e != entity))
                    {
                        entry.Active = false;
                    }
                }

                await ctx.SaveChangesAsync();
            }
        }
Exemple #5
0
        public void SendMailOnTemplateCreatedOrUpdated(Template template, CredentialAssignment assignment, string trackingId)
        {
            try
            {
                var email = new EmailMessage(this.service);
                email.Subject = string.Format(TitleFormat, template.Signature, template.Name);
                email.Body    = new MessageBody(BodyType.HTML, BuildMailBody(SmsTemplateOpsMailTemplate, template, assignment));

                foreach (var receiver in this.opsInfo.ReceiverAddresses)
                {
                    email.ToRecipients.Add(receiver);
                }

                email.SendAndSaveCopy();
            }
            catch (Exception ex)
            {
                SmsProviderEventSource.Current.ErrorException(trackingId, this, nameof(this.SendMailOnTemplateCreatedOrUpdated), OperationStates.Failed, $"Failed to send ops mail for Account={template.EngagementAccount}, TemplateName={template.Name}", ex);
            }
        }
Exemple #6
0
        private string BuildMailBody(string html, Template template, CredentialAssignment assignment)
        {
            var format = "$({0})";
            var kvs    = new Dictionary <string, string>
            {
                { "provider", assignment?.Provider },
                { "providerId", assignment?.ConnectorId },
                { "category", template.Category.ToString() },
                { "name", template.Name },
                { "signature", template.Signature },
                { "content", template.Body },
                { "account", template.EngagementAccount }
            };

            foreach (var kv in kvs)
            {
                var key = string.Format(format, kv.Key);
                html = html.Replace(key, kv.Value);
            }

            return(html);
        }
Exemple #7
0
        public async Task CreateOrUpdateCredentialAssignmentAsync(CredentialAssignment credentialAssignment)
        {
            var credential = this.GetConnectorCredentialByIdAsync(credentialAssignment.ConnectorIdentifier);

            await this.store.CreateOrUpdateCredentialAssignmentAsync(credentialAssignment);
        }