This commit is contained in:
mmrbnjd
2025-07-28 17:41:14 +03:30
parent 43b6e4e746
commit ea152671d6
13 changed files with 691 additions and 12 deletions

View File

@@ -0,0 +1,97 @@
using Common.Dtos.Conversation;
using Common.Enums;
using Hushian.Application.Constants;
using Hushian.Application.Services;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
namespace Hushian.WebApi.Controllers.v1
{
[Route("api/v1/[controller]")]
[ApiController]
public class ChatController : ControllerBase
{
private readonly ChatService _chatService; private readonly ExperService _experService;
[HttpPost("MyChats")]
[Authorize(Roles = "Company,Exper")]
public async Task<ActionResult> MyChats([FromBody] ConversationStatus status)
{
if (User.IsInRole("Exper"))
{
string strExperID = User.Claims.Where(w => w.Type == CustomClaimTypes.Uid).Select(s => s.Value).First();
int ExperID = Convert.ToInt32(strExperID);
var response = await _chatService.GeChatsByExperID(ExperID, status);
return Ok(response);
}
else if (User.IsInRole("Company"))
{
string strCompanyID = User.Claims.Where(w => w.Type == CustomClaimTypes.Uid).Select(s => s.Value).First();
int CompanyID = Convert.ToInt32(strCompanyID);
var response = await _chatService.GetChatsByCompanyID(CompanyID, status);
return Ok(response);
}
return Forbid();
}
[HttpGet("ChatsAwaitingOurResponse")]
[Authorize(Roles = "Company,Exper")]
public async Task<ActionResult> ChatsAwaitingOurResponse()
{
int CompanyID = 0;
if (User.IsInRole("Exper"))
{
string strExperID = User.Claims.Where(w => w.Type == CustomClaimTypes.Uid).Select(s => s.Value).First();
int ExperID = Convert.ToInt32(strExperID);
CompanyID = await _experService.GetCompanyIDExper(ExperID);
}
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.ChatsAwaitingOurResponse(CompanyID);
return Ok(response);
}
[HttpPost("NewChatFromCurrentUser")]
public async Task<ActionResult> NewChatFromCurrentUser(ADD_ConversationDto conversation)
{
conversation.UserID = User.Claims.Where(w => w.Type == CustomClaimTypes.Uid).Select(s => Convert.ToInt32(s.Value)).First();
var response = await _chatService.NewChat(conversation);
return response.Success ? Ok(response.Value)
: BadRequest(response.Errors);
}
[HttpPost("ADDChatResponse")]
[Authorize(Roles = "Company,User,Exper")]
public async Task<ActionResult> ADDChatResponse([FromBody] ADD_ConversationResponseDto ConversationItem)
{
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);
ConversationItem.Type = ConversationType.EU;
}
else if (User.IsInRole("User"))
{
ConversationItem.Type = ConversationType.UE;
}
else if (User.IsInRole("Company"))
{
ConversationItem.Type = ConversationType.CU;
}
else return Unauthorized();
var Response = await _chatService.ADDChatResponse(ConversationItem, ExperID);
return Response.Success ? Ok(Response.Value)
: BadRequest(Response.Errors);
}
}
}

View File

@@ -23,6 +23,7 @@ namespace Hushian.WebApi.Controllers.v1
_experService = experService;
}
//*
[HttpPost("MyConversation")]
[Authorize(Roles = "Company,Exper")]
public async Task<ActionResult> MyConversation([FromBody]ConversationStatus status)
@@ -45,7 +46,7 @@ namespace Hushian.WebApi.Controllers.v1
return Forbid();
}
//*
[HttpGet("ConversationAwaitingOurResponse")]
[Authorize(Roles = "Company,Exper")]
public async Task<ActionResult> ConversationAwaitingOurResponse()
@@ -67,12 +68,14 @@ namespace Hushian.WebApi.Controllers.v1
var response = await _conversationService.ConversationAwaitingOurResponse(CompanyID);
return Ok(response);
}
//*
[HttpGet("ConversationItems/{ConversationID}")]
[Authorize(Roles = "Company,Exper,User")]
public async Task<ActionResult> GetConversationItems(int ConversationID)
{
return Ok(await _conversationService.GetConversationItems(ConversationID));
}
//*
[HttpPost("NewConversationFromCurrentUser")]
public async Task<ActionResult> NewConversationFromCurrentUser(ADD_ConversationDto conversation)
{
@@ -81,6 +84,7 @@ namespace Hushian.WebApi.Controllers.v1
return response.Success ? Ok(response.Value)
: BadRequest(response.Errors);
}
//*
[HttpPost("ADDConversationResponse")]
[Authorize(Roles = "Company,User,Exper")]
public async Task<ActionResult> ADDConversationResponse([FromBody] ADD_ConversationResponseDto ConversationItem)
@@ -110,6 +114,7 @@ namespace Hushian.WebApi.Controllers.v1
return Response.Success ? Ok(Response.Value)
: BadRequest(Response.Errors);
}
//---------------------------------------------------------------------------------------------------------------------
[HttpPut("MarkAsReadConversationItem/{ConversationItemID}")]
[Authorize(Roles = "Company,User,Exper")]
public async Task<ActionResult> MarkAsReadConversationItem(int ConversationItemID)

View File

@@ -82,6 +82,27 @@ namespace Hushian.WebApi.Controllers.v1
var response = await _experService.GetInfoExper(ExperID);
return response != null ? Ok(response) : BadRequest(new List<string> { "یافت نشد" });
}
[HttpGet("GetCurrentUserInfo")]
[Authorize(Roles = "Exper,Company")]
public async Task<ActionResult> GetCurrentUserInfo()
{
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);
}
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 _experService.GetCurrentUserInfo(CompanyID,ExperID);
return response != null ? Ok(response) : BadRequest(new List<string> { "یافت نشد" });
}
[HttpPut("ExperEditingFromManager/{ExperID}")] //ویرایش کارشناس توسط مدیرش
[Authorize(Roles = "Company")]
public async Task<ActionResult> ExperEditingFromManager(int ExperID, [FromBody] Update_ExperDto editUser)

View File

@@ -80,14 +80,14 @@ namespace Hushian.WebApi.Controllers.v1
{
string strExperID = User.Claims.Where(w => w.Type == CustomClaimTypes.Uid).Select(s => s.Value).First();
int ExperID = Convert.ToInt32(strExperID);
CompanyID =await _experService.GetCompanyIDExper(ExperID);
CompanyID = await _experService.GetCompanyIDExper(ExperID);
}
else if (User.IsInRole("Company"))
{
string strCompanyID = User.Claims.Where(w => w.Type == CustomClaimTypes.Uid).Select(s => s.Value).First();
CompanyID = Convert.ToInt32(strCompanyID);
CompanyID = Convert.ToInt32(strCompanyID);
}
}
var response = await _groupService.GetGroupsCompany(CompanyID.Value);
@@ -100,6 +100,27 @@ namespace Hushian.WebApi.Controllers.v1
var response = await _groupService.GetGroupsExper(ExperID);
return Ok(response);
}
[HttpGet("GetGroups")]
[Authorize]
public async Task<ActionResult<List<Read_GroupDto>>> GetGroupsAnon()
{
if (User.IsInRole("Exper"))
{
string strExperID = User.Claims.Where(w => w.Type == CustomClaimTypes.Uid).Select(s => s.Value).First();
int ExperID = Convert.ToInt32(strExperID);
var response = await _groupService.GetGroupsExper(ExperID);
return Ok(response);
}
else if (User.IsInRole("Company"))
{
string strCompanyID = User.Claims.Where(w => w.Type == CustomClaimTypes.Uid).Select(s => s.Value).First();
int CompanyID = Convert.ToInt32(strCompanyID);
var response = await _groupService.GetGroupsCompany(CompanyID);
return Ok(response);
}
return NotFound();
}
[HttpGet("GetExpersFromGroupID/{GroupID}")]
public async Task<ActionResult<List<Read_ExperDto>>> GetExpersGroup(int GroupID)
{
@@ -120,10 +141,10 @@ namespace Hushian.WebApi.Controllers.v1
{
string strCompanyID = User.Claims.Where(w => w.Type == CustomClaimTypes.Uid).Select(s => s.Value).First();
int CompanyID = Convert.ToInt32(strCompanyID);
var response = await _groupService.ChangeAvailableGroup(new Common.Dtos.Exper.ChangeAvailable_GroupDto()
{ Available=Available,ID=GroupID}, CompanyID);
return response? NoContent()
: BadRequest(new List<string> { "یافت نشد"});
var response = await _groupService.ChangeAvailableGroup(new Common.Dtos.Exper.ChangeAvailable_GroupDto()
{ Available = Available, ID = GroupID }, CompanyID);
return response ? NoContent()
: BadRequest(new List<string> { "یافت نشد" });
}
}

View File

@@ -0,0 +1,114 @@
@page "/Chant"
@using Common.Dtos.Conversation
@using Common.Dtos.Group
@using HushianWebApp.Service
@inject ChatService chatService
@inject GroupService groupService
@inject UserService userService
@inject IJSRuntime JS
@code {
public Common.Dtos.CurrentUserInfo CurrentUser { get; set; }
List<Read_GroupDto> _Group = new List<Read_GroupDto>();
//-------------------------------------
bool isSelectedInbox1 = false;
public List<ChatItemDto> Inbox1Items { get; set; } = new();
bool isSelectedInbox2 = true;
public List<ChatItemDto> Inbox2Items { get; set; } = new();
bool isSelectedInbox3 = false;
public List<ChatItemDto> Inbox3Items { get; set; } = new();
/////////////
public ChatItemDto? ChatCurrent { get; set; } = null;
public string MsgInput { get; set; }
}
@functions {
protected override async Task OnInitializedAsync()
{
CurrentUser =await userService.GetCurrentUserInfo();
_Group = await groupService.GetGroups();
Inbox1Items = await chatService.ChatAwaitingOurResponse();
Inbox2Items = await chatService.MyChatsIsInProgress();
Inbox3Items = await chatService.MyChatsIsFinished();
await base.OnInitializedAsync();
}
async Task OnclickInbox(int ID)
{
switch (ID)
{
case 1:
isSelectedInbox1 = true;
isSelectedInbox2 = false;
isSelectedInbox3 = false;
break;
case 2:
isSelectedInbox2 = true;
isSelectedInbox1 = false;
isSelectedInbox3 = false;
break;
case 3:
isSelectedInbox3 = true;
isSelectedInbox2 = false;
isSelectedInbox1 = false;
break;
}
ChatCurrent = null;
}
async Task SendMsg()
{
if (!string.IsNullOrEmpty(MsgInput) && ChatCurrent != null)
{
Common.Enums.ConversationType type = CurrentUser.Role == "Company" ? Common.Enums.ConversationType.CU : Common.Enums.ConversationType.EU;
await chatService.ADDChatResponse(ChatCurrent.ID, MsgInput, type);
ChatCurrent?.Responses.Add(new() { text = MsgInput, Type = type });
ChatCurrent.LastText = MsgInput;
await Task.Yield();
await JS.InvokeVoidAsync("scrollToBottom", "B1");
MsgInput = string.Empty;
}
}
async Task onClickSelectedCon(int InboxID, Read_ConversationDto conversationDto)
{
}
}
<style>
.input-group-text-chat {
display: flex;
align-items: center;
padding: .375rem .75rem;
font-size: 1rem;
font-weight: 400;
line-height: 1.5;
color: var(--bs-body-color);
text-align: center;
white-space: nowrap;
border-radius: var(--bs-border-radius);
}
</style>
<script>
window.getWindowSize = () => {
return {
width: window.innerWidth,
height: window.innerHeight
};
};
window.registerResizeCallback = (dotNetHelper) => {
window.onresize = () => {
dotNetHelper.invokeMethodAsync("OnResize");
};
};
window.scrollToBottom = (elementId) => {
const el = document.getElementById(elementId);
if (el) {
el.scrollTop = el.scrollHeight;
}
};
</script>

View File

@@ -0,0 +1,62 @@
using Common.Dtos.Conversation;
using Common.Enums;
using System.Net.Http.Json;
namespace HushianWebApp.Service
{
public class ChatService
{
private readonly BaseController _baseController;
const string BaseRoute = "v1/Chat/";
//Inbox1
public async Task<List<ChatItemDto>> ChatAwaitingOurResponse()
{
var response = await _baseController.Get($"{BaseRoute}ChatsAwaitingOurResponse");
if (response.IsSuccessStatusCode)
return await response.Content.ReadFromJsonAsync<List<ChatItemDto>>();
return new();
}
//Inbox2
public async Task<List<ChatItemDto>> MyChatsIsInProgress()
{
var response = await _baseController.Post($"{BaseRoute}MyChats", ConversationStatus.InProgress);
if (response.IsSuccessStatusCode)
return await response.Content.ReadFromJsonAsync<List<ChatItemDto>>();
return new();
}
//Inbox3
public async Task<List<ChatItemDto>> MyChatsIsFinished()
{
var response = await _baseController.Post($"{BaseRoute}MyChats", ConversationStatus.Finished);
if (response.IsSuccessStatusCode)
return await response.Content.ReadFromJsonAsync<List<ChatItemDto>>();
return new();
}
public async Task<ChatItemDto> NewChatFromCurrentUser(ADD_ConversationDto conversation)
{
var response = await _baseController.Post($"{BaseRoute}NewChatFromCurrentUser", conversation);
if (response.IsSuccessStatusCode)
return await response.Content.ReadFromJsonAsync<ChatItemDto>();
return null;
}
public async Task<ChatItemResponseDto?> ADDChatResponse(int ConversationID, string text, ConversationType type)
{
var response = await _baseController.Post($"{BaseRoute}ADDChatResponse", new ADD_ConversationResponseDto()
{
ConversationID = ConversationID,
Text = text,
Type = type
});
if (response.IsSuccessStatusCode)
return await response.Content.ReadFromJsonAsync<ChatItemResponseDto>();
return null;
}
}
}

View File

@@ -39,6 +39,15 @@ namespace HushianWebApp.Service
var response = await _baseController.Delete ($"{BaseRoute}DeleteGroup/{GroupID}");
return response.IsSuccessStatusCode;
}
public async Task<List<Read_GroupDto>?> GetGroups()
{
var response = await _baseController.Get($"{BaseRoute}GetGroups");
if (response.IsSuccessStatusCode)
{
return await response.Content.ReadFromJsonAsync<List<Read_GroupDto>>();
}
return null;
}
public async Task<List<Read_GroupDto>?> GetGroupsCompany()
{
var response = await _baseController.Get($"{BaseRoute}GetGroupsCompany");

View File

@@ -92,6 +92,15 @@ namespace HushianWebApp.Service
var response = await _baseController.Delete($"{BaseRoute}DeleteExperFromManager/{ExperID}");
return response.IsSuccessStatusCode;
}
public async Task<CurrentUserInfo> GetCurrentUserInfo()
{
var response = await _baseController.Get($"{BaseRoute}GetCurrentUserInfo");
if (response.IsSuccessStatusCode)
{
return await response.Content.ReadFromJsonAsync<CurrentUserInfo>();
}
return null;
}