#16 moving notification functionality to a new service

This commit is contained in:
Hamid Reza Mohammadi 2020-10-08 19:56:47 +03:30
parent d38eae4f83
commit 661b26f043
7 changed files with 326 additions and 239 deletions

View File

@ -1822,7 +1822,7 @@ namespace RMuseum.Controllers
public async Task<IActionResult> GetUserNotifications()
{
Guid loggedOnUserId = new Guid(User.Claims.FirstOrDefault(c => c.Type == "UserId").Value);
RServiceResult<RUserNotification[]> res = await _artifactService.GetUserNotifications(loggedOnUserId);
RServiceResult<RUserNotification[]> res = await _notificationService.GetUserNotifications(loggedOnUserId);
if (!string.IsNullOrEmpty(res.ExceptionString))
return BadRequest(res.ExceptionString);
return Ok(res.Result);
@ -1836,7 +1836,7 @@ namespace RMuseum.Controllers
public async Task<IActionResult> GetUnreadUserNotificationsCount()
{
Guid loggedOnUserId = new Guid(User.Claims.FirstOrDefault(c => c.Type == "UserId").Value);
RServiceResult<int> res = await _artifactService.GetUnreadUserNotificationsCount(loggedOnUserId);
RServiceResult<int> res = await _notificationService.GetUnreadUserNotificationsCount(loggedOnUserId);
if (!string.IsNullOrEmpty(res.ExceptionString))
return BadRequest(res.ExceptionString);
return Ok(res.Result);
@ -1854,7 +1854,7 @@ namespace RMuseum.Controllers
[ProducesResponseType((int)HttpStatusCode.BadRequest, Type = typeof(string))]
public async Task<IActionResult> SwitchNotificationStatus(Guid notificationId)
{
RServiceResult<RUserNotification> res = await _artifactService.SwitchNotificationStatus(notificationId);
RServiceResult<RUserNotification> res = await _notificationService.SwitchNotificationStatus(notificationId);
if (!string.IsNullOrEmpty(res.ExceptionString))
return BadRequest(res.ExceptionString);
return Ok(res.Result);
@ -1872,7 +1872,7 @@ namespace RMuseum.Controllers
[ProducesResponseType((int)HttpStatusCode.BadRequest, Type = typeof(string))]
public async Task<IActionResult> DeleteNotification(Guid notificationId)
{
RServiceResult<bool> res = await _artifactService.DeleteNotification(notificationId);
RServiceResult<bool> res = await _notificationService.DeleteNotification(notificationId);
if (!string.IsNullOrEmpty(res.ExceptionString))
return BadRequest(res.ExceptionString);
return Ok();
@ -1886,12 +1886,14 @@ namespace RMuseum.Controllers
/// <param name="userPermissionChecker"></param>
/// <param name="memoryCache"></param>
/// <param name="captchaService"></param>
public ArtifactController(IArtifactService artifactService, IUserPermissionChecker userPermissionChecker, IMemoryCache memoryCache, ICaptchaService captchaService)
/// <param name="notificationService"></param>
public ArtifactController(IArtifactService artifactService, IUserPermissionChecker userPermissionChecker, IMemoryCache memoryCache, ICaptchaService captchaService, IRNotificationService notificationService)
{
_artifactService = artifactService;
_userPermissionChecker = userPermissionChecker;
_memoryCache = memoryCache;
_captchaService = captchaService;
_notificationService = notificationService;
}
/// <summary>
@ -1913,5 +1915,10 @@ namespace RMuseum.Controllers
/// Captcha service
/// </summary>
protected readonly ICaptchaService _captchaService;
/// <summary>
/// Notification Service
/// </summary>
protected readonly IRNotificationService _notificationService;
}
}

View File

@ -590,7 +590,7 @@
<param name="notificationId"></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)">
<member name="M:RMuseum.Controllers.ArtifactController.#ctor(RMuseum.Services.IArtifactService,RSecurityBackend.Services.IUserPermissionChecker,Microsoft.Extensions.Caching.Memory.IMemoryCache,RSecurityBackend.Services.ICaptchaService,RMuseum.Services.IRNotificationService)">
<summary>
constructor
</summary>
@ -599,6 +599,7 @@
<param name="userPermissionChecker"></param>
<param name="memoryCache"></param>
<param name="captchaService"></param>
<param name="notificationService"></param>
</member>
<member name="F:RMuseum.Controllers.ArtifactController._artifactService">
<summary>
@ -620,6 +621,11 @@
Captcha service
</summary>
</member>
<member name="F:RMuseum.Controllers.ArtifactController._notificationService">
<summary>
Notification Service
</summary>
</member>
<member name="M:RMuseum.Controllers.AudioNarrationController.Get(RSecurityBackend.Models.Generic.PagingParameterModel,System.Boolean,RMuseum.Models.GanjoorAudio.AudioReviewStatus)">
<summary>
Gets audio narrations, user must have narration::moderate permission to be able to see all users narrations
@ -3577,43 +3583,6 @@
<param name="linkId"></param>
<returns></returns>
</member>
<member name="M:RMuseum.Services.IArtifactService.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.IArtifactService.GetUserNotifications(System.Guid)">
<summary>
Get User Notifications
</summary>
<param name="userId"></param>
<returns></returns>
</member>
<member name="M:RMuseum.Services.IArtifactService.GetUnreadUserNotificationsCount(System.Guid)">
<summary>
Get Unread User Notifications Count
</summary>
<param name="userId"></param>
<returns></returns>
</member>
<member name="M:RMuseum.Services.IArtifactService.SwitchNotificationStatus(System.Guid)">
<summary>
Switch Notification Status
</summary>
<param name="notificationId"></param>
<returns>updated notification object</returns>
</member>
<member name="M:RMuseum.Services.IArtifactService.DeleteNotification(System.Guid)">
<summary>
Delete Notification
</summary>
<param name="notificationId"></param>
<returns></returns>
</member>
<member name="M:RMuseum.Services.IArtifactService.RemoveArtifactHavingNoNoteAndBookmarks(System.Guid,System.Boolean)">
<summary>
an incomplete prototype for removing artifacts
@ -4369,43 +4338,6 @@
<param name="linkId"></param>
<returns></returns>
</member>
<member name="M:RMuseum.Services.Implementation.ArtifactService.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.ArtifactService.SwitchNotificationStatus(System.Guid)">
<summary>
Switch Notification Status
</summary>
<param name="notificationId"></param>
<returns>updated notification object</returns>
</member>
<member name="M:RMuseum.Services.Implementation.ArtifactService.DeleteNotification(System.Guid)">
<summary>
Delete Notification
</summary>
<param name="notificationId"></param>
<returns></returns>
</member>
<member name="M:RMuseum.Services.Implementation.ArtifactService.GetUserNotifications(System.Guid)">
<summary>
Get User Notifications
</summary>
<param name="userId"></param>
<returns></returns>
</member>
<member name="M:RMuseum.Services.Implementation.ArtifactService.GetUnreadUserNotificationsCount(System.Guid)">
<summary>
Get Unread User Notifications Count
</summary>
<param name="userId"></param>
<returns></returns>
</member>
<member name="F:RMuseum.Services.Implementation.ArtifactService._context">
<summary>
Database Contetxt
@ -4431,7 +4363,12 @@
User 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)">
<member name="F:RMuseum.Services.Implementation.ArtifactService._notificationService">
<summary>
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)">
<summary>
constructor
</summary>
@ -4440,6 +4377,7 @@
<param name="pictureFileService"></param>
<param name="backgroundTaskQueue"></param>
<param name="userService"></param>
<param name="notificationService"></param>
</member>
<member name="T:RMuseum.Services.Implementation.AudioNarrationService">
<summary>
@ -4749,6 +4687,53 @@
<param name="configuration"></param>
<param name="simpleImageStorage"></param>
</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)">
<summary>
Switch Notification Status
</summary>
<param name="notificationId"></param>
<returns>updated notification object</returns>
</member>
<member name="M:RMuseum.Services.Implementation.RNotificationService.DeleteNotification(System.Guid)">
<summary>
Delete Notification
</summary>
<param name="notificationId"></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
@ -4846,6 +4831,48 @@
Image Storage Path
</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)">
<summary>
Switch Notification Status
</summary>
<param name="notificationId"></param>
<returns>updated notification object</returns>
</member>
<member name="M:RMuseum.Services.IRNotificationService.DeleteNotification(System.Guid)">
<summary>
Delete Notification
</summary>
<param name="notificationId"></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

@ -498,44 +498,6 @@ namespace RMuseum.Services
/// <returns></returns>
Task<RServiceResult<bool>> SynchronizeSuggestedPinterestLink(Guid linkId);
/// <summary>
/// Add Notification
/// </summary>
/// <param name="userId"></param>
/// <param name="subject"></param>
/// <param name="htmlText"></param>
/// <returns></returns>
Task<RServiceResult<RUserNotification>> PushNotification(Guid userId, string subject, string htmlText);
/// <summary>
/// Get User Notifications
/// </summary>
/// <param name="userId"></param>
/// <returns></returns>
Task<RServiceResult<RUserNotification[]>> GetUserNotifications(Guid userId);
/// <summary>
/// Get Unread User Notifications Count
/// </summary>
/// <param name="userId"></param>
/// <returns></returns>
Task<RServiceResult<int>> GetUnreadUserNotificationsCount(Guid userId);
/// <summary>
/// Switch Notification Status
/// </summary>
/// <param name="notificationId"></param>
/// <returns>updated notification object</returns>
Task<RServiceResult<RUserNotification>> SwitchNotificationStatus(Guid notificationId);
/// <summary>
/// Delete Notification
/// </summary>
/// <param name="notificationId"></param>
/// <returns></returns>
Task<RServiceResult<bool>> DeleteNotification(Guid notificationId);
/// <summary>
/// an incomplete prototype for removing artifacts
/// </summary>

View File

@ -0,0 +1,50 @@
using RMuseum.Models.Notification;
using RSecurityBackend.Models.Generic;
using System;
using System.Threading.Tasks;
namespace RMuseum.Services
{
/// <summary>
/// Internal messaging system interface
/// </summary>
public interface IRNotificationService
{
/// <summary>
/// Add Notification
/// </summary>
/// <param name="userId"></param>
/// <param name="subject"></param>
/// <param name="htmlText"></param>
/// <returns></returns>
Task<RServiceResult<RUserNotification>> PushNotification(Guid userId, string subject, string htmlText);
/// <summary>
/// Get User Notifications
/// </summary>
/// <param name="userId"></param>
/// <returns></returns>
Task<RServiceResult<RUserNotification[]>> GetUserNotifications(Guid userId);
/// <summary>
/// Get Unread User Notifications Count
/// </summary>
/// <param name="userId"></param>
/// <returns></returns>
Task<RServiceResult<int>> GetUnreadUserNotificationsCount(Guid userId);
/// <summary>
/// Switch Notification Status
/// </summary>
/// <param name="notificationId"></param>
/// <returns>updated notification object</returns>
Task<RServiceResult<RUserNotification>> SwitchNotificationStatus(Guid notificationId);
/// <summary>
/// Delete Notification
/// </summary>
/// <param name="notificationId"></param>
/// <returns></returns>
Task<RServiceResult<bool>> DeleteNotification(Guid notificationId);
}
}

View File

@ -1965,7 +1965,7 @@ namespace RMuseum.Services.Implementation
if(referenceNote.RAppUserId != userId)
{
RArtifactMasterRecord artificat = await _context.Artifacts.Where(a => a.Id == artifactId).SingleOrDefaultAsync();
await PushNotification
await _notificationService.PushNotification
(
referenceNote.RAppUserId,
$"پاسخگویی {userInfo.Result.FirstName} {userInfo.Result.SureName} به یادداشت شما دربارهٔ {artificat.Name}",
@ -2032,7 +2032,7 @@ namespace RMuseum.Services.Implementation
{
RArtifactItemRecord item = await _context.Items.Where(a => a.Id == itemId).SingleOrDefaultAsync();
RArtifactMasterRecord artificat = await _context.Artifacts.Where(a => a.Id == item.RArtifactMasterRecordId).SingleOrDefaultAsync();
await PushNotification
await _notificationService.PushNotification
(
referenceNote.RAppUserId,
$"پاسخگویی {userInfo.Result.FirstName} {userInfo.Result.SureName} به یادداشت شما دربارهٔ {artificat.Name} « {item.Name}",
@ -3050,124 +3050,7 @@ namespace RMuseum.Services.Implementation
}
}
/// <summary>
/// Add Notification
/// </summary>
/// <param name="userId"></param>
/// <param name="subject"></param>
/// <param name="htmlText"></param>
/// <returns></returns>
public async Task<RServiceResult<RUserNotification>> PushNotification(Guid userId, string subject, string htmlText)
{
try
{
RUserNotification notification =
new RUserNotification()
{
UserId = userId,
DateTime = DateTime.Now,
Status = NotificationStatus.Unread,
Subject = subject,
HtmlText = htmlText
};
_context.Notifications.Add(notification);
await _context.SaveChangesAsync();
return new RServiceResult<RUserNotification>(notification);
}
catch (Exception exp)
{
return new RServiceResult<RUserNotification>(null, exp.ToString());
}
}
/// <summary>
/// Switch Notification Status
/// </summary>
/// <param name="notificationId"></param>
/// <returns>updated notification object</returns>
public async Task<RServiceResult<RUserNotification>> SwitchNotificationStatus(Guid notificationId)
{
try
{
RUserNotification notification =
await _context.Notifications.Where(n => n.Id == notificationId).SingleAsync();
notification.Status = notification.Status == NotificationStatus.Unread ? NotificationStatus.Read : NotificationStatus.Unread;
_context.Notifications.Update(notification);
await _context.SaveChangesAsync();
return new RServiceResult<RUserNotification>(notification);
}
catch (Exception exp)
{
return new RServiceResult<RUserNotification>(null, exp.ToString());
}
}
/// <summary>
/// Delete Notification
/// </summary>
/// <param name="notificationId"></param>
/// <returns></returns>
public async Task<RServiceResult<bool>> DeleteNotification(Guid notificationId)
{
try
{
RUserNotification notification =
await _context.Notifications.Where(n => n.Id == notificationId).SingleAsync();
_context.Notifications.Remove(notification);
await _context.SaveChangesAsync();
return new RServiceResult<bool>(true);
}
catch (Exception exp)
{
return new RServiceResult<bool>(false, exp.ToString());
}
}
/// <summary>
/// Get User Notifications
/// </summary>
/// <param name="userId"></param>
/// <returns></returns>
public async Task<RServiceResult<RUserNotification[]>> GetUserNotifications(Guid userId)
{
try
{
return new RServiceResult<RUserNotification[]>
(
await _context.Notifications
.Where(n => n.UserId == userId)
.OrderByDescending(n => n.DateTime)
.ToArrayAsync()
);
}
catch (Exception exp)
{
return new RServiceResult<RUserNotification[]>(null, exp.ToString());
}
}
/// <summary>
/// Get Unread User Notifications Count
/// </summary>
/// <param name="userId"></param>
/// <returns></returns>
public async Task<RServiceResult<int>> GetUnreadUserNotificationsCount(Guid userId)
{
try
{
return new RServiceResult<int>
(
await _context.Notifications
.Where(n => n.UserId == userId && n.Status == NotificationStatus.Unread)
.CountAsync()
);
}
catch (Exception exp)
{
return new RServiceResult<int>(0, exp.ToString());
}
}
/// <summary>
@ -3196,6 +3079,11 @@ namespace RMuseum.Services.Implementation
/// </summary>
protected readonly IAppUserService _userService;
/// <summary>
/// Messaging service
/// </summary>
protected readonly IRNotificationService _notificationService;
/// <summary>
/// constructor
/// </summary>
@ -3204,13 +3092,15 @@ namespace RMuseum.Services.Implementation
/// <param name="pictureFileService"></param>
/// <param name="backgroundTaskQueue"></param>
/// <param name="userService"></param>
public ArtifactService(RMuseumDbContext context, IConfiguration configuration, IPictureFileService pictureFileService, IBackgroundTaskQueue backgroundTaskQueue, IAppUserService userService)
/// <param name="notificationService"></param>
public ArtifactService(RMuseumDbContext context, IConfiguration configuration, IPictureFileService pictureFileService, IBackgroundTaskQueue backgroundTaskQueue, IAppUserService userService, IRNotificationService notificationService)
{
_context = context;
_pictureFileService = pictureFileService;
Configuration = configuration;
_backgroundTaskQueue = backgroundTaskQueue;
_userService = userService;
_notificationService = notificationService;
}
}
}

View File

@ -0,0 +1,148 @@
using Microsoft.EntityFrameworkCore;
using RMuseum.DbContext;
using RMuseum.Models.Notification;
using RSecurityBackend.Models.Generic;
using System;
using System.Linq;
using System.Threading.Tasks;
namespace RMuseum.Services.Implementation
{
/// <summary>
/// Internal messaging system implementation
/// </summary>
public class RNotificationService : IRNotificationService
{
/// <summary>
/// Add Notification
/// </summary>
/// <param name="userId"></param>
/// <param name="subject"></param>
/// <param name="htmlText"></param>
/// <returns></returns>
public async Task<RServiceResult<RUserNotification>> PushNotification(Guid userId, string subject, string htmlText)
{
try
{
RUserNotification notification =
new RUserNotification()
{
UserId = userId,
DateTime = DateTime.Now,
Status = NotificationStatus.Unread,
Subject = subject,
HtmlText = htmlText
};
_context.Notifications.Add(notification);
await _context.SaveChangesAsync();
return new RServiceResult<RUserNotification>(notification);
}
catch (Exception exp)
{
return new RServiceResult<RUserNotification>(null, exp.ToString());
}
}
/// <summary>
/// Switch Notification Status
/// </summary>
/// <param name="notificationId"></param>
/// <returns>updated notification object</returns>
public async Task<RServiceResult<RUserNotification>> SwitchNotificationStatus(Guid notificationId)
{
try
{
RUserNotification notification =
await _context.Notifications.Where(n => n.Id == notificationId).SingleAsync();
notification.Status = notification.Status == NotificationStatus.Unread ? NotificationStatus.Read : NotificationStatus.Unread;
_context.Notifications.Update(notification);
await _context.SaveChangesAsync();
return new RServiceResult<RUserNotification>(notification);
}
catch (Exception exp)
{
return new RServiceResult<RUserNotification>(null, exp.ToString());
}
}
/// <summary>
/// Delete Notification
/// </summary>
/// <param name="notificationId"></param>
/// <returns></returns>
public async Task<RServiceResult<bool>> DeleteNotification(Guid notificationId)
{
try
{
RUserNotification notification =
await _context.Notifications.Where(n => n.Id == notificationId).SingleAsync();
_context.Notifications.Remove(notification);
await _context.SaveChangesAsync();
return new RServiceResult<bool>(true);
}
catch (Exception exp)
{
return new RServiceResult<bool>(false, exp.ToString());
}
}
/// <summary>
/// Get User Notifications
/// </summary>
/// <param name="userId"></param>
/// <returns></returns>
public async Task<RServiceResult<RUserNotification[]>> GetUserNotifications(Guid userId)
{
try
{
return new RServiceResult<RUserNotification[]>
(
await _context.Notifications
.Where(n => n.UserId == userId)
.OrderByDescending(n => n.DateTime)
.ToArrayAsync()
);
}
catch (Exception exp)
{
return new RServiceResult<RUserNotification[]>(null, exp.ToString());
}
}
/// <summary>
/// Get Unread User Notifications Count
/// </summary>
/// <param name="userId"></param>
/// <returns></returns>
public async Task<RServiceResult<int>> GetUnreadUserNotificationsCount(Guid userId)
{
try
{
return new RServiceResult<int>
(
await _context.Notifications
.Where(n => n.UserId == userId && n.Status == NotificationStatus.Unread)
.CountAsync()
);
}
catch (Exception exp)
{
return new RServiceResult<int>(0, exp.ToString());
}
}
/// <summary>
/// Database Contetxt
/// </summary>
protected readonly RMuseumDbContext _context;
public RNotificationService(RMuseumDbContext context)
{
_context = context;
}
}
}

View File

@ -245,6 +245,9 @@ namespace RMuseum
//picture file service
services.AddTransient<IPictureFileService, PictureFileService>();
//messaging service
services.AddTransient<IRNotificationService, RNotificationService>();
//artifact service
services.AddTransient<IArtifactService, ArtifactService>();