Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
46 changes: 24 additions & 22 deletions API/Controllers/BooksController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -26,19 +26,19 @@ public BooksController(IUnitOfWork unitOfWork, IBibliotekaNarodowaBooksService b
}

[HttpPost]
public async Task<ActionResult<BookWithOwnerDto>> AddBookToCollection(AddBookDto addBookDto)
public async Task<ActionResult<BookWithOwnerDto>> AddBookToCollection(AddBookDto addBookDto, CancellationToken ct)
{
var userId = User.GetUserId();
var existingBook = await _unitOfWork.Books.GetBookByIsbnAsync(addBookDto.ISBN);
var existingBook = await _unitOfWork.Books.GetBookByIsbnAsync(addBookDto.ISBN, ct);

if (existingBook is not null)
{
if (await _unitOfWork.Books.UserOwnsBookAsync(userId, addBookDto.ISBN))
if (await _unitOfWork.Books.UserOwnsBookAsync(userId, addBookDto.ISBN, ct))
return BadRequest("You already own this book.");

var userBook = await _unitOfWork.Books.AddUserBookAsync(userId, addBookDto.ISBN, addBookDto.Notes);
var userBook = await _unitOfWork.Books.AddUserBookAsync(userId, addBookDto.ISBN, addBookDto.Notes, ct);

if (await _unitOfWork.CompleteAsync())
if (await _unitOfWork.CompleteAsync(ct))
{
var result = new BookWithOwnerDto
{
Expand All @@ -62,18 +62,18 @@ public async Task<ActionResult<BookWithOwnerDto>> AddBookToCollection(AddBookDto
// If book doesn't exist in db, try to fetch from Biblioteka Narodowa API
try
{
var bookFromApi = await _bibliotekaNarodowaBooksService.GetBookByIsbnAsync(addBookDto.ISBN);
var bookFromApi = await _bibliotekaNarodowaBooksService.GetBookByIsbnAsync(addBookDto.ISBN, ct);

if (bookFromApi is null)
return NotFound("Book not found in external API, please provide the book details manually.");

var newBook = bookFromApi.ToBook(BookSource.BibliotekaNarodowa);

await _unitOfWork.Books.AddBookAsync(newBook);
await _unitOfWork.Books.AddBookAsync(newBook, ct);

var userBook = await _unitOfWork.Books.AddUserBookAsync(userId, addBookDto.ISBN, addBookDto.Notes);
var userBook = await _unitOfWork.Books.AddUserBookAsync(userId, addBookDto.ISBN, addBookDto.Notes, ct);

if (await _unitOfWork.CompleteAsync())
if (await _unitOfWork.CompleteAsync(ct))
{
var result = new BookWithOwnerDto
{
Expand Down Expand Up @@ -101,25 +101,25 @@ public async Task<ActionResult<BookWithOwnerDto>> AddBookToCollection(AddBookDto
}

[HttpPost("manual")]
public async Task<ActionResult<BookWithOwnerDto>> AddBookManually(AddBookManualDto addBookManualDto)
public async Task<ActionResult<BookWithOwnerDto>> AddBookManually(AddBookManualDto addBookManualDto, CancellationToken ct)
{
var userId = User.GetUserId();

if (await _unitOfWork.Books.UserOwnsBookAsync(userId, addBookManualDto.ISBN))
if (await _unitOfWork.Books.UserOwnsBookAsync(userId, addBookManualDto.ISBN, ct))
return BadRequest("You already own this book.");

var existingBook = await _unitOfWork.Books.GetBookByIsbnAsync(addBookManualDto.ISBN);
var existingBook = await _unitOfWork.Books.GetBookByIsbnAsync(addBookManualDto.ISBN, ct);

if (existingBook is null)
{
var newBook = addBookManualDto.ToBook(BookSource.Users);

await _unitOfWork.Books.AddBookAsync(newBook);
await _unitOfWork.Books.AddBookAsync(newBook, ct);
}

var userBook = await _unitOfWork.Books.AddUserBookAsync(userId, addBookManualDto.ISBN, addBookManualDto.Notes);
var userBook = await _unitOfWork.Books.AddUserBookAsync(userId, addBookManualDto.ISBN, addBookManualDto.Notes, ct);

if (await _unitOfWork.CompleteAsync())
if (await _unitOfWork.CompleteAsync(ct))
{
var result = new BookWithOwnerDto
{
Expand All @@ -143,11 +143,11 @@ public async Task<ActionResult<BookWithOwnerDto>> AddBookManually(AddBookManualD
}

[HttpGet]
public async Task<ActionResult<IEnumerable<BookDto>>> GetMyBooks([FromQuery] ElementParams elementParams)
public async Task<ActionResult<IEnumerable<BookDto>>> GetMyBooks([FromQuery] ElementParams elementParams, CancellationToken ct)
{
var userId = User.GetUserId();

var userBooks = await _unitOfWork.Books.GetUserBooksAsync(userId, elementParams);
var userBooks = await _unitOfWork.Books.GetUserBooksAsync(userId, elementParams, ct);

Response.AddPaginationHeader(userBooks.CurrentPage, userBooks.PageSize,
userBooks.TotalCount, userBooks.TotalPages);
Expand All @@ -156,16 +156,17 @@ public async Task<ActionResult<IEnumerable<BookDto>>> GetMyBooks([FromQuery] Ele
}

[HttpGet("friends/{friendId}")]
public async Task<ActionResult<IEnumerable<BookDto>>> GetFriendBooks(Guid friendId, [FromQuery] ElementParams elementParams)
public async Task<ActionResult<IEnumerable<BookDto>>> GetFriendBooks(Guid friendId, [FromQuery] ElementParams elementParams,
CancellationToken ct)
{
var userId = User.GetUserId();

var isFriend = await _unitOfWork.Friendships.AreFriendsAsync(userId, friendId);
var isFriend = await _unitOfWork.Friendships.AreFriendsAsync(userId, friendId, ct);

if (!isFriend)
return BadRequest("You can only view books of your friends.");

var friendBooks = await _unitOfWork.Books.GetUserBooksAsync(friendId, elementParams);
var friendBooks = await _unitOfWork.Books.GetUserBooksAsync(friendId, elementParams, ct);

Response.AddPaginationHeader(friendBooks.CurrentPage, friendBooks.PageSize,
friendBooks.TotalCount, friendBooks.TotalPages);
Expand All @@ -174,11 +175,12 @@ public async Task<ActionResult<IEnumerable<BookDto>>> GetFriendBooks(Guid friend
}

[HttpGet("search-friends")]
public async Task<ActionResult<IEnumerable<BookDto>>> SearchBooks([FromQuery] string query, [FromQuery] ElementParams elementParams)
public async Task<ActionResult<IEnumerable<BookDto>>> SearchBooks([FromQuery] string query, [FromQuery] ElementParams elementParams,
CancellationToken ct)
{
var userId = User.GetUserId();

var books = await _unitOfWork.Books.SearchFriendsBooksAsync(userId, query, elementParams);
var books = await _unitOfWork.Books.SearchFriendsBooksAsync(userId, query, elementParams, ct);

Response.AddPaginationHeader(books.CurrentPage, books.PageSize,
books.TotalCount, books.TotalPages);
Expand Down
39 changes: 20 additions & 19 deletions API/Controllers/FriendsController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -20,93 +20,93 @@ public FriendsController(IUnitOfWork unitOfWork)
}

[HttpPost("request/{friendId}")]
public async Task<ActionResult> SendFriendRequest(Guid friendId)
public async Task<ActionResult> SendFriendRequest(Guid friendId, CancellationToken ct)
{
var userId = User.GetUserId();

if (userId == friendId)
return BadRequest("Cannot send friend request to yourself");

var result = await _unitOfWork.Friendships.SendFriendRequestAsync(userId, friendId);
var result = await _unitOfWork.Friendships.SendFriendRequestAsync(userId, friendId, ct);

if (!result)
return BadRequest("Friend request already exists or user is already a friend");

await _unitOfWork.CompleteAsync();
await _unitOfWork.CompleteAsync(ct);

return Ok();
}

[HttpDelete("request/{friendshipId}/cancel")]
public async Task<ActionResult> CancelFriendRequest(Guid friendshipId)
public async Task<ActionResult> CancelFriendRequest(Guid friendshipId, CancellationToken ct)
{
var userId = User.GetUserId();

var success = await _unitOfWork.Friendships.CancelFriendRequestAsync(userId, friendshipId);
var success = await _unitOfWork.Friendships.CancelFriendRequestAsync(userId, friendshipId, ct);

if (!success)
return NotFound("Friend request not found or you don't have permission to cancel it");

if (await _unitOfWork.CompleteAsync())
if (await _unitOfWork.CompleteAsync(ct))
return NoContent();

return BadRequest("Failed to cancel friend request");
}

[HttpPut("accept/{friendshipId}")]
public async Task<ActionResult> AcceptFriendRequest(Guid friendshipId)
public async Task<ActionResult> AcceptFriendRequest(Guid friendshipId, CancellationToken ct)
{
var userId = User.GetUserId();

var friendship = await _unitOfWork.Friendships.GetFriendshipByIdAsync(friendshipId);
var friendship = await _unitOfWork.Friendships.GetFriendshipByIdAsync(friendshipId, ct);

if (friendship == null || friendship.ReceiverId != userId)
return NotFound();

friendship.Status = FriendshipStatus.Accepted;
await _unitOfWork.CompleteAsync();
await _unitOfWork.CompleteAsync(ct);

return Ok();
}

[HttpPut("decline/{friendshipId}")]
public async Task<ActionResult> DeclineFriendRequest(Guid friendshipId)
public async Task<ActionResult> DeclineFriendRequest(Guid friendshipId, CancellationToken ct)
{
var userId = User.GetUserId();

var friendship = await _unitOfWork.Friendships.GetFriendshipByIdAsync(friendshipId);
var friendship = await _unitOfWork.Friendships.GetFriendshipByIdAsync(friendshipId, ct);

if (friendship == null || friendship.ReceiverId != userId)
return NotFound();

friendship.Status = FriendshipStatus.Declined;
await _unitOfWork.CompleteAsync();
await _unitOfWork.CompleteAsync(ct);

return Ok();
}

[HttpDelete("{friendId}")]
public async Task<ActionResult> RemoveFriend(Guid friendId)
public async Task<ActionResult> RemoveFriend(Guid friendId, CancellationToken ct)
{
var userId = User.GetUserId();

var success = await _unitOfWork.Friendships.RemoveFriendAsync(userId, friendId);
var success = await _unitOfWork.Friendships.RemoveFriendAsync(userId, friendId, ct);

if (!success)
return NotFound("Friendship not found");

if (await _unitOfWork.CompleteAsync())
if (await _unitOfWork.CompleteAsync(ct))
return NoContent();

return BadRequest("Failed to remove friend");
}

[HttpGet]
public async Task<ActionResult<IEnumerable<FriendDto>>> GetFriends([FromQuery] ElementParams elementParams)
public async Task<ActionResult<IEnumerable<FriendDto>>> GetFriends([FromQuery] ElementParams elementParams, CancellationToken ct)
{
var userId = User.GetUserId();

var friends = await _unitOfWork.Friendships.GetUserFriendsAsync(userId, elementParams);
var friends = await _unitOfWork.Friendships.GetUserFriendsAsync(userId, elementParams, ct);

Response.AddPaginationHeader(friends.CurrentPage, friends.PageSize,
friends.TotalCount, friends.TotalPages);
Expand All @@ -115,11 +115,12 @@ public async Task<ActionResult<IEnumerable<FriendDto>>> GetFriends([FromQuery] E
}

[HttpGet("requests")]
public async Task<ActionResult<IEnumerable<FriendRequestDto>>> GetPendingRequests([FromQuery] ElementParams elementParams)
public async Task<ActionResult<IEnumerable<FriendRequestDto>>> GetPendingRequests([FromQuery] ElementParams elementParams,
CancellationToken ct)
{
var userId = User.GetUserId();

var requests = await _unitOfWork.Friendships.GetPendingRequestsAsync(userId, elementParams);
var requests = await _unitOfWork.Friendships.GetPendingRequestsAsync(userId, elementParams, ct);

Response.AddPaginationHeader(requests.CurrentPage, requests.PageSize,
requests.TotalCount, requests.TotalPages);
Expand Down
Loading
Loading