aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/DevHive.Data/Repositories/FriendsRepository.cs38
-rw-r--r--src/DevHive.Data/Repositories/UserRepository.cs8
-rw-r--r--src/DevHive.Services/Services/FriendsService.cs70
-rw-r--r--src/DevHive.Services/Services/UserService.cs18
-rw-r--r--src/DevHive.Web/Controllers/FriendsController.cs59
-rw-r--r--src/DevHive.Web/Controllers/UserController.cs9
6 files changed, 168 insertions, 34 deletions
diff --git a/src/DevHive.Data/Repositories/FriendsRepository.cs b/src/DevHive.Data/Repositories/FriendsRepository.cs
new file mode 100644
index 0000000..c65ba5e
--- /dev/null
+++ b/src/DevHive.Data/Repositories/FriendsRepository.cs
@@ -0,0 +1,38 @@
+using System;
+using System.Linq;
+using System.Threading.Tasks;
+using DevHive.Common.Models.Data;
+using DevHive.Data.Models;
+using Microsoft.EntityFrameworkCore;
+
+namespace DevHive.Data.Repositories
+{
+ public class FriendsRepository : UserRepository
+ {
+ private readonly DbContext _context;
+
+ public FriendsRepository(DbContext context)
+ : base(context)
+ {
+ this._context = context;
+ }
+
+ //Create
+ public async Task<bool> AddFriendAsync(User user, User friend)
+ {
+ this._context.Update(user);
+ user.Friends.Add(friend);
+
+ return await RepositoryMethods.SaveChangesAsync(this._context);
+ }
+
+ //Delete
+ public async Task<bool> RemoveFriendAsync(User user, User friend)
+ {
+ this._context.Update(user);
+ user.Friends.Remove(friend);
+
+ return await RepositoryMethods.SaveChangesAsync(this._context);
+ }
+ }
+} \ No newline at end of file
diff --git a/src/DevHive.Data/Repositories/UserRepository.cs b/src/DevHive.Data/Repositories/UserRepository.cs
index 577f02f..6d14a65 100644
--- a/src/DevHive.Data/Repositories/UserRepository.cs
+++ b/src/DevHive.Data/Repositories/UserRepository.cs
@@ -116,13 +116,5 @@ namespace DevHive.Data.Repositories
.AsNoTracking()
.AnyAsync(u => u.Email == email);
}
-
- public async Task<bool> AddFriend(User user, User friend)
- {
- this._context.Update(user);
- user.Friends.Add(friend);
-
- return await RepositoryMethods.SaveChangesAsync(this._context);
- }
}
}
diff --git a/src/DevHive.Services/Services/FriendsService.cs b/src/DevHive.Services/Services/FriendsService.cs
new file mode 100644
index 0000000..21a2aac
--- /dev/null
+++ b/src/DevHive.Services/Services/FriendsService.cs
@@ -0,0 +1,70 @@
+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<bool> 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<UserServiceModel> 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<UserServiceModel>(friend);
+ }
+
+ public async Task<bool> 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;
+ }
+ }
+} \ No newline at end of file
diff --git a/src/DevHive.Services/Services/UserService.cs b/src/DevHive.Services/Services/UserService.cs
index 3e65dab..6f69d6d 100644
--- a/src/DevHive.Services/Services/UserService.cs
+++ b/src/DevHive.Services/Services/UserService.cs
@@ -72,13 +72,7 @@ namespace DevHive.Services.Services
User user = await this._userRepository.GetByIdAsync(id)
?? throw new ArgumentException("User does not exist!");
- //Here User has 1 role
-
- UserServiceModel model = this._userMapper.Map<UserServiceModel>(user);
-
- //here model has 0 roles
-
- return model;
+ return this._userMapper.Map<UserServiceModel>(user);
}
public async Task<UserServiceModel> UpdateUser(UpdateUserServiceModel updateModel)
@@ -111,16 +105,6 @@ namespace DevHive.Services.Services
throw new InvalidOperationException("Unable to delete user!");
}
- public async Task<bool> AddFriend(Guid userId, Guid friendId)
- {
- User user = await this._userRepository.GetByIdAsync(userId);
- User friend = await this._userRepository.GetByIdAsync(friendId);
-
- return user != default(User) && friend != default(User) ?
- await this._userRepository.AddFriend(user, friend) :
- throw new ArgumentException("Invalid user!");
- }
-
private string GeneratePasswordHash(string password)
{
return string.Join(string.Empty, SHA512.HashData(Encoding.ASCII.GetBytes(password)));
diff --git a/src/DevHive.Web/Controllers/FriendsController.cs b/src/DevHive.Web/Controllers/FriendsController.cs
new file mode 100644
index 0000000..1c69bc3
--- /dev/null
+++ b/src/DevHive.Web/Controllers/FriendsController.cs
@@ -0,0 +1,59 @@
+using System;
+using System.Threading.Tasks;
+using AutoMapper;
+using DevHive.Common.Models;
+using DevHive.Data.Repositories;
+using DevHive.Services.Models.Identity.User;
+using DevHive.Services.Options;
+using DevHive.Services.Services;
+using DevHive.Web.Models.Identity.User;
+using Microsoft.AspNetCore.Authorization;
+using Microsoft.AspNetCore.Mvc;
+
+namespace DevHive.Web.Controllers
+{
+ [ApiController]
+ [Authorize(Roles = "User")]
+ public class FriendsController : UserController
+ {
+ private readonly FriendsService _friendsService;
+ private readonly IMapper _friendsMapper;
+
+ public FriendsController(DevHiveContext context, IMapper mapper, JWTOptions jwtOptions)
+ : base(context, mapper, jwtOptions)
+ {
+ this._friendsService = new FriendsService(context, mapper, jwtOptions);
+ this._friendsMapper = mapper;
+ }
+
+ //Create
+ [HttpPost]
+ [Route("AddAFriend")]
+ public async Task<IActionResult> AddAFriend(Guid userId, [FromBody] IdModel friendIdModel)
+ {
+ return await this._friendsService.AddFriend(userId, friendIdModel.Id) ?
+ new OkResult() :
+ new BadRequestResult();
+ }
+
+ //Read
+ [HttpGet]
+ [Route("GetAFriend")]
+ public async Task<IActionResult> GetAFriend(Guid friendId)
+ {
+ UserServiceModel friendServiceModel = await this._friendsService.GetFriendById(friendId);
+ UserWebModel friend = this._friendsMapper.Map<UserWebModel>(friendServiceModel);
+
+ return new OkObjectResult(friend);
+ }
+
+ //Delete
+ [HttpDelete]
+ [Route("GetAFriend")]
+ public async Task<IActionResult> RemoveAFriend(Guid userId, Guid friendId)
+ {
+ await this._friendsService.RemoveFriend(userId, friendId);
+ return new OkResult();
+ }
+ }
+} \ No newline at end of file
diff --git a/src/DevHive.Web/Controllers/UserController.cs b/src/DevHive.Web/Controllers/UserController.cs
index cdb8dc1..e339f70 100644
--- a/src/DevHive.Web/Controllers/UserController.cs
+++ b/src/DevHive.Web/Controllers/UserController.cs
@@ -54,15 +54,6 @@ namespace DevHive.Web.Controllers
return new CreatedResult("Register", tokenWebModel);
}
- [HttpPost]
- [Route("AddAFriend")]
- public async Task<IActionResult> AddAFriend(Guid userId, [FromBody] IdModel friendIdModel)
- {
- return await this._userService.AddFriend(userId, friendIdModel.Id) ?
- new OkResult() :
- new BadRequestResult();
- }
-
//Read
[HttpGet]
public async Task<IActionResult> GetById(Guid id)