...
This commit is contained in:
97
Presentation/Hushian.WebApi/Controllers/v1/ChatController.cs
Normal file
97
Presentation/Hushian.WebApi/Controllers/v1/ChatController.cs
Normal 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);
|
||||
}
|
||||
}
|
||||
}
|
@@ -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)
|
||||
|
@@ -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)
|
||||
|
@@ -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> { "یافت نشد" });
|
||||
}
|
||||
|
||||
}
|
||||
|
114
Presentation/HushianWebApp/Pages/Chat.razor
Normal file
114
Presentation/HushianWebApp/Pages/Chat.razor
Normal 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>
|
62
Presentation/HushianWebApp/Service/ChatService.cs
Normal file
62
Presentation/HushianWebApp/Service/ChatService.cs
Normal 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;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
@@ -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");
|
||||
|
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user