.gitignore | ||
auth.go | ||
auth_test.go | ||
database.go | ||
Dockerfile | ||
go.mod | ||
go.sum | ||
main.go | ||
README.md | ||
routes.go | ||
routes_test.go | ||
utils.go |
Basic spotify API in golang
This API supports simple artist read operations for spotify data, as well as using a simple caching database and handling client authentication automatically.
Setup
After compiling the binary, or when executing via go run
, just be sure to set the following environment variables to enable access to Spotify's API.
SPOTIFY_ID=<your spotify client ID>
SPOTIFY_TOKEN=<your spotify token>
Example execution using the linux command line:
SPOTIFY_ID=myspotifyID SPOTIFY_TOKEN=myspotifytoken ./gomusic
Alternatively you can use go run
too:
SPOTIFY_ID=myspotifyID SPOTIFY_TOKEN=myspotifytoken go run .
This project has been built with docker support, and a docker image can be built using the Dockerfile provided. Please note that the above environment variables will still need to be passed into the container for execution to work correctly.
Testing
This API comes with a complete test suite, it can be run using the standard go test
system.
When running tests you are required to provide the same credentials as when running the server normally.
For example:
SPOTIFY_ID=myspotifyID SPOTIFY_TOKEN=myspotifytoken go test .
Pagination
The API supports pagination on all endpoints that require it, and by default the first page of 10 elements is returned. If you would like to customize the pagination, simply add the page=
and page_size=
paramaters to your query.
For example, using curl: curl -v 'http://127.0.0.1:8000/artists?name=a&page=2&page_size=100'
This would return the second page of 100 elements from the artist name search endpoint. Currently the genre listing endpoint also supports these parameters.
Adding new genres
The API endpoint to add a new genre accepts a POST
request on the /genres
route, and will parse several types of application input, preferring JSON and XML first but falling back to post-form parsing if the client has not specified an appropriate content type for their request.
To give a concrete example using JSON, the following curl request adds a new genre to the database:
curl -v http://127.0.0.1:8000/genres -X POST --data '{"name": "myfancysound"}' -H "content-type: application/json"
Note that since the content type is being checked by the API for parsing, you are required to specify a correct one, otherwise you must send post-form data for the API to find your values correctly.
Technical Choices
This project is built using the Gin framework, for easy and consistent request contexts, as well as easy to expand middleware support. For database interactions it uses the gorm library, to allow for advanced SQL features and server agnostic support.
This API currently uses sqlite as the database for simplicity, but switching to postgres or mysql is easy without any loss of functionality or change in database calls.