The plain pain
Imagine that you have written a really good web app, and you have distributed it to many customers these customers in turn acquired a lot of customers.
Now fast forward a few months and all of a sudden you are getting calls to help fix issues with your platform. For some unforsaken reason your cloud storage integration stopped working.
Because you have moved on to the next thing you have only limited time to spend on fixing the issue. What you eventually discover is that a service provide decided to change the API from version X to version Y.
Now you have to sit down and spend a couple of days fixing what is been broken.
![Sleep Mode Zero](https://www.softwaresamurai.org/wp-content/uploads/2017/11/sleep_mode_zero.jpg)
That is something you have to deal with all the time in an actively changing web environment.
APIs change and certain providers may stop offering services or worse go out of business.
How to avoid the pain
Most web based APIs use a RESTFul interface to their services. As such the steps involved in utilizing a online service is usually accomplished through OAuth2 authorization to gain secure access to users data, followed by the utilization of the actual API.
As a developer you are free to develop to a specific API or to abstract the API in a way where you can easily replace one service/API with another.
However every single line of code you write you will have to maintain yourself and make sure that changes over time will not break functionality.
Cloud abstraction layer, the better way
Every now and then you can do one better though. Take for example web storage. There are many providers of web storage, such as box, Dropbox, S3, Google storage etc. If you want to offer a wide selection of possible back-end storage platforms you would be well advised to look into a framework such as Flysystem for PHP.
![The PHP League Logo](https://www.softwaresamurai.org/wp-content/uploads/2017/11/loep_logo.png)
Flysystem abstracts it the different back-end APIs and provided a unified interface. You can find a multitude of third party connectors, such as Azure, S3, Dropbox, box etc. You can also find some strange adaptations such as GitHub or flicker for it in case you have use for it.
The most important thing to remember though is that if one of the available back-end APIs changes you will be able to replace it with almost no additional work required on your side.
Also if a provider goes out of business, you can quickly switch to another provider. And finally, if a service provider changes the API version and ignores backwards compatibility you can simply replace the old library with a new library with the same API calls.
There are however some shortcomings to adding an cloud abstraction layer
- It is usually not as comprehensive in its feature set
- The additional code will slow down the requests a few milliseconds
- It will increase the projects complexity
- Not every supported back-end-API may provide the required data. E.g. certain storage back-ends don’t support a file system natively
AstraNOS integration
Since I had to move from Dropbox v1 to Dropbox v2, I switched over to utilize the cloud abstraction layer provided by Flysystem for AstraNOS. Integrating the OAuth2 client from the PHP League us also unifying the signups mechanism for cloud storage back-end ( and more if I ever need to ).
![Working Dropbox integration](https://www.softwaresamurai.org/wp-content/uploads/2017/11/DropBox_working.png)
With this addition I will now be able to increase the available back-end services with little additional work, though I would guess that it still requires a good day per back-end.
However this is a price worth paying if we can leverage multiple cloud based back-ends at the same time and in the same environment. Working seamlessly between them as it has been intended.