Compare commits

...
2 Commits
Author SHA1 Message Date
didier amyot a5ed2d866e used mongodb as database 2023-09-24 11:14:23 -04:00
didier amyot e18931b6c0 mondify gitignore 2023-09-23 08:01:20 -04:00
14 changed files with 96 additions and 139 deletions

No files matched your search

+2
View File
@@ -133,3 +133,5 @@ $RECYCLE.BIN/
_NCrunch* _NCrunch*
.vscode .vscode
.idea
mongodb
@@ -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);
} }
+9 -2
View File
@@ -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!;
}
+7
View File
@@ -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);
} }
+26 -35
View File
@@ -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){
int idx = 0; public Robot? GetRobotById(string id)
foreach (Robot robot in robots){ {
if (robot.Id == id){ IQueryable<Robot> q = from robot in robotsCollection.AsQueryable()
return idx; where robot.Id == id
} select robot;
idx ++; return q.First();
}
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">
&copy; 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
View File
@@ -5,5 +5,10 @@
"Microsoft.AspNetCore": "Warning" "Microsoft.AspNetCore": "Warning"
} }
}, },
"RobotsDatabase": {
"ConnectionString": "mongodb://localhost:27017",
"DatabaseName": "Robots",
"RobotsCollectionName": "Robots"
},
"AllowedHosts": "*" "AllowedHosts": "*"
} }