moving some reusable and basic services to RSecuirityBackend and some code improvements

This commit is contained in:
Hamid Reza Mohammadi 2021-01-17 16:16:48 +03:30
parent 7438c7129f
commit df53fa3042
28 changed files with 901 additions and 596 deletions

View File

@ -1,154 +1,22 @@
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using RMuseum.Models.Notification;
using RMuseum.Models.Notification.ViewModels;
using RMuseum.Services;
using RSecurityBackend.Models.Generic;
using System;
using System.Linq;
using System.Net;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using RSecurityBackend.Controllers;
using RSecurityBackend.Services;
namespace RMuseum.Controllers
{
/// <summary>
/// Notifications controller
/// </summary>
[Produces("application/json")]
[Route("api/notifications")]
public class NoificationController : Controller
public class NoificationController : NoificationControllerBase
{
/// <summary>
/// Get User Notifications
/// </summary>
/// <returns></returns>
[HttpGet]
[Authorize]
[ProducesResponseType((int)HttpStatusCode.OK, Type = typeof(RUserNotificationViewModel[]))]
[ProducesResponseType((int)HttpStatusCode.BadRequest, Type = typeof(string))]
public async Task<IActionResult> GetUserNotifications()
{
Guid loggedOnUserId = new Guid(User.Claims.FirstOrDefault(c => c.Type == "UserId").Value);
RServiceResult<RUserNotificationViewModel[]> res = await _notificationService.GetUserNotifications(loggedOnUserId);
if (!string.IsNullOrEmpty(res.ExceptionString))
return BadRequest(res.ExceptionString);
return Ok(res.Result);
}
[HttpGet]
[Route("unread/count")]
[Authorize]
[ProducesResponseType((int)HttpStatusCode.OK, Type = typeof(int))]
[ProducesResponseType((int)HttpStatusCode.BadRequest, Type = typeof(string))]
public async Task<IActionResult> GetUnreadUserNotificationsCount()
{
Guid loggedOnUserId = new Guid(User.Claims.FirstOrDefault(c => c.Type == "UserId").Value);
RServiceResult<int> res = await _notificationService.GetUnreadUserNotificationsCount(loggedOnUserId);
if (!string.IsNullOrEmpty(res.ExceptionString))
return BadRequest(res.ExceptionString);
return Ok(res.Result);
}
/// <summary>
/// Switch Notification Status
/// </summary>
/// <param name="notificationId"></param>
/// <returns></returns>
[HttpPut]
[Route("{notificationId}")]
[Authorize]
[ProducesResponseType((int)HttpStatusCode.OK, Type = typeof(RUserNotificationViewModel))]
[ProducesResponseType((int)HttpStatusCode.BadRequest, Type = typeof(string))]
public async Task<IActionResult> SwitchNotificationStatus(Guid notificationId)
{
Guid loggedOnUserId = new Guid(User.Claims.FirstOrDefault(c => c.Type == "UserId").Value);
RServiceResult<RUserNotificationViewModel> res = await _notificationService.SwitchNotificationStatus(notificationId, loggedOnUserId);
if (!string.IsNullOrEmpty(res.ExceptionString))
return BadRequest(res.ExceptionString);
return Ok(res.Result);
}
/// <summary>
/// Set All User Notifications Status Read
/// </summary>
/// <returns></returns>
[HttpPut]
[Route("allread")]
[Authorize]
[ProducesResponseType((int)HttpStatusCode.OK)]
[ProducesResponseType((int)HttpStatusCode.BadRequest, Type = typeof(string))]
public async Task<IActionResult> SetAllNotificationsStatusRead()
{
Guid loggedOnUserId = new Guid(User.Claims.FirstOrDefault(c => c.Type == "UserId").Value);
RServiceResult<bool> res = await _notificationService.SetAllNotificationsStatus(loggedOnUserId, NotificationStatus.Read);
if (!string.IsNullOrEmpty(res.ExceptionString))
return BadRequest(res.ExceptionString);
return Ok();
}
/// <summary>
/// Set All User Notifications Status Unread
/// </summary>
[HttpPut]
[Route("allunread")]
[Authorize]
[ProducesResponseType((int)HttpStatusCode.OK)]
[ProducesResponseType((int)HttpStatusCode.BadRequest, Type = typeof(string))]
public async Task<IActionResult> SetAllNotificationsStatusUnread()
{
Guid loggedOnUserId = new Guid(User.Claims.FirstOrDefault(c => c.Type == "UserId").Value);
RServiceResult<bool> res = await _notificationService.SetAllNotificationsStatus(loggedOnUserId, NotificationStatus.Unread);
if (!string.IsNullOrEmpty(res.ExceptionString))
return BadRequest(res.ExceptionString);
return Ok();
}
/// <summary>
/// Delete Notification
/// </summary>
/// <param name="notificationId"></param>
/// <returns></returns>
[HttpDelete]
[Route("{notificationId}")]
[Authorize]
[ProducesResponseType((int)HttpStatusCode.OK)]
[ProducesResponseType((int)HttpStatusCode.BadRequest, Type = typeof(string))]
public async Task<IActionResult> DeleteNotification(Guid notificationId)
{
Guid loggedOnUserId = new Guid(User.Claims.FirstOrDefault(c => c.Type == "UserId").Value);
RServiceResult<bool> res = await _notificationService.DeleteNotification(notificationId, loggedOnUserId);
if (!string.IsNullOrEmpty(res.ExceptionString))
return BadRequest(res.ExceptionString);
return Ok();
}
/// <summary>
/// Delete All Read Notifications
/// </summary>
/// <returns></returns>
[HttpDelete]
[Authorize]
[ProducesResponseType((int)HttpStatusCode.OK)]
[ProducesResponseType((int)HttpStatusCode.BadRequest, Type = typeof(string))]
public async Task<IActionResult> DeleteAllReadNotification()
{
Guid loggedOnUserId = new Guid(User.Claims.FirstOrDefault(c => c.Type == "UserId").Value);
RServiceResult<bool> res = await _notificationService.DeleteNotification(Guid.Empty, loggedOnUserId);
if (!string.IsNullOrEmpty(res.ExceptionString))
return BadRequest(res.ExceptionString);
return Ok();
}
/// <summary>
/// Notification Service
/// </summary>
protected readonly IRNotificationService _notificationService;
/// <summary>
/// constructor
/// </summary>
/// <param name="notificationService"></param>
public NoificationController(IRNotificationService notificationService)
public NoificationController(IRNotificationService notificationService) : base(notificationService)
{
_notificationService = notificationService;
}
}
}

View File

@ -7,7 +7,6 @@ using RMuseum.Models.UploadSession;
using RMuseum.Models.GanjoorIntegration;
using RMuseum.Models.ImportJob;
using RMuseum.Models.Note;
using RMuseum.Models.Notification;
using RSecurityBackend.DbContext;
using RSecurityBackend.Models.Auth.Db;
using System;
@ -139,10 +138,7 @@ namespace RMuseum.DbContext
/// </summary>
public DbSet<GanjoorLink> GanjoorLinks { get; set; }
/// <summary>
/// Notifications
/// </summary>
public DbSet<RUserNotification> Notifications { get; set; }
/// <summary>
/// Pinterest Links

View File

@ -1,13 +0,0 @@
namespace RMuseum.Models.Notification
{
/// <summary>
/// Notifaction Status
/// </summary>
public enum NotificationStatus
{
Unread = 0,
Read = 1,
Archived = 2,
Deleted = 3
}
}

View File

@ -572,7 +572,7 @@
<param name="linkId"></param>
<returns></returns>
</member>
<member name="M:RMuseum.Controllers.ArtifactController.#ctor(RMuseum.Services.IArtifactService,RSecurityBackend.Services.IUserPermissionChecker,Microsoft.Extensions.Caching.Memory.IMemoryCache,RSecurityBackend.Services.ICaptchaService,RMuseum.Services.IRNotificationService)">
<member name="M:RMuseum.Controllers.ArtifactController.#ctor(RMuseum.Services.IArtifactService,RSecurityBackend.Services.IUserPermissionChecker,Microsoft.Extensions.Caching.Memory.IMemoryCache,RSecurityBackend.Services.ICaptchaService,RSecurityBackend.Services.IRNotificationService)">
<summary>
constructor
</summary>
@ -781,49 +781,12 @@
Artifact Service
</summary>
</member>
<member name="M:RMuseum.Controllers.NoificationController.GetUserNotifications">
<member name="T:RMuseum.Controllers.NoificationController">
<summary>
Get User Notifications
</summary>
<returns></returns>
</member>
<member name="M:RMuseum.Controllers.NoificationController.SwitchNotificationStatus(System.Guid)">
<summary>
Switch Notification Status
</summary>
<param name="notificationId"></param>
<returns></returns>
</member>
<member name="M:RMuseum.Controllers.NoificationController.SetAllNotificationsStatusRead">
<summary>
Set All User Notifications Status Read
</summary>
<returns></returns>
</member>
<member name="M:RMuseum.Controllers.NoificationController.SetAllNotificationsStatusUnread">
<summary>
Set All User Notifications Status Unread
Notifications controller
</summary>
</member>
<member name="M:RMuseum.Controllers.NoificationController.DeleteNotification(System.Guid)">
<summary>
Delete Notification
</summary>
<param name="notificationId"></param>
<returns></returns>
</member>
<member name="M:RMuseum.Controllers.NoificationController.DeleteAllReadNotification">
<summary>
Delete All Read Notifications
</summary>
<returns></returns>
</member>
<member name="F:RMuseum.Controllers.NoificationController._notificationService">
<summary>
Notification Service
</summary>
</member>
<member name="M:RMuseum.Controllers.NoificationController.#ctor(RMuseum.Services.IRNotificationService)">
<member name="M:RMuseum.Controllers.NoificationController.#ctor(RSecurityBackend.Services.IRNotificationService)">
<summary>
constructor
</summary>
@ -1161,11 +1124,6 @@
Ganjoor Links
</summary>
</member>
<member name="P:RMuseum.DbContext.RMuseumDbContext.Notifications">
<summary>
Notifications
</summary>
</member>
<member name="P:RMuseum.DbContext.RMuseumDbContext.PinterestLinks">
<summary>
Pinterest Links
@ -4765,87 +4723,6 @@
It os set only in certain cases
</remarks>
</member>
<member name="T:RMuseum.Models.Notification.NotificationStatus">
<summary>
Notifaction Status
</summary>
</member>
<member name="T:RMuseum.Models.Notification.RUserNotification">
<summary>
User Notification
</summary>
</member>
<member name="P:RMuseum.Models.Notification.RUserNotification.Id">
<summary>
Id
</summary>
</member>
<member name="P:RMuseum.Models.Notification.RUserNotification.UserId">
<summary>
User Id
</summary>
</member>
<member name="P:RMuseum.Models.Notification.RUserNotification.User">
<summary>
User
</summary>
</member>
<member name="P:RMuseum.Models.Notification.RUserNotification.DateTime">
<summary>
DateTime
</summary>
</member>
<member name="P:RMuseum.Models.Notification.RUserNotification.Status">
<summary>
Status
</summary>
</member>
<member name="P:RMuseum.Models.Notification.RUserNotification.Subject">
<summary>
Subject
</summary>
</member>
<member name="P:RMuseum.Models.Notification.RUserNotification.HtmlText">
<summary>
Text
</summary>
</member>
<member name="T:RMuseum.Models.Notification.ViewModels.RUserNotificationViewModel">
<summary>
User Notification
</summary>
</member>
<member name="M:RMuseum.Models.Notification.ViewModels.RUserNotificationViewModel.#ctor(RMuseum.Models.Notification.RUserNotification)">
<summary>
constructor
</summary>
<param name="src"></param>
</member>
<member name="P:RMuseum.Models.Notification.ViewModels.RUserNotificationViewModel.Id">
<summary>
Id
</summary>
</member>
<member name="P:RMuseum.Models.Notification.ViewModels.RUserNotificationViewModel.DateTime">
<summary>
DateTime
</summary>
</member>
<member name="P:RMuseum.Models.Notification.ViewModels.RUserNotificationViewModel.Status">
<summary>
Status
</summary>
</member>
<member name="P:RMuseum.Models.Notification.ViewModels.RUserNotificationViewModel.Subject">
<summary>
Subject
</summary>
</member>
<member name="P:RMuseum.Models.Notification.ViewModels.RUserNotificationViewModel.HtmlText">
<summary>
Text
</summary>
</member>
<member name="T:RMuseum.Models.UploadSession.UploadSession">
<summary>
Upload Session
@ -6317,7 +6194,7 @@
Messaging service
</summary>
</member>
<member name="M:RMuseum.Services.Implementation.ArtifactService.#ctor(RMuseum.DbContext.RMuseumDbContext,Microsoft.Extensions.Configuration.IConfiguration,RMuseum.Services.IPictureFileService,RMuseum.Services.IBackgroundTaskQueue,RSecurityBackend.Services.IAppUserService,RMuseum.Services.IRNotificationService)">
<member name="M:RMuseum.Services.Implementation.ArtifactService.#ctor(RMuseum.DbContext.RMuseumDbContext,Microsoft.Extensions.Configuration.IConfiguration,RMuseum.Services.IPictureFileService,RSecurityBackend.Services.IBackgroundTaskQueue,RSecurityBackend.Services.IAppUserService,RSecurityBackend.Services.IRNotificationService)">
<summary>
constructor
</summary>
@ -6482,7 +6359,7 @@
Background Task Queue Instance
</summary>
</member>
<member name="M:RMuseum.Services.Implementation.GanjoorService.#ctor(RMuseum.DbContext.RMuseumDbContext,Microsoft.Extensions.Configuration.IConfiguration,RMuseum.Services.IBackgroundTaskQueue)">
<member name="M:RMuseum.Services.Implementation.GanjoorService.#ctor(RMuseum.DbContext.RMuseumDbContext,Microsoft.Extensions.Configuration.IConfiguration,RSecurityBackend.Services.IBackgroundTaskQueue)">
<summary>
constructor
</summary>
@ -6706,63 +6583,6 @@
<param name="recitations"></param>
<returns></returns>
</member>
<member name="T:RMuseum.Services.Implementation.RNotificationService">
<summary>
Internal messaging system implementation
</summary>
</member>
<member name="M:RMuseum.Services.Implementation.RNotificationService.PushNotification(System.Guid,System.String,System.String)">
<summary>
Add Notification
</summary>
<param name="userId"></param>
<param name="subject"></param>
<param name="htmlText"></param>
<returns></returns>
</member>
<member name="M:RMuseum.Services.Implementation.RNotificationService.SwitchNotificationStatus(System.Guid,System.Guid)">
<summary>
Switch Notification Status
</summary>
<param name="notificationId"></param>
<param name="userId"></param>
<returns>updated notification object</returns>
</member>
<member name="M:RMuseum.Services.Implementation.RNotificationService.SetAllNotificationsStatus(System.Guid,RMuseum.Models.Notification.NotificationStatus)">
<summary>
Set All User Notifications Status
</summary>
<param name="userId"></param>
<param name="status"></param>
<returns></returns>
</member>
<member name="M:RMuseum.Services.Implementation.RNotificationService.DeleteNotification(System.Guid,System.Guid)">
<summary>
Delete Notification
</summary>
<param name="notificationId">if empty deletes all read notifications</param>
<param name="userId"></param>
<returns></returns>
</member>
<member name="M:RMuseum.Services.Implementation.RNotificationService.GetUserNotifications(System.Guid)">
<summary>
Get User Notifications
</summary>
<param name="userId"></param>
<returns></returns>
</member>
<member name="M:RMuseum.Services.Implementation.RNotificationService.GetUnreadUserNotificationsCount(System.Guid)">
<summary>
Get Unread User Notifications Count
</summary>
<param name="userId"></param>
<returns></returns>
</member>
<member name="F:RMuseum.Services.Implementation.RNotificationService._context">
<summary>
Database Contetxt
</summary>
</member>
<member name="T:RMuseum.Services.Implementation.RoleService">
<summary>
Role Service Implementation
@ -7018,7 +6838,7 @@
Users service
</summary>
</member>
<member name="M:RMuseum.Services.Implementationa.RecitationService.#ctor(RMuseum.DbContext.RMuseumDbContext,Microsoft.Extensions.Configuration.IConfiguration,RMuseum.Services.IBackgroundTaskQueue,RMuseum.Services.IRNotificationService,RSecurityBackend.Services.IAppUserService)">
<member name="M:RMuseum.Services.Implementationa.RecitationService.#ctor(RMuseum.DbContext.RMuseumDbContext,Microsoft.Extensions.Configuration.IConfiguration,RSecurityBackend.Services.IBackgroundTaskQueue,RSecurityBackend.Services.IRNotificationService,RSecurityBackend.Services.IAppUserService)">
<summary>
constructor
</summary>
@ -7308,58 +7128,6 @@
Upload Enabled (temporary switch off/on for upload)
</summary>
</member>
<member name="T:RMuseum.Services.IRNotificationService">
<summary>
Internal messaging system interface
</summary>
</member>
<member name="M:RMuseum.Services.IRNotificationService.PushNotification(System.Guid,System.String,System.String)">
<summary>
Add Notification
</summary>
<param name="userId"></param>
<param name="subject"></param>
<param name="htmlText"></param>
<returns></returns>
</member>
<member name="M:RMuseum.Services.IRNotificationService.GetUserNotifications(System.Guid)">
<summary>
Get User Notifications
</summary>
<param name="userId"></param>
<returns></returns>
</member>
<member name="M:RMuseum.Services.IRNotificationService.GetUnreadUserNotificationsCount(System.Guid)">
<summary>
Get Unread User Notifications Count
</summary>
<param name="userId"></param>
<returns></returns>
</member>
<member name="M:RMuseum.Services.IRNotificationService.SwitchNotificationStatus(System.Guid,System.Guid)">
<summary>
Switch Notification Status
</summary>
<param name="notificationId"></param>
<param name="userId"></param>
<returns>updated notification object</returns>
</member>
<member name="M:RMuseum.Services.IRNotificationService.SetAllNotificationsStatus(System.Guid,RMuseum.Models.Notification.NotificationStatus)">
<summary>
Set All User Notifications Status
</summary>
<param name="userId"></param>
<param name="status"></param>
<returns></returns>
</member>
<member name="M:RMuseum.Services.IRNotificationService.DeleteNotification(System.Guid,System.Guid)">
<summary>
Delete Notification
</summary>
<param name="notificationId">if empty deletes all read notifications</param>
<param name="userId"></param>
<returns></returns>
</member>
<member name="T:RMuseum.Swashbuckle.SecurityRequirementsOperationFilter">
<summary>
//https://mattfrear.com/2018/07/21/add-an-authorization-header-to-your-swagger-ui-with-swashbuckle-revisited/

View File

@ -8,7 +8,6 @@ using RMuseum.Models.GanjoorIntegration.ViewModels;
using RMuseum.Models.ImportJob;
using RMuseum.Models.Note;
using RMuseum.Models.Note.ViewModels;
using RMuseum.Models.Notification;
using RSecurityBackend.Models.Generic;
using System;
using System.IO;

View File

@ -1,16 +0,0 @@
using System;
using System.Threading;
using System.Threading.Tasks;
namespace RMuseum.Services
{
public interface IBackgroundTaskQueue
{
void QueueBackgroundWorkItem(Func<CancellationToken, Task> workItem);
Task<Func<CancellationToken, Task>> DequeueAsync(
CancellationToken cancellationToken);
int Count { get; }
}
}

View File

@ -1,35 +1,12 @@
using Microsoft.AspNetCore.Http;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using Newtonsoft.Json.Linq;
using Microsoft.EntityFrameworkCore;
using RMuseum.DbContext;
using RMuseum.Models.Artifact;
using RMuseum.Models.Artifact.ViewModels;
using RMuseum.Models.Bookmark;
using RMuseum.Models.Bookmark.ViewModels;
using RMuseum.Models.GanjoorIntegration;
using RMuseum.Models.GanjoorIntegration.ViewModels;
using RMuseum.Models.ImportJob;
using RMuseum.Models.Note;
using RMuseum.Models.Note.ViewModels;
using RMuseum.Models.Notification;
using RSecurityBackend.Models.Auth.ViewModels;
using RSecurityBackend.Models.Generic;
using RSecurityBackend.Services;
using RSecurityBackend.Services.Implementation;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Security.Cryptography;
using System.Text.RegularExpressions;
using System.Threading;
using System.Threading.Tasks;
using System.Xml.Linq;
using System.Drawing;
using System.Drawing.Imaging;
namespace RMuseum.Services.Implementation
{

View File

@ -1,33 +1,16 @@
using Microsoft.AspNetCore.Http;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using Newtonsoft.Json.Linq;
using Microsoft.EntityFrameworkCore;
using RMuseum.DbContext;
using RMuseum.Models.Artifact;
using RMuseum.Models.Artifact.ViewModels;
using RMuseum.Models.Bookmark;
using RMuseum.Models.Bookmark.ViewModels;
using RMuseum.Models.GanjoorIntegration;
using RMuseum.Models.GanjoorIntegration.ViewModels;
using RMuseum.Models.ImportJob;
using RMuseum.Models.Note;
using RMuseum.Models.Note.ViewModels;
using RMuseum.Models.Notification;
using RSecurityBackend.Models.Auth.ViewModels;
using RSecurityBackend.Models.Generic;
using RSecurityBackend.Services;
using RSecurityBackend.Services.Implementation;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Security.Cryptography;
using System.Text.RegularExpressions;
using System.Threading;
using System.Threading.Tasks;
using System.Xml.Linq;
using System.Drawing;
using System.Drawing.Imaging;

View File

@ -12,7 +12,6 @@ using RMuseum.Models.GanjoorIntegration.ViewModels;
using RMuseum.Models.ImportJob;
using RMuseum.Models.Note;
using RMuseum.Models.Note.ViewModels;
using RMuseum.Models.Notification;
using RSecurityBackend.Models.Auth.ViewModels;
using RSecurityBackend.Models.Generic;
using RSecurityBackend.Services;

View File

@ -1,35 +1,16 @@
using Microsoft.AspNetCore.Http;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using Newtonsoft.Json.Linq;
using Microsoft.EntityFrameworkCore;
using RMuseum.DbContext;
using RMuseum.Models.Artifact;
using RMuseum.Models.Artifact.ViewModels;
using RMuseum.Models.Bookmark;
using RMuseum.Models.Bookmark.ViewModels;
using RMuseum.Models.GanjoorIntegration;
using RMuseum.Models.GanjoorIntegration.ViewModels;
using RMuseum.Models.ImportJob;
using RMuseum.Models.Note;
using RMuseum.Models.Note.ViewModels;
using RMuseum.Models.Notification;
using RSecurityBackend.Models.Auth.ViewModels;
using RSecurityBackend.Models.Generic;
using RSecurityBackend.Services;
using RSecurityBackend.Services.Implementation;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Security.Cryptography;
using System.Text.RegularExpressions;
using System.Threading;
using System.Threading.Tasks;
using System.Xml.Linq;
using System.Drawing;
using System.Drawing.Imaging;
namespace RMuseum.Services.Implementation
{

View File

@ -1,35 +1,17 @@
using Microsoft.AspNetCore.Http;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using Microsoft.EntityFrameworkCore;
using Newtonsoft.Json.Linq;
using RMuseum.DbContext;
using RMuseum.Models.Artifact;
using RMuseum.Models.Artifact.ViewModels;
using RMuseum.Models.Bookmark;
using RMuseum.Models.Bookmark.ViewModels;
using RMuseum.Models.GanjoorIntegration;
using RMuseum.Models.GanjoorIntegration.ViewModels;
using RMuseum.Models.ImportJob;
using RMuseum.Models.Note;
using RMuseum.Models.Note.ViewModels;
using RMuseum.Models.Notification;
using RSecurityBackend.Models.Auth.ViewModels;
using RSecurityBackend.Models.Generic;
using RSecurityBackend.Services;
using RSecurityBackend.Services.Implementation;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Security.Cryptography;
using System.Text.RegularExpressions;
using System.Threading;
using System.Threading.Tasks;
using System.Xml.Linq;
using System.Drawing;
using System.Drawing.Imaging;
namespace RMuseum.Services.Implementation
{

View File

@ -1,22 +1,8 @@
using Microsoft.AspNetCore.Http;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using Newtonsoft.Json.Linq;
using Microsoft.EntityFrameworkCore;
using RMuseum.DbContext;
using RMuseum.Models.Artifact;
using RMuseum.Models.Artifact.ViewModels;
using RMuseum.Models.Bookmark;
using RMuseum.Models.Bookmark.ViewModels;
using RMuseum.Models.GanjoorIntegration;
using RMuseum.Models.GanjoorIntegration.ViewModels;
using RMuseum.Models.ImportJob;
using RMuseum.Models.Note;
using RMuseum.Models.Note.ViewModels;
using RMuseum.Models.Notification;
using RSecurityBackend.Models.Auth.ViewModels;
using RSecurityBackend.Models.Generic;
using RSecurityBackend.Services;
using RSecurityBackend.Services.Implementation;
using System;
using System.Collections.Generic;
using System.IO;
@ -24,12 +10,9 @@ using System.Linq;
using System.Net;
using System.Net.Http;
using System.Security.Cryptography;
using System.Text.RegularExpressions;
using System.Threading;
using System.Threading.Tasks;
using System.Xml.Linq;
using System.Drawing;
using System.Drawing.Imaging;
namespace RMuseum.Services.Implementation
{

View File

@ -1,35 +1,16 @@
using Microsoft.AspNetCore.Http;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using Newtonsoft.Json.Linq;
using Microsoft.EntityFrameworkCore;
using RMuseum.DbContext;
using RMuseum.Models.Artifact;
using RMuseum.Models.Artifact.ViewModels;
using RMuseum.Models.Bookmark;
using RMuseum.Models.Bookmark.ViewModels;
using RMuseum.Models.GanjoorIntegration;
using RMuseum.Models.GanjoorIntegration.ViewModels;
using RMuseum.Models.ImportJob;
using RMuseum.Models.Note;
using RMuseum.Models.Note.ViewModels;
using RMuseum.Models.Notification;
using RSecurityBackend.Models.Auth.ViewModels;
using RSecurityBackend.Models.Generic;
using RSecurityBackend.Services;
using RSecurityBackend.Services.Implementation;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Security.Cryptography;
using System.Text.RegularExpressions;
using System.Threading;
using System.Threading.Tasks;
using System.Xml.Linq;
using System.Drawing;
using System.Drawing.Imaging;
namespace RMuseum.Services.Implementation
{

View File

@ -1,35 +1,13 @@
using Microsoft.AspNetCore.Http;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using Newtonsoft.Json.Linq;
using Microsoft.EntityFrameworkCore;
using RMuseum.DbContext;
using RMuseum.Models.Artifact;
using RMuseum.Models.Artifact.ViewModels;
using RMuseum.Models.Bookmark;
using RMuseum.Models.Bookmark.ViewModels;
using RMuseum.Models.GanjoorIntegration;
using RMuseum.Models.GanjoorIntegration.ViewModels;
using RMuseum.Models.ImportJob;
using RMuseum.Models.Note;
using RMuseum.Models.Note.ViewModels;
using RMuseum.Models.Notification;
using RSecurityBackend.Models.Auth.ViewModels;
using RSecurityBackend.Models.Generic;
using RSecurityBackend.Services;
using RSecurityBackend.Services.Implementation;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Security.Cryptography;
using System.Text.RegularExpressions;
using System.Threading;
using System.Threading.Tasks;
using System.Xml.Linq;
using System.Drawing;
using System.Drawing.Imaging;
namespace RMuseum.Services.Implementation
{

View File

@ -1,35 +1,17 @@
using Microsoft.AspNetCore.Http;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using Newtonsoft.Json.Linq;
using Microsoft.EntityFrameworkCore;
using RMuseum.DbContext;
using RMuseum.Models.Artifact;
using RMuseum.Models.Artifact.ViewModels;
using RMuseum.Models.Bookmark;
using RMuseum.Models.Bookmark.ViewModels;
using RMuseum.Models.GanjoorIntegration;
using RMuseum.Models.GanjoorIntegration.ViewModels;
using RMuseum.Models.ImportJob;
using RMuseum.Models.Note;
using RMuseum.Models.Note.ViewModels;
using RMuseum.Models.Notification;
using RSecurityBackend.Models.Auth.ViewModels;
using RSecurityBackend.Models.Generic;
using RSecurityBackend.Services;
using RSecurityBackend.Services.Implementation;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Security.Cryptography;
using System.Text.RegularExpressions;
using System.Threading;
using System.Threading.Tasks;
using System.Xml.Linq;
using System.Drawing;
using System.Drawing.Imaging;
namespace RMuseum.Services.Implementation
{

View File

@ -12,7 +12,6 @@ using RMuseum.Models.GanjoorIntegration.ViewModels;
using RMuseum.Models.ImportJob;
using RMuseum.Models.Note;
using RMuseum.Models.Note.ViewModels;
using RMuseum.Models.Notification;
using RSecurityBackend.Models.Auth.ViewModels;
using RSecurityBackend.Models.Generic;
using RSecurityBackend.Services;

View File

@ -0,0 +1,161 @@
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using RSecurityBackend.Models.Notification;
using RSecurityBackend.Models.Notification.ViewModels;
using RSecurityBackend.Services;
using RSecurityBackend.Models.Generic;
using System;
using System.Linq;
using System.Net;
using System.Threading.Tasks;
namespace RSecurityBackend.Controllers
{
/// <summary>
/// Notifications controller
/// </summary>
[Produces("application/json")]
[Route("api/notifications")]
public abstract class NoificationControllerBase : Controller
{
/// <summary>
/// Get User Notifications
/// </summary>
/// <returns></returns>
[HttpGet]
[Authorize]
[ProducesResponseType((int)HttpStatusCode.OK, Type = typeof(RUserNotificationViewModel[]))]
[ProducesResponseType((int)HttpStatusCode.BadRequest, Type = typeof(string))]
public async Task<IActionResult> GetUserNotifications()
{
Guid loggedOnUserId = new Guid(User.Claims.FirstOrDefault(c => c.Type == "UserId").Value);
RServiceResult<RUserNotificationViewModel[]> res = await _notificationService.GetUserNotifications(loggedOnUserId);
if (!string.IsNullOrEmpty(res.ExceptionString))
return BadRequest(res.ExceptionString);
return Ok(res.Result);
}
/// <summary>
/// Get unread user notifications count
/// </summary>
/// <returns></returns>
[HttpGet]
[Route("unread/count")]
[Authorize]
[ProducesResponseType((int)HttpStatusCode.OK, Type = typeof(int))]
[ProducesResponseType((int)HttpStatusCode.BadRequest, Type = typeof(string))]
public async Task<IActionResult> GetUnreadUserNotificationsCount()
{
Guid loggedOnUserId = new Guid(User.Claims.FirstOrDefault(c => c.Type == "UserId").Value);
RServiceResult<int> res = await _notificationService.GetUnreadUserNotificationsCount(loggedOnUserId);
if (!string.IsNullOrEmpty(res.ExceptionString))
return BadRequest(res.ExceptionString);
return Ok(res.Result);
}
/// <summary>
/// Switch Notification Status
/// </summary>
/// <param name="notificationId"></param>
/// <returns></returns>
[HttpPut]
[Route("{notificationId}")]
[Authorize]
[ProducesResponseType((int)HttpStatusCode.OK, Type = typeof(RUserNotificationViewModel))]
[ProducesResponseType((int)HttpStatusCode.BadRequest, Type = typeof(string))]
public async Task<IActionResult> SwitchNotificationStatus(Guid notificationId)
{
Guid loggedOnUserId = new Guid(User.Claims.FirstOrDefault(c => c.Type == "UserId").Value);
RServiceResult<RUserNotificationViewModel> res = await _notificationService.SwitchNotificationStatus(notificationId, loggedOnUserId);
if (!string.IsNullOrEmpty(res.ExceptionString))
return BadRequest(res.ExceptionString);
return Ok(res.Result);
}
/// <summary>
/// Set All User Notifications Status Read
/// </summary>
/// <returns></returns>
[HttpPut]
[Route("allread")]
[Authorize]
[ProducesResponseType((int)HttpStatusCode.OK)]
[ProducesResponseType((int)HttpStatusCode.BadRequest, Type = typeof(string))]
public async Task<IActionResult> SetAllNotificationsStatusRead()
{
Guid loggedOnUserId = new Guid(User.Claims.FirstOrDefault(c => c.Type == "UserId").Value);
RServiceResult<bool> res = await _notificationService.SetAllNotificationsStatus(loggedOnUserId, NotificationStatus.Read);
if (!string.IsNullOrEmpty(res.ExceptionString))
return BadRequest(res.ExceptionString);
return Ok();
}
/// <summary>
/// Set All User Notifications Status Unread
/// </summary>
[HttpPut]
[Route("allunread")]
[Authorize]
[ProducesResponseType((int)HttpStatusCode.OK)]
[ProducesResponseType((int)HttpStatusCode.BadRequest, Type = typeof(string))]
public async Task<IActionResult> SetAllNotificationsStatusUnread()
{
Guid loggedOnUserId = new Guid(User.Claims.FirstOrDefault(c => c.Type == "UserId").Value);
RServiceResult<bool> res = await _notificationService.SetAllNotificationsStatus(loggedOnUserId, NotificationStatus.Unread);
if (!string.IsNullOrEmpty(res.ExceptionString))
return BadRequest(res.ExceptionString);
return Ok();
}
/// <summary>
/// Delete Notification
/// </summary>
/// <param name="notificationId"></param>
/// <returns></returns>
[HttpDelete]
[Route("{notificationId}")]
[Authorize]
[ProducesResponseType((int)HttpStatusCode.OK)]
[ProducesResponseType((int)HttpStatusCode.BadRequest, Type = typeof(string))]
public async Task<IActionResult> DeleteNotification(Guid notificationId)
{
Guid loggedOnUserId = new Guid(User.Claims.FirstOrDefault(c => c.Type == "UserId").Value);
RServiceResult<bool> res = await _notificationService.DeleteNotification(notificationId, loggedOnUserId);
if (!string.IsNullOrEmpty(res.ExceptionString))
return BadRequest(res.ExceptionString);
return Ok();
}
/// <summary>
/// Delete All Read Notifications
/// </summary>
/// <returns></returns>
[HttpDelete]
[Authorize]
[ProducesResponseType((int)HttpStatusCode.OK)]
[ProducesResponseType((int)HttpStatusCode.BadRequest, Type = typeof(string))]
public async Task<IActionResult> DeleteAllReadNotification()
{
Guid loggedOnUserId = new Guid(User.Claims.FirstOrDefault(c => c.Type == "UserId").Value);
RServiceResult<bool> res = await _notificationService.DeleteNotification(Guid.Empty, loggedOnUserId);
if (!string.IsNullOrEmpty(res.ExceptionString))
return BadRequest(res.ExceptionString);
return Ok();
}
/// <summary>
/// Notification Service
/// </summary>
protected readonly IRNotificationService _notificationService;
/// <summary>
/// constructor
/// </summary>
/// <param name="notificationService"></param>
public NoificationControllerBase(IRNotificationService notificationService)
{
_notificationService = notificationService;
}
}
}

View File

@ -5,6 +5,7 @@ using RSecurityBackend.Models.Audit.Db;
using RSecurityBackend.Models.Auth.Db;
using RSecurityBackend.Models.Generic.Db;
using RSecurityBackend.Models.Image;
using RSecurityBackend.Models.Notification;
using System;
namespace RSecurityBackend.DbContext
@ -90,5 +91,12 @@ namespace RSecurityBackend.DbContext
/// </summary>
public DbSet<RLongRunningJobStatus> LongRunningJobs { get; set; }
#endregion
#region Notifications
/// <summary>
/// Notifications
/// </summary>
public DbSet<RUserNotification> Notifications { get; set; }
#endregion
}
}

View File

@ -0,0 +1,25 @@
namespace RSecurityBackend.Models.Notification
{
/// <summary>
/// Notifaction Status
/// </summary>
public enum NotificationStatus
{
/// <summary>
/// Unread
/// </summary>
Unread = 0,
/// <summary>
/// Read
/// </summary>
Read = 1,
/// <summary>
/// Archived
/// </summary>
Archived = 2,
/// <summary>
/// Deleted
/// </summary>
Deleted = 3
}
}

View File

@ -1,7 +1,7 @@
using RSecurityBackend.Models.Auth.Db;
using System;
namespace RMuseum.Models.Notification
namespace RSecurityBackend.Models.Notification
{
/// <summary>
/// User Notification

View File

@ -1,6 +1,6 @@
using System;
namespace RMuseum.Models.Notification.ViewModels
namespace RSecurityBackend.Models.Notification.ViewModels
{
/// <summary>
/// User Notification

View File

@ -349,6 +349,65 @@
Artifact Service
</summary>
</member>
<member name="T:RSecurityBackend.Controllers.NoificationControllerBase">
<summary>
Notifications controller
</summary>
</member>
<member name="M:RSecurityBackend.Controllers.NoificationControllerBase.GetUserNotifications">
<summary>
Get User Notifications
</summary>
<returns></returns>
</member>
<member name="M:RSecurityBackend.Controllers.NoificationControllerBase.GetUnreadUserNotificationsCount">
<summary>
Get unread user notifications count
</summary>
<returns></returns>
</member>
<member name="M:RSecurityBackend.Controllers.NoificationControllerBase.SwitchNotificationStatus(System.Guid)">
<summary>
Switch Notification Status
</summary>
<param name="notificationId"></param>
<returns></returns>
</member>
<member name="M:RSecurityBackend.Controllers.NoificationControllerBase.SetAllNotificationsStatusRead">
<summary>
Set All User Notifications Status Read
</summary>
<returns></returns>
</member>
<member name="M:RSecurityBackend.Controllers.NoificationControllerBase.SetAllNotificationsStatusUnread">
<summary>
Set All User Notifications Status Unread
</summary>
</member>
<member name="M:RSecurityBackend.Controllers.NoificationControllerBase.DeleteNotification(System.Guid)">
<summary>
Delete Notification
</summary>
<param name="notificationId"></param>
<returns></returns>
</member>
<member name="M:RSecurityBackend.Controllers.NoificationControllerBase.DeleteAllReadNotification">
<summary>
Delete All Read Notifications
</summary>
<returns></returns>
</member>
<member name="F:RSecurityBackend.Controllers.NoificationControllerBase._notificationService">
<summary>
Notification Service
</summary>
</member>
<member name="M:RSecurityBackend.Controllers.NoificationControllerBase.#ctor(RSecurityBackend.Services.IRNotificationService)">
<summary>
constructor
</summary>
<param name="notificationService"></param>
</member>
<member name="T:RSecurityBackend.Controllers.RImageControllerBase">
<summary>
Generic Image Provider
@ -576,6 +635,11 @@
long running jobs
</summary>
</member>
<member name="P:RSecurityBackend.DbContext.RSecurityDbContext`3.Notifications">
<summary>
Notifications
</summary>
</member>
<member name="T:RSecurityBackend.Models.Audit.Db.REvent">
<summary>
Audit Event
@ -1892,6 +1956,107 @@
use ssl
</summary>
</member>
<member name="T:RSecurityBackend.Models.Notification.NotificationStatus">
<summary>
Notifaction Status
</summary>
</member>
<member name="F:RSecurityBackend.Models.Notification.NotificationStatus.Unread">
<summary>
Unread
</summary>
</member>
<member name="F:RSecurityBackend.Models.Notification.NotificationStatus.Read">
<summary>
Read
</summary>
</member>
<member name="F:RSecurityBackend.Models.Notification.NotificationStatus.Archived">
<summary>
Archived
</summary>
</member>
<member name="F:RSecurityBackend.Models.Notification.NotificationStatus.Deleted">
<summary>
Deleted
</summary>
</member>
<member name="T:RSecurityBackend.Models.Notification.RUserNotification">
<summary>
User Notification
</summary>
</member>
<member name="P:RSecurityBackend.Models.Notification.RUserNotification.Id">
<summary>
Id
</summary>
</member>
<member name="P:RSecurityBackend.Models.Notification.RUserNotification.UserId">
<summary>
User Id
</summary>
</member>
<member name="P:RSecurityBackend.Models.Notification.RUserNotification.User">
<summary>
User
</summary>
</member>
<member name="P:RSecurityBackend.Models.Notification.RUserNotification.DateTime">
<summary>
DateTime
</summary>
</member>
<member name="P:RSecurityBackend.Models.Notification.RUserNotification.Status">
<summary>
Status
</summary>
</member>
<member name="P:RSecurityBackend.Models.Notification.RUserNotification.Subject">
<summary>
Subject
</summary>
</member>
<member name="P:RSecurityBackend.Models.Notification.RUserNotification.HtmlText">
<summary>
Text
</summary>
</member>
<member name="T:RSecurityBackend.Models.Notification.ViewModels.RUserNotificationViewModel">
<summary>
User Notification
</summary>
</member>
<member name="M:RSecurityBackend.Models.Notification.ViewModels.RUserNotificationViewModel.#ctor(RSecurityBackend.Models.Notification.RUserNotification)">
<summary>
constructor
</summary>
<param name="src"></param>
</member>
<member name="P:RSecurityBackend.Models.Notification.ViewModels.RUserNotificationViewModel.Id">
<summary>
Id
</summary>
</member>
<member name="P:RSecurityBackend.Models.Notification.ViewModels.RUserNotificationViewModel.DateTime">
<summary>
DateTime
</summary>
</member>
<member name="P:RSecurityBackend.Models.Notification.ViewModels.RUserNotificationViewModel.Status">
<summary>
Status
</summary>
</member>
<member name="P:RSecurityBackend.Models.Notification.ViewModels.RUserNotificationViewModel.Subject">
<summary>
Subject
</summary>
</member>
<member name="P:RSecurityBackend.Models.Notification.ViewModels.RUserNotificationViewModel.HtmlText">
<summary>
Text
</summary>
</member>
<member name="T:RSecurityBackend.Services.IAppUserService">
<summary>
Authentication Service
@ -2154,6 +2319,29 @@
<param name="orderByTimeDescending"></param>
<returns></returns>
</member>
<member name="T:RSecurityBackend.Services.IBackgroundTaskQueue">
<summary>
background task queue
</summary>
</member>
<member name="M:RSecurityBackend.Services.IBackgroundTaskQueue.QueueBackgroundWorkItem(System.Func{System.Threading.CancellationToken,System.Threading.Tasks.Task})">
<summary>
queue new task
</summary>
<param name="workItem"></param>
</member>
<member name="M:RSecurityBackend.Services.IBackgroundTaskQueue.DequeueAsync(System.Threading.CancellationToken)">
<summary>
get task from que
</summary>
<param name="cancellationToken"></param>
<returns></returns>
</member>
<member name="P:RSecurityBackend.Services.IBackgroundTaskQueue.Count">
<summary>
number of tasks
</summary>
</member>
<member name="T:RSecurityBackend.Services.ICaptchaService">
<summary>
Captcha Service
@ -2645,6 +2833,29 @@
</summary>
<param name="context"></param>
</member>
<member name="T:RSecurityBackend.Services.Implementation.BackgroundTaskQueue">
<summary>
IBackgroundTaskQueue implementation
</summary>
</member>
<member name="M:RSecurityBackend.Services.Implementation.BackgroundTaskQueue.QueueBackgroundWorkItem(System.Func{System.Threading.CancellationToken,System.Threading.Tasks.Task})">
<summary>
new task
</summary>
<param name="workItem"></param>
</member>
<member name="M:RSecurityBackend.Services.Implementation.BackgroundTaskQueue.DequeueAsync(System.Threading.CancellationToken)">
<summary>
dequeue task
</summary>
<param name="cancellationToken"></param>
<returns></returns>
</member>
<member name="P:RSecurityBackend.Services.Implementation.BackgroundTaskQueue.Count">
<summary>
task count
</summary>
</member>
<member name="T:RSecurityBackend.Services.Implementation.CaptchaServiceEF">
<summary>
Captcha Service
@ -2869,6 +3080,29 @@
<param name="paging"></param>
<returns></returns>
</member>
<member name="T:RSecurityBackend.Services.Implementation.QueuedHostedService">
<summary>
BackgroundService implementation
</summary>
</member>
<member name="M:RSecurityBackend.Services.Implementation.QueuedHostedService.#ctor(RSecurityBackend.Services.IBackgroundTaskQueue)">
<summary>
constructor
</summary>
<param name="taskQueue"></param>
</member>
<member name="P:RSecurityBackend.Services.Implementation.QueuedHostedService.TaskQueue">
<summary>
task queue
</summary>
</member>
<member name="M:RSecurityBackend.Services.Implementation.QueuedHostedService.ExecuteAsync(System.Threading.CancellationToken)">
<summary>
execute
</summary>
<param name="cancellationToken"></param>
<returns></returns>
</member>
<member name="T:RSecurityBackend.Services.Implementation.RAuditDataProvider">
<summary>
Custom Audit Data Provider
@ -2946,6 +3180,69 @@
</summary>
<param name="connectionString"></param>
</member>
<member name="T:RSecurityBackend.Services.Implementation.RNotificationService">
<summary>
Internal messaging system implementation
</summary>
</member>
<member name="M:RSecurityBackend.Services.Implementation.RNotificationService.PushNotification(System.Guid,System.String,System.String)">
<summary>
Add Notification
</summary>
<param name="userId"></param>
<param name="subject"></param>
<param name="htmlText"></param>
<returns></returns>
</member>
<member name="M:RSecurityBackend.Services.Implementation.RNotificationService.SwitchNotificationStatus(System.Guid,System.Guid)">
<summary>
Switch Notification Status
</summary>
<param name="notificationId"></param>
<param name="userId"></param>
<returns>updated notification object</returns>
</member>
<member name="M:RSecurityBackend.Services.Implementation.RNotificationService.SetAllNotificationsStatus(System.Guid,RSecurityBackend.Models.Notification.NotificationStatus)">
<summary>
Set All User Notifications Status
</summary>
<param name="userId"></param>
<param name="status"></param>
<returns></returns>
</member>
<member name="M:RSecurityBackend.Services.Implementation.RNotificationService.DeleteNotification(System.Guid,System.Guid)">
<summary>
Delete Notification
</summary>
<param name="notificationId">if empty deletes all read notifications</param>
<param name="userId"></param>
<returns></returns>
</member>
<member name="M:RSecurityBackend.Services.Implementation.RNotificationService.GetUserNotifications(System.Guid)">
<summary>
Get User Notifications
</summary>
<param name="userId"></param>
<returns></returns>
</member>
<member name="M:RSecurityBackend.Services.Implementation.RNotificationService.GetUnreadUserNotificationsCount(System.Guid)">
<summary>
Get Unread User Notifications Count
</summary>
<param name="userId"></param>
<returns></returns>
</member>
<member name="F:RSecurityBackend.Services.Implementation.RNotificationService._context">
<summary>
Database Contetxt
</summary>
</member>
<member name="M:RSecurityBackend.Services.Implementation.RNotificationService.#ctor(RSecurityBackend.DbContext.RSecurityDbContext{RSecurityBackend.Models.Auth.Db.RAppUser,RSecurityBackend.Models.Auth.Db.RAppRole,System.Guid})">
<summary>
constructor
</summary>
<param name="context"></param>
</member>
<member name="T:RSecurityBackend.Services.Implementation.RoleServiceBase">
<summary>
User Roles Service Implementation
@ -3077,6 +3374,58 @@
</summary>
<param name="appUserService"></param>
</member>
<member name="T:RSecurityBackend.Services.IRNotificationService">
<summary>
Internal messaging system interface
</summary>
</member>
<member name="M:RSecurityBackend.Services.IRNotificationService.PushNotification(System.Guid,System.String,System.String)">
<summary>
Add Notification
</summary>
<param name="userId"></param>
<param name="subject"></param>
<param name="htmlText"></param>
<returns></returns>
</member>
<member name="M:RSecurityBackend.Services.IRNotificationService.GetUserNotifications(System.Guid)">
<summary>
Get User Notifications
</summary>
<param name="userId"></param>
<returns></returns>
</member>
<member name="M:RSecurityBackend.Services.IRNotificationService.GetUnreadUserNotificationsCount(System.Guid)">
<summary>
Get Unread User Notifications Count
</summary>
<param name="userId"></param>
<returns></returns>
</member>
<member name="M:RSecurityBackend.Services.IRNotificationService.SwitchNotificationStatus(System.Guid,System.Guid)">
<summary>
Switch Notification Status
</summary>
<param name="notificationId"></param>
<param name="userId"></param>
<returns>updated notification object</returns>
</member>
<member name="M:RSecurityBackend.Services.IRNotificationService.SetAllNotificationsStatus(System.Guid,RSecurityBackend.Models.Notification.NotificationStatus)">
<summary>
Set All User Notifications Status
</summary>
<param name="userId"></param>
<param name="status"></param>
<returns></returns>
</member>
<member name="M:RSecurityBackend.Services.IRNotificationService.DeleteNotification(System.Guid,System.Guid)">
<summary>
Delete Notification
</summary>
<param name="notificationId">if empty deletes all read notifications</param>
<param name="userId"></param>
<returns></returns>
</member>
<member name="T:RSecurityBackend.Services.ISecretGenerator">
<summary>
Secret Generator
@ -3205,6 +3554,153 @@
<param name="memberSerialization"></param>
<returns></returns>
</member>
<member name="T:RSecurityBackend.Utilities.PersianIdentityErrorDescriber">
<summary>
PersianIdentityErrorDescriber
</summary>
</member>
<member name="M:RSecurityBackend.Utilities.PersianIdentityErrorDescriber.DefaultError">
<summary>
</summary>
<returns></returns>
</member>
<member name="M:RSecurityBackend.Utilities.PersianIdentityErrorDescriber.ConcurrencyFailure">
<summary>
</summary>
<returns></returns>
</member>
<member name="M:RSecurityBackend.Utilities.PersianIdentityErrorDescriber.PasswordMismatch">
<summary>
</summary>
<returns></returns>
</member>
<member name="M:RSecurityBackend.Utilities.PersianIdentityErrorDescriber.InvalidToken">
<summary>
</summary>
<returns></returns>
</member>
<member name="M:RSecurityBackend.Utilities.PersianIdentityErrorDescriber.LoginAlreadyAssociated">
<summary>
</summary>
<returns></returns>
</member>
<member name="M:RSecurityBackend.Utilities.PersianIdentityErrorDescriber.InvalidUserName(System.String)">
<summary>
</summary>
<param name="userName"></param>
<returns></returns>
</member>
<member name="M:RSecurityBackend.Utilities.PersianIdentityErrorDescriber.InvalidEmail(System.String)">
<summary>
</summary>
<param name="email"></param>
<returns></returns>
</member>
<member name="M:RSecurityBackend.Utilities.PersianIdentityErrorDescriber.DuplicateUserName(System.String)">
<summary>
</summary>
<param name="userName"></param>
<returns></returns>
</member>
<member name="M:RSecurityBackend.Utilities.PersianIdentityErrorDescriber.DuplicateEmail(System.String)">
<summary>
</summary>
<param name="email"></param>
<returns></returns>
</member>
<member name="M:RSecurityBackend.Utilities.PersianIdentityErrorDescriber.InvalidRoleName(System.String)">
<summary>
</summary>
<param name="role"></param>
<returns></returns>
</member>
<member name="M:RSecurityBackend.Utilities.PersianIdentityErrorDescriber.DuplicateRoleName(System.String)">
<summary>
</summary>
<param name="role"></param>
<returns></returns>
</member>
<member name="M:RSecurityBackend.Utilities.PersianIdentityErrorDescriber.UserAlreadyHasPassword">
<summary>
</summary>
<returns></returns>
</member>
<member name="M:RSecurityBackend.Utilities.PersianIdentityErrorDescriber.UserLockoutNotEnabled">
<summary>
</summary>
<returns></returns>
</member>
<member name="M:RSecurityBackend.Utilities.PersianIdentityErrorDescriber.UserAlreadyInRole(System.String)">
<summary>
</summary>
<param name="role"></param>
<returns></returns>
</member>
<member name="M:RSecurityBackend.Utilities.PersianIdentityErrorDescriber.UserNotInRole(System.String)">
<summary>
</summary>
<param name="role"></param>
<returns></returns>
</member>
<member name="M:RSecurityBackend.Utilities.PersianIdentityErrorDescriber.PasswordTooShort(System.Int32)">
<summary>
</summary>
<param name="length"></param>
<returns></returns>
</member>
<member name="M:RSecurityBackend.Utilities.PersianIdentityErrorDescriber.PasswordRequiresNonAlphanumeric">
<summary>
</summary>
<returns></returns>
</member>
<member name="M:RSecurityBackend.Utilities.PersianIdentityErrorDescriber.PasswordRequiresDigit">
<summary>
</summary>
<returns></returns>
</member>
<member name="M:RSecurityBackend.Utilities.PersianIdentityErrorDescriber.PasswordRequiresLower">
<summary>
</summary>
<returns></returns>
</member>
<member name="M:RSecurityBackend.Utilities.PersianIdentityErrorDescriber.PasswordRequiresUpper">
<summary>
</summary>
<returns></returns>
</member>
<member name="M:RSecurityBackend.Utilities.PersianIdentityErrorDescriber.RecoveryCodeRedemptionFailed">
<summary>
</summary>
<returns></returns>
</member>
<member name="M:RSecurityBackend.Utilities.PersianIdentityErrorDescriber.PasswordRequiresUniqueChars(System.Int32)">
<summary>
</summary>
<param name="uniqueChars"></param>
<returns></returns>
</member>
<member name="T:RBilling.Models.Tenant.Db.RChargableFeatureType">
<summary>
Chargable Feature For Tenant Type

View File

@ -0,0 +1,31 @@
using System;
using System.Threading;
using System.Threading.Tasks;
namespace RSecurityBackend.Services
{
/// <summary>
/// background task queue
/// </summary>
public interface IBackgroundTaskQueue
{
/// <summary>
/// queue new task
/// </summary>
/// <param name="workItem"></param>
void QueueBackgroundWorkItem(Func<CancellationToken, Task> workItem);
/// <summary>
/// get task from que
/// </summary>
/// <param name="cancellationToken"></param>
/// <returns></returns>
Task<Func<CancellationToken, Task>> DequeueAsync(
CancellationToken cancellationToken);
/// <summary>
/// number of tasks
/// </summary>
int Count { get; }
}
}

View File

@ -1,10 +1,10 @@
using RMuseum.Models.Notification;
using RMuseum.Models.Notification.ViewModels;
using RSecurityBackend.Models.Notification;
using RSecurityBackend.Models.Notification.ViewModels;
using RSecurityBackend.Models.Generic;
using System;
using System.Threading.Tasks;
namespace RMuseum.Services
namespace RSecurityBackend.Services
{
/// <summary>
/// Internal messaging system interface

View File

@ -3,14 +3,21 @@ using System.Collections.Concurrent;
using System.Threading;
using System.Threading.Tasks;
namespace RMuseum.Services.Implementation
namespace RSecurityBackend.Services.Implementation
{
internal class BackgroundTaskQueue : IBackgroundTaskQueue
/// <summary>
/// IBackgroundTaskQueue implementation
/// </summary>
public class BackgroundTaskQueue : IBackgroundTaskQueue
{
private ConcurrentQueue<Func<CancellationToken, Task>> _workItems =
new ConcurrentQueue<Func<CancellationToken, Task>>();
private SemaphoreSlim _signal = new SemaphoreSlim(0);
/// <summary>
/// new task
/// </summary>
/// <param name="workItem"></param>
public void QueueBackgroundWorkItem(
Func<CancellationToken, Task> workItem)
{
@ -23,6 +30,11 @@ namespace RMuseum.Services.Implementation
_signal.Release();
}
/// <summary>
/// dequeue task
/// </summary>
/// <param name="cancellationToken"></param>
/// <returns></returns>
public async Task<Func<CancellationToken, Task>> DequeueAsync(
CancellationToken cancellationToken)
{
@ -32,6 +44,9 @@ namespace RMuseum.Services.Implementation
return workItem;
}
/// <summary>
/// task count
/// </summary>
public int Count
{
get

View File

@ -5,17 +5,32 @@ using System.Linq;
using System.Threading;
using System.Threading.Tasks;
namespace RMuseum.Services.Implementation
namespace RSecurityBackend.Services.Implementation
{
internal class QueuedHostedService : BackgroundService
/// <summary>
/// BackgroundService implementation
/// </summary>
public class QueuedHostedService : BackgroundService
{
/// <summary>
/// constructor
/// </summary>
/// <param name="taskQueue"></param>
public QueuedHostedService(IBackgroundTaskQueue taskQueue)
{
TaskQueue = taskQueue;
}
/// <summary>
/// task queue
/// </summary>
public IBackgroundTaskQueue TaskQueue { get; }
/// <summary>
/// execute
/// </summary>
/// <param name="cancellationToken"></param>
/// <returns></returns>
protected async override Task ExecuteAsync(
CancellationToken cancellationToken)
{

View File

@ -1,13 +1,14 @@
using Microsoft.EntityFrameworkCore;
using RMuseum.DbContext;
using RMuseum.Models.Notification;
using RMuseum.Models.Notification.ViewModels;
using RSecurityBackend.DbContext;
using RSecurityBackend.Models.Notification;
using RSecurityBackend.Models.Notification.ViewModels;
using RSecurityBackend.Models.Generic;
using System;
using System.Linq;
using System.Threading.Tasks;
using RSecurityBackend.Models.Auth.Db;
namespace RMuseum.Services.Implementation
namespace RSecurityBackend.Services.Implementation
{
/// <summary>
@ -175,10 +176,14 @@ namespace RMuseum.Services.Implementation
/// <summary>
/// Database Contetxt
/// </summary>
protected readonly RMuseumDbContext _context;
protected readonly RSecurityDbContext<RAppUser, RAppRole, Guid> _context;
public RNotificationService(RMuseumDbContext context)
/// <summary>
/// constructor
/// </summary>
/// <param name="context"></param>
public RNotificationService(RSecurityDbContext<RAppUser, RAppRole, Guid> context)
{
_context = context;
}

View File

@ -1,33 +1,135 @@
using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Identity;
namespace RSecurityBackend.Utilities
{
/// <summary>
/// PersianIdentityErrorDescriber
/// </summary>
public class PersianIdentityErrorDescriber : IdentityErrorDescriber
{
/// <summary>
///
/// </summary>
/// <returns></returns>
public override IdentityError DefaultError() => new IdentityError { Code = nameof(DefaultError), Description = $"یک خطای ناشناخته رخ داده است." };
/// <summary>
///
/// </summary>
/// <returns></returns>
public override IdentityError ConcurrencyFailure() => new IdentityError { Code = nameof(ConcurrencyFailure), Description = "رکورد جاری پیشتر ویرایش شده‌است و تغییرات شما آن‌را بازنویسی خواهد کرد." };
/// <summary>
///
/// </summary>
/// <returns></returns>
public override IdentityError PasswordMismatch() => new IdentityError { Code = nameof(PasswordMismatch), Description = "کلمه عبور نادرست است." };
/// <summary>
///
/// </summary>
/// <returns></returns>
public override IdentityError InvalidToken() => new IdentityError { Code = nameof(InvalidToken), Description = "کلمه عبور نامعتبر است." };
/// <summary>
///
/// </summary>
/// <returns></returns>
public override IdentityError LoginAlreadyAssociated() => new IdentityError { Code = nameof(LoginAlreadyAssociated), Description = "این کاربر قبلأ اضافه شده‌است." };
/// <summary>
///
/// </summary>
/// <param name="userName"></param>
/// <returns></returns>
public override IdentityError InvalidUserName(string userName) => new IdentityError { Code = nameof(InvalidUserName), Description = $"نام کاربری '{userName}' نامعتبر است، فقط می تواند حاوی حروف ویا اعداد باشد." };
/// <summary>
///
/// </summary>
/// <param name="email"></param>
/// <returns></returns>
public override IdentityError InvalidEmail(string email) => new IdentityError { Code = nameof(InvalidEmail), Description = $"ایمیل '{email}' نامعتبر است." };
/// <summary>
///
/// </summary>
/// <param name="userName"></param>
/// <returns></returns>
public override IdentityError DuplicateUserName(string userName) => new IdentityError { Code = nameof(DuplicateUserName), Description = $"این نام کاربری '{userName}' به کاربر دیگری اختصاص یافته است." };
/// <summary>
///
/// </summary>
/// <param name="email"></param>
/// <returns></returns>
public override IdentityError DuplicateEmail(string email) => new IdentityError { Code = nameof(DuplicateEmail), Description = $"ایمیل '{email}' به کاربر دیگری اختصاص یافته است." };
/// <summary>
///
/// </summary>
/// <param name="role"></param>
/// <returns></returns>
public override IdentityError InvalidRoleName(string role) => new IdentityError { Code = nameof(InvalidRoleName), Description = $"نام نقش '{role}' نامعتبر است." };
/// <summary>
///
/// </summary>
/// <param name="role"></param>
/// <returns></returns>
public override IdentityError DuplicateRoleName(string role) => new IdentityError { Code = nameof(DuplicateRoleName), Description = $"این نام نقش '{role}' به کاربر دیگری اختصاص یافته است." };
/// <summary>
///
/// </summary>
/// <returns></returns>
public override IdentityError UserAlreadyHasPassword() => new IdentityError { Code = nameof(UserAlreadyHasPassword), Description = "کلمه‌ی عبور کاربر قبلأ تنظیم شده‌است." };
/// <summary>
///
/// </summary>
/// <returns></returns>
public override IdentityError UserLockoutNotEnabled() => new IdentityError { Code = nameof(UserLockoutNotEnabled), Description = "این کاربر فعال است." };
/// <summary>
///
/// </summary>
/// <param name="role"></param>
/// <returns></returns>
public override IdentityError UserAlreadyInRole(string role) => new IdentityError { Code = nameof(UserAlreadyInRole), Description = $"این نقش '{role}' قبلأ به این کاربر اختصاص یافته است." };
/// <summary>
///
/// </summary>
/// <param name="role"></param>
/// <returns></returns>
public override IdentityError UserNotInRole(string role) => new IdentityError { Code = nameof(UserNotInRole), Description = $"این نقش '{role}' قبلأ به این کاربر اختصاص نیافته است." };
/// <summary>
///
/// </summary>
/// <param name="length"></param>
/// <returns></returns>
public override IdentityError PasswordTooShort(int length) => new IdentityError { Code = nameof(PasswordTooShort), Description = $"کلمه عبور باید حداقل {length} کاراکتر باشد." };
/// <summary>
///
/// </summary>
/// <returns></returns>
public override IdentityError PasswordRequiresNonAlphanumeric() => new IdentityError { Code = nameof(PasswordRequiresNonAlphanumeric), Description = "کلمه عبور باید حداقل یک کاراکتر غیر از حروف الفبا داشته باشد." };
/// <summary>
///
/// </summary>
/// <returns></returns>
public override IdentityError PasswordRequiresDigit() => new IdentityError { Code = nameof(PasswordRequiresDigit), Description = "کلمه عبور باید حداقل یک عدد داشته باشد." };
/// <summary>
///
/// </summary>
/// <returns></returns>
public override IdentityError PasswordRequiresLower() => new IdentityError { Code = nameof(PasswordRequiresLower), Description = "کلمه عبور باید حداقل یک حرف کوچک داشته باشد." };
/// <summary>
///
/// </summary>
/// <returns></returns>
public override IdentityError PasswordRequiresUpper() => new IdentityError { Code = nameof(PasswordRequiresUpper), Description = "کلمه عبور باید حداقل یک حرف بزرگ داشته باشد." };
/// <summary>
///
/// </summary>
/// <returns></returns>
public override IdentityError RecoveryCodeRedemptionFailed() => new IdentityError { Code = nameof(RecoveryCodeRedemptionFailed), Description = "بازیابی ناموفق بود." };
/// <summary>
///
/// </summary>
/// <param name="uniqueChars"></param>
/// <returns></returns>
public override IdentityError PasswordRequiresUniqueChars(int uniqueChars) => new IdentityError { Code = nameof(PasswordRequiresUniqueChars), Description = $"کلمه عبور باید حداقل داراى {uniqueChars} حرف متفاوت باشد." };
}
}