Skip to content

Commit 7fe3ed4

Browse files
Merge branch 'release/1.2.0' into feature/issue-2299
2 parents 63c4600 + b167ad6 commit 7fe3ed4

File tree

43 files changed

+3336
-49
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

43 files changed

+3336
-49
lines changed
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
using Streetcode.DAL.Enums;
2+
3+
namespace Streetcode.BLL.DTO.Streetcode
4+
{
5+
public class StreetcodeFavouriteDto
6+
{
7+
public int Id { get; set; }
8+
public string Title { get; set; } = null!;
9+
public string? Alias { get; set; }
10+
public int ImageId { get; set; }
11+
public string TransliterationUrl { get; set; } = null!;
12+
public StreetcodeType Type { get; set; }
13+
}
14+
}

Streetcode/Streetcode.BLL/Mapping/Streetcode/StreetcodeProfile.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,12 @@ public StreetcodeProfile()
2424
.ForPath(dto => dto.ImageId, conf => conf
2525
.MapFrom(e => e.Images.Select(i => i.Id).FirstOrDefault()));
2626

27+
CreateMap<StreetcodeContent, StreetcodeFavouriteDto>()
28+
.ForMember(x => x.Type, conf => conf.MapFrom(s => GetStreetcodeType(s)))
29+
.ForPath(dto => dto.ImageId, conf => conf
30+
.MapFrom(e => e.Images.Select(i => i.Id).FirstOrDefault()))
31+
.ReverseMap();
32+
2733
CreateMap<StreetcodeCreateDTO, StreetcodeContent>()
2834
.ForMember(x => x.Arts, conf => conf.Ignore())
2935
.ForMember(x => x.StreetcodeArtSlides, conf => conf.Ignore())
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
using FluentResults;
2+
using MediatR;
3+
4+
namespace Streetcode.BLL.MediatR.Streetcode.Streetcode.CreateFavourite
5+
{
6+
public record CreateFavouriteStreetcodeCommand(int StreetcodeId)
7+
: IRequest<Result<Unit>>;
8+
}
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
using FluentResults;
2+
using MediatR;
3+
using Microsoft.AspNetCore.Http;
4+
using Microsoft.Extensions.Localization;
5+
using Streetcode.BLL.Interfaces.Logging;
6+
using Streetcode.BLL.SharedResource;
7+
using Streetcode.BLL.Util.Helpers;
8+
using Streetcode.DAL.Entities.Streetcode.Favourites;
9+
using Streetcode.DAL.Repositories.Interfaces.Base;
10+
11+
namespace Streetcode.BLL.MediatR.Streetcode.Streetcode.CreateFavourite
12+
{
13+
public class CreateFavouriteStreetcodeHandler : IRequestHandler<CreateFavouriteStreetcodeCommand, Result<Unit>>
14+
{
15+
private readonly IRepositoryWrapper _repositoryWrapper;
16+
private readonly ILoggerService _logger;
17+
private readonly IStringLocalizer<AlreadyExistSharedResource> _stringLocalizerAlreadyExists;
18+
private readonly IStringLocalizer<CannotSaveSharedResource> _stringLocalizerCannotSave;
19+
private readonly IHttpContextAccessor _httpContextAccessor;
20+
21+
public CreateFavouriteStreetcodeHandler(IRepositoryWrapper repositoryWrapper, ILoggerService logger, IStringLocalizer<AlreadyExistSharedResource> stringLocalizerAlreadyExists, IStringLocalizer<CannotSaveSharedResource> stringLocalizerCannotSave, IHttpContextAccessor httpContextAccessor)
22+
{
23+
_repositoryWrapper = repositoryWrapper;
24+
_logger = logger;
25+
_stringLocalizerAlreadyExists = stringLocalizerAlreadyExists;
26+
_stringLocalizerCannotSave = stringLocalizerCannotSave;
27+
_httpContextAccessor = httpContextAccessor;
28+
}
29+
30+
public async Task<Result<Unit>> Handle(CreateFavouriteStreetcodeCommand request, CancellationToken cancellationToken)
31+
{
32+
var userId = HttpContextHelper.GetCurrentUserId(_httpContextAccessor)!;
33+
34+
if (await _repositoryWrapper.FavouritesRepository.GetFirstOrDefaultAsync(
35+
f => f.UserId == userId && f.StreetcodeId == request.StreetcodeId) is not null)
36+
{
37+
string errorMsg = _stringLocalizerAlreadyExists["FavouriteAlreadyExists"].Value;
38+
_logger.LogError(request, errorMsg);
39+
return Result.Fail(new Error(errorMsg));
40+
}
41+
42+
var favourite = new Favourite
43+
{
44+
StreetcodeId = request.StreetcodeId,
45+
UserId = userId,
46+
};
47+
48+
await _repositoryWrapper.FavouritesRepository.CreateAsync(favourite);
49+
50+
var resultIsSuccessChangeStatus = await _repositoryWrapper.SaveChangesAsync() > 0;
51+
52+
if (resultIsSuccessChangeStatus)
53+
{
54+
return Result.Ok(Unit.Value);
55+
}
56+
57+
string errorMessage = _stringLocalizerCannotSave["CannotSaveTheData"].Value;
58+
_logger.LogError(request, errorMessage);
59+
return Result.Fail(new Error(errorMessage));
60+
}
61+
}
62+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
using FluentResults;
2+
using MediatR;
3+
4+
namespace Streetcode.BLL.MediatR.Streetcode.Streetcode.DeleteFromFavourites
5+
{
6+
public record DeleteStreetcodeFromFavouritesCommand(int StreetcodeId)
7+
: IRequest<Result<Unit>>;
8+
}
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
using FluentResults;
2+
using MediatR;
3+
using Microsoft.AspNetCore.Http;
4+
using Microsoft.Extensions.Localization;
5+
using Streetcode.BLL.Interfaces.Logging;
6+
using Streetcode.BLL.SharedResource;
7+
using Streetcode.BLL.Util.Helpers;
8+
using Streetcode.DAL.Repositories.Interfaces.Base;
9+
10+
namespace Streetcode.BLL.MediatR.Streetcode.Streetcode.DeleteFromFavourites
11+
{
12+
public class DeleteStreetcodeFromFavouritesHandler : IRequestHandler<DeleteStreetcodeFromFavouritesCommand, Result<Unit>>
13+
{
14+
private readonly IRepositoryWrapper _repositoryWrapper;
15+
private readonly ILoggerService _logger;
16+
private readonly IStringLocalizer<CannotFindSharedResource> _stringLocalizerCannotFind;
17+
private readonly IStringLocalizer<FailedToDeleteSharedResource> _stringLocalizerFailedToDelete;
18+
private readonly IHttpContextAccessor _httpContextAccessor;
19+
20+
public DeleteStreetcodeFromFavouritesHandler(IRepositoryWrapper repositoryWrapper, ILoggerService logger, IStringLocalizer<CannotFindSharedResource> stringLocalizerCannotFind, IStringLocalizer<FailedToDeleteSharedResource> stringLocalizerFailedToDelete, IHttpContextAccessor httpContextAccessor)
21+
{
22+
_repositoryWrapper = repositoryWrapper;
23+
_logger = logger;
24+
_stringLocalizerCannotFind = stringLocalizerCannotFind;
25+
_stringLocalizerFailedToDelete = stringLocalizerFailedToDelete;
26+
_httpContextAccessor = httpContextAccessor;
27+
}
28+
29+
public async Task<Result<Unit>> Handle(DeleteStreetcodeFromFavouritesCommand request, CancellationToken cancellationToken)
30+
{
31+
var userId = HttpContextHelper.GetCurrentUserId(_httpContextAccessor)!;
32+
33+
var favourite = await _repositoryWrapper.FavouritesRepository.GetFirstOrDefaultAsync(
34+
f => f.UserId == userId && f.StreetcodeId == request.StreetcodeId);
35+
36+
if (favourite is null)
37+
{
38+
string errorMsg = _stringLocalizerCannotFind["CannotFindStreetcodeInFavourites"].Value;
39+
_logger.LogError(request, errorMsg);
40+
return Result.Fail(new Error(errorMsg));
41+
}
42+
43+
_repositoryWrapper.FavouritesRepository.Delete(favourite);
44+
var resultIsSuccess = await _repositoryWrapper.SaveChangesAsync() > 0;
45+
46+
if (resultIsSuccess)
47+
{
48+
return Result.Ok(Unit.Value);
49+
}
50+
else
51+
{
52+
string errorMsg = _stringLocalizerFailedToDelete["FailedToDeleteStreetcode"].Value;
53+
_logger.LogError(request, errorMsg);
54+
return Result.Fail(new Error(errorMsg));
55+
}
56+
}
57+
}
58+
}

Streetcode/Streetcode.BLL/MediatR/Streetcode/Streetcode/GetAll/GetAllStreetcodesHandler.cs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,9 @@
22
using AutoMapper;
33
using FluentResults;
44
using MediatR;
5-
using Microsoft.Extensions.Localization;
5+
using Microsoft.EntityFrameworkCore;
66
using Streetcode.BLL.DTO.Streetcode;
7+
using Microsoft.Extensions.Localization;
78
using Streetcode.BLL.Interfaces.Logging;
89
using Streetcode.BLL.SharedResource;
910
using Streetcode.DAL.Entities.Streetcode;
@@ -38,7 +39,9 @@ public Task<Result<GetAllStreetcodesResponseDTO>> Handle(GetAllStreetcodesQuery
3839
var filterRequest = query.Request;
3940

4041
var streetcodes = _repositoryWrapper.StreetcodeRepository
41-
.FindAll();
42+
.FindAll()
43+
.Include(s => s.Tags)
44+
.AsQueryable();
4245

4346
if (filterRequest.Title is not null)
4447
{
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
using AutoMapper;
2+
using FluentResults;
3+
using MediatR;
4+
using Microsoft.AspNetCore.Http;
5+
using Microsoft.EntityFrameworkCore;
6+
using Microsoft.Extensions.Localization;
7+
using Streetcode.BLL.DTO.Streetcode;
8+
using Streetcode.BLL.Interfaces.Logging;
9+
using Streetcode.BLL.SharedResource;
10+
using Streetcode.BLL.Util.Helpers;
11+
using Streetcode.DAL.Enums;
12+
using Streetcode.DAL.Repositories.Interfaces.Base;
13+
14+
namespace Streetcode.BLL.MediatR.Streetcode.Streetcode.GetAllFavourites
15+
{
16+
public class GetAllStreetcodeFavouritesHandler : IRequestHandler<GetAllStreetcodeFavouritesQuery,
17+
Result<IEnumerable<StreetcodeFavouriteDto>>>
18+
{
19+
private readonly IMapper _mapper;
20+
private readonly IRepositoryWrapper _repositoryWrapper;
21+
private readonly ILoggerService _logger;
22+
private readonly IStringLocalizer<NoSharedResource> _stringLocalizerNo;
23+
private readonly IHttpContextAccessor _httpContextAccessor;
24+
25+
public GetAllStreetcodeFavouritesHandler(IMapper mapper, IRepositoryWrapper repositoryWrapper, ILoggerService logger, IStringLocalizer<NoSharedResource> stringLocalizerNo, IHttpContextAccessor httpContextAccessor)
26+
{
27+
_mapper = mapper;
28+
_repositoryWrapper = repositoryWrapper;
29+
_logger = logger;
30+
_stringLocalizerNo = stringLocalizerNo;
31+
_httpContextAccessor = httpContextAccessor;
32+
}
33+
34+
public async Task<Result<IEnumerable<StreetcodeFavouriteDto>>> Handle(GetAllStreetcodeFavouritesQuery request, CancellationToken cancellationToken)
35+
{
36+
var userId = HttpContextHelper.GetCurrentUserId(_httpContextAccessor)!;
37+
38+
var favourites = await _repositoryWrapper.StreetcodeRepository.GetAllAsync(
39+
predicate: fv => fv.UserFavourites.Any(u => u.Id == userId),
40+
include: fv => fv.Include(item => item.Images).ThenInclude(x => x.ImageDetails!));
41+
if (favourites.Any())
42+
{
43+
const int keyNumOfImageToDisplay = (int)ImageAssigment.Blackandwhite;
44+
foreach (var streetcode in favourites)
45+
{
46+
streetcode.Images = streetcode.Images.Where(x => x.ImageDetails != null && x.ImageDetails.Alt!.Equals(keyNumOfImageToDisplay.ToString())).ToList();
47+
}
48+
49+
return Result.Ok(_mapper.Map<IEnumerable<StreetcodeFavouriteDto>>(favourites).Where(s => request.Type == null || s.Type == request.Type));
50+
}
51+
52+
string errorMsg = _stringLocalizerNo["NoFavouritesFound"].Value;
53+
_logger.LogError(request, errorMsg);
54+
return Result.Fail(errorMsg);
55+
}
56+
}
57+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
using FluentResults;
2+
using MediatR;
3+
using Streetcode.BLL.DTO.Streetcode;
4+
using Streetcode.DAL.Enums;
5+
6+
namespace Streetcode.BLL.MediatR.Streetcode.Streetcode.GetAllFavourites
7+
{
8+
public record GetAllStreetcodeFavouritesQuery(StreetcodeType? Type = null)
9+
: IRequest<Result<IEnumerable<StreetcodeFavouriteDto>>>;
10+
}
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
using AutoMapper;
2+
using FluentResults;
3+
using MediatR;
4+
using Microsoft.AspNetCore.Http;
5+
using Microsoft.EntityFrameworkCore;
6+
using Microsoft.Extensions.Localization;
7+
using Streetcode.BLL.DTO.Streetcode;
8+
using Streetcode.BLL.Interfaces.Logging;
9+
using Streetcode.BLL.SharedResource;
10+
using Streetcode.BLL.Util.Helpers;
11+
using Streetcode.DAL.Enums;
12+
using Streetcode.DAL.Repositories.Interfaces.Base;
13+
14+
namespace Streetcode.BLL.MediatR.Streetcode.Streetcode.GetFavouriteById
15+
{
16+
public class GetFavouriteByIdHandler : IRequestHandler<GetFavouriteByIdQuery,
17+
Result<StreetcodeFavouriteDto>>
18+
{
19+
private readonly IMapper _mapper;
20+
private readonly IRepositoryWrapper _repositoryWrapper;
21+
private readonly ILoggerService _logger;
22+
private readonly IStringLocalizer<NoSharedResource> _stringLocalizerNo;
23+
private readonly IHttpContextAccessor _httpContextAccessor;
24+
25+
public GetFavouriteByIdHandler(IMapper mapper, IRepositoryWrapper repositoryWrapper, ILoggerService logger, IStringLocalizer<NoSharedResource> stringLocalizerNo, IHttpContextAccessor httpContextAccessor)
26+
{
27+
_mapper = mapper;
28+
_repositoryWrapper = repositoryWrapper;
29+
_logger = logger;
30+
_stringLocalizerNo = stringLocalizerNo;
31+
_httpContextAccessor = httpContextAccessor;
32+
}
33+
34+
public async Task<Result<StreetcodeFavouriteDto>> Handle(GetFavouriteByIdQuery request, CancellationToken cancellationToken)
35+
{
36+
var userId = HttpContextHelper.GetCurrentUserId(_httpContextAccessor)!;
37+
38+
var favourite = await _repositoryWrapper.StreetcodeRepository.GetFirstOrDefaultAsync(
39+
predicate: fv => fv.UserFavourites.Any(u => u.Id == userId) && fv.Id == request.StreetcodeId,
40+
include: fv => fv.Include(item => item.Images).ThenInclude(x => x.ImageDetails!));
41+
42+
if (favourite is not null)
43+
{
44+
const int keyNumOfImageToDisplay = (int)ImageAssigment.Blackandwhite;
45+
favourite.Images = favourite.Images.Where(x => x.ImageDetails != null && x.ImageDetails.Alt!.Equals(keyNumOfImageToDisplay.ToString())).ToList();
46+
return Result.Ok(_mapper.Map<StreetcodeFavouriteDto>(favourite));
47+
}
48+
49+
string errorMsg = _stringLocalizerNo["NoFavouritesWithId", request.StreetcodeId].Value;
50+
_logger.LogError(request, errorMsg);
51+
return Result.Fail(errorMsg);
52+
}
53+
}
54+
}

0 commit comments

Comments
 (0)