using System; using System.Threading.Tasks; using AutoMapper; using DevHive.Data.Models; using DevHive.Data.Repositories; using DevHive.Services.Models.Identity.User; using DevHive.Services.Options; namespace DevHive.Services.Services { public class FriendsService : UserService { private readonly FriendsRepository _friendsRepository; private readonly IMapper _friendsMapper; public FriendsService(DevHiveContext context, IMapper mapper, JWTOptions jwtOptions) : base(context, mapper, jwtOptions) { this._friendsRepository = new FriendsRepository(context); this._friendsMapper = mapper; } //Create public async Task AddFriend(Guid userId, Guid friendId) { User user = await this._friendsRepository.GetByIdAsync(userId); User friend = await this._friendsRepository.GetByIdAsync(friendId); return user != default(User) && friend != default(User) ? await this._friendsRepository.AddFriendAsync(user, friend) : throw new ArgumentException("Invalid user!"); } //Read public async Task GetFriendById(Guid friendId) { if(!_friendsRepository.DoesUserExist(friendId)) throw new ArgumentException("User does not exist!"); User friend = await this._friendsRepository.GetByIdAsync(friendId); return this._friendsMapper.Map(friend); } public async Task RemoveFriend(Guid userId, Guid friendId) { if(!this._friendsRepository.DoesUserExist(userId) && !this._friendsRepository.DoesUserExist(friendId)) throw new ArgumentException("Invalid user!"); User user = await this._friendsRepository.GetByIdAsync(userId); if(!this.DoesUserHaveFriends(user)) throw new ArgumentException("User does not have any friends."); return await this.RemoveFriend(user.Id, friendId); } //Validation private bool DoesUserHaveThisFriend(User user, User friend) { return user.Friends.Contains(friend); } private bool DoesUserHaveFriends(User user) { return user.Friends.Count >= 1; } } }