This commit is contained in:
2025-12-18 15:59:35 +03:30
parent 5f05427f9f
commit ba74efaf3c
4 changed files with 359 additions and 39 deletions
+100 -4
View File
@@ -86,7 +86,9 @@ namespace xWebinarService.Controllers
// Preparing Tags List ...
var tagList = new List<string>();
if (!tags.IsNullOrEmpty()) {
tags.ParseListString<string>();
tagList = tags
.ParseListString<string>()
.ToList();
}
//
@@ -431,6 +433,7 @@ namespace xWebinarService.Controllers
var result = await WebinarProvider
.Subscribe(
webinarId: id,
userInfo: userInfo,
subscriberId: subscriberId,
connectionId: connectionId
);
@@ -492,6 +495,7 @@ namespace xWebinarService.Controllers
var result = await WebinarProvider
.IsSubscribed(
webinarId: id,
userInfo: userInfo,
subscriberId: subscriberId
);
@@ -554,6 +558,7 @@ namespace xWebinarService.Controllers
var result = await WebinarProvider
.Unsubscribe(
webinarId: id,
userInfo: userInfo,
subscriberId: subscriberId,
connectionId: connectionId
);
@@ -615,6 +620,7 @@ namespace xWebinarService.Controllers
var result = await WebinarProvider
.GetSubscriber(
webinarId: id,
userInfo: userInfo,
subscriberId: subscriberId
);
@@ -671,7 +677,10 @@ namespace xWebinarService.Controllers
//
var result = await WebinarProvider
.GetSubscribers(id);
.GetSubscribers(
webinarId: id,
userInfo: userInfo
);
//
return Ok(result.
@@ -730,7 +739,8 @@ namespace xWebinarService.Controllers
var result = await WebinarProvider
.QuerySubscribers(
query: query,
webinarId: id
webinarId: id,
userInfo: userInfo
);
//
@@ -846,9 +856,15 @@ namespace xWebinarService.Controllers
// Do ...
try
{
//
var userInfo = await GetUserInfo();
//
var result = await WebinarProvider
.GetFiles(id);
.GetFiles(
id: id,
userInfo: userInfo
);
//
return Ok(result.
@@ -929,6 +945,86 @@ namespace xWebinarService.Controllers
return result;
}
}
/// <summary>
/// Attach Provided Files to Specified Webinar ...
/// </summary>
/// <param name="id"></param>
/// <param name="ids"></param>
/// <returns></returns>
[HttpGet("{id}/Files/AttachMany")]
public virtual async Task<ActionResult> AttachFiles(
[FromRoute] Guid id,
[FromQuery] string ids
)
{
//
// Do ...
try
{
//
var userInfo = await GetUserInfo();
var connectionId = GetConnectionId();
//
await WebinarProvider
.AttachFiles(
id: id,
ids: ids,
userInfo: userInfo,
connectionId: connectionId
);
//
return Ok();
}
catch (Exception ex)
{
//
var result = GetExceptionActionResult(ex);
return result;
}
}
/// <summary>
/// Detach Provided Files to Specified Webinar ...
/// </summary>
/// <param name="id"></param>
/// <param name="ids">if null, detach all files ...</param>
/// <returns></returns>
[HttpGet("{id}/Files/DetachMany")]
public virtual async Task<ActionResult> DetachFiles(
[FromRoute] Guid id,
[FromQuery] string ids = null
)
{
//
// Do ...
try
{
//
var userInfo = await GetUserInfo();
var connectionId = GetConnectionId();
//
await WebinarProvider
.DetachFiles(
id: id,
ids: ids,
userInfo: userInfo,
connectionId: connectionId
);
//
return Ok();
}
catch (Exception ex)
{
//
var result = GetExceptionActionResult(ex);
return result;
}
}
#endregion
//
+34 -4
View File
@@ -272,7 +272,7 @@ namespace xWebinarService.Interfaces
Guid id,
XUserClaimsInfoDto userInfo = null
);
/// <summary>
/// Stream Specified File ...
/// </summary>
@@ -281,8 +281,8 @@ namespace xWebinarService.Interfaces
Task<FileStreamResult> StreamFile(
Guid id,
Guid fileId
);
);
/// <summary>
/// Stream Specified File ...
/// </summary>
@@ -291,7 +291,37 @@ namespace xWebinarService.Interfaces
Task<PhysicalFileResult> DownloadFile(
Guid id,
Guid fileId
);
);
/// <summary>
/// Attach Provided Files to Specified Webinar ...
/// </summary>
/// <param name="id"></param>
/// <param name="ids"></param>
/// <param name="connectionId"></param>
/// <param name="userInfo"></param>
/// <returns></returns>
Task AttachFiles(
Guid id,
string ids,
string connectionId = null,
XUserClaimsInfoDto userInfo = null
);
/// <summary>
/// Detach Provided Files to Specified Webinar ...
/// </summary>
/// <param name="id"></param>
/// <param name="ids">if null, detach all files ...</param>
/// <param name="connectionId"></param>
/// <param name="userInfo"></param>
/// <returns></returns>
Task DetachFiles(
Guid id,
string ids,
string connectionId = null,
XUserClaimsInfoDto userInfo = null
);
#endregion
//
@@ -213,6 +213,30 @@ namespace xWebinarService.Interfaces
[FromRoute] Guid id,
[FromRoute] Guid fileId
);
/// <summary>
/// Attach Provided Files to Specified Webinar ...
/// </summary>
/// <param name="id"></param>
/// <param name="ids"></param>
/// <returns></returns>
[HttpGet("{id}/Files/AttachMany")]
Task<ActionResult> AttachFiles(
[FromRoute] Guid id,
[FromQuery] string ids
);
/// <summary>
/// Detach Provided Files to Specified Webinar ...
/// </summary>
/// <param name="id"></param>
/// <param name="ids">if null, detach all files ...</param>
/// <returns></returns>
[HttpGet("{id}/Files/DetachMany")]
Task<ActionResult> DetachFiles(
[FromRoute] Guid id,
[FromQuery] string ids = null
);
#endregion
//
+201 -31
View File
@@ -3,7 +3,6 @@ using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Threading.Tasks;
using IdentityModel.Client;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.SignalR;
@@ -309,7 +308,7 @@ namespace xWebinarService.Providers
//
// Check For Files ...
isValid = !files.IsNull();
isValid = !files.IsNull() && files.Count() > 0;
if (isValid)
{
//
@@ -875,16 +874,36 @@ namespace xWebinarService.Providers
//
// Handle Remove ...
var subscribers = await GetSubscribers(
webinarId: webinarId
webinarId: webinarId,
userInfo: userInfo
);
try
{
//
// Unsubscribe all Subscribers ...
await subscribers.SelectAsync(async s => await Unsubscribe(
webinarId: webinarId,
subscriberId: s.SubscriberId
));
//
// Detach Tags ...
await DetachTags(
id: entity.Id,
userInfo: userInfo,
connectionId: connectionId
);
//
// Detach Files ...
//
await DetachFiles(
ids: null, // Pass Null To Detach All Referenced Files ...
id: webinarId,
userInfo: userInfo,
connectionId: connectionId
);
//
string resourceID = webinarId.ToString();
await TitleResourceProvider.Remove(resourceID);
@@ -895,33 +914,6 @@ namespace xWebinarService.Providers
}
catch { }
//
// Detach Tags ...
try
{
await DetachTags(entity.Id, userInfo);
}
catch { }
//
// Remove Files ...
try
{
//
var medias = await WebinarFileProvider.GetAllReferences(entity.Id);
if (!medias.IsNull() && medias.HasChild())
{
//
await RemoveFiles(
id: entity.Id,
ids: string.Empty,
userInfo: userInfo,
connectionId: connectionId
);
}
}
catch { }
//
// Check Entity Removed ...
result = !await WebinarRepository.IsExistsAsync(webinarId);
@@ -1629,7 +1621,185 @@ namespace xWebinarService.Providers
//
var result = await WebinarFileProvider.Download(fileId);
return result;
}
}
/// <summary>
/// Attach Provided Files to Specified Webinar ...
/// </summary>
/// <param name="id"></param>
/// <param name="ids"></param>
/// <param name="connectionId"></param>
/// <param name="userInfo"></param>
/// <returns></returns>
public async Task AttachFiles(
Guid id,
string ids,
string connectionId = null,
XUserClaimsInfoDto userInfo = null
)
{
//
// Validate ...
var isValid = !id.IsNull() &&
!id.IsDefaultGuid() &&
!ids.IsNullOrEmpty() &&
!userInfo.IsNullOrDefault();
if (!isValid)
{
XException.InvalidArgs.Throw();
}
//
// Parse Files ...
var idsList = ids.ParseListGuid();
isValid = !idsList.IsNull() && idsList.HasChild();
if (!isValid)
{
XException.NotFound.Throw();
}
//
// Retrieve Webinar ...
var webinar = await WebinarRepository.GetAsync(id);
isValid = !webinar.IsNullOrDefault();
if (!isValid)
{
XException.NotFound.Throw();
}
//
// Check Permissions ...
isValid =
userInfo.UserId == webinar.OwnerId ||
userInfo.Roles.Any(r => r.ToNormalString() == "admin");
if (!isValid)
{
XException.NotAllowed.Throw();
}
//
// Refrieve all Webinar Refrenced File ...
var references = await WebinarFileProvider.GetAllReferences(id);
if (!references.IsNull() && references.HasChild())
{
//
// Filter ids which Exists in References ...
idsList =
idsList.Where(i => !references.Any(r => r.Id == i));
}
//
isValid = idsList.HasChild();
if (!isValid)
{
return;
}
//
foreach (var fileId in idsList)
{
//
// Check File Exists ...
var file = await WebinarFileProvider.FileProvider.Get(fileId);
isValid = !file.IsNullOrDefault();
if (isValid)
{
//
await WebinarFileProvider.AddReference(
model: file,
providedForId: id,
forIndex: 0,
userInfo: userInfo,
connectionId: connectionId
);
}
}
}
/// <summary>
/// Detach Provided Files to Specified Webinar ...
/// </summary>
/// <param name="id"></param>
/// <param name="ids">if null, detach all files ...</param>
/// <param name="connectionId"></param>
/// <param name="userInfo"></param>
/// <returns></returns>
public async Task DetachFiles(
Guid id,
string ids,
string connectionId = null,
XUserClaimsInfoDto userInfo = null
)
{
//
// Validate ...
var isValid =
!id.IsNull() &&
!id.IsDefaultGuid() &&
!userInfo.IsNullOrDefault();
if (!isValid)
{
XException.InvalidArgs.Throw();
}
//
// Check Webinar Exists ...
var webinar = await WebinarRepository.GetAsync(id);
isValid = !webinar.IsNullOrDefault();
if (!isValid)
{
XException.NotFound.Throw();
}
//
// Check Permissions ...
isValid =
userInfo.UserId == webinar.OwnerId ||
userInfo.Roles.Any(r => r.ToNormalString() == "admin");
if (!isValid)
{
XException.NotAllowed.Throw();
}
//
var references = await WebinarFileProvider.GetAllReferences(id);
isValid = !references.IsNull() && references.HasChild();
if (!isValid)
{
return;
}
//
// Parse IDS ...
if (!ids.IsNullOrEmpty())
{
//
var idsList = ids.ParseListGuid();
if (!idsList.IsNull() && idsList.HasChild())
{
//
// Filtere References based on IDS ...
references =
references.Where(r => idsList.Contains(r.Id));
}
}
//
if (references.HasChild())
{
//
foreach (var file in references)
{
//
await WebinarFileProvider.RemoveReference(
model: file,
providedForId: id,
userInfo: userInfo,
connectionId: connectionId
);
}
}
}
#endregion
//