Feat/230/add endpoint getbyuserid#245
Conversation
WalkthroughAdds a MediatR query and handler to fetch a user’s favorite streetcodes, wires a new authorized Web API GET endpoint using the mediator, adjusts a repository using directive, and introduces unit tests covering success and empty/null repository scenarios. Changes
Sequence Diagram(s)sequenceDiagram
autonumber
actor Client
participant API as FavouriteStreetcodeController
participant Med as Mediator
participant H as GetFavoritesByUserIdHandler
participant Repo as IRepositoryWrapper
participant Map as IMapper
Client->>API: GET /favourite-streetcodes/{userId}
API->>Med: Send(GetFavoritesByUserIdQuery)
Med->>H: Handle(query)
H->>Repo: FavouriteStreetcode.GetAll( userId )
alt Favorites found
H->>Repo: Streetcode.GetAllByIds( streetcodeIds )
H->>Map: Map(Streetcodes -> StreetcodeDTO[])
Map-->>H: DTOs
H-->>Med: Result.Success(DTOs)
else None or null
H-->>Med: Result.Success(empty)
end
Med-->>API: Result
alt Success
API-->>Client: 200 OK (DTOs)
else Failure
API-->>Client: 400 Bad Request (errors)
end
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~25 minutes Suggested labels
Suggested reviewers
Poem
Pre-merge checks and finishing touches❌ Failed checks (2 warnings)
✅ Passed checks (1 passed)
✨ Finishing touches
🧪 Generate unit tests
📜 Recent review detailsConfiguration used: CodeRabbit UI Review profile: CHILL Plan: Pro 📒 Files selected for processing (3)
🚧 Files skipped from review as they are similar to previous changes (3)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Actionable comments posted: 1
🧹 Nitpick comments (5)
Streetcode/Streetcode.DAL/Repositories/Realizations/Streetcode/StreetcodeRepository.cs (1)
16-21: Guard null/empty IDs; add AsNoTracking + Distinct; consider CT supportAvoid NRE on null input, reduce duplicates, and skip change tracking for a read-only query. Also propagate CancellationToken from callers.
Apply:
- public async Task<IEnumerable<StreetcodeContent>> GetStreetcodesByIdsAsync(IEnumerable<int> streetcodeIds) + public async Task<IEnumerable<StreetcodeContent>> GetStreetcodesByIdsAsync(IEnumerable<int> streetcodeIds, CancellationToken cancellationToken = default) { - return await FindAll() - .Where(s => streetcodeIds.Contains(s.Id)) - .ToListAsync(); + if (streetcodeIds is null || !streetcodeIds.Any()) + { + return Enumerable.Empty<StreetcodeContent>(); + } + + var ids = streetcodeIds.Distinct().ToList(); + return await FindAll() + .AsNoTracking() + .Where(s => ids.Contains(s.Id)) + .ToListAsync(cancellationToken); }If not globally enabled, add:
// at file top using System.Linq; using System.Threading;Streetcode/Streetcode.DAL/Repositories/Interfaces/Streetcode/IStreetcodeRepository.cs (1)
8-8: Propagate cancellation tokens from top to data layerAdd an optional CancellationToken to support request aborts/timeouts.
Apply:
- Task<IEnumerable<StreetcodeContent>> GetStreetcodesByIdsAsync(IEnumerable<int> streetcodeIds); + Task<IEnumerable<StreetcodeContent>> GetStreetcodesByIdsAsync(IEnumerable<int> streetcodeIds, CancellationToken cancellationToken = default);If not present, add:
using System.Threading;Streetcode/Streetcode.BLL/MediatR/FavouriteStreetcode/GetFavoritesByUserId/GetFavoritesByUserIdQuery.cs (1)
7-8: LGTMQuery shape is clear and minimal.
Consider aligning naming with the project’s “Favourite” convention for consistency (e.g., GetFavouriteStreetcodesByUserIdQuery).
Streetcode/Streetcode.BLL/MediatR/FavouriteStreetcode/GetFavoritesByUserId/GetFavoritesByUserIdHandler.cs (2)
1-10: Missing System.Linq importEnsure Linq is available for Any/Select/Distinct if implicit usings are off.
Apply:
using System.Collections.Generic; +using System.Linq; using System.Threading; using System.Threading.Tasks;
28-42: Deduplicate IDs and pass CancellationToken downstreamAvoid redundant DB filter terms and propagate CT to the repository call.
Apply:
- var streetcodeIds = favoriteStreetcodes.Select(fs => fs.StreetcodeId).ToList(); + var streetcodeIds = favoriteStreetcodes.Select(fs => fs.StreetcodeId).Distinct().ToList(); var streetcodes = await _repositoryWrapper.StreetcodeRepository - .GetStreetcodesByIdsAsync(streetcodeIds); + .GetStreetcodesByIdsAsync(streetcodeIds, cancellationToken);Optional: log when favorites are empty to aid diagnostics.
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (6)
Streetcode/Streetcode.BLL/MediatR/FavouriteStreetcode/GetFavoritesByUserId/GetFavoritesByUserIdHandler.cs(1 hunks)Streetcode/Streetcode.BLL/MediatR/FavouriteStreetcode/GetFavoritesByUserId/GetFavoritesByUserIdQuery.cs(1 hunks)Streetcode/Streetcode.DAL/Repositories/Interfaces/Streetcode/IStreetcodeRepository.cs(1 hunks)Streetcode/Streetcode.DAL/Repositories/Realizations/Streetcode/StreetcodeRepository.cs(2 hunks)Streetcode/Streetcode.WebApi/Controllers/FavouriteStreetcode/FavouriteStreetcodeController.cs(2 hunks)Streetcode/Streetcode.XUnitTest/BLL/MediatR/FavouriteStreetcode/GetFavoritesByUserIdQueryHandlerTests.cs(1 hunks)
🧰 Additional context used
🧬 Code graph analysis (5)
Streetcode/Streetcode.BLL/MediatR/FavouriteStreetcode/GetFavoritesByUserId/GetFavoritesByUserIdQuery.cs (1)
Streetcode/Streetcode.XUnitTest/BLL/MediatR/StreetCode/Streetcode/Create/StreetcodeCreateHandlerTest.cs (1)
StreetcodeDTO(550-559)
Streetcode/Streetcode.WebApi/Controllers/FavouriteStreetcode/FavouriteStreetcodeController.cs (3)
Streetcode/Streetcode.BLL/MediatR/FavouriteStreetcode/GetFavoritesByUserId/GetFavoritesByUserIdHandler.cs (1)
Task(28-42)Streetcode/Streetcode.DAL/Repositories/Interfaces/Streetcode/IStreetcodeRepository.cs (1)
Task(8-8)Streetcode/Streetcode.DAL/Repositories/Realizations/Streetcode/StreetcodeRepository.cs (1)
Task(16-21)
Streetcode/Streetcode.XUnitTest/BLL/MediatR/FavouriteStreetcode/GetFavoritesByUserIdQueryHandlerTests.cs (3)
Streetcode/Streetcode.BLL/MediatR/FavouriteStreetcode/GetFavoritesByUserId/GetFavoritesByUserIdHandler.cs (3)
GetFavoritesByUserIdHandler(13-43)GetFavoritesByUserIdHandler(18-26)Task(28-42)Streetcode/Streetcode.DAL/Repositories/Interfaces/Streetcode/IStreetcodeRepository.cs (1)
Task(8-8)Streetcode/Streetcode.DAL/Repositories/Realizations/Streetcode/StreetcodeRepository.cs (3)
Task(16-21)StreetcodeRepository(9-22)StreetcodeRepository(11-14)
Streetcode/Streetcode.DAL/Repositories/Realizations/Streetcode/StreetcodeRepository.cs (2)
Streetcode/Streetcode.BLL/MediatR/FavouriteStreetcode/GetFavoritesByUserId/GetFavoritesByUserIdHandler.cs (1)
Task(28-42)Streetcode/Streetcode.DAL/Repositories/Interfaces/Streetcode/IStreetcodeRepository.cs (1)
Task(8-8)
Streetcode/Streetcode.BLL/MediatR/FavouriteStreetcode/GetFavoritesByUserId/GetFavoritesByUserIdHandler.cs (2)
Streetcode/Streetcode.DAL/Repositories/Interfaces/Streetcode/IStreetcodeRepository.cs (1)
Task(8-8)Streetcode/Streetcode.DAL/Repositories/Realizations/Streetcode/StreetcodeRepository.cs (3)
Task(16-21)StreetcodeRepository(9-22)StreetcodeRepository(11-14)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
- GitHub Check: Build and analyze
🔇 Additional comments (3)
Streetcode/Streetcode.XUnitTest/BLL/MediatR/FavouriteStreetcode/GetFavoritesByUserIdQueryHandlerTests.cs (3)
40-89: Happy-path coverage looks solidMocks and assertions validate mapping and counts correctly.
91-116: Good negative path testsVerifies no downstream calls when there are no favorites.
118-142: Null path handledAppropriate assertion and verifications.
Skiper29
left a comment
There was a problem hiding this comment.
Perhaps it is not necessary to create the GetStreetcodesByIdsAsync method in StreetcodeRepository. It is redundant because it is used in only one place. Instead, you should use the existing GetAllAsync or FindAll methods, using the predicate parameter for filtering.
|


dev
JIRA
Code reviewers
Second Level Review
Summary of issue
ToDo
Summary of change
ToDo
Testing approach
ToDo
CHECK LIST
Summary by CodeRabbit