Files
Umbraco-CMS/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/NotificationsRepository.cs

116 lines
5.3 KiB
C#
Raw Normal View History

using System;
using System.Collections.Generic;
using System.Linq;
using Umbraco.Cms.Core.Models;
using Umbraco.Cms.Core.Models.Entities;
using Umbraco.Cms.Core.Models.Membership;
using Umbraco.Cms.Core.Persistence.Repositories;
using Umbraco.Cms.Core.Scoping;
using Umbraco.Cms.Infrastructure.Persistence.Dtos;
using Umbraco.Extensions;
namespace Umbraco.Cms.Infrastructure.Persistence.Repositories.Implement
{
2017-12-14 17:04:44 +01:00
public class NotificationsRepository : INotificationsRepository
{
2017-12-14 17:04:44 +01:00
private readonly IScopeAccessor _scopeAccessor;
2017-12-14 17:04:44 +01:00
public NotificationsRepository(IScopeAccessor scopeAccessor)
{
2017-12-14 17:04:44 +01:00
_scopeAccessor = scopeAccessor;
}
2017-12-14 17:04:44 +01:00
private IScope AmbientScope => _scopeAccessor.AmbientScope;
public IEnumerable<Notification> GetUsersNotifications(IEnumerable<int> userIds, string action, IEnumerable<int> nodeIds, Guid objectType)
{
var nodeIdsA = nodeIds.ToArray();
2017-12-14 17:04:44 +01:00
var sql = AmbientScope.SqlContext.Sql()
.Select("DISTINCT umbracoNode.id nodeId, umbracoUser.id userId, umbracoNode.nodeObjectType, umbracoUser2NodeNotify.action")
.From<User2NodeNotifyDto>()
.InnerJoin<NodeDto>().On<User2NodeNotifyDto, NodeDto>(left => left.NodeId, right => right.NodeId)
.InnerJoin<UserDto>().On<User2NodeNotifyDto, UserDto>(left => left.UserId, right => right.Id)
.Where<NodeDto>(x => x.NodeObjectType == objectType)
.Where<UserDto>(x => x.Disabled == false) // only approved users
.Where<User2NodeNotifyDto>(x => x.Action == action); // on the specified action
if (nodeIdsA.Length > 0)
sql
.WhereIn<NodeDto>(x => x.NodeId, nodeIdsA); // for the specified nodes
sql
.OrderBy<UserDto>(x => x.Id)
.OrderBy<NodeDto>(dto => dto.NodeId);
return AmbientScope.Database.Fetch<UserNotificationDto>(sql).Select(x => new Notification(x.NodeId, x.UserId, x.Action, objectType));
}
public IEnumerable<Notification> GetUserNotifications(IUser user)
{
2017-12-14 17:04:44 +01:00
var sql = AmbientScope.SqlContext.Sql()
.Select("DISTINCT umbracoNode.id AS nodeId, umbracoUser2NodeNotify.userId, umbracoNode.nodeObjectType, umbracoUser2NodeNotify.action")
.From<User2NodeNotifyDto>()
.InnerJoin<NodeDto>()
.On<User2NodeNotifyDto, NodeDto>(dto => dto.NodeId, dto => dto.NodeId)
.Where<User2NodeNotifyDto>(dto => dto.UserId == (int)user.Id)
.OrderBy<NodeDto>(dto => dto.NodeId);
var dtos = AmbientScope.Database.Fetch<UserNotificationDto>(sql);
//need to map the results
return dtos.Select(d => new Notification(d.NodeId, d.UserId, d.Action, d.NodeObjectType)).ToList();
}
public IEnumerable<Notification> SetNotifications(IUser user, IEntity entity, string[] actions)
{
DeleteNotifications(user, entity);
return actions.Select(action => CreateNotification(user, entity, action)).ToList();
}
public IEnumerable<Notification> GetEntityNotifications(IEntity entity)
{
2017-12-14 17:04:44 +01:00
var sql = AmbientScope.SqlContext.Sql()
.Select("DISTINCT umbracoNode.id as nodeId, umbracoUser2NodeNotify.userId, umbracoNode.nodeObjectType, umbracoUser2NodeNotify.action")
.From<User2NodeNotifyDto>()
.InnerJoin<NodeDto>()
.On<User2NodeNotifyDto, NodeDto>(dto => dto.NodeId, dto => dto.NodeId)
.Where<User2NodeNotifyDto>(dto => dto.NodeId == entity.Id)
.OrderBy<NodeDto>(dto => dto.NodeId);
var dtos = AmbientScope.Database.Fetch<UserNotificationDto>(sql);
//need to map the results
return dtos.Select(d => new Notification(d.NodeId, d.UserId, d.Action, d.NodeObjectType)).ToList();
}
public int DeleteNotifications(IEntity entity)
{
2017-12-14 17:04:44 +01:00
return AmbientScope.Database.Delete<User2NodeNotifyDto>("WHERE nodeId = @nodeId", new { nodeId = entity.Id });
}
public int DeleteNotifications(IUser user)
{
2017-12-14 17:04:44 +01:00
return AmbientScope.Database.Delete<User2NodeNotifyDto>("WHERE userId = @userId", new { userId = user.Id });
}
public int DeleteNotifications(IUser user, IEntity entity)
{
// delete all settings on the node for this user
2017-12-14 17:04:44 +01:00
return AmbientScope.Database.Delete<User2NodeNotifyDto>("WHERE userId = @userId AND nodeId = @nodeId", new { userId = user.Id, nodeId = entity.Id });
}
public Notification CreateNotification(IUser user, IEntity entity, string action)
{
2017-12-14 17:04:44 +01:00
var sql = AmbientScope.SqlContext.Sql()
.Select("DISTINCT nodeObjectType")
.From<NodeDto>()
.Where<NodeDto>(nodeDto => nodeDto.NodeId == entity.Id);
2017-12-14 17:04:44 +01:00
var nodeType = AmbientScope.Database.ExecuteScalar<Guid>(sql);
2017-09-22 15:23:46 +02:00
var dto = new User2NodeNotifyDto
{
Action = action,
NodeId = entity.Id,
2017-09-22 15:23:46 +02:00
UserId = user.Id
};
2017-12-14 17:04:44 +01:00
AmbientScope.Database.Insert(dto);
return new Notification(dto.NodeId, dto.UserId, dto.Action, nodeType);
}
}
2017-07-20 11:21:28 +02:00
}