private RegisterFileRepositaryEF RegisterFile(string userId, string fileName, string FileBase64Data)
        {
            if (string.IsNullOrEmpty(FileBase64Data))
            {
                return(null);
            }
            RegisterFileRepositaryEF registerFile = new RegisterFileRepositaryEF();

            registerFile.UserId   = userId;
            registerFile.FileName = fileName;
            string[] splits = FileBase64Data.Split(',');
            if (splits.Length > 1)
            {
                registerFile.ContentsType = splits[0];
                byte[] data = Convert.FromBase64String(splits[1]);
                registerFile.Contents = data;
            }
            else
            {
                registerFile.ContentsType = System.IO.Path.GetExtension(fileName).TrimStart('.');
                byte[] data = Convert.FromBase64String(splits[0]);
                registerFile.Contents = data;
            }
            registerFile.CreateDT = DateTime.Now.Date;
            return(registerFile);
        }
        private RegisterFileRepositaryEF RegisterFile(string userId, string fileName, string FileBase64Data)
        {
            if (string.IsNullOrEmpty(FileBase64Data))
            {
                return(null);
            }
            RegisterFileRepositaryEF registerFile = new RegisterFileRepositaryEF();

            registerFile.UserId   = userId;
            registerFile.FileName = fileName;
            string[] splits = FileBase64Data.Split(',');
            registerFile.ContentsType = splits[0];
            byte[] data = Convert.FromBase64String(splits[1]);
            registerFile.Contents = data;
            registerFile.CreateDT = DateTime.Now.Date;
            return(registerFile);
        }
        //[ValidateAntiForgeryToken]
        public async Task <IActionResult> SignonContractor([FromBody] AggregatorRegistModelBase model)
        {
            if (ModelState.IsValid)
            {
                var trans = await _accountContext.Database.BeginTransactionAsync();

                try
                {
                    AggregatorGroupEF aggregatorGroup = await _accountContext.AggregatorGroups.FindAsync(model.AggregatorGroupId);

                    if (aggregatorGroup == null)
                    {
                        IdentityError  error   = (_userManager.ErrorDescriber as LocalizedIdentityErrorDescriber).AggregatorNotFounded(model.AggregatorGroupId);
                        IdentityResult _result = IdentityResult.Failed(error);
                        return(base.BadRequest(new { Result = _result }));
                    }

                    var user = CreateUserAccount(model, RegisterType.Contrator);

                    JObject obj    = JObject.FromObject(user);
                    var     result = await _userManager.CreateAsync(user, model.Password);

                    //result.Errors
                    if (result.Succeeded)
                    {
                        ContractorUserEF cu = new ContractorUserEF();
                        cu.AggGroupId     = aggregatorGroup.ID;
                        cu.ContractStatus = ContractStatusCodes.Signing;
                        cu.UserId         = user.Id;
                        _accountContext.ContractorUsers.Add(cu);

                        RegisterFileRepositaryEF registerModel = null;

                        if (string.IsNullOrEmpty(model.RegisterFilename) == false)
                        {
                            registerModel = RegisterFile(user.Id, model.RegisterFilename, model.RegisterFilebase64);
                            _accountContext.RegisterFileRepositaries.Add(registerModel);
                        }

                        await _userManager.AddToRoleAsync(user, UserRoleTypes.Contractor);

                        await _accountContext.SaveChangesAsync();


                        if (model.NotifyEmail)
                        {
                            string email_contents = htmlGenerator.GenerateHtml("NotifyEmail.html",
                                                                               new
                            {
                                Name       = $"{user.FirstName} {user.LastName}",
                                Company    = model.Company,
                                Email      = model.Email,
                                Phone      = model.PhoneNumber,
                                Address    = model.Address,
                                Aggregator = aggregatorGroup.AggName
                            });

                            string sender = "PEIU 운영팀";
                            string target = "";

                            List <string> supervisor_emails = (await _userManager.GetUsersInRoleAsync(UserRoleTypes.Supervisor)).Select(x => x.Email).ToList();
                            target = "발전사업자";

                            var agg_result = _accountContext.VwAggregatorusers.Where(x => x.AggGroupId == model.AggregatorGroupId);
                            supervisor_emails.AddRange(agg_result.Select(x => x.Email));

                            //var aggregator_account_users = await _userManager.GetUsersInRoleAsync(UserRoleTypes.Supervisor);
                            await _emailSender.SendEmailAsync(sender, $"새로운 {target} 가입이 요청되었습니다", email_contents, registerModel, supervisor_emails.ToArray());

                            logger.LogInformation($"가입 알림 메일 전송: {string.Join(", ", supervisor_emails)}");
                        }
                        trans.Commit();
                        return(Ok(new { Result = result }));


                        //_userManager.find
                        //if (user.AuthRoles == (int)AuthRoles.Aggregator || user.AuthRoles == (int)AuthRoles.Business)
                        //    await Publisher.PublishMessageAsync(obj.ToString(), cancellationTokenSource.Token);

                        // For more information on how to enable account confirmation and password reset please visit http://go.microsoft.com/fwlink/?LinkID=532713
                        // Send an email with this link
                        //var code = await _userManager.GenerateEmailConfirmationTokenAsync(user);
                        //var callbackUrl = Url.Action("ConfirmEmail", "Account", new { userId = user.Id, code = code }, protocol: HttpContext.Request.Scheme);
                        //await _emailSender.SendEmailAsync(model.Email, "Confirm your account",
                        //    "Please confirm your account by clicking this link: <a href=\"" + callbackUrl + "\">link</a>");
                        //await _signInManager.SignInAsync(user, isPersistent: false);
                        //_logger.LogInformation(3, "User created a new account with password.");
                    }
                    else
                    {
                        trans.Dispose();
                        return(BadRequest(new { Result = result }));
                    }
                }
                catch (Exception ex)
                {
                    trans.Dispose();
                    logger.LogError(ex, ex.Message);
                    throw;
                }
            }

            // If we got this far, something failed, redisplay form
            return(BadRequest());
        }
        //[ValidateAntiForgeryToken]
        public async Task <IActionResult> SignonAggregator([FromBody] AggregatorRegistModelBase model)
        {
            if (ModelState.IsValid)
            {
                var trans = await _accountContext.Database.BeginTransactionAsync();

                try

                {
                    AggregatorGroupEF aggregatorGroup = _accountContext.AggregatorGroups.FirstOrDefault(x => x.AggName == model.Company);
                    if (aggregatorGroup == null)
                    {
                        aggregatorGroup                = new AggregatorGroupEF();
                        aggregatorGroup.ID             = Guid.NewGuid().ToString();
                        aggregatorGroup.AggName        = model.Company;
                        aggregatorGroup.Representation = "";
                        aggregatorGroup.Address        = model.Address;
                        aggregatorGroup.CreateDT       = DateTime.Now;
                        aggregatorGroup.PhoneNumber    = model.PhoneNumber;
                        await _accountContext.AddAsync(aggregatorGroup);
                    }

                    var user   = CreateUserAccount(model, RegisterType.Aggregator);
                    var result = await _userManager.CreateAsync(user, model.Password);

                    //result.Errors
                    if (result.Succeeded)
                    {
                        var role_add_result = await _userManager.AddToRoleAsync(user, UserRoleTypes.Aggregator);

                        //_userManager.AddClaimAsync(user, new Claim())
                        AggregatorUserEF aggregatorUser = new AggregatorUserEF();
                        aggregatorUser.AggregatorGroup = aggregatorGroup;
                        aggregatorUser.UserId          = user.Id;
                        await _accountContext.AggregatorUsers.AddAsync(aggregatorUser);

                        RegisterFileRepositaryEF registerModel = null;

                        if (string.IsNullOrEmpty(model.RegisterFilename) == false)
                        {
                            registerModel = RegisterFile(user.Id, model.RegisterFilename, model.RegisterFilebase64);
                            _accountContext.RegisterFileRepositaries.Add(registerModel);
                        }

                        await _accountContext.SaveChangesAsync();

                        if (model.NotifyEmail)
                        {
                            string email_contents = htmlGenerator.GenerateHtml("NotifyEmail.html",
                                                                               new
                            {
                                Name       = $"{user.FirstName} {user.LastName}",
                                Company    = model.Company,
                                Email      = model.Email,
                                Phone      = model.PhoneNumber,
                                Address    = model.Address,
                                Aggregator = aggregatorGroup.AggName
                            });

                            string sender = "PEIU 운영팀";
                            string target = "";

                            List <string> supervisor_emails = (await _userManager.GetUsersInRoleAsync(UserRoleTypes.Supervisor)).Select(x => x.Email).ToList();
                            target = "중개거래사업자";

                            var agg_result = _accountContext.VwAggregatorusers.Where(x => x.AggGroupId == model.AggregatorGroupId);
                            supervisor_emails.AddRange(agg_result.Select(x => x.Email));

                            //var aggregator_account_users = await _userManager.GetUsersInRoleAsync(UserRoleTypes.Supervisor);
                            await _emailSender.SendEmailAsync(sender, $"새로운 {target} 가입이 요청되었습니다", email_contents, registerModel, supervisor_emails.ToArray());

                            logger.LogInformation($"가입 알림 메일 전송: {string.Join(", ", supervisor_emails)}");
                        }
                        trans.Commit();
                        return(Ok(new { Result = result }));
                    }
                    else
                    {
                        trans.Dispose();
                        return(BadRequest(new { Result = result }));
                    }
                }
                catch (Exception ex)
                {
                    trans.Dispose();
                    logger.LogError(ex, ex.Message);
                }
            }
            return(BadRequest());
        }
        public async Task SendEmailAsync(string email_sender, string subject, string message, RegisterFileRepositaryEF attachFile, params string[] emails)
        {
            try
            {
                if (emails.Length == 0)
                {
                    return;
                }
                //await Task.CompletedTask;
                var mimeMessage = new MimeMessage();
                mimeMessage.From.Add(new MailboxAddress(email_sender, _emailSettings.Sender));
                IEnumerable <MailboxAddress> address = emails.Select(x => new MailboxAddress(x));
                mimeMessage.To.AddRange(address);

                mimeMessage.Subject = subject;
                var bodyBuilder = new BodyBuilder();
                if (attachFile != null)
                {
                    bodyBuilder.Attachments.Add(attachFile.FileName, attachFile.Contents);
                }

                bodyBuilder.HtmlBody = message;
                mimeMessage.Body     = bodyBuilder.ToMessageBody();


                using (var client = new SmtpClient())
                {
                    // For demo-purposes, accept all SSL certificates (in case the server supports STARTTLS)
                    client.ServerCertificateValidationCallback = (s, c, h, e) => true;

                    await client.ConnectAsync(_emailSettings.MailServer, _emailSettings.MailPort, true);

                    // Note: only needed if the SMTP server requires authentication
                    await client.AuthenticateAsync(_emailSettings.Sender, _emailSettings.Password);

                    await client.SendAsync(mimeMessage);

                    Console.WriteLine($"이메일 전송: {string.Join(',', emails)}");

                    await client.DisconnectAsync(true);
                }
            }
            catch (Exception ex)
            {
                // TODO: handle exception
                throw new InvalidOperationException(ex.Message);
            }
        }