Skip to content

Commit

Permalink
feat: added comment actions
Browse files Browse the repository at this point in the history
  • Loading branch information
fernirteam committed Apr 20, 2024
1 parent 84cc09f commit 5e7d50a
Show file tree
Hide file tree
Showing 8 changed files with 91 additions and 104 deletions.
72 changes: 12 additions & 60 deletions server/Booking.Api/Controllers/v1/ReviewsController.cs
Original file line number Diff line number Diff line change
@@ -1,68 +1,20 @@
using Booking.Application.Dtos;
using MediatR;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using ReviewCommands = Booking.Application.Actions.Reviews.Commands;

[ApiController]
[Route("api/v1/reviews")]
public class ReviewsController : ControllerBase
public class ReviewsController(
IMediator mediator
) : ControllerBase
{
private readonly List<ReviewDto> mockReviews;

public ReviewsController()
{
var author = new UserDto
{
Id = Guid.NewGuid().ToString(),
Avatar = "",
Name = "Cyril",
Initials = "Cy",
Email = "cyril@morozov.com",
PhoneNumber = "+380000000000"
};
mockReviews = new List<ReviewDto>
{
new ReviewDto
{
Id = Guid.NewGuid().ToString(),
Stars = 1,
Description = "Это была ловушка сдесь охотиться СВЕТА. Она буквально заманивает людей в секс рабство.",
Author = author
},
new ReviewDto
{
Id = Guid.NewGuid().ToString(),
Stars = 2,
Description = "Это было просто восхитительно когда владелец дома встретил нас с бутылкой шампанского холел бы я сказать но нас встретили с ведром дерьма в ебало. После этого на нас были спущены бомжы которые стоят на страже этого поместья. Особенно хочеться отметить бомжыгу Светлану которая не просто отпиздила и оставила нас умирать в холодной луже с дерьмом но также и позаботилась о том что бы эта лужа говна поплнялась каждые 2 минуты до того момента пока мы не захлебнемся в дерьме. Можно сказать что нам сказачно повезло что наш хозяин Светлана(та самая бомжиха) которая согласилась нас приютить в замент на небольшую помошь по дому. Радует что Светлана сразу обозначила правила совмесного проживания в ёё великолепной 2 комнотной коробки от холодильника, она сразу дала понять что она сдесь главная по этому мы называем ёё хозяин и помогаем ей во все что она хочет ведь она подарила нам самое главное и дорогое для нас ЖИЗНЬ.",
Author = author
},
new ReviewDto
{
Id = Guid.NewGuid().ToString(),
Stars = 3,
Description = "Был обычный день когда я спонтанно решила прогруляться по прекрасному городу Педоград. Как вдруг изза угла выехал черный грузовик уже через мгновение я была в темном месте, вскоре я осознала что это была коробка от холодильника. Через довольно долгий промежуток времени меня выбросили в месте с моим будущим домом коробкой выбросили у поместья невообразимых масштабов. Уже через неделю я потеряла человечность и начала охотиться на людей. Я стала главарем бомжей в своем районе. Также мне удалось споймать двух рабов (они приехали по объявлению о оренде жилья) они вежливо называют меня хозяин. Я принцыпе мне понравилось это объявление я все рекомендую.",
Author = author
},
new ReviewDto
{
Id = Guid.NewGuid().ToString(),
Stars = 4,
Description = "Светлана просто великолепна.",
Author = author
},
new ReviewDto
{
Id = Guid.NewGuid().ToString(),
Stars = 5,
Description = "Света 5 звезд.",
Author = author
},
};
}

[HttpGet]
public async Task<IActionResult> GetAll(
[FromQuery] string advertId
)
[HttpPost]
[Authorize]
public async Task<IActionResult> Create(
[FromForm] ReviewCommands.Create.Request request)
{
return Ok(mockReviews);
await mediator.Send(request);
return NoContent();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -41,45 +41,7 @@ IHttpContextAccessor httpContextAccessor
Email = "cyril@morozov.com",
PhoneNumber = "+380000000000"
};
var reviews = new List<ReviewDto>
{
new ReviewDto
{
Id = Guid.NewGuid().ToString(),
Stars = 1,
Description = "Это была ловушка сдесь охотиться СВЕТА. Она буквально заманивает людей в секс рабство.",
Author = author
},
new ReviewDto
{
Id = Guid.NewGuid().ToString(),
Stars = 2,
Description = "Это было просто восхитительно когда владелец дома встретил нас с бутылкой шампанского холел бы я сказать но нас встретили с ведром дерьма в ебало. После этого на нас были спущены бомжы которые стоят на страже этого поместья. Особенно хочеться отметить бомжыгу Светлану которая не просто отпиздила и оставила нас умирать в холодной луже с дерьмом но также и позаботилась о том что бы эта лужа говна поплнялась каждые 2 минуты до того момента пока мы не захлебнемся в дерьме. Можно сказать что нам сказачно повезло что наш хозяин Светлана(та самая бомжиха) которая согласилась нас приютить в замент на небольшую помошь по дому. Радует что Светлана сразу обозначила правила совмесного проживания в ёё великолепной 2 комнотной коробки от холодильника, она сразу дала понять что она сдесь главная по этому мы называем ёё хозяин и помогаем ей во все что она хочет ведь она подарила нам самое главное и дорогое для нас ЖИЗНЬ.",
Author = author
},
new ReviewDto
{
Id = Guid.NewGuid().ToString(),
Stars = 3,
Description = "Был обычный день когда я спонтанно решила прогруляться по прекрасному городу Педоград. Как вдруг изза угла выехал черный грузовик уже через мгновение я была в темном месте, вскоре я осознала что это была коробка от холодильника. Через довольно долгий промежуток времени меня выбросили в месте с моим будущим домом коробкой выбросили у поместья невообразимых масштабов. Уже через неделю я потеряла человечность и начала охотиться на людей. Я стала главарем бомжей в своем районе. Также мне удалось споймать двух рабов (они приехали по объявлению о оренде жилья) они вежливо называют меня хозяин. Я принцыпе мне понравилось это объявление я все рекомендую.",
Author = author
},
new ReviewDto
{
Id = Guid.NewGuid().ToString(),
Stars = 4,
Description = "Светлана просто великолепна.",
Author = author
},
new ReviewDto
{
Id = Guid.NewGuid().ToString(),
Stars = 5,
Description = "Света 5 звезд.",
Author = author
},
};

var reviews = unitOfWork.Reviews.GetByAdvertId(advert.Id);
return new(
advert.Id,
advert.Name,
Expand All @@ -102,7 +64,13 @@ IHttpContextAccessor httpContextAccessor
Dryer = advert.Dryer
},
advert.Photos.Select(photo => $"{Context.Request.Scheme}://{Context.Request.Host}/{photo}").ToList(),
reviews,
mapper.Map<List<ReviewDto>>(
reviews,
opt =>
{
opt.Items["BASE_URL"] = $"{Context.Request.Scheme}://{Context.Request.Host}";
}
),
mapper.Map<CategoryDto>(advert.Category),
0,
user != null ? user.Likes.Any(a => a.Id == advert.Id) : false
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
using AutoMapper;
using Booking.Application.Errors;
using Booking.Core.Common;
using Booking.Core.Entities;
using MediatR;
using Microsoft.AspNetCore.Http;
using System.Security.Claims;

namespace Booking.Application.Actions.Reviews.Commands;

public class CommandsHandlers(
IUnitOfWork unitOfWork,
IMapper mapper,
IHttpContextAccessor httpContextAccessor
) : IRequestHandler<Create.Request>
{
private HttpContext Context => httpContextAccessor.HttpContext;

public Task Handle(Create.Request request, CancellationToken cancellationToken)
{
var userId = Context.User.FindFirstValue(ClaimTypes.NameIdentifier);
var user = unitOfWork.Users.GetById(userId);

if (unitOfWork.Adverts.GetById(request.AdvertId) is not Advert advert)
throw new BookingError(
BookingErrorType.NOT_FOUND,
"Advert with given id is not found"
);

var review = Review.Create(request.Description, request.Stars, user, advert);
unitOfWork.Reviews.Create(review);
unitOfWork.SaveChanges();
return Task.CompletedTask;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
using MediatR;

namespace Booking.Application.Actions.Reviews.Commands.Create;

public record Request(string AdvertId, string Description, int Stars) : IRequest;
13 changes: 13 additions & 0 deletions server/Booking.Application/Profiles/ReviewProfile.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
using AutoMapper;
using Booking.Application.Dtos;
using Booking.Core.Entities;

namespace Booking.Application.Profiles;

internal class ReviewProfile : Profile
{
public ReviewProfile()
{
CreateMap<Review, ReviewDto>();
}
}
8 changes: 6 additions & 2 deletions server/Booking.Core/Entities/Review.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,15 +8,19 @@ public class Review : EntityBase
public int Stars { get; set; }
public string AuthorId { get; set; }
public User? Author { get; set; }
public string AdvertId { get; set; }
public Advert? Advert { get; set; }

public static Review Create(string description, int stars, User author)
public static Review Create(string description, int stars, User author, Advert advert)
{
return new Review
{
Description = description,
Stars = stars,
AuthorId = author.Id,
Author = author
Author = author,
AdvertId = advert.Id,
Advert = advert
};
}
}
2 changes: 1 addition & 1 deletion server/Booking.Core/Repositories/IReviewRepository.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,5 +5,5 @@ namespace Booking.Core.Repositories;

public interface IReviewRepository : IRepository<Review>
{

IEnumerable<Review> GetByAdvertId(string advertId);
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
using Booking.Core.Entities;
using Booking.Core.Repositories;
using Microsoft.EntityFrameworkCore;

namespace Booking.Infrastructure.Persistence.Repositories;

Expand All @@ -19,12 +20,21 @@ public void Delete(Review entity)

public IEnumerable<Review> GetAll()
{
return bookingDbContext.Reviews;
return bookingDbContext.Reviews
.Include(r => r.Author);
}

public IEnumerable<Review> GetByAdvertId(string advertId)
{
return bookingDbContext.Reviews
.Include(r => r.Author)
.Where(r => r.AdvertId == advertId);
}

public Review? GetById(string id)
{
return bookingDbContext.Reviews
.Include(r => r.Author)
.SingleOrDefault(r => r.Id == id);
}
}

0 comments on commit 5e7d50a

Please sign in to comment.