Shell Fleet Management System
Software Design Doc
Sensitivity: Internal & Restricted
Contents
Scope.....................................................................................................................................................2
Abstract.................................................................................................................................................2
Overall Architecture..............................................................................................................................2
Design Considerations...........................................................................................................................3
Authentication...................................................................................................................................3
Resilience...........................................................................................................................................3
Decoupled.........................................................................................................................................3
Design................................................................................................................................................3
FMS........................................................................................................................................................3
FMSS......................................................................................................................................................4
VehicleController Details...................................................................................................................4
CountryController..............................................................................................................................6
DriverController.................................................................................................................................7
Domain..............................................................................................................................................9
Database..............................................................................................................................................10
Sensitivity: Internal & Restricted
Scope
This document depict the high level design and architectural consideration for Shell Fleet
Management Application and Service, which can used for initial Tech Spike.
Abstract
Shell Fleet management application is used by shell operators for registering driver and their vehicle
details for managing the shell fleet business and its operations.
Overall Architecture
The above picture show the high level architecture of Fleet management System (FMS) with FMS is
developed as a web app with custom authentication or Azure Active Directory (AAD) authentication
and Fleet management System Service (FMSS) as web api secured with AAD B2B.
Design Considerations
Authentication
Some of the authentication can be used are
Azure AD B2C - for enduser authentication
Azure AD B2B - for service to service authentication
Open ID Connect - third party authentication (facebook, google, etc).
Sensitivity: Internal & Restricted
Custom Authentication – UserName, Passphrase
Resilience
Azure web app is used for resilience with proper azure app service plan.
Decoupled
Application is decoupled and made as web app and web api service.
Design Patterns
1. SOLID
2. Factory
3. Repository pattern (Entity Framework)
4. Dependency Injection
5. Layered Architecture
6. Adapter pattern
7. Retry pattern
8. Cloud Design Patterns
FMS Web App Wireframe:
Fig: Driver Page for Enrolment
Sensitivity: Internal & Restricted
Fig: Driver page for overall view and modifications
FMSS Web Api:
We are going to use Restful service (ASP .Net Web API) for our case study [Link] Web
Api solution, we will have three controllers VehicleController,DriveController and CountryController.
All these controllers will support CRUD (Create, Read, Update and Delete) operation for respective
entities.
VehicleController Details :
Controller will expose CRUD operation for vehicle entity.
Operation list in Vehicle Controller:
GetAllVehicleDetails : This method will return list of registered vehicle details.
Url : api/v1/Vehicle/ VehicleList
Sample
1. [RoutePrefix(“api/v1/Vehicle”)
2. public class VehicleController : ApiController
3. {
4.
5. [Route(“VehicleList”)
6. [HttpGet]
7. Public async Task<IHttpActionResult> GetAllVehicleDetails()
8. { }
GetVehicleDetailById : This method will return Vehicle detail based on id.
Sensitivity: Internal & Restricted
Url : api/v1/Vehicle/ Vehicle/{id}
1. [RoutePrefix(“api/v1/Vehicle”)
2. public class VehicleController : ApiController
3. {
4. [Route(“Vehicle/{id}”)
5. [HttpGet]
6. Public async Task<IHttpActionResult> GetVehicleDetailById(int id)
7. { }
RegisterVehicle :This metod will be used to register new Vehicle.
Url : api/v1/Vehicle/ RegisterVehicle
Method signature:
8. [RoutePrefix(“api/v1/Vehicle”)
9. public class VehicleController : ApiController
10. {
11. [Route(“RegisterVehicle”)
12. [HttpPost]
13. Public async Task<IHttpActionResult> RegisterVehicle(VehicleModel
request)
{ }
UpdateVehicleDetail : This method will be used to update already register Vehicle details in system.
Url : api/v1/Vehicle/ UpdateVehicleDetail
Method Signature:
14. [RoutePrefix(“api/v1/Vehicle”)
15. public class VehicleController : ApiController
16. {
17. [Route(“UpdateVehicleDetail”)
18. [HttpPut]
19. Public async Task<IHttpActionResult> UpdateVehicleDetail (VehicleModel request)
{ }
DeregisterVehicle : This method will be used for deregistration.
Url : api/v1/Vehicle/ DeregisterVehicle/{id}
Method Signature:
20. [RoutePrefix(“api/v1/Vehicle”)
Sensitivity: Internal & Restricted
21. public class VehicleController : ApiController
22. {
23. [Route(“DeregisterVehicle/{id}”)
24. [HttpDelete]
25. Public async Task<IHttpActionResult> DeregisterVehicle (int id)
{ }
CountryController Details :
Controller will expose CRUD operation for country entity.
Operation list in Country Controller:
GetCountryDetailList : This method will return list of country details.
Url : api/v1/Country/ CountryList
Method signature:
9. [RoutePrefix(“api/v1/Country”)
10. public class CountryController : ApiController
11. {
12.
13. [Route(“CountryList”)
14. [HttpGet]
15. Public async Task<IHttpActionResult>
GetCountryDetailList()
16. { }
GetCountryDetailById : This method will return country detail based on id.
Url : api/v1/Country/ CountryDetail/{id}
Method signature:
26. [RoutePrefix(“api/v1/Vehicle”)
27. public class CountryController : ApiController
28. {
29. [Route(“CountryDetail/{id}”)
30. [HttpGet]
31. Public async Task<IHttpActionResult> CountryDetailById(int id)
32. { }
RegisterCountry :This metod will be used to register new country detail.
Url : api/v1/Country/ RegisterCountry
Sensitivity: Internal & Restricted
Method signature:
33. [RoutePrefix(“api/v1/Country”)
34. public class CountryController : ApiController
35. {
36. [Route(“RegisterCountry”)
37. [HttpPost]
38. Public async Task<IHttpActionResult> RegisterCountry(CountryModel
request)
{ }
UpdateCountryDetail : This method will be used to update already register country details in system.
Url : api/v1/Country/ UpdateCountryDetail
Method signature:
39. [RoutePrefix(“api/v1/Country”)
40. public class CountryController : ApiController
41. {
42. [Route(“UpdateCountryDetail”)
43. [HttpPut]
44. Public async Task<IHttpActionResult> UpdateCountryDetail (CountryModel
request)
{ }
DeregisterCountry : This method will be used for deregistration.
Url : api/v1/Country/ DeregisterCountry/{id}
Method signature:
45. [RoutePrefix(“api/v1/Country”)
46. public class CountryController : ApiController
47. {
48. [Route(“DeregisterCountry/{id}”)
49. [HttpDelete]
50. Public async Task<IHttpActionResult> DeregisterCountry (int id)
{ }
DriverController Details :
Sensitivity: Internal & Restricted
Controller will expose CRUD operation for Driver entity.
Operation list in Driver Controller:
GetRegisteredDriverList : This method will return list of resitered driver details.
Url : api/v1/Driver/DriverList
Method signature:
17. [RoutePrefix(“api/v1/Driver”)
18. public class DriverController : ApiController
19. {
20.
21. [Route(“DriverList”)
22. [HttpGet]
23. Public async Task<IHttpActionResult> GetDriverDetailList()
24. { }
GetDriverDetailById : This method will return driver detail based on id.
Url : api/v1/Driver/DriverDetail
Method signature:
51. [RoutePrefix(“api/v1/Driver”)
52. public class DriverController : ApiController
53. {
54. [Route(“DriverDetail/{id}”)
55. [HttpGet]
56. Public async Task<IHttpActionResult> DriverDetailById(int id)
57. { }
RegisterDriver :This metod will be used to register new driver detail.
Url : api/v1/Driver/RegisterDriver
Method signature:
58. [RoutePrefix(“api/v1/Driver”)
59. public class DriverController : ApiController
60. {
61. [Route(“RegisterDriver”)
62. [HttpPost]
63. Public async Task<IHttpActionResult> RegisterDriver(DriverModel
request)
{ }
Sensitivity: Internal & Restricted
UpdateDriverDetail : This method will be used to update already register driver details in system.
Url : api/v1/Driver/ UpdateDriverDetail
Method signature:
64. [RoutePrefix(“api/v1/Driver”)
65. public class DriverController : ApiController
66. {
67. [Route(“UpdateDriverDetail”)
68. [HttpPut]
69. Public async Task<IHttpActionResult> UpdateDriverDetail (DriverModel
request)
{ }
DeregisterDriver : This method will be used for deregistration.
Url : api/v1/Driver/DeregisterDriver/{id}
Method signature:
70. [RoutePrefix(“api/v1/Driver”)
71. public class DriverController : ApiController
72. {
73. [Route(“DeregisterDriver/{id}”)
74. [HttpDelete]
75. Public async Task<IHttpActionResult> DeregisterCountry (int id)
{ }
Domain Models:
public class VehicleModel
{
public int VehicleId { get; set; }
public string LicencePlateNumber { get; set; }
public VehicleType Type{ get; set; }
public string VechicleOwner {get;set;}
public int CountryId {get;set;}
public string CountryPermit {get;set;}
public class CountryModel
Sensitivity: Internal & Restricted
{
public int CountryId { get; set; }
public string CountryName { get; set; }
}
public class DriverModel
{
public int DriverId { get; set; }
public string Firstname { get; set; }
public string Lastname{ get; set; }
public string DriverLicenceNumber {get;set;}
public string Address {get;set;}
public string CountryPermit {get;set;}
public enum VehicleType
Unknown,
ShortTruck,
LongTruck
Database ER Design:
--End--
Sensitivity: Internal & Restricted
Sensitivity: Internal & Restricted