From ba0c5138308a987f27190646f457278df48d8f10 Mon Sep 17 00:00:00 2001 From: mmrbnjd Date: Sun, 3 Aug 2025 23:41:54 +0330 Subject: [PATCH] ... --- Hushian.Application/Services/ChatService.cs | 160 ++++++++++-------- .../Controllers/v1/ChatController.cs | 29 +++- Presentation/HushianWebApp/Pages/Chat.razor | 87 +++++++++- .../HushianWebApp/Service/ChatService.cs | 5 + 4 files changed, 199 insertions(+), 82 deletions(-) diff --git a/Hushian.Application/Services/ChatService.cs b/Hushian.Application/Services/ChatService.cs index 350f48a..090da9a 100644 --- a/Hushian.Application/Services/ChatService.cs +++ b/Hushian.Application/Services/ChatService.cs @@ -15,7 +15,7 @@ using System.Threading.Tasks; namespace Hushian.Application.Services { - public class ChatService + public class ChatService { private readonly IGenericRepository _ConversationRepository; private readonly IGenericRepository _ConversationResponseRepository; @@ -55,7 +55,7 @@ namespace Hushian.Application.Services status = s.Status, UserID = s.UserID, UserFullName = string.IsNullOrEmpty(s.User.FullName) ? s.User.Mobile : s.User.FullName, - Responses = s.ConversationResponses.Select(ss=>new ChatItemResponseDto() + Responses = s.ConversationResponses.Select(ss => new ChatItemResponseDto() { ChatItemID = ss.ConversationID, ExperID = ss.ExperID, @@ -104,40 +104,50 @@ namespace Hushian.Application.Services }).ToList() }).ToListAsync(); - public async Task> ChatsAwaitingOurResponse(int CompanyID) - => await _ConversationRepository.Get() - .Include(inc => inc.Group) - .Include(inc => inc.ConversationResponses).ThenInclude(tinc => tinc.Exper) - .Where(w => w.Status == ConversationStatus.Recorded && w.CompanyID == CompanyID) - .Select(s => new ChatItemDto() + public async Task> ChatsAwaitingOurResponse(int CompanyID, int? ExperID) { - ID = s.ID, - ExperID = s.ConversationResponses.OrderBy(o => o.ID).Last().ExperID, - ExperFullName = s.ConversationResponses.OrderBy(o => o.ID).Last().Exper.FullName, - GroupID = s.GroupID, - GroupName = s.Group.Name, - LastText = s.ConversationResponses.OrderBy(o => o.ID).Last().Text, - LastMsgdate = s.Cdatetime.GetDatePersian(), - LastMsgtime = s.Cdatetime.GetTime(), - LastMsgType = s.ConversationResponses.OrderBy(o => o.ID).Last().Type, - status = s.Status, - UserID = s.UserID, - UserFullName = string.IsNullOrEmpty(s.User.FullName) ? s.User.Mobile : s.User.FullName, - Responses = s.ConversationResponses.Select(ss => new ChatItemResponseDto() + int[]? groupallow = null; + if (ExperID.HasValue) { - ChatItemID = ss.ConversationID, - ExperID = ss.ExperID, - ExperName = ss.Exper.FullName, - FileContent = ss.FileContent, - FileName = ss.FileName, - FileType = ss.FileType, - ID = ss.ID, - IsRead = ss.IsRead, - text = ss.Text, - Type = ss.Type - }).ToList() + var groups = await _groupService.GetGroupsExper(ExperID.Value); + if (groups.Count > 0) groupallow = groups.Select(s => s.ID).ToArray(); + } - }).ToListAsync(); + var request = _ConversationRepository.Get() + .Include(inc => inc.Group) + .Include(inc => inc.ConversationResponses).ThenInclude(tinc => tinc.Exper) + .Where(w => w.Status == ConversationStatus.Recorded && w.CompanyID == CompanyID); + if (groupallow != null) request = request.Where(w=>!w.GroupID.HasValue || groupallow.Contains(w.GroupID.Value)); + return await request.Select(s => new ChatItemDto() + { + ID = s.ID, + ExperID = s.ConversationResponses.OrderBy(o => o.ID).Last().ExperID, + ExperFullName = s.ConversationResponses.OrderBy(o => o.ID).Last().Exper.FullName, + GroupID = s.GroupID, + GroupName = s.Group.Name, + LastText = s.ConversationResponses.OrderBy(o => o.ID).Last().Text, + LastMsgdate = s.Cdatetime.GetDatePersian(), + LastMsgtime = s.Cdatetime.GetTime(), + LastMsgType = s.ConversationResponses.OrderBy(o => o.ID).Last().Type, + status = s.Status, + UserID = s.UserID, + UserFullName = string.IsNullOrEmpty(s.User.FullName) ? s.User.Mobile : s.User.FullName, + Responses = s.ConversationResponses.Select(ss => new ChatItemResponseDto() + { + ChatItemID = ss.ConversationID, + ExperID = ss.ExperID, + ExperName = ss.Exper.FullName, + FileContent = ss.FileContent, + FileName = ss.FileName, + FileType = ss.FileType, + ID = ss.ID, + IsRead = ss.IsRead, + text = ss.Text, + Type = ss.Type + }).ToList() + + }).ToListAsync(); + } //------------------------ public async Task> NewChat(ADD_ConversationDto dto, ConversationType type = ConversationType.UE) { @@ -167,39 +177,39 @@ namespace Hushian.Application.Services ConversationResponses = new List() { new() { Text = dto.Question, Type = type } } }; var mi = await _ConversationRepository.ADD(conversation); - if(mi.ID > 0) - Response.Value = await _ConversationRepository.Get() - .Include(inc => inc.Group).Include(inc => inc.ConversationResponses).ThenInclude(tinc => tinc.Exper) - .Where(w => w.ID==mi.ID) - .Select(s => new ChatItemDto() - { - ID = s.ID, - ExperID = s.ConversationResponses.OrderBy(o => o.ID).Last().ExperID, - ExperFullName = s.ConversationResponses.OrderBy(o => o.ID).Last().Exper.FullName, - GroupID = s.GroupID, - GroupName = s.Group.Name, - LastText = s.ConversationResponses.OrderBy(o => o.ID).Last().Text, - LastMsgdate = s.Cdatetime.GetDatePersian(), - LastMsgtime = s.Cdatetime.GetTime(), - LastMsgType = s.ConversationResponses.OrderBy(o => o.ID).Last().Type, - status = s.Status, - UserID = s.UserID, - UserFullName = string.IsNullOrEmpty(s.User.FullName) ? s.User.Mobile : s.User.FullName, - Responses = s.ConversationResponses.Select(ss => new ChatItemResponseDto() - { - ChatItemID = ss.ConversationID, - ExperID = ss.ExperID, - ExperName = ss.Exper.FullName, - FileContent = ss.FileContent, - FileName = ss.FileName, - FileType = ss.FileType, - ID = ss.ID, - IsRead = ss.IsRead, - text = ss.Text, - Type = ss.Type - }).ToList() + if (mi.ID > 0) + Response.Value = await _ConversationRepository.Get() + .Include(inc => inc.Group).Include(inc => inc.ConversationResponses).ThenInclude(tinc => tinc.Exper) + .Where(w => w.ID == mi.ID) + .Select(s => new ChatItemDto() + { + ID = s.ID, + ExperID = s.ConversationResponses.OrderBy(o => o.ID).Last().ExperID, + ExperFullName = s.ConversationResponses.OrderBy(o => o.ID).Last().Exper.FullName, + GroupID = s.GroupID, + GroupName = s.Group.Name, + LastText = s.ConversationResponses.OrderBy(o => o.ID).Last().Text, + LastMsgdate = s.Cdatetime.GetDatePersian(), + LastMsgtime = s.Cdatetime.GetTime(), + LastMsgType = s.ConversationResponses.OrderBy(o => o.ID).Last().Type, + status = s.Status, + UserID = s.UserID, + UserFullName = string.IsNullOrEmpty(s.User.FullName) ? s.User.Mobile : s.User.FullName, + Responses = s.ConversationResponses.Select(ss => new ChatItemResponseDto() + { + ChatItemID = ss.ConversationID, + ExperID = ss.ExperID, + ExperName = ss.Exper.FullName, + FileContent = ss.FileContent, + FileName = ss.FileName, + FileType = ss.FileType, + ID = ss.ID, + IsRead = ss.IsRead, + text = ss.Text, + Type = ss.Type + }).ToList() - }).FirstOrDefaultAsync(); + }).FirstOrDefaultAsync(); Response.Success = mi.ID > 0; } else Response.Errors.Add("شناسه گروه صحیح نمی باشد"); @@ -272,11 +282,11 @@ namespace Hushian.Application.Services return Response; } - public async Task FinishChat(int ChatID, int CompanyID,int? ExperID) + public async Task FinishChat(int ChatID, int CompanyID, int? ExperID) { var convModel = await _ConversationRepository.Get() .Include(inc => inc.ConversationResponses) - .FirstOrDefaultAsync(w => w.ID == ChatID && w.CompanyID==CompanyID); + .FirstOrDefaultAsync(w => w.ID == ChatID && w.CompanyID == CompanyID); if (ExperID.HasValue && !convModel.ConversationResponses.Any(a => a.ExperID == ExperID.Value)) return false; if (convModel != null && convModel.Status != ConversationStatus.Finished) @@ -288,7 +298,7 @@ namespace Hushian.Application.Services return true; } - public async Task OpenChat(int ChatID, int CompanyID,int? ExperID) + public async Task OpenChat(int ChatID, int CompanyID, int? ExperID) { var convModel = await _ConversationRepository.Get() .Include(inc => inc.ConversationResponses) @@ -322,7 +332,11 @@ namespace Hushian.Application.Services return true; } + public async Task Attachedto(int ChatID, int? FromExperID, int toExperID, int CompanyID) + { + return false; + } public async Task MarkAsReadChatItem(int ID, ConversationType Type, int? ExperID) { var item = await _ConversationResponseRepository.Get() @@ -352,14 +366,14 @@ namespace Hushian.Application.Services } return false; } - public async Task> GetLastOpenChatInCompany(int CompanyID,int UserID) + public async Task> GetLastOpenChatInCompany(int CompanyID, int UserID) { ResponseBase Response = new(); - Response.Value= await _ConversationRepository.Get() + Response.Value = await _ConversationRepository.Get() .Include(inc => inc.Group) .Include(inc => inc.ConversationResponses).ThenInclude(tinc => tinc.Exper) - .Where(w => w.UserID== UserID &&w.CompanyID==CompanyID && w.Status != ConversationStatus.Finished) - .OrderByDescending(o=>o.ID) + .Where(w => w.UserID == UserID && w.CompanyID == CompanyID && w.Status != ConversationStatus.Finished) + .OrderByDescending(o => o.ID) .Select(s => new ChatItemDto() { ID = s.ID, @@ -399,7 +413,7 @@ namespace Hushian.Application.Services Response.Value = await _ConversationRepository.Get() .Include(inc => inc.Group) .Include(inc => inc.ConversationResponses).ThenInclude(tinc => tinc.Exper) - .Where(w => w.UserID == UserID && w.ID == ChatID ) + .Where(w => w.UserID == UserID && w.ID == ChatID) .OrderByDescending(o => o.ID) .Select(s => new ChatItemDto() { diff --git a/Presentation/Hushian.WebApi/Controllers/v1/ChatController.cs b/Presentation/Hushian.WebApi/Controllers/v1/ChatController.cs index c4dbac1..386101b 100644 --- a/Presentation/Hushian.WebApi/Controllers/v1/ChatController.cs +++ b/Presentation/Hushian.WebApi/Controllers/v1/ChatController.cs @@ -69,12 +69,13 @@ namespace Hushian.WebApi.Controllers.v1 public async Task ChatsAwaitingOurResponse() { int CompanyID = 0; + int? ExperID = null; if (User.IsInRole("Exper")) { string strExperID = User.Claims.Where(w => w.Type == CustomClaimTypes.Uid).Select(s => s.Value).First(); - int ExperID = Convert.ToInt32(strExperID); + ExperID = Convert.ToInt32(strExperID); - CompanyID = await _experService.GetCompanyIDExper(ExperID); + CompanyID = await _experService.GetCompanyIDExper(ExperID.Value); } else if (User.IsInRole("Company")) { @@ -82,9 +83,31 @@ namespace Hushian.WebApi.Controllers.v1 CompanyID = Convert.ToInt32(strCompanyID); } - var response = await _chatService.ChatsAwaitingOurResponse(CompanyID); + var response = await _chatService.ChatsAwaitingOurResponse(CompanyID,ExperID); return Ok(response); } + [HttpPut("Attached-to/{toExperID}/{ChatID}")] + [Authorize(Roles = "Company,Exper")] + public async Task Attachedto(int toExperID,int ChatID) + { + int CompanyID = 0; + int? ExperID = null; + if (User.IsInRole("Exper")) + { + string strExperID = User.Claims.Where(w => w.Type == CustomClaimTypes.Uid).Select(s => s.Value).First(); + ExperID = Convert.ToInt32(strExperID); + + CompanyID = await _experService.GetCompanyIDExper(ExperID.Value); + } + else if (User.IsInRole("Company")) + { + string strCompanyID = User.Claims.Where(w => w.Type == CustomClaimTypes.Uid).Select(s => s.Value).First(); + CompanyID = Convert.ToInt32(strCompanyID); + } + + var response = await _chatService.Attachedto(ChatID, ExperID,toExperID,CompanyID); + return response ?NoContent(): BadRequest(new List { "خطا در بروزرسانی وضعیت" }); + } [HttpPost("NewChatFromCurrentUser")] public async Task NewChatFromCurrentUser(ADD_ConversationDto conversation) { diff --git a/Presentation/HushianWebApp/Pages/Chat.razor b/Presentation/HushianWebApp/Pages/Chat.razor index 4c9c140..5d33694 100644 --- a/Presentation/HushianWebApp/Pages/Chat.razor +++ b/Presentation/HushianWebApp/Pages/Chat.razor @@ -26,8 +26,8 @@