fix Room bugs
This commit is contained in:
parent
5e8ccff93e
commit
d7bbdbf505
@ -5,6 +5,12 @@ namespace EnotaryoPH.Data.Entities
|
|||||||
[Table("LawyerVideoConferenceSchedule")]
|
[Table("LawyerVideoConferenceSchedule")]
|
||||||
public class LawyerVideoConferenceSchedule
|
public class LawyerVideoConferenceSchedule
|
||||||
{
|
{
|
||||||
|
[Column("ServerCallID")]
|
||||||
|
public string? ServerCallID { get; set; }
|
||||||
|
|
||||||
|
[Column("RecordingID")]
|
||||||
|
public string? RecordingID { get; set; }
|
||||||
|
|
||||||
[Column("CreatedOn")]
|
[Column("CreatedOn")]
|
||||||
public DateTime? CreatedOn { get; set; }
|
public DateTime? CreatedOn { get; set; }
|
||||||
|
|
||||||
|
@ -19,6 +19,7 @@ class VideoCall {
|
|||||||
this.onCreateLocalVideoStream = null;
|
this.onCreateLocalVideoStream = null;
|
||||||
this.remoteParticipantStateChanged = null;
|
this.remoteParticipantStateChanged = null;
|
||||||
this.remoteVideoIsAvailableChanged = null;
|
this.remoteVideoIsAvailableChanged = null;
|
||||||
|
this.onGetServerCallID = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
async init(userAccessToken, options) {
|
async init(userAccessToken, options) {
|
||||||
@ -42,13 +43,6 @@ class VideoCall {
|
|||||||
this.localVideoStream = new LocalVideoStream(cameras[0]);
|
this.localVideoStream = new LocalVideoStream(cameras[0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
async startLocalVideo() {
|
|
||||||
if (this.localVideoStream) {
|
|
||||||
//const localVideoOptions = new VideoStreamOptions();
|
|
||||||
await this.callAgent.startCall([this.callAgent.identity], { video: [this.localVideoStream] });
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
stopLocalVideo() {
|
stopLocalVideo() {
|
||||||
if (this.call) {
|
if (this.call) {
|
||||||
this.call.stopVideo(this.localVideoStream);
|
this.call.stopVideo(this.localVideoStream);
|
||||||
@ -67,6 +61,21 @@ class VideoCall {
|
|||||||
const roomCallLocator = { roomId: roomId };
|
const roomCallLocator = { roomId: roomId };
|
||||||
let call = this.callAgent.join(roomCallLocator, { videoOptions });
|
let call = this.callAgent.join(roomCallLocator, { videoOptions });
|
||||||
this.subscribeToCall(call);
|
this.subscribeToCall(call);
|
||||||
|
|
||||||
|
this.callAgent.on('callsUpdated', e => {
|
||||||
|
e.added.forEach((addedCall) => {
|
||||||
|
addedCall.on('stateChanged', () => {
|
||||||
|
if (addedCall.state === 'Connected') {
|
||||||
|
debugger;
|
||||||
|
addedCall.info.getServerCallId().then(result => {
|
||||||
|
this.onGetServerCallID?.(result);
|
||||||
|
}).catch(err => {
|
||||||
|
console.log(err);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error(error);
|
console.error(error);
|
||||||
}
|
}
|
||||||
|
@ -8,6 +8,7 @@
|
|||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<PackageReference Include="Azure.Communication.CallAutomation" Version="1.3.0" />
|
||||||
<PackageReference Include="Azure.Communication.Identity" Version="1.3.1" />
|
<PackageReference Include="Azure.Communication.Identity" Version="1.3.1" />
|
||||||
<PackageReference Include="Azure.Communication.Rooms" Version="1.1.1" />
|
<PackageReference Include="Azure.Communication.Rooms" Version="1.1.1" />
|
||||||
<PackageReference Include="CompreFace.NET.Sdk" Version="1.0.2" />
|
<PackageReference Include="CompreFace.NET.Sdk" Version="1.0.2" />
|
||||||
|
@ -77,7 +77,7 @@
|
|||||||
<input type="hidden" value="@JsonSerializer.Serialize(Model.Participants)" />
|
<input type="hidden" value="@JsonSerializer.Serialize(Model.Participants)" />
|
||||||
|
|
||||||
@section Scripts {
|
@section Scripts {
|
||||||
<script type="text/javascript" src="~/dist/jfa.js"></script>
|
<script type="text/javascript" src="/dist/_jfa.js"></script>
|
||||||
<script>
|
<script>
|
||||||
|
|
||||||
let participants = JSON.parse('@Html.Raw(JsonSerializer.Serialize(Model.Participants))');
|
let participants = JSON.parse('@Html.Raw(JsonSerializer.Serialize(Model.Participants))');
|
||||||
@ -138,8 +138,21 @@
|
|||||||
e.el.querySelector('video').style['object-fit'] = 'cover';
|
e.el.querySelector('video').style['object-fit'] = 'cover';
|
||||||
document.getElementById(participant.Id).appendChild(e.el);
|
document.getElementById(participant.Id).appendChild(e.el);
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
onGetServerCallID: function(e) {
|
||||||
|
debugger;
|
||||||
|
let url = jfa.utilities.routing.getCurrentURLWithHandler("StartRecording");
|
||||||
|
debugger;
|
||||||
|
url.searchParams.append("ServerCallID", e.serverCallId || "");
|
||||||
|
jfa.utilities.request.post(url, {})
|
||||||
|
.then(resp => {
|
||||||
|
if (resp.ok === true) {
|
||||||
|
jfa.page.reload();
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.catch(err => console.error(err));
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
await videoCall.init(userAccessToken, options);
|
await videoCall.init(userAccessToken, options);
|
||||||
videoCall.joinRoom('@Model.CommunicationRoomId');
|
videoCall.joinRoom('@Model.CommunicationRoomId');
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,3 @@
|
|||||||
using Azure;
|
|
||||||
using Azure.Communication;
|
|
||||||
using Azure.Communication.Identity;
|
|
||||||
using Azure.Communication.Rooms;
|
|
||||||
using EnotaryoPH.Data;
|
using EnotaryoPH.Data;
|
||||||
using EnotaryoPH.Data.Entities;
|
using EnotaryoPH.Data.Entities;
|
||||||
using Microsoft.AspNetCore.Mvc;
|
using Microsoft.AspNetCore.Mvc;
|
||||||
@ -11,83 +7,54 @@ namespace EnotaryoPH.Web.Pages.Participant.VideoCall
|
|||||||
{
|
{
|
||||||
public class RoomModel : PageModel
|
public class RoomModel : PageModel
|
||||||
{
|
{
|
||||||
private const string CONNECTION_STRING = "endpoint=https://comm-enotario.asiapacific.communication.azure.com/;accesskey=yqxq5mRByG8aPwZBiT/KFfx6Rr16RR280dC3GVkGaFVNXGk91sIDy04j5jrZfjDZAvdn0fjtyF0kGJPXMGgfKg==";
|
private readonly IConferenceSheduleService _conferenceSheduleService;
|
||||||
private readonly ICurrentUserService _currentUserService;
|
private readonly ICurrentUserService _currentUserService;
|
||||||
private readonly NotaryoDBContext _dbContext;
|
private readonly NotaryoDBContext _dbContext;
|
||||||
private readonly ISession _session;
|
|
||||||
private readonly CommunicationUserIdentifier? _user1;
|
|
||||||
private readonly CommunicationUserIdentifier? _user2;
|
|
||||||
private CommunicationIdentityClient? _communicationIdentityClient;
|
|
||||||
private LawyerVideoConferenceSchedule _LawyerVideoConferenceSchedule;
|
private LawyerVideoConferenceSchedule _LawyerVideoConferenceSchedule;
|
||||||
private Transaction _Transaction;
|
private Transaction _Transaction;
|
||||||
|
|
||||||
public RoomModel(IHttpContextAccessor httpContextAccessor, ICurrentUserService currentUserService, NotaryoDBContext dbContext)
|
public RoomModel(ICurrentUserService currentUserService, NotaryoDBContext dbContext, IConferenceSheduleService conferenceSheduleService)
|
||||||
{
|
{
|
||||||
_session = httpContextAccessor.HttpContext.Session;
|
|
||||||
_currentUserService = currentUserService;
|
_currentUserService = currentUserService;
|
||||||
_dbContext = dbContext;
|
_dbContext = dbContext;
|
||||||
|
_conferenceSheduleService = conferenceSheduleService;
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<IActionResult> OnGetAsync()
|
public async Task<IActionResult> OnGetAsync()
|
||||||
{
|
{
|
||||||
_Transaction = _dbContext.Transactions
|
_Transaction = _dbContext.Transactions
|
||||||
.Include(t => t.TransactionSignatories)
|
.Include(t => t.TransactionSignatories)
|
||||||
|
.Include(t => t.Principal)
|
||||||
.FirstOrDefault(t => t.Transaction_UID == Transaction_UID);
|
.FirstOrDefault(t => t.Transaction_UID == Transaction_UID);
|
||||||
if (_Transaction == null)
|
if (_Transaction == null)
|
||||||
{
|
{
|
||||||
return NotFound();
|
return NotFound();
|
||||||
}
|
}
|
||||||
|
|
||||||
_LawyerVideoConferenceSchedule = _dbContext.LawyerVideoConferenceSchedules
|
var currentUser = _dbContext.Users.Single(u => u.User_UID == _currentUserService.GetUser_UID());
|
||||||
.Include(meeting => meeting.LawyerVideoConferenceParticipants)
|
var schedule_UID = await _conferenceSheduleService.GetOrCreateScheduleIDAsync(Transaction_UID);
|
||||||
.ThenInclude(p => p.Participant)
|
if (schedule_UID == Guid.Empty)
|
||||||
.Include(meeting => meeting.Lawyer)
|
|
||||||
.ThenInclude(l => l.User)
|
|
||||||
.FirstOrDefault(meeting => meeting.TransactionID == _Transaction.TransactionID);
|
|
||||||
|
|
||||||
if (ShouldCreateRoom())
|
|
||||||
{
|
{
|
||||||
_LawyerVideoConferenceSchedule ??= new LawyerVideoConferenceSchedule
|
if (_Transaction.PrincipalID == currentUser.UserID)
|
||||||
{
|
{
|
||||||
LawyerVideoConferenceSchedule_UID = Guid.CreateVersion7(),
|
return Redirect($"/Principal/TransactionStatus/{Transaction_UID}");
|
||||||
CreatedOn = DateTime.UtcNow,
|
|
||||||
LawyerID = _Transaction.LawyerID.GetValueOrDefault(),
|
|
||||||
TransactionID = _Transaction.TransactionID,
|
|
||||||
};
|
|
||||||
_LawyerVideoConferenceSchedule.MeetingDate = DateTime.UtcNow;
|
|
||||||
_LawyerVideoConferenceSchedule.Status = nameof(VideoConferenceStatus.New);
|
|
||||||
|
|
||||||
var roomParticipants = new List<RoomParticipant>();
|
|
||||||
foreach (var participant in _LawyerVideoConferenceSchedule.LawyerVideoConferenceParticipants)
|
|
||||||
{
|
|
||||||
var attendee = await CommunicationIdentityClient.CreateUserAsync();
|
|
||||||
roomParticipants.Add(new RoomParticipant(attendee) { Role = ParticipantRole.Attendee });
|
|
||||||
participant.MeetingRoomTokenID = await GetTokenResponse(attendee);
|
|
||||||
participant.MeetingRoomUserID = attendee.Value.Id;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var presenter = await CommunicationIdentityClient.CreateUserAsync();
|
if (currentUser.Role.IsInList(UserType.Principal, UserType.Witness))
|
||||||
roomParticipants.Add(new RoomParticipant(presenter) { Role = ParticipantRole.Presenter });
|
|
||||||
_LawyerVideoConferenceSchedule.MeetingRoomTokenID = await GetTokenResponse(presenter);
|
|
||||||
_LawyerVideoConferenceSchedule.MeetingRoomUserID = presenter.Value.Id;
|
|
||||||
|
|
||||||
var roomsClient = new RoomsClient(CONNECTION_STRING);
|
|
||||||
CommunicationRoom room = await roomsClient.CreateRoomAsync(DateTime.Now, DateTime.Now.AddHours(2), roomParticipants);
|
|
||||||
|
|
||||||
_LawyerVideoConferenceSchedule.MeetingRoomID = room.Id;
|
|
||||||
|
|
||||||
if (_LawyerVideoConferenceSchedule.LawyerVideoConferenceScheduleID == 0)
|
|
||||||
{
|
{
|
||||||
_dbContext.Add(_LawyerVideoConferenceSchedule);
|
return Redirect($"/Participant/VideoCall/Waiting/{Transaction_UID}");
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
return Redirect("/");
|
||||||
_dbContext.Update(_LawyerVideoConferenceSchedule);
|
|
||||||
}
|
|
||||||
_dbContext.SaveChanges();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var currentUser = _dbContext.Users.FirstOrDefault(u => u.User_UID == _currentUserService.GetUser_UID());
|
_LawyerVideoConferenceSchedule = _dbContext.LawyerVideoConferenceSchedules
|
||||||
|
.Include(sched => sched.LawyerVideoConferenceParticipants)
|
||||||
|
.ThenInclude(p => p.Participant)
|
||||||
|
.Include(sched => sched.Lawyer)
|
||||||
|
.ThenInclude(l => l.User)
|
||||||
|
.FirstOrDefault(sched => sched.LawyerVideoConferenceSchedule_UID == schedule_UID);
|
||||||
|
|
||||||
CommunicationUserToken = currentUser.Role == nameof(UserType.Notary)
|
CommunicationUserToken = currentUser.Role == nameof(UserType.Notary)
|
||||||
? _LawyerVideoConferenceSchedule.MeetingRoomTokenID
|
? _LawyerVideoConferenceSchedule.MeetingRoomTokenID
|
||||||
: _LawyerVideoConferenceSchedule.LawyerVideoConferenceParticipants.First(u => u.ParticipantID == currentUser.UserID).MeetingRoomTokenID;
|
: _LawyerVideoConferenceSchedule.LawyerVideoConferenceParticipants.First(u => u.ParticipantID == currentUser.UserID).MeetingRoomTokenID;
|
||||||
@ -96,53 +63,47 @@ namespace EnotaryoPH.Web.Pages.Participant.VideoCall
|
|||||||
? _LawyerVideoConferenceSchedule.MeetingRoomUserID
|
? _LawyerVideoConferenceSchedule.MeetingRoomUserID
|
||||||
: _LawyerVideoConferenceSchedule.LawyerVideoConferenceParticipants.First(u => u.ParticipantID == currentUser.UserID).MeetingRoomUserID;
|
: _LawyerVideoConferenceSchedule.LawyerVideoConferenceParticipants.First(u => u.ParticipantID == currentUser.UserID).MeetingRoomUserID;
|
||||||
|
|
||||||
|
|
||||||
return Page();
|
return Page();
|
||||||
}
|
}
|
||||||
|
|
||||||
private static string GetHashCode(string stringValue) => stringValue.GetHashCode().ToString("X8");
|
public async Task OnPostStartRecordingAsync() => await _conferenceSheduleService.StartRecordingAsync(Transaction_UID);
|
||||||
|
|
||||||
private async Task<string> GetTokenResponse(Response<CommunicationUserIdentifier> user)
|
|
||||||
{
|
|
||||||
var tokenResponse = await CommunicationIdentityClient.GetTokenAsync(user, new[] { CommunicationTokenScope.VoIP });
|
|
||||||
return tokenResponse.Value.Token;
|
|
||||||
}
|
|
||||||
|
|
||||||
private bool ShouldCreateRoom() => _LawyerVideoConferenceSchedule == null || DateTime.UtcNow.Subtract(_LawyerVideoConferenceSchedule.MeetingDate).TotalHours > 1 || _LawyerVideoConferenceSchedule.LawyerVideoConferenceParticipants.Any(p => string.IsNullOrEmpty(p.MeetingRoomTokenID));
|
|
||||||
|
|
||||||
public string CommunicationRoomId { get; private set; }
|
public string CommunicationRoomId { get; private set; }
|
||||||
public string CommunicationUserToken { get; private set; }
|
|
||||||
public string CommunicationUserId { get; set; }
|
public string CommunicationUserId { get; set; }
|
||||||
|
|
||||||
|
public string CommunicationUserToken { get; private set; }
|
||||||
|
|
||||||
public List<RoomParticipantViewModel> Participants
|
public List<RoomParticipantViewModel> Participants
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
var signatoryTypes = _Transaction.TransactionSignatories.Where(t => t.UserID > 0).ToDictionary(k => k.UserID, v => v.Type);
|
var signatoryTypes = _Transaction.TransactionSignatories.Where(t => t.UserID > 0).ToDictionary(k => k.UserID, v => v.Type);
|
||||||
var dic = _LawyerVideoConferenceSchedule.LawyerVideoConferenceParticipants.ConvertAll(p => new RoomParticipantViewModel
|
var participants = _LawyerVideoConferenceSchedule.LawyerVideoConferenceParticipants.ConvertAll(p => new RoomParticipantViewModel
|
||||||
{
|
{
|
||||||
Id = p.LawyerVideoConferenceParticipant_UID.ToString(),
|
Id = p.LawyerVideoConferenceParticipant_UID.ToString(),
|
||||||
DisplayName = $"{p.Participant.Firstname} {p.Participant.Lastname}",
|
DisplayName = $"{p.Participant.Firstname} {p.Participant.Lastname}".Trim().DefaultIfEmpty(p.Participant.Email),
|
||||||
RoomUserID = p.MeetingRoomUserID,
|
RoomUserID = p.MeetingRoomUserID,
|
||||||
Type = signatoryTypes.GetValueOrDefault(p.ParticipantID, nameof(UserType.Principal))
|
Type = signatoryTypes.GetValueOrDefault(p.ParticipantID, nameof(UserType.Principal))
|
||||||
});
|
});
|
||||||
|
|
||||||
var host = _LawyerVideoConferenceSchedule.Lawyer.User;
|
var host = _LawyerVideoConferenceSchedule.Lawyer.User;
|
||||||
dic.Add(new RoomParticipantViewModel
|
participants.Add(new RoomParticipantViewModel
|
||||||
{
|
{
|
||||||
DisplayName = $"{host.Firstname} {host.Lastname}",
|
DisplayName = $"{host.Firstname} {host.Lastname}".Trim().DefaultIfEmpty(host.Email),
|
||||||
Id = Guid.Empty.ToString(),
|
Id = Guid.Empty.ToString(),
|
||||||
RoomUserID = _LawyerVideoConferenceSchedule.MeetingRoomUserID,
|
RoomUserID = _LawyerVideoConferenceSchedule.MeetingRoomUserID,
|
||||||
Type = nameof(UserType.Notary)
|
Type = nameof(UserType.Notary)
|
||||||
});
|
});
|
||||||
|
|
||||||
return dic;
|
return participants;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
[BindProperty(SupportsGet = true)]
|
[BindProperty(SupportsGet = true)]
|
||||||
public Guid Transaction_UID { get; set; }
|
public string ServerCallingID { get; set; }
|
||||||
|
|
||||||
private CommunicationIdentityClient CommunicationIdentityClient => _communicationIdentityClient ??= new CommunicationIdentityClient(CONNECTION_STRING);
|
[BindProperty(SupportsGet = true)]
|
||||||
|
public Guid Transaction_UID { get; set; }
|
||||||
}
|
}
|
||||||
}
|
}
|
Loading…
x
Reference in New Issue
Block a user