Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add review entity class and controllers #29

Merged
merged 14 commits into from
Oct 15, 2024
114 changes: 114 additions & 0 deletions Controllers/ReviewController.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,114 @@
using Microsoft.AspNetCore.Mvc;
using SimpleWebAppReact.Entities;
using Microsoft.Extensions.Logging;
using MongoDB.Driver;
using MongoDB.Driver.Linq;
using SimpleWebAppReact.Services;
using System.Text.RegularExpressions;

namespace SimpleWebAppReact.Controllers
{
/// <summary>
/// Defines endpoints for operations relating the Review table
/// </summary>
[ApiController]
[Route("api/[controller]")]
public class ReviewController : ControllerBase
{
private readonly ILogger<ReviewController> _logger;
private readonly IMongoCollection<Review>? _reviews;

public ReviewController(ILogger<ReviewController> logger, MongoDbService mongoDbService)
{
_logger = logger;
_reviews = mongoDbService.Database?.GetCollection<Review>("review");
}

/// <summary>
/// gets reviews, with optional query parameters
/// </summary>
/// <param name="mostRecent"></param>
/// <returns></returns>
/// </summary>
[HttpGet]
public async Task<ActionResult<Review>> Get([FromQuery] bool mostRecent = true, [FromQuery] string? keywords = null)
{
var reviews = await _reviews.Find(_ => true).ToListAsync();

if (!string.IsNullOrWhiteSpace(keywords))
{
// Split keywords into individual words by space (you can change the delimiter if needed)
var keywordArray = keywords.Split(' ', StringSplitOptions.RemoveEmptyEntries);

// Filter reviews by checking if the description contains any of the keywords
reviews = reviews.Where(x => keywordArray.Any(kw =>
Regex.IsMatch(x.Description, $".*{kw}.*", RegexOptions.IgnoreCase)
)).ToList();
}

if (mostRecent)
{
reviews.Reverse();
}

// Fetch the reviews from the database
return Ok(reviews);
}

/// <summary>
/// gets specific review with id
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
[HttpGet("{id}")]
public async Task<ActionResult<Review?>> GetById([FromRoute] string id)
{
if (!ModelState.IsValid) {
return BadRequest(ModelState);
}

var filter = Builders<Review>.Filter.Eq(x => x.Id, id);
var review = _reviews.Find(filter).FirstOrDefault();

return review is not null ? Ok(review) : NotFound();
}

/// <summary>
/// adds review entry to table
/// </summary>
/// <param name="review"></param>
/// <returns></returns>
[HttpPost]
public async Task<ActionResult> Post(Review review)
{
await _reviews.InsertOneAsync(review);
return CreatedAtAction(nameof(GetById), new { id = review.Id }, review);
}

/// <summary>
/// updates a review entry
/// </summary>
/// <param name="review"></param>
/// <returns></returns>
[HttpPut]
public async Task<ActionResult> Update(Review review)
{
var filter = Builders<Review>.Filter.Eq(x => x.Id, review.Id);
await _reviews.ReplaceOneAsync(filter, review);
return Ok();
}

/// <summary>
/// deletes a review entry
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
[HttpDelete("{id}")]
public async Task<ActionResult> Delete(string id)
{
var filter = Builders<Review>.Filter.Eq(x => x.Id, id);
await _reviews.DeleteOneAsync(filter);
return Ok();
}
}
}
33 changes: 33 additions & 0 deletions Entities/Review.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
namespace SimpleWebAppReact.Entities;
using MongoDB.Bson;
using MongoDB.Bson.Serialization.Attributes;
/// <summary>
/// Class structure matches 1-1 with Building Table in database
/// </summary>
public class Review
{
[BsonId]
[BsonElement("_id"), BsonRepresentation(BsonType.ObjectId)]
public string? Id { get; set; }

[BsonElement("userId"), BsonRepresentation(BsonType.String)]
public string? UserId { get; set; }

[BsonElement("description"), BsonRepresentation(BsonType.String)]
public string? Description { get; set; }

[BsonElement("createdAt"), BsonRepresentation(BsonType.DateTime)]
public DateTime? CreatedAt { get; set; } = DateTime.Now;

[BsonElement("rating"), BsonRepresentation(BsonType.Int32)]
public int? Rating { get; set; }

[BsonElement("likeCount"), BsonRepresentation(BsonType.Int32)]
public int? LikeCount { get; set; }

[BsonElement("dislikeCount"), BsonRepresentation(BsonType.Int32)]
public int? DislikeCount { get; set; }

[BsonElement("buildingId"), BsonRepresentation(BsonType.String)]
public string? BuildingId { get; set; }
}
7 changes: 7 additions & 0 deletions global.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
{
"sdk": {
"version": "6.0.0",
"rollForward": "latestMajor",
"allowPrerelease": true
}
}
Loading