Like any other institution of higher learning, CAPA faces organizational challenges tied to processing enrollment applications and registration fees and conducting student and supervisor evaluations. Additionally, CAPA offers non-students the chance to become members of and make charitable contributions to the Alliance.
After using a subscription-based, hosted solution for awhile, CAPA decided that the pre-packaged software didn’t have the data and reporting tools or the flexibility and extensibility that the they needed. So, they contacted our premiere FileMaker partner, Properly Sorted, to investigate building a custom solution tailor fit to their needs.
Because CAPA is headquartered in the United States and its students are located throughout China, we had to wrestle both with the latency problems that typically affect transcontinental communication and navigating the Great Firewall of China.
Dial-Up Internet Access
With some users connecting to the Internet from very rural areas, we recognized that their access was going to be slow and spotty and that compression and asynchronous communication were going to be paramount.
An API in Flux
The idea of a REST data service is so new to FileMaker that the entire official API completely changed on us mid-development.
Disparate Data Sources
Over time, various pieces of data had been tucked away in small silos, and we knew from the start that pulling it all together wasn’t going to be a simple export/import task.
To solve our geography challenge, we set up development and staging in the U.S. on DigitalOcean, but for production we went with AWS out of Singapore. This gave us the ability to keep costs down for QA while still providing the robust feature set and proximity to China that we wanted. We used Git and Jenkins for an easy and consistent deployment process.
To import and normalize data across FileMaker and Amazon S3, Properly Sorted architected a data schema and we wrote import tools to pull data out of the old stores and put it into the new locations.
We were aware that FileMaker’s data API was in flux, so we created our application in Python/Flask and wrote a custom extension that provided an abstraction of the FileMaker API. By piping all database communication through our extension, we could safely continue developing logic as the API changed, because we’d only had to make incremental revisions to our extension to keep pace with the official API.
For user accounts, we relied on Flask’s standard authorization and authentication packages to build out everything you would expect from a rights-based system — login/logout, password reset, restricted views and restricted functionality. The one unusual challenge here was coming up with a password-hashing scheme that both FileMaker and Python could agree on, since both the web-based, end users and the desktop-based, administrators needed to be able to authenticate against the same set of rules. In the end, we used a base64-encoded HMAC value to reach an agreement between the two technologies.
Finally, to compensate for slow and unreliable internet connections, we used Apache’s mod_deflate module to reduce the amount of data coming out of the web application, and we used a combination of AJAX on the front end and Python’s AsyncIO with coroutines on the back end to gracefully handle exceptionally long and/or interrupted requests being sent to the web application.
The China American Psychoanalytic Alliance
Recreate and improve upon an off-the-shelf, hosted software service.
Deliver a modern web application experience to users on dial-up and transient Internet connections.
AWS, FileMaker, Flask, Python, Sass