Files
xWebinarService/Controllers/XWebinarServiceControllerBase.cs
T
2025-12-19 00:27:06 +03:30

1114 lines
32 KiB
C#

using System;
using System.Linq;
using System.Collections.Generic;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using xCommons.Configurations;
using xCommons.Extensions;
using xCommons.Providers;
using xExceptions.Constants;
using xIdentityService.Controllers;
using xIdentityService.Interfaces;
using xWebinarService.Interfaces;
using xWebinarService.Models.Dtos;
using Microsoft.AspNetCore.Http;
using XFileDto = xFileService.Models.Dtos.XFileDto;
using xModels.Dtos;
using xTagService.Models.Dtos;
namespace xWebinarService.Controllers
{
/// <summary>
/// a Controller base Class which implement based Actions to Provides Webinar Provider Access ...
/// </summary>
public abstract class XWebinarServiceControllerBase : XIBaseProviderController, IXWebinarServiceControllerActions
{
//
#region Props ...
public IXWebinarProvider WebinarProvider { get; }
#endregion
//
#region Constructor ...
public XWebinarServiceControllerBase(
ILogger logger,
IXWebinarProvider webinarProvider,
XAppConfiguration appConfiguration,
IXIdentityProvider identityProvider,
XValidationProvider validationProvider
) : base(
logger,
appConfiguration,
identityProvider,
validationProvider
)
{
//
WebinarProvider = webinarProvider;
}
#endregion
//
#region Actions ...
/// <summary>
/// Create Webinar ...
/// </summary>
/// <param name="item"></param>
/// <param name="tags"></param>
/// <param name="files"></param>
/// <returns></returns>
[HttpPost("")]
public virtual async Task<ActionResult<XWebinarDto>> CreateWebinar(
[FromForm] XWebinarDto item,
[FromQuery] string tags = null,
[FromForm] IFormFileCollection files = null
)
{
//
// Do ...
try
{
//
// Retrieve User Info ...
var userInfo = await GetUserInfo();
var connectionId = GetConnectionId();
bool isAdmin = userInfo.Roles.Any(r => r.ToNormalString() == "admin");
var userId = userInfo.UserId;
//
// Check Owner ...
if (item.OwnerId.IsNullOrEmpty())
{
item.OwnerId = userId;
}
//
// Preparing Tags List ...
var tagList = new List<string>();
if (!tags.IsNullOrEmpty())
{
tagList = tags
.ParseListString<string>()
.ToList();
}
//
var result = await WebinarProvider
.CreateWebinar(
item: item,
files: files,
tags: tagList,
userInfo: userInfo,
connectionId: connectionId
);
//
return Ok(result.
ToDynamicObject());
}
catch (Exception ex)
{
//
var result = GetExceptionActionResult(ex);
return result;
}
}
/// <summary>
/// Update a Webinar ...
/// </summary>
/// <param name="id"></param>
/// <param name="item"></param>
/// <returns></returns>
[HttpPut("{id}")]
public virtual async Task<ActionResult<XWebinarDto>> UpdateWebinar(
[FromRoute] Guid id,
[FromBody] XWebinarDto item
)
{
//
// Do ...
try
{
//
// Retrieve User Info ...
var userInfo = await GetUserInfo();
var connectionId = GetConnectionId();
bool isAdmin = userInfo.Roles.Any(r => r.ToNormalString() == "admin");
var userId = userInfo.UserId;
//
// Check Permission ...
bool has = item.OwnerId == userId || isAdmin;
if (!has)
{
XException.NotAllowed.Throw();
}
//
var result = await WebinarProvider
.UpdateWebinar(
item: item,
userInfo: userInfo,
connectionId: connectionId
);
//
return Ok(result.
ToDynamicObject());
}
catch (Exception ex)
{
//
var result = GetExceptionActionResult(ex);
return result;
}
}
/// <summary>
/// Retrieve Specified Webinar ...
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
[HttpGet("{id}")]
public virtual async Task<ActionResult<XWebinarDto>> GetWebinar(
[FromRoute] Guid id
)
{
//
// Do ...
try
{
//
var result = await WebinarProvider
.GetWebinar(id);
//
return Ok(result.
ToDynamicObject());
}
catch (Exception ex)
{
//
var result = GetExceptionActionResult(ex);
return result;
}
}
/// <summary>
/// Retrieve all Exists Webinars ...
/// </summary>
/// <returns></returns>
[HttpGet("All")]
public virtual async Task<ActionResult<IEnumerable<XWebinarDto>>> GetWebinars()
{
//
// Do ...
try
{
//
var result = await WebinarProvider
.GetWebinars();
//
return Ok(result.
ToDynamicObject());
}
catch (Exception ex)
{
//
var result = GetExceptionActionResult(ex);
return result;
}
}
/// <summary>
/// Query Webinars ...
/// </summary>
/// <param name="query"></param>
/// <returns></returns>
[HttpGet("Query")]
public virtual async Task<ActionResult<XQueryResult<XWebinarDto>>> QueryWebinars(
[FromQuery] XQuery query
)
{
//
// Do ...
try
{
//
var result = await WebinarProvider
.QueryWebinars(query);
//
return Ok(result.
ToDynamicObject());
}
catch (Exception ex)
{
//
var result = GetExceptionActionResult(ex);
return result;
}
}
/// <summary>
/// Query Owned Webinars ...
/// </summary>
/// <param name="query"></param>
/// <returns></returns>
[HttpGet("Query/Owned")]
public virtual async Task<ActionResult<XQueryResult<XWebinarDto>>> QueryOwnedWebinars(
[FromQuery] XQuery query
)
{
//
// Do ...
try
{
//
// Retrieve User Info ...
var userInfo = await GetUserInfo();
//
var result = await WebinarProvider
.QueryOwnedWebinars(
query: query,
userInfo: userInfo
);
//
return Ok(result.
ToDynamicObject());
}
catch (Exception ex)
{
//
var result = GetExceptionActionResult(ex);
return result;
}
}
/// <summary>
/// Query Joinable Webinars ...
/// </summary>
/// <param name="query"></param>
/// <returns></returns>
[HttpGet("Query/Joinable")]
public virtual async Task<ActionResult<XQueryResult<XWebinarDto>>> QueryJoinableWebinars(
[FromQuery] XQuery query
)
{
//
// Do ...
try
{
//
// Retrieve User Info ...
var userInfo = await GetUserInfo();
//
var result = await WebinarProvider
.QueryJoinableWebinars(
query: query,
userInfo: userInfo
);
//
return Ok(result.
ToDynamicObject());
}
catch (Exception ex)
{
//
var result = GetExceptionActionResult(ex);
return result;
}
}
/// <summary>
/// Remove Specified Webinar ...
/// </summary>
/// <param name="webinarId"></param>
/// <returns></returns>
[HttpDelete("{id}")]
public virtual async Task<ActionResult<bool>> RemoveWebinar(
[FromRoute] Guid id
)
{
//
// Do ...
try
{
//
// Retrieve User Info ...
var userInfo = await GetUserInfo();
var connectionId = GetConnectionId();
bool isAdmin = userInfo.Roles.Any(r => r.ToNormalString() == "admin");
var userId = userInfo.UserId;
//
// Retrieve Entity ...
var entity = await WebinarProvider.GetWebinar(id);
bool has = !entity.IsNullOrDefault();
if (!has)
{
XException.NotFound.Throw();
}
//
// Check Permissions ...
has = entity.OwnerId == userId || isAdmin;
if (!has)
{
XException.NotAllowed.Throw();
}
//
var result = await WebinarProvider
.RemoveWebinar(
webinarId: id,
userInfo: userInfo,
connectionId: connectionId
);
//
return Ok(result.
ToDynamicObject());
}
catch (Exception ex)
{
//
var result = GetExceptionActionResult(ex);
return result;
}
}
#endregion
//
#region WebinarSubscriber ...
/// <summary>
/// Subscribe a User to Webinar ...
/// </summary>
/// <param name="id"></param>
/// <param name="subscriberId"></param>
/// <returns></returns>
[HttpPost("{id}/Subscribe/{subscriberId}")]
public virtual async Task<ActionResult<bool>> Subscribe(
[FromRoute] Guid id,
[FromRoute] string subscriberId
)
{
//
// Do ...
try
{
//
// Retrieve User Info ...
var userInfo = await GetUserInfo();
var connectionId = GetConnectionId();
bool isAdmin = userInfo.Roles.Any(r => r.ToNormalString() == "admin");
var userId = userInfo.UserId;
//
// Retrieve Entity ...
var entity = await WebinarProvider.GetWebinar(id);
bool has = !entity.IsNullOrDefault();
if (!has)
{
XException.NotFound.Throw();
}
//
// Check Permissions ...
has =
isAdmin ||
entity.OwnerId == userId ||
entity.Type == Constants.XWebinarType.Public;
if (!has)
{
XException.NotAllowed.Throw();
}
//
var result = await WebinarProvider
.Subscribe(
webinarId: id,
userInfo: userInfo,
subscriberId: subscriberId,
connectionId: connectionId
);
//
return Ok(result.
ToDynamicObject());
}
catch (Exception ex)
{
//
var result = GetExceptionActionResult(ex);
return result;
}
}
/// <summary>
/// Check Specified User Subscribed on a Webinar or not ...
/// </summary>
/// <param name="id"></param>
/// <param name="subscriberId"></param>
/// <returns></returns>
[HttpGet("{id}/IsSubscribed/{subscriberId}")]
public virtual async Task<ActionResult<bool>> IsSubscribed(
[FromRoute] Guid id,
[FromRoute] string subscriberId
)
{
//
// Do ...
try
{
//
// Retrieve User Info ...
var userInfo = await GetUserInfo();
bool isAdmin = userInfo.Roles.Any(r => r.ToNormalString() == "admin");
var userId = userInfo.UserId;
//
// Retrieve Entity ...
var entity = await WebinarProvider.GetWebinar(id);
bool has = !entity.IsNullOrDefault();
if (!has)
{
XException.NotFound.Throw();
}
//
// Check Permissions ...
has =
isAdmin ||
entity.OwnerId == userId;
if (!has)
{
XException.NotAllowed.Throw();
}
//
var result = await WebinarProvider
.IsSubscribed(
webinarId: id,
userInfo: userInfo,
subscriberId: subscriberId
);
//
return Ok(result.
ToDynamicObject());
}
catch (Exception ex)
{
//
var result = GetExceptionActionResult(ex);
return result;
}
}
/// <summary>
/// Unsubscribe Specified User from a Specified Webinar ...
/// </summary>
/// <param name="id"></param>
/// <param name="subscriberId"></param>
/// <returns></returns>
[HttpDelete("{id}/Unsubscribe/{subscriberId}")]
public virtual async Task<ActionResult<bool>> Unsubscribe(
[FromRoute] Guid id,
[FromRoute] string subscriberId
)
{
//
// Do ...
try
{
//
// Retrieve User Info ...
var userInfo = await GetUserInfo();
var connectionId = GetConnectionId();
bool isAdmin = userInfo.Roles.Any(r => r.ToNormalString() == "admin");
var userId = userInfo.UserId;
//
// Retrieve Entity ...
var entity = await WebinarProvider.GetWebinar(id);
bool has = !entity.IsNullOrDefault();
if (!has)
{
XException.NotFound.Throw();
}
//
// Check Permissions ...
has =
isAdmin ||
subscriberId == userId ||
entity.OwnerId == userId;
if (!has)
{
XException.NotAllowed.Throw();
}
//
var result = await WebinarProvider
.Unsubscribe(
webinarId: id,
userInfo: userInfo,
subscriberId: subscriberId,
connectionId: connectionId
);
//
return Ok(result.
ToDynamicObject());
}
catch (Exception ex)
{
//
var result = GetExceptionActionResult(ex);
return result;
}
}
/// <summary>
/// Retrieve Specified Subscriber ...
/// </summary>
/// <param name="id"></param>
/// <param name="subscriberId"></param>
/// <returns></returns>
[HttpGet("{id}/Subscriber/{subscriberId}")]
public virtual async Task<ActionResult<XWebinarSubscriberDto>> GetSubscriber(
[FromRoute] Guid id,
[FromRoute] string subscriberId
)
{
//
// Do ...
try
{
//
// Retrieve User Info ...
var userInfo = await GetUserInfo();
bool isAdmin = userInfo.Roles.Any(r => r.ToNormalString() == "admin");
var userId = userInfo.UserId;
//
// Retrieve Entity ...
var entity = await WebinarProvider.GetWebinar(id);
bool has = !entity.IsNullOrDefault();
if (!has)
{
XException.NotFound.Throw();
}
//
// Check Permissions ...
has =
isAdmin ||
entity.OwnerId == userId;
if (!has)
{
XException.NotAllowed.Throw();
}
//
var result = await WebinarProvider
.GetSubscriber(
webinarId: id,
userInfo: userInfo,
subscriberId: subscriberId
);
//
return Ok(result.
ToDynamicObject());
}
catch (Exception ex)
{
//
var result = GetExceptionActionResult(ex);
return result;
}
}
/// <summary>
/// Get all Specified Webinars Subscribers ...
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
[HttpGet("{id}/Subscribers")]
public virtual async Task<ActionResult<IEnumerable<XWebinarSubscriberDto>>> GetSubscribers(
[FromRoute] Guid id
)
{
//
// Do ...
try
{
//
// Retrieve User Info ...
var userInfo = await GetUserInfo();
bool isAdmin = userInfo.Roles.Any(r => r.ToNormalString() == "admin");
var userId = userInfo.UserId;
//
// Retrieve Entity ...
var entity = await WebinarProvider.GetWebinar(id);
bool has = !entity.IsNullOrDefault();
if (!has)
{
XException.NotFound.Throw();
}
//
// Check Permissions ...
has =
isAdmin ||
entity.OwnerId == userId;
if (!has)
{
XException.NotAllowed.Throw();
}
//
var result = await WebinarProvider
.GetSubscribers(
webinarId: id,
userInfo: userInfo
);
//
return Ok(result.
ToDynamicObject());
}
catch (Exception ex)
{
//
var result = GetExceptionActionResult(ex);
return result;
}
}
/// <summary>
/// Query Specified Webinar's Subscribers ...
/// </summary>
/// <param name="id"></param>
/// <param name="query"></param>
/// <returns></returns>
[HttpGet("{id}/Subscribers/Query")]
public virtual async Task<ActionResult<XQueryResult<XWebinarSubscriberDto>>> QuerySubscribers(
[FromRoute] Guid id,
[FromQuery] XQuery query
)
{
//
// Do ...
try
{
//
// Retrieve User Info ...
var userInfo = await GetUserInfo();
bool isAdmin = userInfo.Roles.Any(r => r.ToNormalString() == "admin");
var userId = userInfo.UserId;
//
// Retrieve Entity ...
var entity = await WebinarProvider.GetWebinar(id);
bool has = !entity.IsNullOrDefault();
if (!has)
{
XException.NotFound.Throw();
}
//
// Check Permissions ...
has =
isAdmin ||
entity.OwnerId == userId;
if (!has)
{
XException.NotAllowed.Throw();
}
//
var result = await WebinarProvider
.QuerySubscribers(
query: query,
webinarId: id,
userInfo: userInfo
);
//
return Ok(result.
ToDynamicObject());
}
catch (Exception ex)
{
//
var result = GetExceptionActionResult(ex);
return result;
}
}
#endregion
//
#region File Actions ...
/// <summary>
/// Upload Specified Files for Specified Webinar ...
/// </summary>
/// <param name="id"></param>
/// <param name="files"></param>
/// <returns></returns>
[HttpPost("{id}/Files")]
public virtual async Task<ActionResult<IEnumerable<XFileDto>>> UploadFiles(
[FromRoute] Guid id,
[FromForm] IFormFileCollection files
)
{
//
// Do ...
try
{
//
// Retrieve User Info ...
var userInfo = await GetUserInfo();
var connectionId = GetConnectionId();
//
var result = await WebinarProvider
.UploadFiles(
id: id,
files: files,
userInfo: userInfo,
connectionId: connectionId
);
//
return Ok(result.
ToDynamicObject());
}
catch (Exception ex)
{
//
var result = GetExceptionActionResult(ex);
return result;
}
}
/// <summary>
/// Retrieve Specified Webinar's Files ...
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
[HttpGet("{id}/Files")]
public virtual async Task<ActionResult<IEnumerable<XFileDto>>> GetFiles(
[FromRoute] Guid id
)
{
//
// Do ...
try
{
//
var userInfo = await GetUserInfo();
//
var result = await WebinarProvider
.GetFiles(
id: id,
userInfo: userInfo
);
//
return Ok(result.
ToDynamicObject());
}
catch (Exception ex)
{
//
var result = GetExceptionActionResult(ex);
return result;
}
}
/// <summary>
/// Stream Specified File of Specified Webinar ...
/// </summary>
/// <param name="id"></param>
/// <param name="fileId"></param>
/// <returns></returns>
[HttpGet("{id}/Files/{fileId}/Stream")]
public virtual async Task<ActionResult> StreamFile(
[FromRoute] Guid id,
[FromRoute] Guid fileId
)
{
//
// Do ...
try
{
//
var result = await WebinarProvider
.StreamFile(
id: id,
fileId: fileId
);
//
return result;
}
catch (Exception ex)
{
//
var result = GetExceptionActionResult(ex);
return result;
}
}
/// <summary>
/// Download Specified File of Specified Webinar ...
/// </summary>
/// <param name="id"></param>
/// <param name="fileId"></param>
/// <returns></returns>
[HttpGet("{id}/Files/{fileId}/Download")]
public virtual async Task<ActionResult> DownloadFile(
[FromRoute] Guid id,
[FromRoute] Guid fileId
)
{
//
// Do ...
try
{
//
var result = await WebinarProvider
.DownloadFile(
id: id,
fileId: fileId
);
//
return result;
}
catch (Exception ex)
{
//
var result = GetExceptionActionResult(ex);
return result;
}
}
/// <summary>
/// Attach Provided Files to Specified Webinar ...
/// </summary>
/// <param name="id"></param>
/// <param name="ids"></param>
/// <returns></returns>
[HttpPost("{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>
[HttpDelete("{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
//
#region Tags Actions ...
/// <summary>
/// Attach Specified Tags To Specified Webinar ...
/// </summary>
/// <param name="id"></param>
/// <param name="tags"></param>
/// <returns></returns>
[HttpPost("{id}/Tags")]
public virtual async Task<ActionResult> AttachTags(
[FromRoute] Guid id,
[FromQuery] string tags
)
{
//
// Do ...
try
{
//
// Retrieve User Info ...
var userInfo = await GetUserInfo();
var connectionId = GetConnectionId();
//
await WebinarProvider
.AttachTags(
id: id,
tags: tags,
userInfo: userInfo,
forceAttachToFiles: true,
connectionId: connectionId
);
//
return Ok();
}
catch (Exception ex)
{
//
var result = GetExceptionActionResult(ex);
return result;
}
}
/// <summary>
/// Detach Specified Tags From Specified Webinar ...
/// </summary>
/// <param name="id"></param>
/// <param name="tags">if null, remove all attached tags ...</param>
/// <returns></returns>
[HttpDelete("{id}/Tags")]
public virtual async Task<ActionResult> DetachTags(
[FromRoute] Guid id,
[FromQuery] string tags
)
{
//
// Do ...
try
{
//
// Retrieve User Info ...
var userInfo = await GetUserInfo();
var connectionId = GetConnectionId();
//
await WebinarProvider
.DetachTags(
id: id,
tags: tags,
userInfo: userInfo,
forceDetachFromFiles: true,
connectionId: connectionId
);
//
return Ok();
}
catch (Exception ex)
{
//
var result = GetExceptionActionResult(ex);
return result;
}
}
/// <summary>
/// Retrieve Specified Webinars Tags ...
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
[HttpGet("{id}/Tags")]
public virtual async Task<ActionResult<IEnumerable<XTagDto>>> GetTags(
[FromRoute] Guid id
)
{
//
// Do ...
try
{
//
// Retrieve User Info ...
var userInfo = await GetUserInfo();
//
var result = await WebinarProvider
.GetTags(
id: id,
userInfo: userInfo
);
//
return Ok(result
.ToDynamicObject());
}
catch (Exception ex)
{
//
var result = GetExceptionActionResult(ex);
return result;
}
}
#endregion
}
}