public async Task CreateManyIfNotExists(Guid userId, List <Guid> releaseIds, ReleaseRole role,
                                                Guid createdById)
        {
            var alreadyExistingReleaseIds = await _contentDbContext.UserReleaseRoles
                                            .AsQueryable()
                                            .Where(urr =>
                                                   urr.UserId == userId &&
                                                   urr.Role == role &&
                                                   releaseIds.Contains(urr.ReleaseId))
                                            .Select(urr => urr.ReleaseId)
                                            .ToListAsync();

            var newUserReleaseRoles = releaseIds
                                      .Except(alreadyExistingReleaseIds)
                                      .Select(releaseId =>
                                              new UserReleaseRole
            {
                UserId      = userId,
                ReleaseId   = releaseId,
                Role        = role,
                Created     = DateTime.UtcNow,
                CreatedById = createdById,
            }
                                              ).ToList();

            await _contentDbContext.UserReleaseRoles.AddRangeAsync(newUserReleaseRoles);

            await _contentDbContext.SaveChangesAsync();
        }
        public async Task CreateManyIfNotExists(List <Guid> releaseIds,
                                                string email,
                                                ReleaseRole releaseRole,
                                                bool emailSent,
                                                Guid createdById,
                                                bool accepted = false)
        {
            var invites = await releaseIds
                          .ToAsyncEnumerable()
                          .WhereAwait(async releaseId => !await UserHasInvite(releaseId, email, releaseRole))
                          .Select(releaseId =>
                                  new UserReleaseInvite
            {
                Email       = email.ToLower(),
                ReleaseId   = releaseId,
                Role        = releaseRole,
                EmailSent   = emailSent,
                Created     = DateTime.UtcNow,
                CreatedById = createdById,
                Accepted    = accepted,
            }
                                  ).ToListAsync();

            await _contentDbContext.AddRangeAsync(invites);

            await _contentDbContext.SaveChangesAsync();
        }
 public async Task <bool> HasUserReleaseRole(string email, Guid releaseId, ReleaseRole role)
 {
     return(await _contentDbContext.UserReleaseRoles
            .AsQueryable()
            .AnyAsync(r =>
                      r.User.Email.ToLower().Equals(email.ToLower()) &&
                      r.ReleaseId == releaseId &&
                      r.Role == role));
 }
 public async Task <bool> HasUserReleaseRole(Guid userId, Guid releaseId, ReleaseRole role)
 {
     return(await _contentDbContext.UserReleaseRoles
            .AsQueryable()
            .AnyAsync(r =>
                      r.UserId == userId &&
                      r.ReleaseId == releaseId &&
                      r.Role == role));
 }
 public async Task <bool> UserHasInvite(Guid releaseId, string email, ReleaseRole role)
 {
     return(await _contentDbContext
            .UserReleaseInvites
            .AsQueryable()
            .AnyAsync(i =>
                      i.ReleaseId == releaseId &&
                      i.Email.ToLower().Equals(email.ToLower()) &&
                      i.Role == role));
 }
Пример #6
0
 public async Task <Either <ActionResult, Unit> > RemoveByPublication(
     string email,
     Guid publicationId,
     ReleaseRole releaseRole)
 {
     return(await _contentPersistenceHelper
            .CheckEntityExists <Publication>(publicationId, query => query
                                             .Include(p => p.Releases))
            .OnSuccessDo(
                publication => _userService.CheckCanUpdateReleaseRole(publication, releaseRole))
            .OnSuccess(async publication =>
     {
         await _userReleaseInviteRepository.RemoveByPublication(publication, email, releaseRole);
         return Unit.Instance;
     }));
 }
        public async Task <UserReleaseRole> Create(Guid userId, Guid releaseId, ReleaseRole role, Guid createdById)
        {
            var userReleaseRole = new UserReleaseRole
            {
                UserId      = userId,
                ReleaseId   = releaseId,
                Role        = role,
                Created     = DateTime.UtcNow,
                CreatedById = createdById,
            };

            var created =
                (await _contentDbContext.UserReleaseRoles.AddAsync(userReleaseRole)).Entity;
            await _contentDbContext.SaveChangesAsync();

            return(created);
        }
Пример #8
0
        public Either <ActionResult, Unit> SendReleaseRoleEmail(
            string email,
            Release release,
            ReleaseRole role)
        {
            var uri      = _configuration.GetValue <string>("AdminUri");
            var template = _configuration.GetValue <string>("NotifyReleaseRoleTemplateId");

            var link        = role == ReleaseRole.PrereleaseViewer ? "prerelease " : "summary";
            var emailValues = new Dictionary <string, dynamic>
            {
                { "url", $"https://{uri}/publication/{release.Publication.Id}/release/{release.Id}/{link}" },
                { "role", role.ToString() },
                { "publication", release.Publication.Title },
                { "release", release.Title }
            };

            return(_emailService.SendEmail(email, template, emailValues));
        }
Пример #9
0
        private void SendNewReleaseRoleEmail(Guid userId, Release release,
                                             ReleaseRole role)
        {
            var uri      = _configuration.GetValue <string>("AdminUri");
            var template = _configuration.GetValue <string>("NotifyReleaseRoleTemplateId");
            var email    = _usersAndRolesDbContext.Users
                           .First(x => x.Id == userId.ToString())
                           .Email;

            var link        = (role == ReleaseRole.PrereleaseViewer ? "prerelease " : "summary");
            var emailValues = new Dictionary <string, dynamic>
            {
                { "url", $"https://{uri}/publication/{release.Publication.Id}/release/{release.Id}/{link}" },
                { "role", role.ToString() },
                { "publication", release.Publication.Title },
                { "release", release.Title }
            };

            _emailService.SendEmail(email, template, emailValues);
        }
        public async Task Create(Guid releaseId,
                                 string email,
                                 ReleaseRole releaseRole,
                                 bool emailSent,
                                 Guid createdById,
                                 bool accepted = false)
        {
            await _contentDbContext.AddAsync(
                new UserReleaseInvite
            {
                Email       = email.ToLower(),
                ReleaseId   = releaseId,
                Role        = releaseRole,
                Accepted    = accepted,
                EmailSent   = emailSent,
                Created     = DateTime.UtcNow,
                CreatedById = createdById,
            }
                );

            await _contentDbContext.SaveChangesAsync();
        }
        public async Task RemoveByPublication(Publication publication, string email, ReleaseRole role)
        {
            _contentDbContext.Update(publication);
            await _contentDbContext.Entry(publication)
            .Collection(p => p.Releases)
            .LoadAsync();

            var releaseIds = publication.Releases
                             .Select(r => r.Id)
                             .ToList();

            var invites = await _contentDbContext
                          .UserReleaseInvites
                          .AsQueryable()
                          .Where(i =>
                                 releaseIds.Contains(i.ReleaseId) &&
                                 i.Email.ToLower().Equals(email.ToLower()) &&
                                 i.Role == role)
                          .ToListAsync();

            _contentDbContext.RemoveRange(invites);
            await _contentDbContext.SaveChangesAsync();
        }
        public async Task <UserReleaseRole> CreateIfNotExists(Guid userId, Guid releaseId, ReleaseRole role,
                                                              Guid createdById)
        {
            var userReleaseRole = await GetUserReleaseRole(userId, releaseId, role);

            if (userReleaseRole == null)
            {
                return(await Create(userId, releaseId, role, createdById));
            }

            return(userReleaseRole);
        }
        public async Task RemoveAllForPublication(Guid userId, Publication publication, ReleaseRole role,
                                                  Guid deletedById)
        {
            _contentDbContext.Update(publication);
            await _contentDbContext
            .Entry(publication)
            .Collection(p => p.Releases)
            .LoadAsync();

            var allReleaseIds = publication
                                .Releases // Remove on previous release versions as well
                                .Select(r => r.Id)
                                .ToList();
            var userReleaseRoles = await _contentDbContext.UserReleaseRoles
                                   .AsQueryable()
                                   .Where(urr =>
                                          urr.UserId == userId &&
                                          allReleaseIds.Contains(urr.ReleaseId) &&
                                          urr.Role == role)
                                   .ToListAsync();

            await RemoveMany(userReleaseRoles, deletedById);
        }
        public async Task <List <UserReleaseRole> > ListUserReleaseRolesByPublication(ReleaseRole role,
                                                                                      Guid publicationId)
        {
            var allLatestReleases = await _publicationRepository
                                    .ListActiveReleases(publicationId);

            var allLatestReleaseIds = allLatestReleases
                                      .Select(r => r.Id)
                                      .ToList();

            return(await _contentDbContext.UserReleaseRoles
                   .Include(releaseRole => releaseRole.User)
                   .Where(userReleaseRole =>
                          allLatestReleaseIds.Contains(userReleaseRole.ReleaseId) &&
                          userReleaseRole.Role == role)
                   .ToListAsync());
        }
        public async Task <bool> UserHasInvites(List <Guid> releaseIds, string email, ReleaseRole role)
        {
            var inviteReleaseIds = await _contentDbContext
                                   .UserReleaseInvites
                                   .AsQueryable()
                                   .Where(i =>
                                          releaseIds.Contains(i.ReleaseId) &&
                                          i.Email.ToLower().Equals(email.ToLower()) &&
                                          i.Role == role)
                                   .Select(i => i.ReleaseId)
                                   .ToListAsync();

            return(releaseIds.All(releaseId => inviteReleaseIds.Contains(releaseId)));
        }
Пример #16
0
        private async Task <Either <ActionResult, Unit> > ValidateReleaseRoleCanBeAdded(Guid userId,
                                                                                        Guid releaseId,
                                                                                        ReleaseRole role)
        {
            if (await _userReleaseRoleRepository.HasUserReleaseRole(userId, releaseId, role))
            {
                return(ValidationActionResult(UserAlreadyHasResourceRole));
            }

            return(Unit.Instance);
        }
Пример #17
0
 public async Task <Either <ActionResult, Unit> > AddReleaseRole(Guid userId, Guid releaseId, ReleaseRole role)
 {
     return(await _contentPersistenceHelper
            .CheckEntityExists <Release>(releaseId, query => query
                                         .Include(r => r.Publication))
            .OnSuccess(release =>
                       _userService.CheckCanUpdateReleaseRole(release.Publication, role)
                       .OnSuccess(async() =>
     {
         return await _usersAndRolesPersistenceHelper
         .CheckEntityExists <ApplicationUser, string>(userId.ToString())
         .OnSuccessDo(_ => ValidateReleaseRoleCanBeAdded(userId, releaseId, role))
         .OnSuccess(async user =>
         {
             await _userReleaseRoleRepository.Create(
                 userId: userId,
                 releaseId: release.Id,
                 role: role,
                 createdById: _userService.GetUserId());
             return _emailTemplateService.SendReleaseRoleEmail(user.Email, release, role);
         });
     })
                       ));
 }
 public async Task <UserReleaseRole?> GetUserReleaseRole(Guid userId, Guid releaseId, ReleaseRole role)
 {
     return(await _contentDbContext.UserReleaseRoles
            .AsQueryable()
            .SingleOrDefaultAsync(r =>
                                  r.UserId == userId &&
                                  r.ReleaseId == releaseId &&
                                  r.Role == role));
 }
Пример #19
0
 public static Task <Either <ActionResult, Tuple <Publication, ReleaseRole> > > CheckCanUpdateReleaseRole(
     this IUserService userService, Publication publication, ReleaseRole role)
 {
     return(userService.CheckPolicy(TupleOf(publication, role),
                                    SecurityPolicies.CanUpdateSpecificReleaseRole));
 }
 public async Task <List <UserReleaseRole> > ListUserReleaseRoles(Guid releaseId, ReleaseRole role)
 {
     return(await _contentDbContext.UserReleaseRoles
            .AsQueryable()
            .Include(urr => urr.User)
            .Where(urr =>
                   urr.ReleaseId == releaseId &&
                   urr.Role == role)
            .ToListAsync());
 }