implement Webinar and WebinarSubscriber Entity and Dto (s) and Data Requirements ...

This commit is contained in:
2026-07-24 19:46:35 +03:30
parent cf6568e089
commit d2d3ac90b6
82 changed files with 1466 additions and 4889 deletions
+10
View File
@@ -0,0 +1,10 @@
using System;
using xPushService.Interfaces;
using xWebinarService.Models.Dtos;
using xWebinarService.Models.Entities;
namespace xWebinarService.Interfaces.Dtos
{
public interface IXWebinarDtoHub : IXBaseDtoHub<XWebinar, XWebinarDto, Guid>
{ }
}
@@ -0,0 +1,10 @@
using System;
using xDataService.Interfaces;
using xWebinarService.Models.Dtos;
using xWebinarService.Models.Entities;
namespace xWebinarService.Interfaces.Dtos
{
public interface IXWebinarRepositoryService : IXBaseRepositoryService<XWebinar, XWebinarDto, Guid>
{ }
}
@@ -0,0 +1,14 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using xPushService.Interfaces;
using xWebinarService.Models.Dtos;
using xWebinarService.Models.Entities;
using xWebinarService.Providers.Dtos;
namespace xWebinarService.Interfaces.Dtos
{
public interface IXWebinarServiceProvider : IXBaseDtoProvider<XWebinar, XWebinarDto, Guid, XWebinarDtoHub>
{ }
}
@@ -0,0 +1,9 @@
using xPushService.Interfaces;
using xWebinarService.Models.Dtos;
using xWebinarService.Models.Entities;
namespace xWebinarService.Interfaces.Dtos
{
public interface IXWebinarSubscriberDtoHub : IXBaseDtoHub<XWebinarSubscriber, XWebinarSubscriberDto, int>
{ }
}
@@ -0,0 +1,9 @@
using xDataService.Interfaces;
using xWebinarService.Models.Dtos;
using xWebinarService.Models.Entities;
namespace xWebinarService.Interfaces.Dtos
{
public interface IXWebinarSubscriberRepositoryService : IXBaseRepositoryService<XWebinarSubscriber, XWebinarSubscriberDto, int>
{ }
}
@@ -0,0 +1,12 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace xWebinarService.Interfaces.Dtos
{
public interface IXWebinarSubscriberServiceProvider
{
}
}
@@ -0,0 +1,9 @@
using System;
using xPushService.Interfaces;
using xWebinarService.Models.Entities;
namespace xWebinarService.Interfaces.Entities
{
public interface IXWebinarEntityHub : IXBaseEntityHub<XWebinar, Guid>
{ }
}
@@ -1,8 +1,9 @@
using System;
using xDataService.Interfaces;
using xWebinarService.Models.Entities;
namespace xWebinarService.Interfaces.Entities
{
public interface IXWebinarSubscriberEvents : IXBaseRepositoryEvents<XWebinarSubscriber>
public interface IXWebinarKeyGenerator : IXKeyGenerator<XWebinar, Guid>
{ }
}
@@ -3,6 +3,6 @@ using xWebinarService.Models.Entities;
namespace xWebinarService.Interfaces.Entities
{
public interface IXWebinarEvents : IXBaseRepositoryEvents<XWebinar>
public interface IXWebinarRepositoryEvents : IXBaseRepositoryEvents<XWebinar>
{ }
}
@@ -0,0 +1,10 @@
using System;
using xPushService.Interfaces;
using xWebinarService.Models.Entities;
using xWebinarService.Providers.Entities;
namespace xWebinarService.Interfaces.Entities
{
public interface IXWebinarRepositoryProvider : IXBaseEntityProvider<XWebinar, Guid, XWebinarEntityHub>
{ }
}
@@ -0,0 +1,8 @@
using xPushService.Interfaces;
using xWebinarService.Models.Entities;
namespace xWebinarService.Interfaces.Entities
{
public interface IXWebinarSubscriberEntityHub : IXBaseEntityHub<XWebinarSubscriber, int>
{ }
}
@@ -0,0 +1,8 @@
using xDataService.Interfaces;
using xWebinarService.Models.Entities;
namespace xWebinarService.Interfaces.Entities
{
public interface IXWebinarSubscriberKeyGenerator : IXKeyGenerator<XWebinarSubscriber, int>
{ }
}
@@ -0,0 +1,8 @@
using xDataService.Interfaces;
using xWebinarService.Models.Entities;
namespace xWebinarService.Interfaces.Entities
{
public interface IXWebinarSubscriberRepositoryEvents : IXBaseRepositoryEvents<XWebinarSubscriber>
{ }
}
@@ -0,0 +1,9 @@
using xPushService.Interfaces;
using xWebinarService.Models.Entities;
using xWebinarService.Providers.Entities;
namespace xWebinarService.Interfaces.Entities
{
public interface IXWebinarSubscriberRepositoryProvider : IXBaseEntityProvider<XWebinarSubscriber, int, XWebinarSubscriberEntityHub>
{ }
}
@@ -1,7 +0,0 @@
using xStringService.Interfaces;
namespace xWebinarService.Interfaces
{
public interface IXWebinarDescriptionResourceProvider : IXBaseStringResourceProvider
{ }
}
-8
View File
@@ -1,8 +0,0 @@
using System;
using xFileService.Interfaces;
namespace xWebinarService.Interfaces
{
public interface IXWebinarFileProvider : IXBaseFileProvider<Guid>
{ }
}
-395
View File
@@ -1,395 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq.Expressions;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.SignalR;
using xDataService.Configuration;
using xIdentityModels.Models;
using xIdentityService.Interfaces;
using xModels.Dtos;
using xTagService.Models.Dtos;
using xWebinarService.Hubs;
using xWebinarService.Interfaces.Entities;
using xWebinarService.Models.Dtos;
using xWebinarService.Models.Entities;
using XFileDto = xFileService.Models.Dtos.XFileDto;
namespace xWebinarService.Interfaces
{
public interface IXWebinarProvider
{
//
#region Props ...
IHubContext<XWebinarEntityHub> Hub { get; }
IXIdentityProvider IdentityProvider { get; }
IXWebinarRepository WebinarRepository { get; }
IXWebinarTagProvider WebinarTagProvider { get; }
IXWebinarFileProvider WebinarFileProvider { get; }
XDataServiceConfiguration DataSercviceConfiguration { get; }
IXWebinarTitleResourceProvider TitleResourceProvider { get; }
IXWebinarSubscriberRepository WebinarSubscriberRepository { get; }
IXWebinarDescriptionResourceProvider DescriptionResourceProvider { get; }
#endregion
//
#region Tools ...
/// <summary>
/// Converts Specified XWebinar Entity to it's Corresponding Dto Presentation
/// and also Fill Owner and Title/Description Resources ...
/// </summary>
/// <param name="model"></param>
/// <returns></returns>
Task<XWebinarDto> ToXWebinarDto(XWebinar model);
/// <summary>
/// Converts Specified WebinarSubscriber Entity to it's Dto Presentation ...
/// </summary>
/// <param name="model"></param>
/// <returns></returns>
Task<XWebinarSubscriberDto> ToXWebinarSubscriberDto(XWebinarSubscriber model);
#endregion
//
#region Actions ...
/// <summary>
/// Create Webinar ...
/// </summary>
/// <param name="item"></param>
/// <param name="tags"></param>
/// <param name="files"></param>
/// <param name="userInfo"></param>
/// <param name="connectionId"></param>
/// <returns></returns>
Task<XWebinarDto> CreateWebinar(
XWebinarDto item,
IEnumerable<string> tags = null,
IFormFileCollection files = null,
XUserClaimsInfoDto userInfo = null,
string connectionId = null
);
/// <summary>
/// Update a Webinar ...
/// </summary>
/// <param name="item"></param>
/// <param name="userInfo"></param>
/// <param name="connectionId"></param>
/// <returns></returns>
Task<XWebinarDto> UpdateWebinar(
XWebinarDto item,
XUserClaimsInfoDto userInfo = null,
string connectionId = null
);
/// <summary>
/// Retrieve Specified Webinar ...
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
Task<XWebinarDto> GetWebinar(Guid id);
/// <summary>
/// Retrieve all Exists Webinars ...
/// </summary>
/// <returns></returns>
Task<IEnumerable<XWebinarDto>> GetWebinars();
/// <summary>
/// Query Webinars ...
/// </summary>
/// <param name="query"></param>
/// <returns></returns>
Task<XQueryResult<XWebinarDto>> QueryWebinars(XQuery query);
/// <summary>
/// Conditional Query Webinars ...
/// </summary>
/// <param name="whereClause"></param>
/// <param name="query"></param>
/// <returns></returns>
Task<XQueryResult<XWebinarDto>> ConditionalQueryWebinars(
Expression<Func<XWebinarDto, bool>> whereClause,
XQuery query
);
/// <summary>
/// Query Owned Webinars ...
/// </summary>
/// <param name="query"></param>
/// <returns></returns>
Task<XQueryResult<XWebinarDto>> QueryOwnedWebinars(
XQuery query,
XUserClaimsInfoDto userInfo = null
);
/// <summary>
/// Query Joinable Webinars ...
/// </summary>
/// <param name="query"></param>
/// <returns></returns>
Task<XQueryResult<XWebinarDto>> QueryJoinableWebinars(
XQuery query,
XUserClaimsInfoDto userInfo = null
);
/// <summary>
/// Remove Specified Webinar ...
/// </summary>
/// <param name="webinarId"></param>
/// <param name="userInfo"></param>
/// <param name="connectionId"></param>
/// <returns></returns>
Task<bool> RemoveWebinar(
Guid webinarId,
XUserClaimsInfoDto userInfo = null,
string connectionId = null
);
#endregion
//
#region WebinarSubscriber ...
/// <summary>
/// Subscribe a User to Webinar ...
/// </summary>
/// <param name="webinarId"></param>
/// <param name="subscriberId"></param>
/// <param name="connectionId"></param>
/// <param name="userInfo"></param>
/// <returns></returns>
Task<bool> Subscribe(
Guid webinarId,
string subscriberId,
string connectionId = null,
XUserClaimsInfoDto userInfo = null
);
/// <summary>
/// Check Specified User Subscribed on a Webinar or not ...
/// </summary>
/// <param name="webinarId"></param>
/// <param name="subscriberId"></param>
/// <param name="userInfo"></param>
/// <returns></returns>
Task<bool> IsSubscribed(
Guid webinarId,
string subscriberId,
XUserClaimsInfoDto userInfo = null
);
/// <summary>
/// Unsubscribe Specified User from a Specified Webinar ...
/// </summary>
/// <param name="webinarId"></param>
/// <param name="subscriberId"></param>
/// <param name="connectionId"></param>
/// <param name="userInfo"></param>
/// <returns></returns>
Task<bool> Unsubscribe(
Guid webinarId,
string subscriberId,
string connectionId = null,
XUserClaimsInfoDto userInfo = null
);
/// <summary>
/// Retrieve Specified Subscriber ...
/// </summary>
/// <param name="webinarId"></param>
/// <param name="subscriberId"></param>
/// <param name="userInfo"></param>
/// <returns></returns>
Task<XWebinarSubscriberDto> GetSubscriber(
Guid webinarId,
string subscriberId,
XUserClaimsInfoDto userInfo = null
);
/// <summary>
/// Get all Specified Webinars Subscribers ...
/// </summary>
/// <param name="webinarId"></param>
/// <param name="userInfo"></param>
/// <returns></returns>
Task<IEnumerable<XWebinarSubscriberDto>> GetSubscribers(
Guid webinarId,
XUserClaimsInfoDto userInfo = null
);
/// <summary>
/// Query Specified Webinar's Subscribers ...
/// </summary>
/// <param name="webinarId"></param>
/// <param name="query"></param>
/// <param name="userInfo"></param>
/// <returns></returns>
Task<XQueryResult<XWebinarSubscriberDto>> QuerySubscribers(
Guid webinarId,
XQuery query,
XUserClaimsInfoDto userInfo = null
);
#endregion
//
#region File Actions ...
/// <summary>
/// Upload Files ...
/// </summary>
/// <param name="forProvidedId"></param>
/// <param name="files"></param>
/// <param name="userInfo"></param>
/// <param name="connectionId"></param>
/// <returns></returns>
Task<IEnumerable<XFileDto>> UploadFiles(
Guid id,
IFormFileCollection files,
XUserClaimsInfoDto userInfo = null,
string connectionId = null
);
/// <summary>
/// Get Webinar Files ...
/// </summary>
/// <param name="id"></param>
/// <param name="userInfo"></param>
/// <returns></returns>
Task<IEnumerable<XFileDto>> GetFiles(
Guid id,
XUserClaimsInfoDto userInfo = null
);
/// <summary>
/// Stream Specified File ...
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
Task<FileStreamResult> StreamFile(
Guid id,
Guid fileId
);
/// <summary>
/// Stream Specified File ...
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
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
//
#region Tags Actions ...
/// <summary>
/// Attach Tag to Specified File ...
/// </summary>
/// <param name="id"></param>
/// <param name="tag"></param>
/// <param name="connectionId"></param>
/// <param name="userInfo"></param>
/// <param name="forceAttachToFiles"></param>
/// <returns></returns>
Task AttachTag(
Guid id,
string tag,
string connectionId = null,
XUserClaimsInfoDto userInfo = null,
bool forceAttachToFiles = true
);
/// <summary>
/// Detach Tag fro Specified File ...
/// </summary>
/// <param name="tag"></param>
/// <param name="id"></param>
/// <param name="userInfo"></param>
/// <param name="connectionId"></param>
/// <param name="forceAttachToFiles"></param>
/// <returns></returns>
Task DetachTag(
Guid id,
string tag,
string connectionId = null,
XUserClaimsInfoDto userInfo = null,
bool forceDetachFromFiles = true
);
/// <summary>
/// Attach Tags for Specified File ...
/// </summary>
/// <param name="id"></param>
/// <param name="tags"></param>
/// <param name="connectionId"></param>
/// <param name="userInfo"></param>
/// <param name="forceAttachToFiles"></param>
/// <returns></returns>
Task AttachTags(
Guid id,
string tags,
string connectionId = null,
XUserClaimsInfoDto userInfo = null,
bool forceAttachToFiles = true
);
/// <summary>
/// Detach Tags for Specified File ...
/// </summary>
/// <param name="id"></param>
/// <param name="tags">if nulls, detach all tags ...</param>
/// <param name="connectionId"></param>
/// <param name="userInfo"></param>
/// <param name="forceDetachFromFiles"></param>
/// <returns></returns>
Task DetachTags(
Guid id,
string tags,
string connectionId = null,
XUserClaimsInfoDto userInfo = null,
bool forceDetachFromFiles = true
);
/// <summary>
/// Retrieve Specified Webinar's Tags ...
/// </summary>
/// <param name="id"></param>
/// <param name="userInfo"></param>
/// <returns></returns>
Task<IEnumerable<XTagDto>> GetTags(
Guid id,
XUserClaimsInfoDto userInfo = null
);
#endregion
}
}
@@ -4,8 +4,6 @@ using xWebinarService.Models.Entities;
namespace xWebinarService.Interfaces
{
public interface IXWebinarGroupStore : IXBaseRepository<XWebinarGroupEntity, Guid>
{
}
public interface IXWebinarSeeder : IXBaseDbSeeder<XWebinar, Guid>
{ }
}
@@ -1,266 +0,0 @@
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using xModels.Dtos;
using XFileDto = xFileService.Models.Dtos.XFileDto;
using xWebinarService.Models.Dtos;
using xTagService.Models.Dtos;
namespace xWebinarService.Interfaces
{
/// <summary>
/// an Interface to Provides Webinar Provider Actions ...
/// </summary>
public interface IXWebinarServiceControllerActions
{
//
#region Actions ...
/// <summary>
/// Create Webinar ...
/// </summary>
/// <param name="item"></param>
/// <param name="tags"></param>
/// <param name="files"></param>
/// <returns></returns>
Task<ActionResult<XWebinarDto>> CreateWebinar(
[FromForm] XWebinarDto item,
[FromQuery] string tags = null,
[FromForm] IFormFileCollection files = null
);
/// <summary>
/// Update a Webinar ...
/// </summary>
/// <param name="id"></param>
/// <param name="item"></param>
/// <returns></returns>
Task<ActionResult<XWebinarDto>> UpdateWebinar(
[FromRoute] Guid id,
[FromBody] XWebinarDto item
);
/// <summary>
/// Retrieve Specified Webinar ...
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
Task<ActionResult<XWebinarDto>> GetWebinar(
[FromRoute] Guid id
);
/// <summary>
/// Retrieve all Exists Webinars ...
/// </summary>
/// <returns></returns>
Task<ActionResult<IEnumerable<XWebinarDto>>> GetWebinars();
/// <summary>
/// Query Webinars ...
/// </summary>
/// <param name="query"></param>
/// <returns></returns>
Task<ActionResult<XQueryResult<XWebinarDto>>> QueryWebinars(
[FromQuery] XQuery query
);
/// <summary>
/// Query Owned Webinars ...
/// </summary>
/// <param name="query"></param>
/// <returns></returns>
Task<ActionResult<XQueryResult<XWebinarDto>>> QueryOwnedWebinars(
[FromQuery] XQuery query
);
/// <summary>
/// Query Joinable Webinars ...
/// </summary>
/// <param name="query"></param>
/// <returns></returns>
Task<ActionResult<XQueryResult<XWebinarDto>>> QueryJoinableWebinars(
[FromQuery] XQuery query
);
/// <summary>
/// Remove Specified Webinar ...
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
Task<ActionResult<bool>> RemoveWebinar(
[FromRoute] Guid id
);
#endregion
//
#region WebinarSubscriber ...
/// <summary>
/// Subscribe a User to Webinar ...
/// </summary>
/// <param name="id"></param>
/// <param name="subscriberId"></param>
/// <returns></returns>
Task<ActionResult<bool>> Subscribe(
[FromRoute] Guid id,
[FromRoute] string subscriberId
);
/// <summary>
/// Check Specified User Subscribed on a Webinar or not ...
/// </summary>
/// <param name="id"></param>
/// <param name="subscriberId"></param>
/// <returns></returns>
Task<ActionResult<bool>> IsSubscribed(
[FromRoute] Guid id,
[FromRoute] string subscriberId
);
/// <summary>
/// Unsubscribe Specified User from a Specified Webinar ...
/// </summary>
/// <param name="id"></param>
/// <param name="subscriberId"></param>
/// <returns></returns>
Task<ActionResult<bool>> Unsubscribe(
[FromRoute] Guid id,
[FromRoute] string subscriberId
);
/// <summary>
/// Retrieve Specified Subscriber ...
/// </summary>
/// <param name="id"></param>
/// <param name="subscriberId"></param>
/// <returns></returns>
Task<ActionResult<XWebinarSubscriberDto>> GetSubscriber(
[FromRoute] Guid id,
[FromRoute] string subscriberId
);
/// <summary>
/// Get all Specified Webinars Subscribers ...
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
Task<ActionResult<IEnumerable<XWebinarSubscriberDto>>> GetSubscribers(
[FromRoute] Guid id
);
/// <summary>
/// Query Specified Webinar's Subscribers ...
/// </summary>
/// <param name="id"></param>
/// <param name="query"></param>
/// <returns></returns>
Task<ActionResult<XQueryResult<XWebinarSubscriberDto>>> QuerySubscribers(
[FromRoute] Guid id,
[FromQuery] XQuery query
);
#endregion
//
#region File Actions ...
/// <summary>
/// Upload Specified Files for Specified Webinar ...
/// </summary>
/// <param name="id"></param>
/// <param name="files"></param>
/// <returns></returns>
Task<ActionResult<IEnumerable<XFileDto>>> UploadFiles(
[FromRoute] Guid id,
[FromForm] IFormFileCollection files
);
/// <summary>
/// Retrieve Specified Webinar's Files ...
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
Task<ActionResult<IEnumerable<XFileDto>>> GetFiles(
[FromRoute] Guid id
);
/// <summary>
/// Stream Specified File of Specified Webinar ...
/// </summary>
/// <param name="id"></param>
/// <param name="fileId"></param>
/// <returns></returns>
Task<ActionResult> StreamFile(
[FromRoute] Guid id,
[FromRoute] Guid fileId
);
/// <summary>
/// Download Specified File of Specified Webinar ...
/// </summary>
/// <param name="id"></param>
/// <param name="fileId"></param>
/// <returns></returns>
Task<ActionResult> DownloadFile(
[FromRoute] Guid id,
[FromRoute] Guid fileId
);
/// <summary>
/// Attach Provided Files to Specified Webinar ...
/// </summary>
/// <param name="id"></param>
/// <param name="ids"></param>
/// <returns></returns>
[HttpPost("{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>
[HttpDelete("{id}/Files/DetachMany")]
Task<ActionResult> DetachFiles(
[FromRoute] Guid id,
[FromQuery] string ids = null
);
#endregion
//
#region Tags Actions ...
/// <summary>
/// Attach Specified Tags To Specified Webinar ...
/// </summary>
/// <param name="id"></param>
/// <param name="tags"></param>
/// <returns></returns>
Task<ActionResult> AttachTags(
[FromRoute] Guid id,
[FromQuery] string tags
);
/// <summary>
/// Detach Specified Tags From Specified Webinar ...
/// </summary>
/// <param name="id"></param>
/// <param name="tags">if null, remove all attached tags ...</param>
/// <returns></returns>
Task<ActionResult> DetachTags(
[FromRoute] Guid id,
[FromQuery] string tags
);
/// <summary>
/// Retrieve Specified Webinars Tags ...
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
Task<ActionResult<IEnumerable<XTagDto>>> GetTags(
[FromRoute] Guid id
);
#endregion
}
}
+8
View File
@@ -0,0 +1,8 @@
using xDataService.Interfaces;
using xWebinarService.Models.Entities;
namespace xWebinarService.Interfaces
{
public interface IXWebinarSubscriberSeeder : IXBaseDbSeeder<XWebinarSubscriber, int>
{ }
}
-8
View File
@@ -1,8 +0,0 @@
using System;
using xTagService.Interfaces;
namespace xWebinarService.Interfaces
{
public interface IXWebinarTagProvider : IXBaseTagProvider<Guid>
{ }
}
@@ -1,7 +0,0 @@
using xStringService.Interfaces;
namespace xWebinarService.Interfaces
{
public interface IXWebinarTitleResourceProvider : IXBaseStringResourceProvider
{ }
}