used mongodb as database
This commit is contained in:
1 parent
e18931b6c0
commit
a5ed2d866e
13 files changed
+94
-139
No files matched your search
@@ -20,4 +20,8 @@
|
|||||||
<ProjectReference Include="..\RobotsWantedLeague\RobotsWantedLeague.csproj" />
|
<ProjectReference Include="..\RobotsWantedLeague\RobotsWantedLeague.csproj" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<Folder Include="Services\" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
</Project>
|
</Project>
|
||||||
@@ -1,25 +0,0 @@
|
|||||||
namespace RobotsWantedLeague.Test.Services;
|
|
||||||
using RobotsWantedLeague.Models;
|
|
||||||
using RobotsWantedLeague.Services;
|
|
||||||
|
|
||||||
[TestClass]
|
|
||||||
public class NotEmptyRobotsServiceTest
|
|
||||||
{
|
|
||||||
|
|
||||||
[TestMethod]
|
|
||||||
public void TestHappyPath()
|
|
||||||
{
|
|
||||||
IRobotsService service = new NotEmptyRobotsService();
|
|
||||||
Assert.AreEqual(3, service.Robots.Count);
|
|
||||||
Robot robot = service.CreateRobot("paul", 2, 3, "canada");
|
|
||||||
Assert.AreEqual(robot.Name, "paul");
|
|
||||||
Assert.AreEqual(robot.Weight, 2);
|
|
||||||
|
|
||||||
Assert.AreEqual(4, service.Robots.Count);
|
|
||||||
|
|
||||||
service.DeleteRobotById(robot.Id);
|
|
||||||
Assert.AreEqual(3, service.Robots.Count);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,65 +0,0 @@
|
|||||||
namespace RobotsWantedLeague.Test.Services;
|
|
||||||
using RobotsWantedLeague.Models;
|
|
||||||
using RobotsWantedLeague.Services;
|
|
||||||
|
|
||||||
[TestClass]
|
|
||||||
public class RobotsServiceTest
|
|
||||||
{
|
|
||||||
|
|
||||||
[TestMethod]
|
|
||||||
public void TestCreateRobot()
|
|
||||||
{
|
|
||||||
RobotsService service = new RobotsService();
|
|
||||||
Robot robot = service.CreateRobot("paul", 2, 3, "canada");
|
|
||||||
Assert.AreEqual(robot.Name, "paul");
|
|
||||||
Assert.AreEqual(robot.Weight, 2);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
[TestMethod]
|
|
||||||
public void TestGetRobotById()
|
|
||||||
{
|
|
||||||
RobotsService service = new RobotsService();
|
|
||||||
Assert.IsNull(service.GetRobotById(98));
|
|
||||||
Robot robot = service.CreateRobot("paul", 2, 3, "canada");
|
|
||||||
Robot? ret = service.GetRobotById(robot.Id);
|
|
||||||
Assert.IsNotNull(ret);
|
|
||||||
Assert.AreEqual(robot.Name, ret.Name);
|
|
||||||
}
|
|
||||||
|
|
||||||
[TestMethod]
|
|
||||||
public void TestGetRobotById_MultipleRobots()
|
|
||||||
{
|
|
||||||
RobotsService service = new RobotsService();
|
|
||||||
Robot robot1 = service.CreateRobot("paul", 2, 3, "canada");
|
|
||||||
Robot robot2 = service.CreateRobot("emanuel", 20, 30, "france");
|
|
||||||
Robot? ret = service.GetRobotById(robot2.Id);
|
|
||||||
Assert.IsNotNull(ret);
|
|
||||||
Assert.AreEqual(robot2.Name, ret.Name);
|
|
||||||
}
|
|
||||||
|
|
||||||
[TestMethod]
|
|
||||||
public void TestListRobots()
|
|
||||||
{
|
|
||||||
RobotsService service = new RobotsService();
|
|
||||||
Robot robot1 = service.CreateRobot("paul", 2, 3, "canada");
|
|
||||||
Robot robot2 = service.CreateRobot("emanuel", 20, 30, "france");
|
|
||||||
Assert.AreEqual(2, service.Robots.Count);
|
|
||||||
}
|
|
||||||
|
|
||||||
[TestMethod]
|
|
||||||
public void TestDeleteRobotById()
|
|
||||||
{
|
|
||||||
RobotsService service = new RobotsService();
|
|
||||||
Robot robot1 = service.CreateRobot("paul", 2, 3, "canada");
|
|
||||||
Robot robot2 = service.CreateRobot("emanuel", 20, 30, "france");
|
|
||||||
Robot robot3 = service.CreateRobot("xu", 1, 9, "chine");
|
|
||||||
|
|
||||||
Assert.IsTrue(service.DeleteRobotById(robot2.Id));
|
|
||||||
|
|
||||||
Assert.AreEqual(2, service.Robots.Count);
|
|
||||||
Assert.IsNull(service.GetRobotById(robot2.Id));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -37,8 +37,8 @@ public class RobotsController : Controller
|
|||||||
return View(robotsService.Robots);
|
return View(robotsService.Robots);
|
||||||
}
|
}
|
||||||
|
|
||||||
public IActionResult Robot(int id){
|
public IActionResult Robot(string id){
|
||||||
Robot robot = robotsService.GetRobotById(id);
|
Robot? robot = robotsService.GetRobotById(id);
|
||||||
return View(robot);
|
return View(robot);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,14 @@
|
|||||||
|
using MongoDB.Bson;
|
||||||
|
using MongoDB.Bson.Serialization.Attributes;
|
||||||
|
|
||||||
namespace RobotsWantedLeague.Models;
|
namespace RobotsWantedLeague.Models;
|
||||||
|
|
||||||
public class Robot{
|
public class Robot{
|
||||||
public int Id { get; set;}
|
|
||||||
|
[BsonId]
|
||||||
|
[BsonRepresentation(BsonType.ObjectId)]
|
||||||
|
public string? Id { get; set;}
|
||||||
|
|
||||||
public string Name { get; set;}
|
public string Name { get; set;}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -16,7 +23,7 @@ public class Robot{
|
|||||||
|
|
||||||
public string Country { get; set;}
|
public string Country { get; set;}
|
||||||
|
|
||||||
public Robot(int Id, string Name, int Weight, int Height, string Country){
|
public Robot(string? Id, string Name, int Weight, int Height, string Country){
|
||||||
this.Id = Id;
|
this.Id = Id;
|
||||||
this.Name = Name;
|
this.Name = Name;
|
||||||
this.Weight = Weight;
|
this.Weight = Weight;
|
||||||
|
|||||||
@@ -0,0 +1,11 @@
|
|||||||
|
namespace RobotsWantedLeague.Models;
|
||||||
|
|
||||||
|
public class RobotsDatabaseSettings
|
||||||
|
{
|
||||||
|
|
||||||
|
public string ConnectionString { get; set; } = null!;
|
||||||
|
|
||||||
|
public string DatabaseName { get; set; } = null!;
|
||||||
|
|
||||||
|
public string RobotsCollectionName { get; set; } = null!;
|
||||||
|
}
|
||||||
@@ -1,9 +1,16 @@
|
|||||||
|
using RobotsWantedLeague.Models;
|
||||||
using RobotsWantedLeague.Services;
|
using RobotsWantedLeague.Services;
|
||||||
|
|
||||||
var builder = WebApplication.CreateBuilder(args);
|
var builder = WebApplication.CreateBuilder(args);
|
||||||
|
|
||||||
|
// database settings
|
||||||
|
|
||||||
|
builder.Services.Configure<RobotsDatabaseSettings>(
|
||||||
|
builder.Configuration.GetSection("RobotsDatabase"));
|
||||||
|
|
||||||
// Add services to the container.
|
// Add services to the container.
|
||||||
builder.Services.AddControllersWithViews();
|
builder.Services.AddControllersWithViews();
|
||||||
|
builder.Services.AddSingleton<RobotsService>();
|
||||||
builder.Services.AddSingleton<IRobotsService, NotEmptyRobotsService>();
|
builder.Services.AddSingleton<IRobotsService, NotEmptyRobotsService>();
|
||||||
var app = builder.Build();
|
var app = builder.Build();
|
||||||
|
|
||||||
|
|||||||
@@ -6,4 +6,13 @@
|
|||||||
<ImplicitUsings>enable</ImplicitUsings>
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<PackageReference Include="MongoDB.Driver" Version="2.21.0" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<Folder Include="Entities\" />
|
||||||
|
<Folder Include="Repositories\" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
</Project>
|
</Project>
|
||||||
@@ -9,7 +9,7 @@ public interface IRobotsService{
|
|||||||
int height,
|
int height,
|
||||||
string country);
|
string country);
|
||||||
|
|
||||||
public Robot? GetRobotById(int id);
|
public Robot? GetRobotById(string id);
|
||||||
|
|
||||||
public bool DeleteRobotById(int id);
|
public bool DeleteRobotById(string id);
|
||||||
}
|
}
|
||||||
@@ -1,3 +1,6 @@
|
|||||||
|
using Microsoft.Extensions.Options;
|
||||||
|
using MongoDB.Driver;
|
||||||
|
|
||||||
namespace RobotsWantedLeague.Services;
|
namespace RobotsWantedLeague.Services;
|
||||||
|
|
||||||
using RobotsWantedLeague.Models;
|
using RobotsWantedLeague.Models;
|
||||||
@@ -7,12 +10,22 @@ public class NotEmptyRobotsService: IRobotsService
|
|||||||
private readonly IRobotsService underlyingRobotsService;
|
private readonly IRobotsService underlyingRobotsService;
|
||||||
public List<Robot> Robots { get => underlyingRobotsService.Robots; }
|
public List<Robot> Robots { get => underlyingRobotsService.Robots; }
|
||||||
|
|
||||||
public NotEmptyRobotsService()
|
public NotEmptyRobotsService(RobotsService underlyingRobotsService)
|
||||||
{
|
{
|
||||||
this.underlyingRobotsService = new RobotsService();
|
this.underlyingRobotsService = underlyingRobotsService;
|
||||||
|
fillDefaultRobotsWhenUnderlyingRobotServiceIsEmpty();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void fillDefaultRobotsWhenUnderlyingRobotServiceIsEmpty()
|
||||||
|
{
|
||||||
|
if (underlyingRobotsService.Robots.Count() != 0)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
this.underlyingRobotsService.CreateRobot("Alice", 1050, 2, "Bhutan");
|
this.underlyingRobotsService.CreateRobot("Alice", 1050, 2, "Bhutan");
|
||||||
this.underlyingRobotsService.CreateRobot("Bob", 5001, 5, "Vanuatu");
|
this.underlyingRobotsService.CreateRobot("Bob", 5001, 5, "Vanuatu");
|
||||||
this.underlyingRobotsService.CreateRobot("Xu", 890, 1, "Taiwan");
|
this.underlyingRobotsService.CreateRobot("Xu", 890, 1, "Taiwan");
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public Robot CreateRobot(string name,
|
public Robot CreateRobot(string name,
|
||||||
@@ -20,15 +33,16 @@ public class NotEmptyRobotsService: IRobotsService
|
|||||||
int height,
|
int height,
|
||||||
string country)
|
string country)
|
||||||
{
|
{
|
||||||
return underlyingRobotsService.CreateRobot(name, weight, height, country);
|
var robot = underlyingRobotsService.CreateRobot(name, weight, height, country);
|
||||||
|
return robot;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public Robot? GetRobotById(int id){
|
public Robot? GetRobotById(string id){
|
||||||
return underlyingRobotsService.GetRobotById(id);
|
return underlyingRobotsService.GetRobotById(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool DeleteRobotById(int id){
|
public bool DeleteRobotById(string id){
|
||||||
return underlyingRobotsService.DeleteRobotById(id);
|
return underlyingRobotsService.DeleteRobotById(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,21 +1,25 @@
|
|||||||
|
using Microsoft.Extensions.Options;
|
||||||
|
using MongoDB.Driver;
|
||||||
|
|
||||||
namespace RobotsWantedLeague.Services;
|
namespace RobotsWantedLeague.Services;
|
||||||
|
|
||||||
using RobotsWantedLeague.Models;
|
using RobotsWantedLeague.Models;
|
||||||
|
|
||||||
public class RobotsService: IRobotsService
|
public class RobotsService: IRobotsService
|
||||||
{
|
{
|
||||||
private readonly List<Robot> robots;
|
private readonly IMongoCollection<Robot> robotsCollection;
|
||||||
private int idGenerator = 0;
|
|
||||||
public List<Robot> Robots { get => robots; }
|
|
||||||
|
|
||||||
public RobotsService()
|
public List<Robot> Robots { get => robotsCollection.AsQueryable().ToList(); }
|
||||||
|
|
||||||
|
public RobotsService(IOptions<RobotsDatabaseSettings> bookStoreDatabaseSettings)
|
||||||
{
|
{
|
||||||
robots = new List<Robot>();
|
var mongoClient = new MongoClient(
|
||||||
}
|
bookStoreDatabaseSettings.Value.ConnectionString);
|
||||||
|
|
||||||
private int generateId(){
|
var mongoDatabase = mongoClient.GetDatabase(
|
||||||
idGenerator = idGenerator + 1;
|
bookStoreDatabaseSettings.Value.DatabaseName);
|
||||||
return idGenerator;
|
|
||||||
|
this.robotsCollection = mongoDatabase.GetCollection<Robot>(bookStoreDatabaseSettings.Value.RobotsCollectionName);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Robot CreateRobot(string name,
|
public Robot CreateRobot(string name,
|
||||||
@@ -23,37 +27,24 @@ public class RobotsService: IRobotsService
|
|||||||
int height,
|
int height,
|
||||||
string country)
|
string country)
|
||||||
{
|
{
|
||||||
var robot = new Robot(generateId(), name, weight, height, country);
|
var robot = new Robot(null, name, weight, height, country);
|
||||||
robots.Add(robot);
|
robotsCollection.InsertOne(robot);
|
||||||
return robot;
|
return robot;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private int getIndexOfRobotById(int id){
|
public Robot? GetRobotById(string id)
|
||||||
int idx = 0;
|
{
|
||||||
foreach (Robot robot in robots){
|
IQueryable<Robot> q = from robot in robotsCollection.AsQueryable()
|
||||||
if (robot.Id == id){
|
where robot.Id == id
|
||||||
return idx;
|
select robot;
|
||||||
}
|
return q.First();
|
||||||
idx ++;
|
|
||||||
}
|
|
||||||
return -1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public Robot? GetRobotById(int id){
|
public bool DeleteRobotById(string id)
|
||||||
int indexToDelete = getIndexOfRobotById(id);
|
{
|
||||||
if(indexToDelete == -1){
|
var res = robotsCollection.DeleteOne(robot => robot.Id == id);
|
||||||
return null;
|
return res != null ;
|
||||||
}
|
|
||||||
return robots[indexToDelete];
|
|
||||||
}
|
|
||||||
|
|
||||||
public bool DeleteRobotById(int id){
|
|
||||||
int indexToDelete = getIndexOfRobotById(id);
|
|
||||||
if(indexToDelete == -1){
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
robots.RemoveAt(indexToDelete);
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -83,9 +83,6 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<footer class="border-top footer text-muted">
|
<footer class="border-top footer text-muted">
|
||||||
<div class="container">
|
|
||||||
© 2023 - RobotsWantedLeague - <a asp-area="" asp-controller="Home" asp-action="Privacy">Privacy</a>
|
|
||||||
</div>
|
|
||||||
</footer>
|
</footer>
|
||||||
<script src="~/lib/jquery/dist/jquery.min.js"></script>
|
<script src="~/lib/jquery/dist/jquery.min.js"></script>
|
||||||
<script src="~/lib/bootstrap/dist/js/bootstrap.bundle.min.js"></script>
|
<script src="~/lib/bootstrap/dist/js/bootstrap.bundle.min.js"></script>
|
||||||
|
|||||||
@@ -5,5 +5,10 @@
|
|||||||
"Microsoft.AspNetCore": "Warning"
|
"Microsoft.AspNetCore": "Warning"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"RobotsDatabase": {
|
||||||
|
"ConnectionString": "mongodb://localhost:27017",
|
||||||
|
"DatabaseName": "Robots",
|
||||||
|
"RobotsCollectionName": "Robots"
|
||||||
|
},
|
||||||
"AllowedHosts": "*"
|
"AllowedHosts": "*"
|
||||||
}
|
}
|
||||||
Reference in new issue
Block a user