This project is a parking reselling solution. The parking available on airports and other public areas can be paid on a monthly and yearly basis. Moogilu was hired to architect and implement the complete solution. The system was implemented using .NET platform. Since this is a SAAS platform, the Cloud infrastructure initially was Amazon using EC2 and RDS and later migrated to another cloud platform with SqlServer. The engagement included:
- Migration, Redesign, and implementation of Legacy Parking system
- Implementation of Monthly Parking Service
Migration, Redesign, and implementation of Legacy Parking System
Before Moogilu’s engagement, the project was built by a different group which did not document the architecture and the code. The development environment was bound to the lead developers environment and Visual Studio. This made the application development difficult for we have to make sure that the product could be built on any machine including the cloud environment. This involved re-designing the development environment and build scripts so that it could run on any environment. The build scripts and code included hard-coded paths, email addresses, URIs, domain names, and connection strings. The first task was to clean up all this and move to new developer environment.
As mentioned earlier the developer environment was .Net 2.0 in Visual Studio 2008 and the source control system used was SourceSafe 2005. We upgraded the projects to .Net 4.0 and Visual Studio 2010, also migrated projects to Team Foundation Server 2010 to improve team work environment. This gave enormous flexibility and was easy to share the work across multiple developers. The migration to .Net 4.0 allowed the usage of improved security features and other improvements to deliver more secure and stable solution. At the same time we were able to work with previously created code library and implemented concepts like per-tenant configurable modules, and load on demand. This allowed us reuse the investments previously made into this project.
Monthly Parking service
This is another software module implemented from ground-up. This was development for a parking agency where they could have customers pay for the parking by month. The only dependency from a previous system was that the data. The data from old system had to be used. In addition, the new system was expected to be backward compatible in terms of data export functionality of purchase history.
The architecture followed the familiar MVC pattern. And it was important that the modular architecture had well-defined Web API. The user interface was templates based. Usage of Web API concept and technology allowed us to deliver a really extensible solution – usage of Web API allows a cleaner implementation of MVC pattern separating UI and application logic. This allows to extend this solution and deliver a Windows 8 application for Modern UI (former Metro UI), an Adobe AIR client, or a mobile application for other platforms in future as new client. The Web API provided the hook to integrate any other client solution. Currently only web UI based on jQuery knockout.js templates and some jQuery UI controls is implemented.
The product at the very outset was designed to run on Amazon EC2, S3, VPC, and RDS. After the initial release of the product on Amazon Cloud, they wanted to migration to another Cloud partner – Hosting.com. And the migration from Amazon to Hosting.com is described.
Migration from Amazon Web Services and MySQL to Hosting.com and MS SQL
In the late stage of development a decision was made to migrate from Amazon Web Services and MySQL to Hosting.com and Microsoft SQL Server respectively. Due to modular structure of application, only modules that were tightly coupled with Amazon-specific features, like virtual files repository module that used S3 buckets to store localization files and other files, or logging module that used Dynamo DB service to store logging output separately from application data and content had to be changed.
Because of Entity Framework being used as foundation for Data access layer, the data layer was kept almost unchanged during migration from MySQL to MS SQL Server. Just few optimized queries that were made directly to database for reason of better performance for reports generation, and easier implementation of queries, were rewritten to follow SQL Sever syntax. Other changes related to this migration were update of application configuration files.
A modular architecture designed by Moogilu’s team helped with migration. And migration with testing and release was done within 3 weeks.
Full localization support
This product architecture included localization. The texts and strings visible to user, including labels, email templates, tool-tips, descriptions, invoices, and other email templates, are stored in XML files, provided for each language the application supports. The set of supported languages can be extended easily with just creating new set of localization data files. Application UI allows users switch from one language to another at any time.
Authorize.net integration with CIM and Reporting API support
Payments processing module uses Authorize.net platform and services it provides as a secure foundation. To make solution PCI-compliant and avoid storing users sensitive data, payments processing module uses Authorize.net Customer Information Manager (CIM) and Reports API instead of storing credit cards numbers and other sensitive data within application.
- Applications provides export of the reports into CSV (comma separated values) format for easier reuse data the reports include.
- Data exchange with the legacy system customer users is made via SFTP protocol. XML data format is used for imports and exports that allows different ways of exported data reuse and keep import process flexible and extensible.
- Background tasks separated from web front-end and executed on schedule by a separate executable hosted on different server to deliver better performance for more responsive user experience.
- User accounts that expire soon will get an email notification about this in advance – about 7 days before expiration.