From d6ab78a52d97998b5f89a3e08ffceab27dd057af Mon Sep 17 00:00:00 2001 From: Anu Viswan Date: Sun, 29 Jun 2025 13:48:16 +0530 Subject: [PATCH 01/11] adding create review end point --- .../ReviewService.Application.DTO/Reviews/Review.cs | 7 ++++++- .../Operations/IReviewService.cs | 3 ++- .../Controllers/UserReviewsController.cs | 12 ++++++++++-- .../Models/CreateReviewRequest.cs | 9 +++++++++ .../Models/CreateReviewResponse.cs | 6 ++++++ .../GetReviewsForMovieRequest.cs | 2 +- .../ReviewService.Presenation.Api.csproj | 1 + 7 files changed, 35 insertions(+), 5 deletions(-) create mode 100644 server/nt.microservice/services/ReviewService/ReviewService.Presentation.Api/Models/CreateReviewRequest.cs create mode 100644 server/nt.microservice/services/ReviewService/ReviewService.Presentation.Api/Models/CreateReviewResponse.cs rename server/nt.microservice/services/ReviewService/ReviewService.Presentation.Api/{ViewModels => Models}/GetReviewsForMovieRequest.cs (91%) diff --git a/server/nt.microservice/services/ReviewService/ReviewService.Application.DTO/Reviews/Review.cs b/server/nt.microservice/services/ReviewService/ReviewService.Application.DTO/Reviews/Review.cs index 0aff9e2d..bb6f3f0d 100644 --- a/server/nt.microservice/services/ReviewService/ReviewService.Application.DTO/Reviews/Review.cs +++ b/server/nt.microservice/services/ReviewService/ReviewService.Application.DTO/Reviews/Review.cs @@ -3,5 +3,10 @@ public class Review { public Guid ReviewId { get; set; } - public string MovieTitle { get; set; } = null!; + public Guid MovieId { get; set; } + + public string Content { get; set; } = string.Empty; + public int Rating { get; set; } + public string UserName { get; set; } = string.Empty; + } diff --git a/server/nt.microservice/services/ReviewService/ReviewService.Application.Interfaces/Operations/IReviewService.cs b/server/nt.microservice/services/ReviewService/ReviewService.Application.Interfaces/Operations/IReviewService.cs index 01e6b174..49c17436 100644 --- a/server/nt.microservice/services/ReviewService/ReviewService.Application.Interfaces/Operations/IReviewService.cs +++ b/server/nt.microservice/services/ReviewService/ReviewService.Application.Interfaces/Operations/IReviewService.cs @@ -4,5 +4,6 @@ namespace ReviewService.Application.Interfaces.Operations; public interface IReviewService { - public Task> GetReviewsByMovieIdAsync(Guid movieId); + Task> GetReviewsByMovieIdAsync(Guid movieId); + Task CreateReviewAsync(Review reviewDto); } diff --git a/server/nt.microservice/services/ReviewService/ReviewService.Presentation.Api/Controllers/UserReviewsController.cs b/server/nt.microservice/services/ReviewService/ReviewService.Presentation.Api/Controllers/UserReviewsController.cs index 6f37de51..79a52487 100644 --- a/server/nt.microservice/services/ReviewService/ReviewService.Presentation.Api/Controllers/UserReviewsController.cs +++ b/server/nt.microservice/services/ReviewService/ReviewService.Presentation.Api/Controllers/UserReviewsController.cs @@ -1,5 +1,6 @@ using Microsoft.AspNetCore.Mvc; -using ReviewService.Presenation.Api.ViewModels; +using ReviewService.Application.Interfaces.Operations; +using ReviewService.Presenation.Api.Models; namespace ReviewService.Api.Controllers; @@ -9,7 +10,7 @@ public class UserReviewsController : ControllerBase { private readonly ILogger _logger; - public UserReviewsController(ILogger logger) + public UserReviewsController(IReviewService reviewService, ILogger logger) { _logger = logger; } @@ -19,4 +20,11 @@ public ActionResult GetReviewsForMovie(GetReviewsFor { return default!; } + + [HttpPost] + public ActionResult CreateReview(CreateReviewRequest request) + { + return default!; + } + } diff --git a/server/nt.microservice/services/ReviewService/ReviewService.Presentation.Api/Models/CreateReviewRequest.cs b/server/nt.microservice/services/ReviewService/ReviewService.Presentation.Api/Models/CreateReviewRequest.cs new file mode 100644 index 00000000..f08df856 --- /dev/null +++ b/server/nt.microservice/services/ReviewService/ReviewService.Presentation.Api/Models/CreateReviewRequest.cs @@ -0,0 +1,9 @@ +namespace ReviewService.Presenation.Api.Models; + +public class CreateReviewRequest +{ + public Guid MovieId { get; set; } + public string Content { get; set; } = string.Empty; + public int Rating { get; set; } + public string UserName { get; set; } = string.Empty; +} \ No newline at end of file diff --git a/server/nt.microservice/services/ReviewService/ReviewService.Presentation.Api/Models/CreateReviewResponse.cs b/server/nt.microservice/services/ReviewService/ReviewService.Presentation.Api/Models/CreateReviewResponse.cs new file mode 100644 index 00000000..efa95156 --- /dev/null +++ b/server/nt.microservice/services/ReviewService/ReviewService.Presentation.Api/Models/CreateReviewResponse.cs @@ -0,0 +1,6 @@ +namespace ReviewService.Presenation.Api.Models; + +public class CreateReviewResponse +{ + public Guid Id { get; set; } +} \ No newline at end of file diff --git a/server/nt.microservice/services/ReviewService/ReviewService.Presentation.Api/ViewModels/GetReviewsForMovieRequest.cs b/server/nt.microservice/services/ReviewService/ReviewService.Presentation.Api/Models/GetReviewsForMovieRequest.cs similarity index 91% rename from server/nt.microservice/services/ReviewService/ReviewService.Presentation.Api/ViewModels/GetReviewsForMovieRequest.cs rename to server/nt.microservice/services/ReviewService/ReviewService.Presentation.Api/Models/GetReviewsForMovieRequest.cs index 5365cf08..2afb905b 100644 --- a/server/nt.microservice/services/ReviewService/ReviewService.Presentation.Api/ViewModels/GetReviewsForMovieRequest.cs +++ b/server/nt.microservice/services/ReviewService/ReviewService.Presentation.Api/Models/GetReviewsForMovieRequest.cs @@ -1,4 +1,4 @@ -namespace ReviewService.Presenation.Api.ViewModels; +namespace ReviewService.Presenation.Api.Models; public record GetReviewsForMovieRequest { diff --git a/server/nt.microservice/services/ReviewService/ReviewService.Presentation.Api/ReviewService.Presenation.Api.csproj b/server/nt.microservice/services/ReviewService/ReviewService.Presentation.Api/ReviewService.Presenation.Api.csproj index e2dec2a8..0537b077 100644 --- a/server/nt.microservice/services/ReviewService/ReviewService.Presentation.Api/ReviewService.Presenation.Api.csproj +++ b/server/nt.microservice/services/ReviewService/ReviewService.Presentation.Api/ReviewService.Presenation.Api.csproj @@ -16,6 +16,7 @@ + From bcf7bcd24c81639d180a801c957b49d178d9878c Mon Sep 17 00:00:00 2001 From: Anu Viswan Date: Sun, 29 Jun 2025 15:51:23 +0530 Subject: [PATCH 02/11] clean up --- .../Controllers/UserReviewsController.cs | 36 +++++++++++++++---- ...quest.cs => GetReviewsForMovieResponse.cs} | 4 --- .../ReviewService.Presenation.Api.csproj | 1 + 3 files changed, 31 insertions(+), 10 deletions(-) rename server/nt.microservice/services/ReviewService/ReviewService.Presentation.Api/Models/{GetReviewsForMovieRequest.cs => GetReviewsForMovieResponse.cs} (87%) diff --git a/server/nt.microservice/services/ReviewService/ReviewService.Presentation.Api/Controllers/UserReviewsController.cs b/server/nt.microservice/services/ReviewService/ReviewService.Presentation.Api/Controllers/UserReviewsController.cs index 79a52487..222c254c 100644 --- a/server/nt.microservice/services/ReviewService/ReviewService.Presentation.Api/Controllers/UserReviewsController.cs +++ b/server/nt.microservice/services/ReviewService/ReviewService.Presentation.Api/Controllers/UserReviewsController.cs @@ -1,6 +1,7 @@ using Microsoft.AspNetCore.Mvc; using ReviewService.Application.Interfaces.Operations; using ReviewService.Presenation.Api.Models; +using AutoMapper; namespace ReviewService.Api.Controllers; @@ -9,22 +10,45 @@ namespace ReviewService.Api.Controllers; public class UserReviewsController : ControllerBase { private readonly ILogger _logger; + private readonly IReviewService _reviewService; + private readonly IMapper _mapper; - public UserReviewsController(IReviewService reviewService, ILogger logger) + public UserReviewsController(IReviewService reviewService, IMapper mapper, ILogger logger) { _logger = logger; + _reviewService = reviewService; + _mapper = mapper; } - [HttpGet(Name = "GetReviewsForMovie")] - public ActionResult GetReviewsForMovie(GetReviewsForMovieRequest request) + [HttpGet] + [Route("GetReviewsForMovie/{movieId}")] + public ActionResult GetReviewsForMovie(Guid movieId) { return default!; } [HttpPost] - public ActionResult CreateReview(CreateReviewRequest request) + [Route("CreateReview")] + public async Task> CreateReview(CreateReviewRequest request) { - return default!; - } + try + { + if (!ModelState.IsValid) + { + return BadRequest(ModelState); + } + + var reviewId = await _reviewService.CreateReviewAsync(_mapper.Map(request)).ConfigureAwait(false); + return Ok(new CreateReviewResponse + { + Id = reviewId + }); + } + catch (Exception e) + { + _logger.LogError(@"An error occurred while creating the review.", e); + return BadRequest(e); + } + } } diff --git a/server/nt.microservice/services/ReviewService/ReviewService.Presentation.Api/Models/GetReviewsForMovieRequest.cs b/server/nt.microservice/services/ReviewService/ReviewService.Presentation.Api/Models/GetReviewsForMovieResponse.cs similarity index 87% rename from server/nt.microservice/services/ReviewService/ReviewService.Presentation.Api/Models/GetReviewsForMovieRequest.cs rename to server/nt.microservice/services/ReviewService/ReviewService.Presentation.Api/Models/GetReviewsForMovieResponse.cs index 2afb905b..881310e3 100644 --- a/server/nt.microservice/services/ReviewService/ReviewService.Presentation.Api/Models/GetReviewsForMovieRequest.cs +++ b/server/nt.microservice/services/ReviewService/ReviewService.Presentation.Api/Models/GetReviewsForMovieResponse.cs @@ -1,9 +1,5 @@ namespace ReviewService.Presenation.Api.Models; -public record GetReviewsForMovieRequest -{ - public Guid MovieId { get; set; } -} public record GetReviewsForMovieResponse { diff --git a/server/nt.microservice/services/ReviewService/ReviewService.Presentation.Api/ReviewService.Presenation.Api.csproj b/server/nt.microservice/services/ReviewService/ReviewService.Presentation.Api/ReviewService.Presenation.Api.csproj index 0537b077..7b9943e2 100644 --- a/server/nt.microservice/services/ReviewService/ReviewService.Presentation.Api/ReviewService.Presenation.Api.csproj +++ b/server/nt.microservice/services/ReviewService/ReviewService.Presentation.Api/ReviewService.Presenation.Api.csproj @@ -10,6 +10,7 @@ + From 311fe165bd0ea04297576294a779c44a1c171347 Mon Sep 17 00:00:00 2001 From: Anu Viswan Date: Sun, 29 Jun 2025 15:54:36 +0530 Subject: [PATCH 03/11] clean up --- .../Interfaces/IReviewService.cs | 8 -------- .../Operations/ReviewService.cs | 7 ++++++- .../ReviewService.Application.Services.csproj | 1 + 3 files changed, 7 insertions(+), 9 deletions(-) delete mode 100644 server/nt.microservice/services/ReviewService/ReviewService.Application.Services/Interfaces/IReviewService.cs diff --git a/server/nt.microservice/services/ReviewService/ReviewService.Application.Services/Interfaces/IReviewService.cs b/server/nt.microservice/services/ReviewService/ReviewService.Application.Services/Interfaces/IReviewService.cs deleted file mode 100644 index 7824d97a..00000000 --- a/server/nt.microservice/services/ReviewService/ReviewService.Application.Services/Interfaces/IReviewService.cs +++ /dev/null @@ -1,8 +0,0 @@ -using ReviewService.Application.DTO.Reviews; - -namespace ReviewService.Application.Services.Interfaces; - -public interface IReviewService -{ - Task> GetReviewsByMovieIdAsync(Guid movieId); -} diff --git a/server/nt.microservice/services/ReviewService/ReviewService.Application.Services/Operations/ReviewService.cs b/server/nt.microservice/services/ReviewService/ReviewService.Application.Services/Operations/ReviewService.cs index 665d7793..690cf18c 100644 --- a/server/nt.microservice/services/ReviewService/ReviewService.Application.Services/Operations/ReviewService.cs +++ b/server/nt.microservice/services/ReviewService/ReviewService.Application.Services/Operations/ReviewService.cs @@ -1,5 +1,5 @@ using ReviewService.Application.DTO.Reviews; -using ReviewService.Application.Services.Interfaces; +using ReviewService.Application.Interfaces.Operations; namespace ReviewService.Application.Services.Operations; @@ -9,4 +9,9 @@ public Task> GetReviewsByMovieIdAsync(Guid movieId) { throw new NotImplementedException(); } + + public Task CreateReviewAsync(Review reviewDto) + { + throw new NotImplementedException(); + } } diff --git a/server/nt.microservice/services/ReviewService/ReviewService.Application.Services/ReviewService.Application.Services.csproj b/server/nt.microservice/services/ReviewService/ReviewService.Application.Services/ReviewService.Application.Services.csproj index 3c6a2248..faf82c9a 100644 --- a/server/nt.microservice/services/ReviewService/ReviewService.Application.Services/ReviewService.Application.Services.csproj +++ b/server/nt.microservice/services/ReviewService/ReviewService.Application.Services/ReviewService.Application.Services.csproj @@ -8,6 +8,7 @@ + From 84e742715e6ac5cae1a5dd493eaeac9624cf8e17 Mon Sep 17 00:00:00 2001 From: Anu Viswan Date: Sun, 29 Jun 2025 16:11:12 +0530 Subject: [PATCH 04/11] use CQRS, dont use service directly in API --- .../Reviews/{Review.cs => ReviewDto.cs} | 2 +- .../Operations/IReviewService.cs | 4 ++-- .../Commands/CreateReviewCommand.cs | 9 +++++++++ .../Commands/CreateReviewCommandHandler.cs | 18 ++++++++++++++++++ .../Queries/GetReviewsByMovieIdQuery.cs | 2 +- .../Queries/GetReviewsByMovieIdQueryHandler.cs | 4 ++-- ...iewService.Application.Orchestration.csproj | 4 ---- .../Operations/ReviewService.cs | 4 ++-- .../Controllers/UserReviewsController.cs | 18 ++++++++++++++---- .../ReviewService.Presenation.Api.csproj | 3 +++ 10 files changed, 52 insertions(+), 16 deletions(-) rename server/nt.microservice/services/ReviewService/ReviewService.Application.DTO/Reviews/{Review.cs => ReviewDto.cs} (92%) create mode 100644 server/nt.microservice/services/ReviewService/ReviewService.Application.Orchestration/Commands/CreateReviewCommand.cs create mode 100644 server/nt.microservice/services/ReviewService/ReviewService.Application.Orchestration/Commands/CreateReviewCommandHandler.cs diff --git a/server/nt.microservice/services/ReviewService/ReviewService.Application.DTO/Reviews/Review.cs b/server/nt.microservice/services/ReviewService/ReviewService.Application.DTO/Reviews/ReviewDto.cs similarity index 92% rename from server/nt.microservice/services/ReviewService/ReviewService.Application.DTO/Reviews/Review.cs rename to server/nt.microservice/services/ReviewService/ReviewService.Application.DTO/Reviews/ReviewDto.cs index bb6f3f0d..3a3b36bd 100644 --- a/server/nt.microservice/services/ReviewService/ReviewService.Application.DTO/Reviews/Review.cs +++ b/server/nt.microservice/services/ReviewService/ReviewService.Application.DTO/Reviews/ReviewDto.cs @@ -1,6 +1,6 @@ namespace ReviewService.Application.DTO.Reviews; -public class Review +public class ReviewDto { public Guid ReviewId { get; set; } public Guid MovieId { get; set; } diff --git a/server/nt.microservice/services/ReviewService/ReviewService.Application.Interfaces/Operations/IReviewService.cs b/server/nt.microservice/services/ReviewService/ReviewService.Application.Interfaces/Operations/IReviewService.cs index 49c17436..7ff857d6 100644 --- a/server/nt.microservice/services/ReviewService/ReviewService.Application.Interfaces/Operations/IReviewService.cs +++ b/server/nt.microservice/services/ReviewService/ReviewService.Application.Interfaces/Operations/IReviewService.cs @@ -4,6 +4,6 @@ namespace ReviewService.Application.Interfaces.Operations; public interface IReviewService { - Task> GetReviewsByMovieIdAsync(Guid movieId); - Task CreateReviewAsync(Review reviewDto); + Task> GetReviewsByMovieIdAsync(Guid movieId); + Task CreateReviewAsync(ReviewDto reviewDto); } diff --git a/server/nt.microservice/services/ReviewService/ReviewService.Application.Orchestration/Commands/CreateReviewCommand.cs b/server/nt.microservice/services/ReviewService/ReviewService.Application.Orchestration/Commands/CreateReviewCommand.cs new file mode 100644 index 00000000..77b10be3 --- /dev/null +++ b/server/nt.microservice/services/ReviewService/ReviewService.Application.Orchestration/Commands/CreateReviewCommand.cs @@ -0,0 +1,9 @@ +using MediatR; +using ReviewService.Application.DTO.Reviews; + +namespace ReviewService.Application.Orchestration.Commands; + +public class CreateReviewCommand : IRequest +{ + public required ReviewDto Review { get; init; } +} diff --git a/server/nt.microservice/services/ReviewService/ReviewService.Application.Orchestration/Commands/CreateReviewCommandHandler.cs b/server/nt.microservice/services/ReviewService/ReviewService.Application.Orchestration/Commands/CreateReviewCommandHandler.cs new file mode 100644 index 00000000..c2f00757 --- /dev/null +++ b/server/nt.microservice/services/ReviewService/ReviewService.Application.Orchestration/Commands/CreateReviewCommandHandler.cs @@ -0,0 +1,18 @@ +using MediatR; +using ReviewService.Application.Interfaces.Operations; + +namespace ReviewService.Application.Orchestration.Commands; + +public class CreateReviewCommandHandler : IRequestHandler +{ + private readonly IReviewService _reviewService; + public CreateReviewCommandHandler(IReviewService reviewService) + { + _reviewService = reviewService ?? throw new ArgumentNullException(nameof(reviewService)); + } + + public async Task Handle(CreateReviewCommand request, CancellationToken cancellationToken) + { + return await _reviewService.CreateReviewAsync(request.Review).ConfigureAwait(false); + } +} diff --git a/server/nt.microservice/services/ReviewService/ReviewService.Application.Orchestration/Queries/GetReviewsByMovieIdQuery.cs b/server/nt.microservice/services/ReviewService/ReviewService.Application.Orchestration/Queries/GetReviewsByMovieIdQuery.cs index 9f078e72..a21e7b33 100644 --- a/server/nt.microservice/services/ReviewService/ReviewService.Application.Orchestration/Queries/GetReviewsByMovieIdQuery.cs +++ b/server/nt.microservice/services/ReviewService/ReviewService.Application.Orchestration/Queries/GetReviewsByMovieIdQuery.cs @@ -3,7 +3,7 @@ namespace ReviewService.Application.Orchestration.Queries; -public class GetReviewsByMovieIdQuery : IRequest> +public class GetReviewsByMovieIdQuery : IRequest> { public Guid MovieId { get; set; } public GetReviewsByMovieIdQuery(Guid movieId) diff --git a/server/nt.microservice/services/ReviewService/ReviewService.Application.Orchestration/Queries/GetReviewsByMovieIdQueryHandler.cs b/server/nt.microservice/services/ReviewService/ReviewService.Application.Orchestration/Queries/GetReviewsByMovieIdQueryHandler.cs index 1dab701a..8f55eecd 100644 --- a/server/nt.microservice/services/ReviewService/ReviewService.Application.Orchestration/Queries/GetReviewsByMovieIdQueryHandler.cs +++ b/server/nt.microservice/services/ReviewService/ReviewService.Application.Orchestration/Queries/GetReviewsByMovieIdQueryHandler.cs @@ -4,7 +4,7 @@ namespace ReviewService.Application.Orchestration.Queries; -public class GetReviewsByMovieIdQueryHandler : IRequestHandler> +public class GetReviewsByMovieIdQueryHandler : IRequestHandler> { private readonly IReviewService _reviewService; public GetReviewsByMovieIdQueryHandler(IReviewService reviewService) @@ -12,7 +12,7 @@ public GetReviewsByMovieIdQueryHandler(IReviewService reviewService) _reviewService = reviewService; } - public Task> Handle(GetReviewsByMovieIdQuery request, CancellationToken cancellationToken) + public Task> Handle(GetReviewsByMovieIdQuery request, CancellationToken cancellationToken) { return _reviewService.GetReviewsByMovieIdAsync(request.MovieId); } diff --git a/server/nt.microservice/services/ReviewService/ReviewService.Application.Orchestration/ReviewService.Application.Orchestration.csproj b/server/nt.microservice/services/ReviewService/ReviewService.Application.Orchestration/ReviewService.Application.Orchestration.csproj index be99fe48..d0d1e240 100644 --- a/server/nt.microservice/services/ReviewService/ReviewService.Application.Orchestration/ReviewService.Application.Orchestration.csproj +++ b/server/nt.microservice/services/ReviewService/ReviewService.Application.Orchestration/ReviewService.Application.Orchestration.csproj @@ -6,10 +6,6 @@ enable - - - - diff --git a/server/nt.microservice/services/ReviewService/ReviewService.Application.Services/Operations/ReviewService.cs b/server/nt.microservice/services/ReviewService/ReviewService.Application.Services/Operations/ReviewService.cs index 690cf18c..b3aa8319 100644 --- a/server/nt.microservice/services/ReviewService/ReviewService.Application.Services/Operations/ReviewService.cs +++ b/server/nt.microservice/services/ReviewService/ReviewService.Application.Services/Operations/ReviewService.cs @@ -5,12 +5,12 @@ namespace ReviewService.Application.Services.Operations; public class ReviewService : IReviewService { - public Task> GetReviewsByMovieIdAsync(Guid movieId) + public Task> GetReviewsByMovieIdAsync(Guid movieId) { throw new NotImplementedException(); } - public Task CreateReviewAsync(Review reviewDto) + public Task CreateReviewAsync(ReviewDto reviewDto) { throw new NotImplementedException(); } diff --git a/server/nt.microservice/services/ReviewService/ReviewService.Presentation.Api/Controllers/UserReviewsController.cs b/server/nt.microservice/services/ReviewService/ReviewService.Presentation.Api/Controllers/UserReviewsController.cs index 222c254c..1b25446a 100644 --- a/server/nt.microservice/services/ReviewService/ReviewService.Presentation.Api/Controllers/UserReviewsController.cs +++ b/server/nt.microservice/services/ReviewService/ReviewService.Presentation.Api/Controllers/UserReviewsController.cs @@ -2,6 +2,8 @@ using ReviewService.Application.Interfaces.Operations; using ReviewService.Presenation.Api.Models; using AutoMapper; +using MediatR; +using ReviewService.Application.Orchestration.Commands; namespace ReviewService.Api.Controllers; @@ -10,14 +12,14 @@ namespace ReviewService.Api.Controllers; public class UserReviewsController : ControllerBase { private readonly ILogger _logger; - private readonly IReviewService _reviewService; private readonly IMapper _mapper; + private readonly IMediator _mediator; - public UserReviewsController(IReviewService reviewService, IMapper mapper, ILogger logger) + public UserReviewsController(IMediator mediator, IMapper mapper, ILogger logger) { _logger = logger; - _reviewService = reviewService; _mapper = mapper; + _mediator = mediator; } [HttpGet] @@ -38,8 +40,16 @@ public async Task> CreateReview(CreateReviewR return BadRequest(ModelState); } - var reviewId = await _reviewService.CreateReviewAsync(_mapper.Map(request)).ConfigureAwait(false); + var reviewId = await _mediator.Send(new CreateReviewCommand + { + Review = _mapper.Map(request) + }).ConfigureAwait(false); + if (reviewId == Guid.Empty) + { + _logger.LogError("Failed to create review. Review ID is empty."); + return BadRequest("Failed to create review."); + } return Ok(new CreateReviewResponse { Id = reviewId diff --git a/server/nt.microservice/services/ReviewService/ReviewService.Presentation.Api/ReviewService.Presenation.Api.csproj b/server/nt.microservice/services/ReviewService/ReviewService.Presentation.Api/ReviewService.Presenation.Api.csproj index 7b9943e2..74a7fa93 100644 --- a/server/nt.microservice/services/ReviewService/ReviewService.Presentation.Api/ReviewService.Presenation.Api.csproj +++ b/server/nt.microservice/services/ReviewService/ReviewService.Presentation.Api/ReviewService.Presenation.Api.csproj @@ -11,6 +11,8 @@ + + @@ -18,6 +20,7 @@ + From f84b8e89c5c710dafe15c36041da1a2142cf9102 Mon Sep 17 00:00:00 2001 From: Anu Viswan Date: Sun, 29 Jun 2025 16:22:02 +0530 Subject: [PATCH 05/11] clean up --- .../Controllers/UserReviewsController.cs | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/server/nt.microservice/services/ReviewService/ReviewService.Presentation.Api/Controllers/UserReviewsController.cs b/server/nt.microservice/services/ReviewService/ReviewService.Presentation.Api/Controllers/UserReviewsController.cs index 1b25446a..bf8bd4bc 100644 --- a/server/nt.microservice/services/ReviewService/ReviewService.Presentation.Api/Controllers/UserReviewsController.cs +++ b/server/nt.microservice/services/ReviewService/ReviewService.Presentation.Api/Controllers/UserReviewsController.cs @@ -1,9 +1,8 @@ -using Microsoft.AspNetCore.Mvc; -using ReviewService.Application.Interfaces.Operations; -using ReviewService.Presenation.Api.Models; using AutoMapper; using MediatR; +using Microsoft.AspNetCore.Mvc; using ReviewService.Application.Orchestration.Commands; +using ReviewService.Presenation.Api.Models; namespace ReviewService.Api.Controllers; @@ -42,7 +41,7 @@ public async Task> CreateReview(CreateReviewR var reviewId = await _mediator.Send(new CreateReviewCommand { - Review = _mapper.Map(request) + Review = _mapper.Map(request) }).ConfigureAwait(false); if (reviewId == Guid.Empty) From afe662d92d49dc84bc6d04d6c83bc0de786003f8 Mon Sep 17 00:00:00 2001 From: Anu Viswan Date: Tue, 1 Jul 2025 21:58:24 +0530 Subject: [PATCH 06/11] Added Review service Moved Repository interfaces to domain --- .../Repository/GenericRepository.cs | 20 ------------- .../Operations/ReviewService.cs | 28 +++++++++++++++++-- .../ReviewService.Application.Services.csproj | 5 ++++ .../Repositories/IGenericRepository.cs | 12 ++++++++ .../Repositories/IReviewRepository.cs | 11 ++++++++ ...ewService.Infrastructure.Repository.csproj | 4 +++ 6 files changed, 57 insertions(+), 23 deletions(-) delete mode 100644 server/nt.microservice/services/ReviewService/ReviewService.Application.Interfaces/Repository/GenericRepository.cs create mode 100644 server/nt.microservice/services/ReviewService/ReviewService.Domain/Repositories/IGenericRepository.cs create mode 100644 server/nt.microservice/services/ReviewService/ReviewService.Domain/Repositories/IReviewRepository.cs diff --git a/server/nt.microservice/services/ReviewService/ReviewService.Application.Interfaces/Repository/GenericRepository.cs b/server/nt.microservice/services/ReviewService/ReviewService.Application.Interfaces/Repository/GenericRepository.cs deleted file mode 100644 index ae479858..00000000 --- a/server/nt.microservice/services/ReviewService/ReviewService.Application.Interfaces/Repository/GenericRepository.cs +++ /dev/null @@ -1,20 +0,0 @@ -using ReviewService.Domain.Entities; - -namespace ReviewService.Application.Interfaces.Repository; - -public interface IGenericRepository where TEntity : class, IEntity, new() -{ - Task> GetAll(); - Task GetByIdAsync(long id); - Task AddAsync(TEntity entity); - Task UpdateAsync(TEntity entity); - Task DeleteAsync(TEntity entity); -} - -public interface ReviewRepository : IGenericRepository -{ - Task> GetReviewsByMovieIdAsync(Guid movieId); - Task> GetReviewsByUserIdAsync(Guid userId); - Task> GetReviewsByRatingAsync(int rating); - Task> GetReviewsByDateRangeAsync(DateTime startDate, DateTime endDate); -} \ No newline at end of file diff --git a/server/nt.microservice/services/ReviewService/ReviewService.Application.Services/Operations/ReviewService.cs b/server/nt.microservice/services/ReviewService/ReviewService.Application.Services/Operations/ReviewService.cs index b3aa8319..015ebf75 100644 --- a/server/nt.microservice/services/ReviewService/ReviewService.Application.Services/Operations/ReviewService.cs +++ b/server/nt.microservice/services/ReviewService/ReviewService.Application.Services/Operations/ReviewService.cs @@ -1,17 +1,39 @@ -using ReviewService.Application.DTO.Reviews; +using AutoMapper; +using Microsoft.Extensions.Logging; +using ReviewService.Application.DTO.Reviews; using ReviewService.Application.Interfaces.Operations; +using ReviewService.Domain.Entities; +using ReviewService.Domain.Repositories; namespace ReviewService.Application.Services.Operations; public class ReviewService : IReviewService { + private readonly IReviewRepository _reviewRepository; + private readonly IMapper _mapper; + private readonly ILogger _logger; + public ReviewService(IReviewRepository reviewRepository,IMapper mapper, ILogger logger) + { + _reviewRepository = reviewRepository ?? throw new ArgumentNullException(nameof(reviewRepository)); + _mapper = mapper ?? throw new ArgumentNullException(nameof(mapper)); + _logger = logger ?? throw new ArgumentNullException(nameof(logger)); + } public Task> GetReviewsByMovieIdAsync(Guid movieId) { throw new NotImplementedException(); } - public Task CreateReviewAsync(ReviewDto reviewDto) + public async Task CreateReviewAsync(ReviewDto reviewDto) { - throw new NotImplementedException(); + try + { + var review = await _reviewRepository.AddAsync(_mapper.Map(reviewDto)); + return review.Id; + } + catch (Exception ex) + { + _logger.LogError(ex, "An error occurred while creating a review."); + throw; + } } } diff --git a/server/nt.microservice/services/ReviewService/ReviewService.Application.Services/ReviewService.Application.Services.csproj b/server/nt.microservice/services/ReviewService/ReviewService.Application.Services/ReviewService.Application.Services.csproj index faf82c9a..57630032 100644 --- a/server/nt.microservice/services/ReviewService/ReviewService.Application.Services/ReviewService.Application.Services.csproj +++ b/server/nt.microservice/services/ReviewService/ReviewService.Application.Services/ReviewService.Application.Services.csproj @@ -6,6 +6,11 @@ enable + + + + + diff --git a/server/nt.microservice/services/ReviewService/ReviewService.Domain/Repositories/IGenericRepository.cs b/server/nt.microservice/services/ReviewService/ReviewService.Domain/Repositories/IGenericRepository.cs new file mode 100644 index 00000000..57d022e1 --- /dev/null +++ b/server/nt.microservice/services/ReviewService/ReviewService.Domain/Repositories/IGenericRepository.cs @@ -0,0 +1,12 @@ +using ReviewService.Domain.Entities; + +namespace ReviewService.Domain.Repositories; + +public interface IGenericRepository where TEntity : class, IEntity, new() +{ + Task> GetAll(); + Task GetByIdAsync(long id); + Task AddAsync(TEntity entity); + Task UpdateAsync(TEntity entity); + Task DeleteAsync(TEntity entity); +} diff --git a/server/nt.microservice/services/ReviewService/ReviewService.Domain/Repositories/IReviewRepository.cs b/server/nt.microservice/services/ReviewService/ReviewService.Domain/Repositories/IReviewRepository.cs new file mode 100644 index 00000000..0aac5f82 --- /dev/null +++ b/server/nt.microservice/services/ReviewService/ReviewService.Domain/Repositories/IReviewRepository.cs @@ -0,0 +1,11 @@ +using ReviewService.Domain.Entities; + +namespace ReviewService.Domain.Repositories; + +public interface IReviewRepository : IGenericRepository +{ + Task> GetReviewsByMovieIdAsync(Guid movieId); + Task> GetReviewsByUserIdAsync(Guid userId); + Task> GetReviewsByRatingAsync(int rating); + Task> GetReviewsByDateRangeAsync(DateTime startDate, DateTime endDate); +} \ No newline at end of file diff --git a/server/nt.microservice/services/ReviewService/ReviewService.Infrastructure.Repository/ReviewService.Infrastructure.Repository.csproj b/server/nt.microservice/services/ReviewService/ReviewService.Infrastructure.Repository/ReviewService.Infrastructure.Repository.csproj index 125f4c93..608e71d9 100644 --- a/server/nt.microservice/services/ReviewService/ReviewService.Infrastructure.Repository/ReviewService.Infrastructure.Repository.csproj +++ b/server/nt.microservice/services/ReviewService/ReviewService.Infrastructure.Repository/ReviewService.Infrastructure.Repository.csproj @@ -6,4 +6,8 @@ enable + + + + From 270eb214d5defeab0e392e812299edc77153bca8 Mon Sep 17 00:00:00 2001 From: Anu Viswan Date: Tue, 1 Jul 2025 22:17:37 +0530 Subject: [PATCH 07/11] working on repository --- .../Operations/ReviewService.cs | 2 +- .../Repositories/GenericRepository.cs | 32 +++++++++++++++++++ ...ewService.Infrastructure.Repository.csproj | 2 +- 3 files changed, 34 insertions(+), 2 deletions(-) create mode 100644 server/nt.microservice/services/ReviewService/ReviewService.Infrastructure.Repository/Repositories/GenericRepository.cs diff --git a/server/nt.microservice/services/ReviewService/ReviewService.Application.Services/Operations/ReviewService.cs b/server/nt.microservice/services/ReviewService/ReviewService.Application.Services/Operations/ReviewService.cs index 015ebf75..49c51e9d 100644 --- a/server/nt.microservice/services/ReviewService/ReviewService.Application.Services/Operations/ReviewService.cs +++ b/server/nt.microservice/services/ReviewService/ReviewService.Application.Services/Operations/ReviewService.cs @@ -27,7 +27,7 @@ public async Task CreateReviewAsync(ReviewDto reviewDto) { try { - var review = await _reviewRepository.AddAsync(_mapper.Map(reviewDto)); + var review = await _reviewRepository.AddAsync(_mapper.Map(reviewDto)).ConfigureAwait(false); return review.Id; } catch (Exception ex) diff --git a/server/nt.microservice/services/ReviewService/ReviewService.Infrastructure.Repository/Repositories/GenericRepository.cs b/server/nt.microservice/services/ReviewService/ReviewService.Infrastructure.Repository/Repositories/GenericRepository.cs new file mode 100644 index 00000000..0dab4f8b --- /dev/null +++ b/server/nt.microservice/services/ReviewService/ReviewService.Infrastructure.Repository/Repositories/GenericRepository.cs @@ -0,0 +1,32 @@ +using ReviewService.Domain.Entities; +using ReviewService.Domain.Repositories; + +namespace ReviewService.Infrastructure.Repository.Repositories; + +public class GenericRepository : IGenericRepository where TEntity : class, IEntity, new() +{ + public Task AddAsync(TEntity entity) + { + throw new NotImplementedException(); + } + + public Task DeleteAsync(TEntity entity) + { + throw new NotImplementedException(); + } + + public Task> GetAll() + { + throw new NotImplementedException(); + } + + public Task GetByIdAsync(long id) + { + throw new NotImplementedException(); + } + + public Task UpdateAsync(TEntity entity) + { + throw new NotImplementedException(); + } +} diff --git a/server/nt.microservice/services/ReviewService/ReviewService.Infrastructure.Repository/ReviewService.Infrastructure.Repository.csproj b/server/nt.microservice/services/ReviewService/ReviewService.Infrastructure.Repository/ReviewService.Infrastructure.Repository.csproj index 608e71d9..04125aee 100644 --- a/server/nt.microservice/services/ReviewService/ReviewService.Infrastructure.Repository/ReviewService.Infrastructure.Repository.csproj +++ b/server/nt.microservice/services/ReviewService/ReviewService.Infrastructure.Repository/ReviewService.Infrastructure.Repository.csproj @@ -7,7 +7,7 @@ - + From 84d7130db0b557593a2c0e0a676db6ef71899eb5 Mon Sep 17 00:00:00 2001 From: Anu Viswan Date: Tue, 1 Jul 2025 22:48:04 +0530 Subject: [PATCH 08/11] adding cosmos db --- .../infrastructure/nt.orchestrator.AppHost/Program.cs | 8 ++++++++ .../nt.orchestrator.AppHost.csproj | 1 + 2 files changed, 9 insertions(+) diff --git a/server/nt.microservice/infrastructure/nt.orchestrator.AppHost/Program.cs b/server/nt.microservice/infrastructure/nt.orchestrator.AppHost/Program.cs index 77fdea4f..29ec186b 100644 --- a/server/nt.microservice/infrastructure/nt.orchestrator.AppHost/Program.cs +++ b/server/nt.microservice/infrastructure/nt.orchestrator.AppHost/Program.cs @@ -70,6 +70,14 @@ .WithEnvironment("MSSQL_SA_PASSWORD", infrastructureSettings.SqlServer.Password) .WithHttpEndpoint(port: infrastructureSettings.SqlServer.HostPort, targetPort: infrastructureSettings.SqlServer.TargetPort, isProxied: true); +var cosmosDb = builder.AddAzureCosmosDB("nt-reviewservice-db") + .RunAsEmulator(emulator => + { + emulator.WithLifetime(ContainerLifetime.Persistent); + emulator.WithDataVolume(); + }) + .AddCosmosDatabase("ntreviews"); + var authServiceInstances = new List>(); foreach(var port in serviceSettings.AuthService.InstancePorts) diff --git a/server/nt.microservice/infrastructure/nt.orchestrator.AppHost/nt.orchestrator.AppHost.csproj b/server/nt.microservice/infrastructure/nt.orchestrator.AppHost/nt.orchestrator.AppHost.csproj index 1b43f6a8..5e65dca2 100644 --- a/server/nt.microservice/infrastructure/nt.orchestrator.AppHost/nt.orchestrator.AppHost.csproj +++ b/server/nt.microservice/infrastructure/nt.orchestrator.AppHost/nt.orchestrator.AppHost.csproj @@ -13,6 +13,7 @@ + From 1a8e0f0ea3af36795c5473d8901f943ecc2bb8d9 Mon Sep 17 00:00:00 2001 From: Anu Viswan Date: Wed, 2 Jul 2025 19:51:56 +0530 Subject: [PATCH 09/11] added dependencies --- .../infrastructure/nt.orchestrator.AppHost/Program.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/server/nt.microservice/infrastructure/nt.orchestrator.AppHost/Program.cs b/server/nt.microservice/infrastructure/nt.orchestrator.AppHost/Program.cs index 29ec186b..7c61f39e 100644 --- a/server/nt.microservice/infrastructure/nt.orchestrator.AppHost/Program.cs +++ b/server/nt.microservice/infrastructure/nt.orchestrator.AppHost/Program.cs @@ -179,7 +179,9 @@ var reviewService = builder.AddProject("nt-reviewservice-service") .WithEnvironment(Constants.Global.EnvironmentVariables.RunningWithVariable, Constants.Global.EnvironmentVariables.RunningWithValue) - .WithUrls(c => c.Urls.ForEach(u => u.DisplayText = $"Open API ({u.Endpoint?.EndpointName})")); + .WithUrls(c => c.Urls.ForEach(u => u.DisplayText = $"Open API ({u.Endpoint?.EndpointName})")) + .WithReference(cosmosDb) + .WaitFor(cosmosDb); var gateway = builder.AddProject(Constants.Gateway.ServiceName, launchProfileName: Constants.Gateway.LaunchProfile) From 1f2b5fe3616afddd336d43a854b64d88fdd7e6eb Mon Sep 17 00:00:00 2001 From: Anu Viswan Date: Thu, 3 Jul 2025 21:30:26 +0530 Subject: [PATCH 10/11] added couchbase --- .../infrastructure/nt.orchestrator.AppHost/Program.cs | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/server/nt.microservice/infrastructure/nt.orchestrator.AppHost/Program.cs b/server/nt.microservice/infrastructure/nt.orchestrator.AppHost/Program.cs index 7c61f39e..62a3878f 100644 --- a/server/nt.microservice/infrastructure/nt.orchestrator.AppHost/Program.cs +++ b/server/nt.microservice/infrastructure/nt.orchestrator.AppHost/Program.cs @@ -73,10 +73,19 @@ var cosmosDb = builder.AddAzureCosmosDB("nt-reviewservice-db") .RunAsEmulator(emulator => { + emulator.WithGatewayPort(7777); emulator.WithLifetime(ContainerLifetime.Persistent); emulator.WithDataVolume(); }) - .AddCosmosDatabase("ntreviews"); + .AddCosmosDatabase("ntreviews") + .WithUrls(c => c.Urls.ForEach(u => u.DisplayText = $"Open API ({u.Endpoint?.Port})")); + + +var couchbase = builder.AddContainer("couchbase-server", "couchbase:community") + .WithEnvironment("CB_USERNAME", "Administrator") + .WithEnvironment("CB_PASSWORD", "password") + .WithEndpoint(port: 8091, targetPort:8091, scheme:"http") + .WithEndpoint(port: 8093, targetPort:8093); var authServiceInstances = new List>(); From 5764d5a05e4823031fe3f014d64bb38b7cc0dc0d Mon Sep 17 00:00:00 2001 From: Anu Viswan Date: Sat, 5 Jul 2025 21:44:34 +0530 Subject: [PATCH 11/11] adding couchbase --- .../nt.orchestrator.AppHost/Program.cs | 16 ++-------------- 1 file changed, 2 insertions(+), 14 deletions(-) diff --git a/server/nt.microservice/infrastructure/nt.orchestrator.AppHost/Program.cs b/server/nt.microservice/infrastructure/nt.orchestrator.AppHost/Program.cs index 62a3878f..a52f8329 100644 --- a/server/nt.microservice/infrastructure/nt.orchestrator.AppHost/Program.cs +++ b/server/nt.microservice/infrastructure/nt.orchestrator.AppHost/Program.cs @@ -70,18 +70,7 @@ .WithEnvironment("MSSQL_SA_PASSWORD", infrastructureSettings.SqlServer.Password) .WithHttpEndpoint(port: infrastructureSettings.SqlServer.HostPort, targetPort: infrastructureSettings.SqlServer.TargetPort, isProxied: true); -var cosmosDb = builder.AddAzureCosmosDB("nt-reviewservice-db") - .RunAsEmulator(emulator => - { - emulator.WithGatewayPort(7777); - emulator.WithLifetime(ContainerLifetime.Persistent); - emulator.WithDataVolume(); - }) - .AddCosmosDatabase("ntreviews") - .WithUrls(c => c.Urls.ForEach(u => u.DisplayText = $"Open API ({u.Endpoint?.Port})")); - - -var couchbase = builder.AddContainer("couchbase-server", "couchbase:community") +var couchbase = builder.AddContainer("nt-reviewservice-db", "couchbase:community") .WithEnvironment("CB_USERNAME", "Administrator") .WithEnvironment("CB_PASSWORD", "password") .WithEndpoint(port: 8091, targetPort:8091, scheme:"http") @@ -189,8 +178,7 @@ var reviewService = builder.AddProject("nt-reviewservice-service") .WithEnvironment(Constants.Global.EnvironmentVariables.RunningWithVariable, Constants.Global.EnvironmentVariables.RunningWithValue) .WithUrls(c => c.Urls.ForEach(u => u.DisplayText = $"Open API ({u.Endpoint?.EndpointName})")) - .WithReference(cosmosDb) - .WaitFor(cosmosDb); + .WaitFor(couchbase); var gateway = builder.AddProject(Constants.Gateway.ServiceName, launchProfileName: Constants.Gateway.LaunchProfile)