From 466324fb47b84709f0621e98afc82c9b548f0a19 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanis=C5=82aw?= <62651497+staszkiet@users.noreply.github.com> Date: Sun, 30 Mar 2025 15:21:15 +0200 Subject: [PATCH 1/7] Add service repository and controller classes to categories folder --- .../Abstractions/ICategoryRepository.cs | 9 ++++++++ .../Abstractions/ICategoryService.cs | 9 ++++++++ .../Controllers/CategoryController.cs | 16 ++++++++++++++ .../Respositories/CategoryRepository.cs | 21 +++++++++++++++++++ .../Categories/Services/CategoryService.cs | 20 ++++++++++++++++++ 5 files changed, 75 insertions(+) create mode 100644 TickAPI/TickAPI/Categories/Abstractions/ICategoryRepository.cs create mode 100644 TickAPI/TickAPI/Categories/Abstractions/ICategoryService.cs create mode 100644 TickAPI/TickAPI/Categories/Controllers/CategoryController.cs create mode 100644 TickAPI/TickAPI/Categories/Respositories/CategoryRepository.cs create mode 100644 TickAPI/TickAPI/Categories/Services/CategoryService.cs diff --git a/TickAPI/TickAPI/Categories/Abstractions/ICategoryRepository.cs b/TickAPI/TickAPI/Categories/Abstractions/ICategoryRepository.cs new file mode 100644 index 0000000..1e5d8cb --- /dev/null +++ b/TickAPI/TickAPI/Categories/Abstractions/ICategoryRepository.cs @@ -0,0 +1,9 @@ +using TickAPI.Categories.Models; +using TickAPI.Common.Results.Generic; + +namespace TickAPI.Categories.Abstractions; + +public interface ICategoryRepository +{ + public Task>> GetCategoriesAsync(); +} \ No newline at end of file diff --git a/TickAPI/TickAPI/Categories/Abstractions/ICategoryService.cs b/TickAPI/TickAPI/Categories/Abstractions/ICategoryService.cs new file mode 100644 index 0000000..dc74fc2 --- /dev/null +++ b/TickAPI/TickAPI/Categories/Abstractions/ICategoryService.cs @@ -0,0 +1,9 @@ +using TickAPI.Categories.Models; +using TickAPI.Common.Results.Generic; + +namespace TickAPI.Categories.Abstractions; + +public interface ICategoryService +{ + public Task>> GetCategoriesAsync(); +} \ No newline at end of file diff --git a/TickAPI/TickAPI/Categories/Controllers/CategoryController.cs b/TickAPI/TickAPI/Categories/Controllers/CategoryController.cs new file mode 100644 index 0000000..3ffb38a --- /dev/null +++ b/TickAPI/TickAPI/Categories/Controllers/CategoryController.cs @@ -0,0 +1,16 @@ +using Microsoft.AspNetCore.Mvc; +using TickAPI.Categories.Models; + +namespace TickAPI.Categories.Controllers; + +[ApiController] +[Route("api/[controller]")] + +public class CategoryController : Controller +{ + [HttpPost("get-categories")] + public async Task> GetCategories() + { + throw new NotImplementedException(); + } +} \ No newline at end of file diff --git a/TickAPI/TickAPI/Categories/Respositories/CategoryRepository.cs b/TickAPI/TickAPI/Categories/Respositories/CategoryRepository.cs new file mode 100644 index 0000000..7bc9346 --- /dev/null +++ b/TickAPI/TickAPI/Categories/Respositories/CategoryRepository.cs @@ -0,0 +1,21 @@ +using Microsoft.EntityFrameworkCore; +using TickAPI.Categories.Abstractions; +using TickAPI.Categories.Models; +using TickAPI.Common.Results.Generic; +using TickAPI.Common.TickApiDbContext; +namespace TickAPI.Categories.Respositories; + +public class CategoryRepository : ICategoryRepository +{ + private readonly TickApiDbContext _tickApiDbContext; + + public CategoryRepository(TickApiDbContext tickApiDbContext) + { + _tickApiDbContext = tickApiDbContext; + } + + public async Task>> GetCategoriesAsync() + { + throw new NotImplementedException(); + } +} \ No newline at end of file diff --git a/TickAPI/TickAPI/Categories/Services/CategoryService.cs b/TickAPI/TickAPI/Categories/Services/CategoryService.cs new file mode 100644 index 0000000..3e20024 --- /dev/null +++ b/TickAPI/TickAPI/Categories/Services/CategoryService.cs @@ -0,0 +1,20 @@ +using TickAPI.Categories.Abstractions; +using TickAPI.Categories.Models; +using TickAPI.Common.Results.Generic; + +namespace TickAPI.Categories.Services; + +public class CategoryService : ICategoryRepository +{ + private readonly ICategoryRepository _categoryRepository; + + public CategoryService(ICategoryRepository categoryRepository) + { + _categoryRepository = categoryRepository; + } + + public Task>> GetCategoriesAsync() + { + throw new NotImplementedException(); + } +} \ No newline at end of file From 60544d2d6736d4ff2bf518e91141b44e6765b8c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanis=C5=82aw?= <62651497+staszkiet@users.noreply.github.com> Date: Sun, 30 Mar 2025 15:22:40 +0200 Subject: [PATCH 2/7] Add missing files --- .../Categories/Controllers/CategoryController.cs | 13 +++++++++++++ .../TickAPI/Categories/Services/CategoryService.cs | 2 +- TickAPI/TickAPI/Program.cs | 7 +++++++ 3 files changed, 21 insertions(+), 1 deletion(-) diff --git a/TickAPI/TickAPI/Categories/Controllers/CategoryController.cs b/TickAPI/TickAPI/Categories/Controllers/CategoryController.cs index 3ffb38a..4037416 100644 --- a/TickAPI/TickAPI/Categories/Controllers/CategoryController.cs +++ b/TickAPI/TickAPI/Categories/Controllers/CategoryController.cs @@ -1,5 +1,9 @@ using Microsoft.AspNetCore.Mvc; +using TickAPI.Categories.Abstractions; using TickAPI.Categories.Models; +using TickAPI.Common.Auth.Attributes; +using TickAPI.Common.Auth.Enums; +using TickAPI.Customers.Abstractions; namespace TickAPI.Categories.Controllers; @@ -8,6 +12,15 @@ namespace TickAPI.Categories.Controllers; public class CategoryController : Controller { + + private readonly ICategoryService _categoryService; + + public CategoryController(ICategoryService categoryService) + { + _categoryService = categoryService; + } + + [AuthorizeWithPolicy(AuthPolicies.VerifiedOrganizerPolicy)] [HttpPost("get-categories")] public async Task> GetCategories() { diff --git a/TickAPI/TickAPI/Categories/Services/CategoryService.cs b/TickAPI/TickAPI/Categories/Services/CategoryService.cs index 3e20024..addb0de 100644 --- a/TickAPI/TickAPI/Categories/Services/CategoryService.cs +++ b/TickAPI/TickAPI/Categories/Services/CategoryService.cs @@ -4,7 +4,7 @@ namespace TickAPI.Categories.Services; -public class CategoryService : ICategoryRepository +public class CategoryService : ICategoryService { private readonly ICategoryRepository _categoryRepository; diff --git a/TickAPI/TickAPI/Program.cs b/TickAPI/TickAPI/Program.cs index 2b0ffca..d4110fa 100644 --- a/TickAPI/TickAPI/Program.cs +++ b/TickAPI/TickAPI/Program.cs @@ -30,6 +30,9 @@ using TickAPI.Addresses.Abstractions; using TickAPI.Addresses.Repositories; using TickAPI.Addresses.Services; +using TickAPI.Categories.Abstractions; +using TickAPI.Categories.Respositories; +using TickAPI.Categories.Services; // Builder constants const string allowClientPolicyName = "AllowClient"; @@ -99,6 +102,10 @@ builder.Services.AddScoped(); builder.Services.AddScoped(); +// Add category services. +builder.Services.AddScoped(); +builder.Services.AddScoped(); + // Add common services. builder.Services.AddScoped(); builder.Services.AddScoped(); From a692167a1092d6ec6ef4fa2aa490eebbc5b114ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanis=C5=82aw?= <62651497+staszkiet@users.noreply.github.com> Date: Sun, 30 Mar 2025 16:15:34 +0200 Subject: [PATCH 3/7] Get categories working without pagination --- .../Categories/Abstractions/ICategoryService.cs | 5 +++-- .../Categories/Controllers/CategoryController.cs | 14 ++++++++++++-- .../Categories/DTOs/Response/GetCategoriesDto.cs | 5 +++++ .../Categories/Respositories/CategoryRepository.cs | 4 +++- .../TickAPI/Categories/Services/CategoryService.cs | 12 ++++++++++-- TickAPI/TickAPI/TickAPI.csproj | 4 ++++ 6 files changed, 37 insertions(+), 7 deletions(-) create mode 100644 TickAPI/TickAPI/Categories/DTOs/Response/GetCategoriesDto.cs diff --git a/TickAPI/TickAPI/Categories/Abstractions/ICategoryService.cs b/TickAPI/TickAPI/Categories/Abstractions/ICategoryService.cs index dc74fc2..78318f1 100644 --- a/TickAPI/TickAPI/Categories/Abstractions/ICategoryService.cs +++ b/TickAPI/TickAPI/Categories/Abstractions/ICategoryService.cs @@ -1,9 +1,10 @@ -using TickAPI.Categories.Models; +using TickAPI.Categories.DTOs.Response; +using TickAPI.Categories.Models; using TickAPI.Common.Results.Generic; namespace TickAPI.Categories.Abstractions; public interface ICategoryService { - public Task>> GetCategoriesAsync(); + public Task>> GetCategoriesAsync(); } \ No newline at end of file diff --git a/TickAPI/TickAPI/Categories/Controllers/CategoryController.cs b/TickAPI/TickAPI/Categories/Controllers/CategoryController.cs index 4037416..f41070a 100644 --- a/TickAPI/TickAPI/Categories/Controllers/CategoryController.cs +++ b/TickAPI/TickAPI/Categories/Controllers/CategoryController.cs @@ -1,8 +1,11 @@ using Microsoft.AspNetCore.Mvc; using TickAPI.Categories.Abstractions; +using TickAPI.Categories.DTOs.Response; using TickAPI.Categories.Models; using TickAPI.Common.Auth.Attributes; using TickAPI.Common.Auth.Enums; +using TickAPI.Common.Pagination.Abstractions; +using TickAPI.Common.Results.Generic; using TickAPI.Customers.Abstractions; namespace TickAPI.Categories.Controllers; @@ -14,6 +17,7 @@ public class CategoryController : Controller { private readonly ICategoryService _categoryService; + private readonly IPaginationService _paginationService; public CategoryController(ICategoryService categoryService) { @@ -22,8 +26,14 @@ public CategoryController(ICategoryService categoryService) [AuthorizeWithPolicy(AuthPolicies.VerifiedOrganizerPolicy)] [HttpPost("get-categories")] - public async Task> GetCategories() + public async Task>> GetCategories() { - throw new NotImplementedException(); + var res = await _categoryService.GetCategoriesAsync(); + if (!res.IsSuccess) + { + return StatusCode(StatusCodes.Status500InternalServerError, res.ErrorMsg); + } + + return Ok(res.Value); } } \ No newline at end of file diff --git a/TickAPI/TickAPI/Categories/DTOs/Response/GetCategoriesDto.cs b/TickAPI/TickAPI/Categories/DTOs/Response/GetCategoriesDto.cs new file mode 100644 index 0000000..c7a5980 --- /dev/null +++ b/TickAPI/TickAPI/Categories/DTOs/Response/GetCategoriesDto.cs @@ -0,0 +1,5 @@ +namespace TickAPI.Categories.DTOs.Response; + +public record GetCategoriesDto( + string CategoryName +); \ No newline at end of file diff --git a/TickAPI/TickAPI/Categories/Respositories/CategoryRepository.cs b/TickAPI/TickAPI/Categories/Respositories/CategoryRepository.cs index 7bc9346..ddd9b2a 100644 --- a/TickAPI/TickAPI/Categories/Respositories/CategoryRepository.cs +++ b/TickAPI/TickAPI/Categories/Respositories/CategoryRepository.cs @@ -1,6 +1,7 @@ using Microsoft.EntityFrameworkCore; using TickAPI.Categories.Abstractions; using TickAPI.Categories.Models; +using TickAPI.Common.Results; using TickAPI.Common.Results.Generic; using TickAPI.Common.TickApiDbContext; namespace TickAPI.Categories.Respositories; @@ -16,6 +17,7 @@ public CategoryRepository(TickApiDbContext tickApiDbContext) public async Task>> GetCategoriesAsync() { - throw new NotImplementedException(); + var list = await _tickApiDbContext.Categories.ToListAsync(); + return Result>.Success(list); } } \ No newline at end of file diff --git a/TickAPI/TickAPI/Categories/Services/CategoryService.cs b/TickAPI/TickAPI/Categories/Services/CategoryService.cs index addb0de..2edd516 100644 --- a/TickAPI/TickAPI/Categories/Services/CategoryService.cs +++ b/TickAPI/TickAPI/Categories/Services/CategoryService.cs @@ -1,5 +1,7 @@ using TickAPI.Categories.Abstractions; +using TickAPI.Categories.DTOs.Response; using TickAPI.Categories.Models; +using TickAPI.Common.Results; using TickAPI.Common.Results.Generic; namespace TickAPI.Categories.Services; @@ -13,8 +15,14 @@ public CategoryService(ICategoryRepository categoryRepository) _categoryRepository = categoryRepository; } - public Task>> GetCategoriesAsync() + public async Task>> GetCategoriesAsync() { - throw new NotImplementedException(); + var res = await _categoryRepository.GetCategoriesAsync(); + List categories = new List(); + foreach (var category in res.Value!) + { + categories.Add(new GetCategoriesDto(category.CategoryName)); + } + return Result>.Success(categories); } } \ No newline at end of file diff --git a/TickAPI/TickAPI/TickAPI.csproj b/TickAPI/TickAPI/TickAPI.csproj index 1e131f6..39a857b 100644 --- a/TickAPI/TickAPI/TickAPI.csproj +++ b/TickAPI/TickAPI/TickAPI.csproj @@ -20,6 +20,10 @@ + + + + From a8345437741c497c61695ec3fa4c9167c1367911 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanis=C5=82aw?= <62651497+staszkiet@users.noreply.github.com> Date: Sun, 30 Mar 2025 17:51:03 +0200 Subject: [PATCH 4/7] Get Categories with Pagination --- .../Abstractions/ICategoryRepository.cs | 2 +- .../Abstractions/ICategoryService.cs | 3 ++- .../Controllers/CategoryController.cs | 12 ++++------ .../DTOs/Response/GetCategoriesDto.cs | 4 +++- .../Respositories/CategoryRepository.cs | 5 ++--- .../Categories/Services/CategoryService.cs | 22 ++++++++++++++----- 6 files changed, 29 insertions(+), 19 deletions(-) diff --git a/TickAPI/TickAPI/Categories/Abstractions/ICategoryRepository.cs b/TickAPI/TickAPI/Categories/Abstractions/ICategoryRepository.cs index 1e5d8cb..8f998b0 100644 --- a/TickAPI/TickAPI/Categories/Abstractions/ICategoryRepository.cs +++ b/TickAPI/TickAPI/Categories/Abstractions/ICategoryRepository.cs @@ -5,5 +5,5 @@ namespace TickAPI.Categories.Abstractions; public interface ICategoryRepository { - public Task>> GetCategoriesAsync(); + public Task>> GetCategoriesAsync(); } \ No newline at end of file diff --git a/TickAPI/TickAPI/Categories/Abstractions/ICategoryService.cs b/TickAPI/TickAPI/Categories/Abstractions/ICategoryService.cs index 78318f1..9eb60c1 100644 --- a/TickAPI/TickAPI/Categories/Abstractions/ICategoryService.cs +++ b/TickAPI/TickAPI/Categories/Abstractions/ICategoryService.cs @@ -1,10 +1,11 @@ using TickAPI.Categories.DTOs.Response; using TickAPI.Categories.Models; +using TickAPI.Common.Pagination.Responses; using TickAPI.Common.Results.Generic; namespace TickAPI.Categories.Abstractions; public interface ICategoryService { - public Task>> GetCategoriesAsync(); + public Task>> GetCategoriesAsync(int pageSize, int page); } \ No newline at end of file diff --git a/TickAPI/TickAPI/Categories/Controllers/CategoryController.cs b/TickAPI/TickAPI/Categories/Controllers/CategoryController.cs index f41070a..88319ea 100644 --- a/TickAPI/TickAPI/Categories/Controllers/CategoryController.cs +++ b/TickAPI/TickAPI/Categories/Controllers/CategoryController.cs @@ -1,12 +1,10 @@ using Microsoft.AspNetCore.Mvc; using TickAPI.Categories.Abstractions; using TickAPI.Categories.DTOs.Response; -using TickAPI.Categories.Models; using TickAPI.Common.Auth.Attributes; using TickAPI.Common.Auth.Enums; -using TickAPI.Common.Pagination.Abstractions; -using TickAPI.Common.Results.Generic; -using TickAPI.Customers.Abstractions; +using TickAPI.Common.Pagination.Responses; + namespace TickAPI.Categories.Controllers; @@ -17,7 +15,6 @@ public class CategoryController : Controller { private readonly ICategoryService _categoryService; - private readonly IPaginationService _paginationService; public CategoryController(ICategoryService categoryService) { @@ -26,14 +23,13 @@ public CategoryController(ICategoryService categoryService) [AuthorizeWithPolicy(AuthPolicies.VerifiedOrganizerPolicy)] [HttpPost("get-categories")] - public async Task>> GetCategories() + public async Task>> GetCategories([FromQuery] int page, [FromQuery] int pageSize) { - var res = await _categoryService.GetCategoriesAsync(); + var res = await _categoryService.GetCategoriesAsync(pageSize, page); if (!res.IsSuccess) { return StatusCode(StatusCodes.Status500InternalServerError, res.ErrorMsg); } - return Ok(res.Value); } } \ No newline at end of file diff --git a/TickAPI/TickAPI/Categories/DTOs/Response/GetCategoriesDto.cs b/TickAPI/TickAPI/Categories/DTOs/Response/GetCategoriesDto.cs index c7a5980..abbaea2 100644 --- a/TickAPI/TickAPI/Categories/DTOs/Response/GetCategoriesDto.cs +++ b/TickAPI/TickAPI/Categories/DTOs/Response/GetCategoriesDto.cs @@ -1,4 +1,6 @@ -namespace TickAPI.Categories.DTOs.Response; +using TickAPI.Common.Pagination.Responses; + +namespace TickAPI.Categories.DTOs.Response; public record GetCategoriesDto( string CategoryName diff --git a/TickAPI/TickAPI/Categories/Respositories/CategoryRepository.cs b/TickAPI/TickAPI/Categories/Respositories/CategoryRepository.cs index ddd9b2a..bcedbd2 100644 --- a/TickAPI/TickAPI/Categories/Respositories/CategoryRepository.cs +++ b/TickAPI/TickAPI/Categories/Respositories/CategoryRepository.cs @@ -1,7 +1,6 @@ using Microsoft.EntityFrameworkCore; using TickAPI.Categories.Abstractions; using TickAPI.Categories.Models; -using TickAPI.Common.Results; using TickAPI.Common.Results.Generic; using TickAPI.Common.TickApiDbContext; namespace TickAPI.Categories.Respositories; @@ -15,9 +14,9 @@ public CategoryRepository(TickApiDbContext tickApiDbContext) _tickApiDbContext = tickApiDbContext; } - public async Task>> GetCategoriesAsync() + public async Task>> GetCategoriesAsync() { var list = await _tickApiDbContext.Categories.ToListAsync(); - return Result>.Success(list); + return Result>.Success(list); } } \ No newline at end of file diff --git a/TickAPI/TickAPI/Categories/Services/CategoryService.cs b/TickAPI/TickAPI/Categories/Services/CategoryService.cs index 2edd516..2be8597 100644 --- a/TickAPI/TickAPI/Categories/Services/CategoryService.cs +++ b/TickAPI/TickAPI/Categories/Services/CategoryService.cs @@ -1,7 +1,8 @@ using TickAPI.Categories.Abstractions; using TickAPI.Categories.DTOs.Response; using TickAPI.Categories.Models; -using TickAPI.Common.Results; +using TickAPI.Common.Pagination.Abstractions; +using TickAPI.Common.Pagination.Responses; using TickAPI.Common.Results.Generic; namespace TickAPI.Categories.Services; @@ -9,20 +10,31 @@ namespace TickAPI.Categories.Services; public class CategoryService : ICategoryService { private readonly ICategoryRepository _categoryRepository; + private readonly IPaginationService _paginationService; - public CategoryService(ICategoryRepository categoryRepository) + public CategoryService(ICategoryRepository categoryRepository, IPaginationService paginationService) { _categoryRepository = categoryRepository; + _paginationService = paginationService; } - public async Task>> GetCategoriesAsync() + public async Task>> GetCategoriesAsync(int pageSize, int page) { var res = await _categoryRepository.GetCategoriesAsync(); List categories = new List(); - foreach (var category in res.Value!) + var categoriesPaginated = _paginationService.Paginate(res.Value, pageSize, page); + if (!categoriesPaginated.IsSuccess) + { + return Result>.PropagateError(categoriesPaginated); + } + + foreach (var category in categoriesPaginated.Value.Data) { categories.Add(new GetCategoriesDto(category.CategoryName)); } - return Result>.Success(categories); + + return Result>.Success(new PaginatedData(categories, categoriesPaginated.Value.PageNumber + ,categoriesPaginated.Value.PageSize, categoriesPaginated.Value.HasNextPage, categoriesPaginated.Value.HasPreviousPage, + categoriesPaginated.Value.PaginationDetails)); } } \ No newline at end of file From 13a60f968fdcfbba802fa773782b7eaaff53a770 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanis=C5=82aw?= <62651497+staszkiet@users.noreply.github.com> Date: Sun, 30 Mar 2025 18:25:19 +0200 Subject: [PATCH 5/7] Add tests --- .../Controllers/CategoryControllerTests.cs | 39 +++++++++++++++++ .../Services/CategoryServiceTests.cs | 42 +++++++++++++++++++ .../Controllers/CategoryController.cs | 2 +- 3 files changed, 82 insertions(+), 1 deletion(-) create mode 100644 TickAPI/TickAPI.Tests/Categories/Controllers/CategoryControllerTests.cs create mode 100644 TickAPI/TickAPI.Tests/Categories/Services/CategoryServiceTests.cs diff --git a/TickAPI/TickAPI.Tests/Categories/Controllers/CategoryControllerTests.cs b/TickAPI/TickAPI.Tests/Categories/Controllers/CategoryControllerTests.cs new file mode 100644 index 0000000..88df29f --- /dev/null +++ b/TickAPI/TickAPI.Tests/Categories/Controllers/CategoryControllerTests.cs @@ -0,0 +1,39 @@ +using Microsoft.AspNetCore.Mvc; +using Moq; +using TickAPI.Categories.Abstractions; +using TickAPI.Categories.Controllers; +using TickAPI.Categories.DTOs.Response; +using TickAPI.Common.Pagination.Responses; +using TickAPI.Common.Results; +using TickAPI.Common.Results.Generic; +using TickAPI.Events.DTOs.Response; + +namespace TickAPI.Tests.Categories.Controllers; + +public class CategoryControllerTests +{ + [Fact] + + public async Task GetCategories_WhenDataIsValid_ShouldReturnOk() + { + //arrange + int pageSize = 20; + int pageNumber = 0; + var categoryServiceMock = new Mock(); + categoryServiceMock.Setup(m => m.GetCategoriesAsync(pageSize, pageNumber)).ReturnsAsync( + Result>.Success(new PaginatedData(new List(), pageNumber, pageSize, true, true, + new PaginationDetails(0, 0)))); + + var sut = new CategoryController(categoryServiceMock.Object); + + //act + var res = await sut.GetCategories(pageSize, pageNumber); + + //assert + var result = Assert.IsType>>(res); + var objectResult = Assert.IsType(result.Result); + Assert.Equal(200, objectResult.StatusCode); + Assert.NotNull(objectResult.Value); + } + +} \ No newline at end of file diff --git a/TickAPI/TickAPI.Tests/Categories/Services/CategoryServiceTests.cs b/TickAPI/TickAPI.Tests/Categories/Services/CategoryServiceTests.cs new file mode 100644 index 0000000..345cdec --- /dev/null +++ b/TickAPI/TickAPI.Tests/Categories/Services/CategoryServiceTests.cs @@ -0,0 +1,42 @@ +using Microsoft.AspNetCore.Mvc; +using Moq; +using TickAPI.Categories.Abstractions; +using TickAPI.Categories.DTOs.Response; +using TickAPI.Categories.Models; +using TickAPI.Categories.Services; +using TickAPI.Common.Pagination.Abstractions; +using TickAPI.Common.Pagination.Responses; +using TickAPI.Common.Results; +using TickAPI.Common.Results.Generic; + +namespace TickAPI.Tests.Categories.Services; + +public class CategoryServiceTests +{ + [Fact] + + public async Task GetCategories_WhenDataIsValid_ShouldReturnOk() + { + //arrange + int pageSize = 10; + int page = 0; + var categoryRepositoryMock = new Mock(); + categoryRepositoryMock.Setup(repo => repo.GetCategoriesAsync()) + .ReturnsAsync(Result>.Success(new List())); + + var paginationServiceMock = new Mock(); + paginationServiceMock.Setup(p => p.Paginate(new List(), pageSize, page)).Returns( + Result>.Success(new PaginatedData(new List(), page, pageSize, + false, false, new PaginationDetails(0, 0))) + ); + + var sut = new CategoryService(categoryRepositoryMock.Object, paginationServiceMock.Object); + + //act + var res = await sut.GetCategoriesAsync(pageSize, page); + + //assert + var result = Assert.IsType>>(res); + Assert.True(result.IsSuccess); + } +} \ No newline at end of file diff --git a/TickAPI/TickAPI/Categories/Controllers/CategoryController.cs b/TickAPI/TickAPI/Categories/Controllers/CategoryController.cs index 88319ea..2b3fb02 100644 --- a/TickAPI/TickAPI/Categories/Controllers/CategoryController.cs +++ b/TickAPI/TickAPI/Categories/Controllers/CategoryController.cs @@ -23,7 +23,7 @@ public CategoryController(ICategoryService categoryService) [AuthorizeWithPolicy(AuthPolicies.VerifiedOrganizerPolicy)] [HttpPost("get-categories")] - public async Task>> GetCategories([FromQuery] int page, [FromQuery] int pageSize) + public async Task>> GetCategories([FromQuery] int pageSize, [FromQuery] int page) { var res = await _categoryService.GetCategoriesAsync(pageSize, page); if (!res.IsSuccess) From 03a41f7b8822663c01d750050de4c83060cb2fc4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanis=C5=82aw?= <62651497+staszkiet@users.noreply.github.com> Date: Mon, 31 Mar 2025 09:55:26 +0200 Subject: [PATCH 6/7] Minor fixes suggested by trzcinskiiK --- .../Categories/Controllers/CategoryControllerTests.cs | 6 +++--- .../Categories/Services/CategoryServiceTests.cs | 4 ++-- .../Categories/Abstractions/ICategoryService.cs | 2 +- .../Categories/Controllers/CategoryController.cs | 6 +++--- .../Categories/DTOs/Response/GetCategoriesDto.cs | 2 +- TickAPI/TickAPI/Categories/Services/CategoryService.cs | 10 +++++----- TickAPI/TickAPI/Common/Auth/Enums/AuthPolicies.cs | 1 + TickAPI/TickAPI/Program.cs | 1 + TickAPI/TickAPI/TickAPI.csproj | 4 ---- 9 files changed, 17 insertions(+), 19 deletions(-) diff --git a/TickAPI/TickAPI.Tests/Categories/Controllers/CategoryControllerTests.cs b/TickAPI/TickAPI.Tests/Categories/Controllers/CategoryControllerTests.cs index 88df29f..fdce5df 100644 --- a/TickAPI/TickAPI.Tests/Categories/Controllers/CategoryControllerTests.cs +++ b/TickAPI/TickAPI.Tests/Categories/Controllers/CategoryControllerTests.cs @@ -20,8 +20,8 @@ public async Task GetCategories_WhenDataIsValid_ShouldReturnOk() int pageSize = 20; int pageNumber = 0; var categoryServiceMock = new Mock(); - categoryServiceMock.Setup(m => m.GetCategoriesAsync(pageSize, pageNumber)).ReturnsAsync( - Result>.Success(new PaginatedData(new List(), pageNumber, pageSize, true, true, + categoryServiceMock.Setup(m => m.GetCategoriesResponsesAsync(pageSize, pageNumber)).ReturnsAsync( + Result>.Success(new PaginatedData(new List(), pageNumber, pageSize, true, true, new PaginationDetails(0, 0)))); var sut = new CategoryController(categoryServiceMock.Object); @@ -30,7 +30,7 @@ public async Task GetCategories_WhenDataIsValid_ShouldReturnOk() var res = await sut.GetCategories(pageSize, pageNumber); //assert - var result = Assert.IsType>>(res); + var result = Assert.IsType>>(res); var objectResult = Assert.IsType(result.Result); Assert.Equal(200, objectResult.StatusCode); Assert.NotNull(objectResult.Value); diff --git a/TickAPI/TickAPI.Tests/Categories/Services/CategoryServiceTests.cs b/TickAPI/TickAPI.Tests/Categories/Services/CategoryServiceTests.cs index 345cdec..0456fa0 100644 --- a/TickAPI/TickAPI.Tests/Categories/Services/CategoryServiceTests.cs +++ b/TickAPI/TickAPI.Tests/Categories/Services/CategoryServiceTests.cs @@ -33,10 +33,10 @@ public async Task GetCategories_WhenDataIsValid_ShouldReturnOk() var sut = new CategoryService(categoryRepositoryMock.Object, paginationServiceMock.Object); //act - var res = await sut.GetCategoriesAsync(pageSize, page); + var res = await sut.GetCategoriesResponsesAsync(pageSize, page); //assert - var result = Assert.IsType>>(res); + var result = Assert.IsType>>(res); Assert.True(result.IsSuccess); } } \ No newline at end of file diff --git a/TickAPI/TickAPI/Categories/Abstractions/ICategoryService.cs b/TickAPI/TickAPI/Categories/Abstractions/ICategoryService.cs index 9eb60c1..37e0f24 100644 --- a/TickAPI/TickAPI/Categories/Abstractions/ICategoryService.cs +++ b/TickAPI/TickAPI/Categories/Abstractions/ICategoryService.cs @@ -7,5 +7,5 @@ namespace TickAPI.Categories.Abstractions; public interface ICategoryService { - public Task>> GetCategoriesAsync(int pageSize, int page); + public Task>> GetCategoriesResponsesAsync(int pageSize, int page); } \ No newline at end of file diff --git a/TickAPI/TickAPI/Categories/Controllers/CategoryController.cs b/TickAPI/TickAPI/Categories/Controllers/CategoryController.cs index 2b3fb02..20f4d94 100644 --- a/TickAPI/TickAPI/Categories/Controllers/CategoryController.cs +++ b/TickAPI/TickAPI/Categories/Controllers/CategoryController.cs @@ -21,11 +21,11 @@ public CategoryController(ICategoryService categoryService) _categoryService = categoryService; } - [AuthorizeWithPolicy(AuthPolicies.VerifiedOrganizerPolicy)] + [AuthorizeWithPolicy(AuthPolicies.VerifiedUserPolicy)] [HttpPost("get-categories")] - public async Task>> GetCategories([FromQuery] int pageSize, [FromQuery] int page) + public async Task>> GetCategories([FromQuery] int pageSize, [FromQuery] int page) { - var res = await _categoryService.GetCategoriesAsync(pageSize, page); + var res = await _categoryService.GetCategoriesResponsesAsync(pageSize, page); if (!res.IsSuccess) { return StatusCode(StatusCodes.Status500InternalServerError, res.ErrorMsg); diff --git a/TickAPI/TickAPI/Categories/DTOs/Response/GetCategoriesDto.cs b/TickAPI/TickAPI/Categories/DTOs/Response/GetCategoriesDto.cs index abbaea2..9ece0df 100644 --- a/TickAPI/TickAPI/Categories/DTOs/Response/GetCategoriesDto.cs +++ b/TickAPI/TickAPI/Categories/DTOs/Response/GetCategoriesDto.cs @@ -2,6 +2,6 @@ namespace TickAPI.Categories.DTOs.Response; -public record GetCategoriesDto( +public record GetCategoryResponseDto( string CategoryName ); \ No newline at end of file diff --git a/TickAPI/TickAPI/Categories/Services/CategoryService.cs b/TickAPI/TickAPI/Categories/Services/CategoryService.cs index 2be8597..f663b40 100644 --- a/TickAPI/TickAPI/Categories/Services/CategoryService.cs +++ b/TickAPI/TickAPI/Categories/Services/CategoryService.cs @@ -18,22 +18,22 @@ public CategoryService(ICategoryRepository categoryRepository, IPaginationServi _paginationService = paginationService; } - public async Task>> GetCategoriesAsync(int pageSize, int page) + public async Task>> GetCategoriesResponsesAsync(int pageSize, int page) { var res = await _categoryRepository.GetCategoriesAsync(); - List categories = new List(); + List categories = new List(); var categoriesPaginated = _paginationService.Paginate(res.Value, pageSize, page); if (!categoriesPaginated.IsSuccess) { - return Result>.PropagateError(categoriesPaginated); + return Result>.PropagateError(categoriesPaginated); } foreach (var category in categoriesPaginated.Value.Data) { - categories.Add(new GetCategoriesDto(category.CategoryName)); + categories.Add(new GetCategoryResponseDto(category.CategoryName)); } - return Result>.Success(new PaginatedData(categories, categoriesPaginated.Value.PageNumber + return Result>.Success(new PaginatedData(categories, categoriesPaginated.Value.PageNumber ,categoriesPaginated.Value.PageSize, categoriesPaginated.Value.HasNextPage, categoriesPaginated.Value.HasPreviousPage, categoriesPaginated.Value.PaginationDetails)); } diff --git a/TickAPI/TickAPI/Common/Auth/Enums/AuthPolicies.cs b/TickAPI/TickAPI/Common/Auth/Enums/AuthPolicies.cs index 33bf3d0..5c9f52a 100644 --- a/TickAPI/TickAPI/Common/Auth/Enums/AuthPolicies.cs +++ b/TickAPI/TickAPI/Common/Auth/Enums/AuthPolicies.cs @@ -7,4 +7,5 @@ public enum AuthPolicies CustomerPolicy, NewOrganizerPolicy, CreatedOrganizerPolicy, + VerifiedUserPolicy, } \ No newline at end of file diff --git a/TickAPI/TickAPI/Program.cs b/TickAPI/TickAPI/Program.cs index d4110fa..5ed6205 100644 --- a/TickAPI/TickAPI/Program.cs +++ b/TickAPI/TickAPI/Program.cs @@ -76,6 +76,7 @@ options.AddPolicy(AuthPolicies.NewOrganizerPolicy.ToString(), policy => policy.RequireRole(UserRole.NewOrganizer.ToString())); options.AddPolicy(AuthPolicies.CreatedOrganizerPolicy.ToString(), policy => policy.RequireRole(UserRole.UnverifiedOrganizer.ToString(), UserRole.Organizer.ToString())); + options.AddPolicy(AuthPolicies.VerifiedUserPolicy.ToString(), policy => policy.RequireRole(UserRole.Admin.ToString(), UserRole.Organizer.ToString(), UserRole.Customer.ToString())); }); // Add admin services. diff --git a/TickAPI/TickAPI/TickAPI.csproj b/TickAPI/TickAPI/TickAPI.csproj index 39a857b..1e131f6 100644 --- a/TickAPI/TickAPI/TickAPI.csproj +++ b/TickAPI/TickAPI/TickAPI.csproj @@ -20,10 +20,6 @@ - - - - From 03e40b8a35c267427facf71ea20ad4a90cbb0850 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanis=C5=82aw?= <62651497+staszkiet@users.noreply.github.com> Date: Thu, 3 Apr 2025 14:55:58 +0200 Subject: [PATCH 7/7] Delete result return from category repo --- .../TickAPI.Tests/Categories/Services/CategoryServiceTests.cs | 2 +- .../TickAPI/Categories/Abstractions/ICategoryRepository.cs | 2 +- .../{GetCategoriesDto.cs => GetCategoryResponseDto.cs} | 0 .../TickAPI/Categories/Respositories/CategoryRepository.cs | 4 ++-- TickAPI/TickAPI/Categories/Services/CategoryService.cs | 4 ++-- 5 files changed, 6 insertions(+), 6 deletions(-) rename TickAPI/TickAPI/Categories/DTOs/Response/{GetCategoriesDto.cs => GetCategoryResponseDto.cs} (100%) diff --git a/TickAPI/TickAPI.Tests/Categories/Services/CategoryServiceTests.cs b/TickAPI/TickAPI.Tests/Categories/Services/CategoryServiceTests.cs index 0456fa0..0b43f6d 100644 --- a/TickAPI/TickAPI.Tests/Categories/Services/CategoryServiceTests.cs +++ b/TickAPI/TickAPI.Tests/Categories/Services/CategoryServiceTests.cs @@ -22,7 +22,7 @@ public async Task GetCategories_WhenDataIsValid_ShouldReturnOk() int page = 0; var categoryRepositoryMock = new Mock(); categoryRepositoryMock.Setup(repo => repo.GetCategoriesAsync()) - .ReturnsAsync(Result>.Success(new List())); + .ReturnsAsync(new List()); var paginationServiceMock = new Mock(); paginationServiceMock.Setup(p => p.Paginate(new List(), pageSize, page)).Returns( diff --git a/TickAPI/TickAPI/Categories/Abstractions/ICategoryRepository.cs b/TickAPI/TickAPI/Categories/Abstractions/ICategoryRepository.cs index 8f998b0..5b6254f 100644 --- a/TickAPI/TickAPI/Categories/Abstractions/ICategoryRepository.cs +++ b/TickAPI/TickAPI/Categories/Abstractions/ICategoryRepository.cs @@ -5,5 +5,5 @@ namespace TickAPI.Categories.Abstractions; public interface ICategoryRepository { - public Task>> GetCategoriesAsync(); + public Task> GetCategoriesAsync(); } \ No newline at end of file diff --git a/TickAPI/TickAPI/Categories/DTOs/Response/GetCategoriesDto.cs b/TickAPI/TickAPI/Categories/DTOs/Response/GetCategoryResponseDto.cs similarity index 100% rename from TickAPI/TickAPI/Categories/DTOs/Response/GetCategoriesDto.cs rename to TickAPI/TickAPI/Categories/DTOs/Response/GetCategoryResponseDto.cs diff --git a/TickAPI/TickAPI/Categories/Respositories/CategoryRepository.cs b/TickAPI/TickAPI/Categories/Respositories/CategoryRepository.cs index bcedbd2..9cba1d3 100644 --- a/TickAPI/TickAPI/Categories/Respositories/CategoryRepository.cs +++ b/TickAPI/TickAPI/Categories/Respositories/CategoryRepository.cs @@ -14,9 +14,9 @@ public CategoryRepository(TickApiDbContext tickApiDbContext) _tickApiDbContext = tickApiDbContext; } - public async Task>> GetCategoriesAsync() + public async Task> GetCategoriesAsync() { var list = await _tickApiDbContext.Categories.ToListAsync(); - return Result>.Success(list); + return list; } } \ No newline at end of file diff --git a/TickAPI/TickAPI/Categories/Services/CategoryService.cs b/TickAPI/TickAPI/Categories/Services/CategoryService.cs index f663b40..dbbfcd8 100644 --- a/TickAPI/TickAPI/Categories/Services/CategoryService.cs +++ b/TickAPI/TickAPI/Categories/Services/CategoryService.cs @@ -20,9 +20,9 @@ public CategoryService(ICategoryRepository categoryRepository, IPaginationServi public async Task>> GetCategoriesResponsesAsync(int pageSize, int page) { - var res = await _categoryRepository.GetCategoriesAsync(); + var categoriesAllResponse = await _categoryRepository.GetCategoriesAsync(); List categories = new List(); - var categoriesPaginated = _paginationService.Paginate(res.Value, pageSize, page); + var categoriesPaginated = _paginationService.Paginate(categoriesAllResponse, pageSize, page); if (!categoriesPaginated.IsSuccess) { return Result>.PropagateError(categoriesPaginated);