diff --git a/src/WebAPI/Controllers/UserController.cs b/src/WebAPI/Controllers/UserController.cs new file mode 100644 index 0000000..d66c48a --- /dev/null +++ b/src/WebAPI/Controllers/UserController.cs @@ -0,0 +1,46 @@ +using System.Collections.Generic; +using Microsoft.AspNetCore.Mvc; +using AskToniApi.Models; +using System.Linq; +using System; +using System.Threading.Tasks; + +namespace AskToniApi.Controllers +{ + [Route("api/[controller]")] + public class UserController : Controller + { + private readonly IUserRepository _userRepository; + public UserController(IUserRepository userRepository) + { + _userRepository = userRepository; + } + + [HttpGet] + public Task> Get(int pageOffset = 0, int pageLimit = 0) + { + return GetUsers(pageOffset, pageLimit); + } + + private async Task> GetUsers(int pageOffset, int pageLimit) + { + if (pageLimit > 0) + { + throw new NotImplementedException(); + } + else + { + return await _userRepository.GetAllUsers(); + } + } + + // POST api/user + [HttpPost] + public void Post([FromBody]User value) + { + _userRepository.AddUser(new User() + { FirstName = value.FirstName, + LastName = value.LastName}); + } + } +} \ No newline at end of file diff --git a/src/WebAPI/Controllers/VisitController.cs b/src/WebAPI/Controllers/VisitController.cs new file mode 100644 index 0000000..5ea8998 --- /dev/null +++ b/src/WebAPI/Controllers/VisitController.cs @@ -0,0 +1,88 @@ +using System.Collections.Generic; +using Microsoft.AspNetCore.Mvc; +using AskToniApi.Models; +using System.Linq; +using System; +using System.Threading.Tasks; + +namespace AskToniApi.Controllers +{ + [Route("api/[controller]")] + public class VisitController : Controller + { + private readonly IVisitRepository _visitRepository; + public VisitController(IVisitRepository visitRepository) + { + _visitRepository = visitRepository; + } + + [HttpGet] + public Task> Get(int pageOffset = 0, int pageLimit = 0, string restaurantMongoId = null) + { + return GetVisits(pageOffset, pageLimit, restaurantMongoId); + } + + private async Task> GetVisits(int pageOffset, int pageLimit, string restaurantMongoId) + { + if (String.IsNullOrEmpty(restaurantMongoId) == false) + { + if (pageLimit > 0) + { + return await _visitRepository.GetAllVisitsToARestaurant(restaurantMongoId, pageOffset, pageLimit); + } + else + { + return await _visitRepository.GetAllVisitsToARestaurant(restaurantMongoId); + } + } + else + { + if (pageLimit > 0) + { + return await _visitRepository.GetVisitsUsingFilter(pageOffset, pageLimit); + } + else + { + return await _visitRepository.GetAllVisits(); + } + } + + } + + // GET api/visit/ObjectId + [HttpGet("{id}")] + public Task Get(string id) + { + return GetVisitByIdInternal(id); + } + + private async Task GetVisitByIdInternal(string id) + { + return await _visitRepository.GetVisit(id) ?? new Visit(); + } + + // POST api/visit + [HttpPost] + public void Post([FromBody]Visit value) + { + _visitRepository.AddVisit(new Visit() + { RestaurantMongoId = value.RestaurantMongoId, + RestaurantYelpId = value.RestaurantYelpId, + VisitDate = value.VisitDate}); + } + + // PUT api/visit/ObjectId + [HttpPut("{id}")] + public void Put(string id, [FromBody]Visit value) + { + _visitRepository.UpdateVisit(id, value); + } + + // DELETE api/visit/ObjectId + [HttpDelete("{id}")] + public void Delete(string id) + { + _visitRepository.RemoveVisit(id); + } + } +} \ No newline at end of file diff --git a/src/WebAPI/Models/AskToniContext.cs b/src/WebAPI/Models/AskToniContext.cs index ef4a009..ba15fca 100644 --- a/src/WebAPI/Models/AskToniContext.cs +++ b/src/WebAPI/Models/AskToniContext.cs @@ -39,5 +39,29 @@ public IMongoCollection Reviews return _db.GetCollection("reviews"); } } + + public IMongoCollection Visits + { + get + { + return _db.GetCollection("visits"); + } + } + + public IMongoCollection Users + { + get + { + return _db.GetCollection("users"); + } + } + + public IMongoCollection UserVisits + { + get + { + return _db.GetCollection("uservisits"); + } + } } } \ No newline at end of file diff --git a/src/WebAPI/Models/Interfaces.cs b/src/WebAPI/Models/Interfaces.cs index 3a3290c..ff082e9 100644 --- a/src/WebAPI/Models/Interfaces.cs +++ b/src/WebAPI/Models/Interfaces.cs @@ -20,4 +20,32 @@ public interface IRecommendationRepository Task RemoveReview(string id); Task UpdateReview(string id, Review item); +} + +public interface IVisitRepository +{ + Task> GetAllVisitsToARestaurant(string restaurantMongoId, int pageOffset, int pageLimit); + + Task> GetAllVisitsToARestaurant(string restaurantMongoId); + + Task> GetAllVisits(); + + Task> GetVisitsUsingFilter(int pageOffset, int pageLimit); + + Task GetVisit(string id); + + Task AddVisit(Visit item); + + Task RemoveVisit(string id); + + Task UpdateVisit(string id, Visit item); + + Task AddUserToVisit(string userId, string visitId); +} + +public interface IUserRepository +{ + Task> GetAllUsers(); + + Task AddUser(User item); } \ No newline at end of file diff --git a/src/WebAPI/Models/User.cs b/src/WebAPI/Models/User.cs new file mode 100644 index 0000000..a6e2c53 --- /dev/null +++ b/src/WebAPI/Models/User.cs @@ -0,0 +1,16 @@ +using System; +using MongoDB.Bson; +using MongoDB.Bson.Serialization.Attributes; + +public class User +{ + [BsonId] + [BsonRepresentation(BsonType.ObjectId)] + public string Id { get; set; } + + [BsonElement("FirstName")] + public string FirstName {get; set;} + + [BsonElement("LastName")] + public string LastName {get; set;} +} \ No newline at end of file diff --git a/src/WebAPI/Models/UserRepository.cs b/src/WebAPI/Models/UserRepository.cs new file mode 100644 index 0000000..92080d3 --- /dev/null +++ b/src/WebAPI/Models/UserRepository.cs @@ -0,0 +1,33 @@ +using AskToniApi.Models; +using MongoDB.Driver; +using MongoDB.Bson; +using System.Collections.Generic; +using System.Threading.Tasks; +using System; +using Microsoft.Extensions.Options; + +public class UserRepository : IUserRepository +{ + private readonly AskToniContext _context = null; + + public UserRepository(IOptions dbConnectionConfig) + { + DbConnectionConfig _dbConnectionConfig = dbConnectionConfig.Value; + _context = new AskToniContext(_dbConnectionConfig.mLabConnectStr); + } + + public async Task> GetAllUsers() + { + try { + return await _context.Users.Find(_ => true).ToListAsync(); + } + catch (Exception ex) { + throw ex; + } + } + + public async Task AddUser(User item) + { + await _context.Users.InsertOneAsync(item); + } +} \ No newline at end of file diff --git a/src/WebAPI/Models/UserVisit.cs b/src/WebAPI/Models/UserVisit.cs new file mode 100644 index 0000000..b35b36f --- /dev/null +++ b/src/WebAPI/Models/UserVisit.cs @@ -0,0 +1,17 @@ +using System; +using MongoDB.Bson; +using MongoDB.Bson.Serialization.Attributes; + +public class UserVisit +{ + [BsonId] + [BsonRepresentation(BsonType.ObjectId)] + public string Id { get; set; } + + [BsonElement("VisitId")] + [BsonRepresentation(BsonType.ObjectId)] + public string VisitId {get; set;} + + [BsonElement("UserId")] + public string UserId {get; set;} +} \ No newline at end of file diff --git a/src/WebAPI/Models/Visit.cs b/src/WebAPI/Models/Visit.cs new file mode 100644 index 0000000..621c693 --- /dev/null +++ b/src/WebAPI/Models/Visit.cs @@ -0,0 +1,19 @@ +using System; +using MongoDB.Bson; +using MongoDB.Bson.Serialization.Attributes; + +public class Visit +{ + [BsonId] + [BsonRepresentation(BsonType.ObjectId)] + public string Id { get; set; } + + [BsonElement("RestaurantMongoId")] + public string RestaurantMongoId {get; set;} + + [BsonElement("RestaurantYelpId")] + public string RestaurantYelpId {get; set;} + + [BsonElement("VisitDate")] + public MongoDB.Bson.BsonDateTime VisitDate {get; set;} +} \ No newline at end of file diff --git a/src/WebAPI/Models/VisitRepository.cs b/src/WebAPI/Models/VisitRepository.cs new file mode 100644 index 0000000..29b1017 --- /dev/null +++ b/src/WebAPI/Models/VisitRepository.cs @@ -0,0 +1,96 @@ +using AskToniApi.Models; +using MongoDB.Driver; +using MongoDB.Bson; +using System.Collections.Generic; +using System.Threading.Tasks; +using System; +using Microsoft.Extensions.Options; + +public class VisitRepository : IVisitRepository +{ + private readonly AskToniContext _context = null; + + public VisitRepository(IOptions dbConnectionConfig) + { + DbConnectionConfig _dbConnectionConfig = dbConnectionConfig.Value; + _context = new AskToniContext(_dbConnectionConfig.mLabConnectStr); + } + + public async Task> GetAllVisitsToARestaurant(string restaurantMongoId, int pageOffset, int pageLimit) + { + try { + var filter = Builders.Filter.Eq(v => v.RestaurantMongoId, restaurantMongoId); + return await _context.Visits.Find(filter).Skip(pageOffset*pageLimit).Limit(pageLimit).ToListAsync(); + } + catch (Exception ex) { + throw ex; + } + } + + public async Task> GetAllVisitsToARestaurant(string restaurantMongoId) + { + try { + var filter = Builders.Filter.Eq(v => v.RestaurantMongoId, restaurantMongoId); + return await _context.Visits.Find(filter).ToListAsync(); + } + catch (Exception ex) { + throw ex; + } + } + + public async Task> GetAllVisits() + { + try { + return await _context.Visits.Find(_ => true).ToListAsync(); + } + catch (Exception ex) { + throw ex; + } + } + + public async Task> GetVisitsUsingFilter(int pageOffset, int pageLimit) + { + try { + return await _context.Visits.Find(_ => true).Skip(pageOffset*pageLimit).Limit(pageLimit).ToListAsync(); + } + catch (Exception ex) { + throw ex; + } + } + + public async Task GetVisit(string id) + { + var filter = Builders.Filter.Eq(r => r.Id, id); + return await _context.Visits + .Find(filter) + .FirstOrDefaultAsync(); + } + + public async Task AddVisit(Visit item) + { + await _context.Visits.InsertOneAsync(item); + } + + public async Task RemoveVisit(string id) + { + return await _context.Visits.DeleteOneAsync( + Builders.Filter.Eq(r => r.Id, id)); + } + + public async Task UpdateVisit(string id, Visit item) + { + item.Id = id; + + return await _context.Visits + .ReplaceOneAsync(r => r.Id.Equals(ObjectId.Parse(id)), + item, + new UpdateOptions { IsUpsert = true }); + } + + public async Task AddUserToVisit(string userId, string visitId) + { + var userVisit = new UserVisit(){ UserId = userId, + VisitId = visitId}; + await _context.UserVisits.InsertOneAsync(userVisit); + } +} \ No newline at end of file