diff --git a/RMuseum/RMuseum.xml b/RMuseum/RMuseum.xml index e55b73b8..3fe60245 100644 --- a/RMuseum/RMuseum.xml +++ b/RMuseum/RMuseum.xml @@ -5738,7 +5738,12 @@ Messaging service - + + + Users service + + + constructor @@ -5746,6 +5751,7 @@ + diff --git a/RMuseum/Services/Implementation/RecitationService.cs b/RMuseum/Services/Implementation/RecitationService.cs index e2312ce6..513dcaee 100644 --- a/RMuseum/Services/Implementation/RecitationService.cs +++ b/RMuseum/Services/Implementation/RecitationService.cs @@ -6,6 +6,7 @@ using Microsoft.Extensions.Configuration; using MySql.Data.MySqlClient; using Renci.SshNet; using RMuseum.DbContext; +using RMuseum.Models.Auth.Memory; using RMuseum.Models.Ganjoor; using RMuseum.Models.GanjoorAudio; using RMuseum.Models.GanjoorAudio.ViewModels; @@ -14,6 +15,7 @@ using RMuseum.Models.UploadSession.ViewModels; using RMuseum.Services.Implementation; using RMuseum.Services.Implementation.ImportedFromDesktopGanjoor; using RSecurityBackend.Models.Generic; +using RSecurityBackend.Services; using RSecurityBackend.Services.Implementation; using System; using System.Collections.Generic; @@ -421,9 +423,14 @@ namespace RMuseum.Services.Implementationa return new RServiceResult(null, err); } + + Recitation narration = await _context.Recitations.Include(a => a.Owner).Where(a => a.Id == id).SingleOrDefaultAsync(); if(narration == null) return new RServiceResult(null, "404"); + + bool bNewPendingRequest = narration.ReviewStatus == AudioReviewStatus.Draft && metadata.ReviewStatus == AudioReviewStatus.Pending; + narration.AudioTitle = metadata.AudioTitle; narration.AudioArtist = metadata.AudioArtist; narration.AudioArtistUrl = metadata.AudioArtistUrl; @@ -433,6 +440,25 @@ namespace RMuseum.Services.Implementationa _context.Recitations.Update(narration); await _context.SaveChangesAsync(); + if(bNewPendingRequest) + { + var moderators = await _userService.GetUsersHavingPermission(RMuseumSecurableItem.AudioRecitationEntityShortName, RMuseumSecurableItem.ModerateOperationShortName); + if(string.IsNullOrEmpty(moderators.ExceptionString)) //if not, do nothing! + { + foreach(var moderator in moderators.Result) + { + await new RNotificationService(_context).PushNotification + ( + (Guid)moderator.Id , + "درخواست بررسی خوانش", + $"درخواستی برای بررسی خوانشی از «{narration.AudioArtist}» ثبت شده است. در صورت تمایل صورت تمایل به بررسی بخش «خوانش‌های در انتظار تأیید» را ببینید.{ Environment.NewLine}" + + $"توجه فرمایید که اگر کاربر دیگری که دارای مجوز بررسی خوانش‌هاست پیش از شما به آن رسیدگی کرده باشد آن را در صف نخواهید دید." + ); + } + } + } + + if(narration.ReviewStatus == AudioReviewStatus.Approved) { narration.AudioSyncStatus = AudioSyncStatus.MetadataChanged; @@ -2028,6 +2054,11 @@ namespace RMuseum.Services.Implementationa /// protected readonly IRNotificationService _notificationService; + /// + /// Users service + /// + protected readonly IAppUserService _userService; + /// /// constructor @@ -2036,12 +2067,14 @@ namespace RMuseum.Services.Implementationa /// /// /// - public RecitationService(RMuseumDbContext context, IConfiguration configuration, IBackgroundTaskQueue backgroundTaskQueue, IRNotificationService notificationService) + /// + public RecitationService(RMuseumDbContext context, IConfiguration configuration, IBackgroundTaskQueue backgroundTaskQueue, IRNotificationService notificationService, IAppUserService userService) { _context = context; Configuration = configuration; _backgroundTaskQueue = backgroundTaskQueue; _notificationService = notificationService; + _userService = userService; } } } diff --git a/RSecurityBackend/RSecurityBackend.xml b/RSecurityBackend/RSecurityBackend.xml index 7d467d10..63442503 100644 --- a/RSecurityBackend/RSecurityBackend.xml +++ b/RSecurityBackend/RSecurityBackend.xml @@ -1924,6 +1924,14 @@ + + + all users having a certain permission + + + + + add a new user @@ -2265,6 +2273,14 @@ + + + all users having a certain permission + + + + + add a new user @@ -2795,6 +2811,14 @@ + + + roles having specific permission + + + + + gets list of SecurableItem, should be reimplemented in end user applications @@ -2939,6 +2963,14 @@ + + + roles having specific permission + + + + + gets list of SecurableItem, should be reimplemented in end user applications diff --git a/RSecurityBackend/Services/IAppUserService.cs b/RSecurityBackend/Services/IAppUserService.cs index 45cdd545..ce431f30 100644 --- a/RSecurityBackend/Services/IAppUserService.cs +++ b/RSecurityBackend/Services/IAppUserService.cs @@ -121,6 +121,14 @@ namespace RSecurityBackend.Services /// Task> GetAllUsersInformation(); + /// + /// all users having a certain permission + /// + /// + /// + /// + Task> GetUsersHavingPermission(string securableItemShortName, string operationShortName); + /// /// add a new user /// diff --git a/RSecurityBackend/Services/IUserRoleService.cs b/RSecurityBackend/Services/IUserRoleService.cs index 8b3f40dd..13de7a00 100644 --- a/RSecurityBackend/Services/IUserRoleService.cs +++ b/RSecurityBackend/Services/IUserRoleService.cs @@ -56,6 +56,14 @@ namespace RSecurityBackend.Services /// Task> HasPermission(string roleName, string securableItemShortName, string operationShortName); + /// + /// roles having specific permission + /// + /// + /// + /// + Task> GetRolesHavingPermission(string securableItemShortName, string operationShortName); + /// /// gets list of SecurableItem, should be reimplemented in end user applications /// diff --git a/RSecurityBackend/Services/Implementation/AppUserService.cs b/RSecurityBackend/Services/Implementation/AppUserService.cs index 045b34eb..559c2f9f 100644 --- a/RSecurityBackend/Services/Implementation/AppUserService.cs +++ b/RSecurityBackend/Services/Implementation/AppUserService.cs @@ -592,6 +592,47 @@ namespace RSecurityBackend.Services.Implementation } } + /// + /// all users having a certain permission + /// + /// + /// + /// + public async Task> GetUsersHavingPermission(string securableItemShortName, string operationShortName) + { + try + { + var rolesResult = await _userRoleService.GetRolesHavingPermission(securableItemShortName, operationShortName); + if(!string.IsNullOrEmpty(rolesResult.ExceptionString)) + { + return new RServiceResult(null, rolesResult.ExceptionString); + } + + + + List lstPublicUsersInfo = new List(); + + RAppRole[] roles = rolesResult.Result; + foreach(RAppRole role in roles) + { + var usersInRole = _userManager.GetUsersInRoleAsync(role.Name); + foreach(var user in usersInRole.Result) + { + if(lstPublicUsersInfo.Where(u => u.Id == user.Id).FirstOrDefault() == null ) + { + lstPublicUsersInfo.Add(new PublicRAppUser(user)); + } + } + } + + return new RServiceResult(lstPublicUsersInfo.ToArray()); + } + catch (Exception exp) + { + return new RServiceResult(null, exp.ToString()); + } + } + /// /// add a new user diff --git a/RSecurityBackend/Services/Implementation/RoleServiceBase.cs b/RSecurityBackend/Services/Implementation/RoleServiceBase.cs index 550a4c40..42ea77aa 100644 --- a/RSecurityBackend/Services/Implementation/RoleServiceBase.cs +++ b/RSecurityBackend/Services/Implementation/RoleServiceBase.cs @@ -33,6 +33,7 @@ namespace RSecurityBackend.Services.Implementation } } + /// /// returns user role information /// @@ -184,6 +185,28 @@ namespace RSecurityBackend.Services.Implementation } } + /// + /// roles having specific permission + /// + /// + /// + /// + public async Task> GetRolesHavingPermission(string securableItemShortName, string operationShortName) + { + try + { + RAppRole[] rolesInfo = await _roleManager.Roles + .Include(r => r.Permissions) + .Where(r => r.Permissions.Any(p => p.SecurableItemShortName == securableItemShortName && p.OperationShortName == operationShortName) ) + .ToArrayAsync(); + return new RServiceResult(rolesInfo); + } + catch (Exception exp) + { + return new RServiceResult(null, exp.ToString()); + } + } + /// /// gets list of SecurableItem, should be reimplemented in end user applications ///