using Microsoft.Extensions.Localization; using PrivaPub.ClientModels; using PrivaPub.Models.User; using PrivaPub.Resources; using PrivaPub.StaticServices; namespace PrivaPub.Services.ClientToServer.Public { public interface IPublicAvatarUsersService { Task GetLocalAvatar(UserPolicyType userPolicyType, string actor, CancellationToken token); Task> GetLocalAvatars(UserPolicyType userPolicyType, CancellationToken token); Task GetForeignAvatar(UserPolicyType userPolicyType, string actor, CancellationToken token); Task> GetForeignAvatars(UserPolicyType userPolicyType, CancellationToken token); Task> GetRootAvatars(string rootUserId, CancellationToken token); } public class PublicAvatarUsersService : IPublicAvatarUsersService { readonly DbEntities _dbEntities; readonly IStringLocalizer _localizer; readonly ILogger _logger; public PublicAvatarUsersService(DbEntities dbEntities, IStringLocalizer localizer, ILogger logger) { _dbEntities = dbEntities; _localizer = localizer; _logger = logger; } public async Task GetLocalAvatar(UserPolicyType userPolicyType, string actor, CancellationToken token) { var result = new WebResult(); try { var query = _dbEntities.Avatars; switch (userPolicyType) { case UserPolicyType.IsUser: query.Match(a => !a.DeletionAt.HasValue && a.UserName == actor); break; case UserPolicyType.IsModerator: query.Match(a => !a.DeletionAt.HasValue && a.UserName == actor); break; case UserPolicyType.IsAdmin: query.Match(a => a.UserName == actor); break; } var avatar = await query.ExecuteFirstAsync(token); if (avatar == default) return result.Invalidate(_localizer["User '{0}' not found.", actor], StatusCodes.Status404NotFound); result.Data = avatar; return result; } catch (Exception ex) { _logger.LogError(ex, $"{nameof(PublicAvatarUsersService)}.{nameof(GetLocalAvatar)}"); return result.Invalidate(_localizer["Error: {0}", ex.ToString()], exception: ex); } } public async Task> GetLocalAvatars(UserPolicyType userPolicyType, CancellationToken token) { try { var query = _dbEntities.Avatars; switch (userPolicyType) { case UserPolicyType.IsUser: query.Match(a => !a.DeletionAt.HasValue); break; case UserPolicyType.IsModerator: query.Match(a => !a.DeletionAt.HasValue); break; case UserPolicyType.IsAdmin: break; } var avatars = await query.ExecuteAsync(token); return avatars; } catch (Exception ex) { _logger.LogError(ex, $"{nameof(PublicAvatarUsersService)}.{nameof(GetLocalAvatars)}"); return Enumerable.Empty(); } } public async Task GetForeignAvatar(UserPolicyType userPolicyType, string actor, CancellationToken token) { var result = new WebResult(); try { var query = _dbEntities.ForeignAvatars; switch (userPolicyType) { case UserPolicyType.IsUser: query.Match(a => !a.DeletionAt.HasValue && a.UserName == actor); break; case UserPolicyType.IsModerator: query.Match(a => !a.DeletionAt.HasValue && a.UserName == actor); break; case UserPolicyType.IsAdmin: query.Match(a => a.UserName == actor); break; } var avatar = await query.ExecuteFirstAsync(token); if (avatar == default) return result.Invalidate(_localizer["User '{0}' not found.", actor], StatusCodes.Status404NotFound); result.Data = avatar; return result; } catch (Exception ex) { _logger.LogError(ex, $"{nameof(PublicAvatarUsersService)}.{nameof(GetForeignAvatar)}"); return result.Invalidate(_localizer["Error: {0}", ex.ToString()], exception: ex); } } public async Task> GetForeignAvatars(UserPolicyType userPolicyType, CancellationToken token) { try { var query = _dbEntities.ForeignAvatars; switch (userPolicyType) { case UserPolicyType.IsUser: query.Match(a => !a.DeletionAt.HasValue); break; case UserPolicyType.IsModerator: query.Match(a => !a.DeletionAt.HasValue); break; case UserPolicyType.IsAdmin: break; } var foreignAvatars = await query.ExecuteAsync(token); return foreignAvatars; } catch (Exception ex) { _logger.LogError(ex, $"{nameof(PublicAvatarUsersService)}.{nameof(GetForeignAvatars)}"); return Enumerable.Empty(); } } public async Task> GetRootAvatars(string rootUserId, CancellationToken token) { try { var rootUser = _dbEntities.RootUsers.MatchID(rootUserId).ExecuteFirstAsync(token); if (rootUser == default) return Enumerable.Empty(); var rootToAvatars = await _dbEntities.RootToAvatars.Match(ra => ra.RootId == rootUserId).ExecuteAsync(token); if (rootToAvatars.Count == 0) return Enumerable.Empty(); var avatarIds = rootToAvatars.Select(ra => ra.AvatarId).ToArray(); var avatars = await _dbEntities.Avatars .Match(a => avatarIds.Contains(a.ID)) .ProjectExcluding(a => a.Settings) .ExecuteAsync(token); return avatars; } catch (Exception ex) { _logger.LogError(ex, $"{nameof(PublicAvatarUsersService)}.{nameof(GetRootAvatars)}"); return Enumerable.Empty(); } } } }