Exemplo n.º 1
0
            public async Task <int> Handle(CreateReplyTicketByMailCommand request, CancellationToken cancellationToken)
            {
                try
                {
                    List <Email>  lt              = _email.ReadInbox() as List <Email>;
                    string        senderEmail     = "";
                    bool          createTicket    = true;
                    string        internRef       = "";
                    int           ticketId        = 0;
                    int           index           = -1;
                    string        subject         = "";
                    bool          isMemberOrAdmin = false;
                    List <byte[]> attachementList;
                    TicketLine    ticketLine;
                    TicketHeader  ticket;
                    AppUser       user;
                    int           result = 0;


                    foreach (var t in lt)
                    {
                        user = _context.User.FirstOrDefault(x => x.Email.ToUpper() == t.from.ToUpper());
                        if (user == null)
                        {
                            senderEmail = t.from;
                        }
                        else
                        {
                            if (await _userManager.IsInRoleAsync(user.Id, "Member"))
                            {
                                isMemberOrAdmin = true;
                            }
                            else if (await _userManager.IsInRoleAsync(user.Id, "Admin"))
                            {
                                isMemberOrAdmin = true;
                            }
                        }
                        if (t.Subject.Length > 0)
                        {
                            subject = Regex.Replace(t.Subject, @"\s+", "");
                            index   = subject.IndexOf("-#");
                            if (index > -1)
                            {
                                internRef = subject.Substring(index + 2);
                                Int32.TryParse(internRef, out ticketId);
                                ticket = _context.TickerHeader.FirstOrDefault(x => x.Id == ticketId);
                                if (ticket != null)
                                {
                                    if (user == null && ticket.Email.ToUpper() == senderEmail.ToUpper())
                                    {
                                        ticket.Status = _context.Status.FirstOrDefault(x => x.Name == "Open");
                                        ticketLine    = new TicketLine
                                        {
                                            AskForClose = false,
                                            Content     = t.Body,
                                            Email       = senderEmail,
                                        };
                                    }
                                    else if ((user != null && ticket.Email.ToUpper() == user.Email.ToUpper()) || isMemberOrAdmin)
                                    {
                                        if (isMemberOrAdmin)
                                        {
                                            ticket.Status = _context.Status.FirstOrDefault(x => x.Name == "Waiting on customer");
                                            ticket.Readed = TicketHeader.ReadedByMemberOrAdmin;
                                        }
                                        else
                                        {
                                            ticket.Status = _context.Status.FirstOrDefault(x => x.Name == "Open");
                                            ticket.Readed = TicketHeader.ReadedByCustomer;
                                        }

                                        ticketLine = new TicketLine
                                        {
                                            AskForClose = false,
                                            Content     = t.Body,
                                            ResponseBy  = user,
                                        };
                                    }
                                    else
                                    {
                                        throw new NotFoundException(nameof(TicketHeader), ticket.Id);
                                    }

                                    foreach (var str in _cloudinary.UploadToCloudinary(t.attachement.ToList()))
                                    {
                                        ticketLine.Content += str;
                                    }
                                    ticket.TicketLine.Add(ticketLine);
                                    result += await _context.SaveChangesAsync(cancellationToken);
                                }
                                else
                                {
                                    throw new NotFoundException(nameof(TicketHeader), ticketId);
                                }
                            }
                            else
                            {
                                //We need to create the ticket
                                ticket = new TicketHeader
                                {
                                    Title       = t.Subject,
                                    Description = t.Body,
                                    Priority    = _context.Priority.FirstOrDefault(x => x.Name == "Unknow"),
                                    Project     = _context.Project.FirstOrDefault(x => x.Name == "Unknow"),
                                    Type        = _context.Type.FirstOrDefault(x => x.Name == "Unknow"),
                                    AssignTO    = null,
                                    ClosedDate  = null,
                                    Requester   = user,
                                    Status      = _context.Status.FirstOrDefault(x => x.Name == "Open"),
                                    CreatedBy   = user?.Id,
                                    Email       = user?.Email,
                                    Readed      = TicketHeader.ReadedByCustomer
                                };
                                if (user == null)
                                {
                                    ticket.Email = senderEmail;
                                }
                                foreach (var str in _cloudinary.UploadToCloudinary(t.attachement.ToList()))
                                {
                                    ticket.Description += str;
                                }

                                _context.TickerHeader.Add(ticket);
                                await _context.SaveChangesAsync(cancellationToken);

                                ticket.InternTitle = ticket.Title + " - #" + ticket.Id;

                                result += await _context.SaveChangesAsync(cancellationToken);

                                if (result > 0 && !isMemberOrAdmin)
                                {
                                    if (user != null)
                                    {
                                        senderEmail = user.Email;
                                    }

                                    _email.SendEmail(senderEmail, ticket.InternTitle, "Your ticket is successfully created. <br>" +
                                                     "We will reply soon as possible.<br>" +
                                                     "<hr>Ticket content :<br>" + ticket.Description);
                                }
                            }
                        }

                        else
                        {
                            throw new ApplicationException();
                        }
                    }

                    return(result);
                }
                catch (Exception e)
                {
                    throw e;
                }
            }