This is a skeleton of a Play Framework app intended for use as a Scala learning project.
The task is to build an API to find all the co-officers of a given company officer (i.e. people that have been officers of any of the companies that our person of interest has been an officer for).
This gives Scala learners an opportunity to build something with a real-world application in the investigative journalism space.
E.g. for officerId aEdQfmEjiBuB7tLwOP_Wfg-JA-8
, this curl request returns their companies:
curl -XGET -u <api-key>: https://api.company-information.service.gov.uk/officers/aEdQfmEjiBuB7tLwOP_Wfg-JA-8/appointments
And for companyNumber 03114488
, this curl request returns its officers:
curl -XGET -u <api-key>: https://api.company-information.service.gov.uk/company/03114488/officers
For more details, see the Companies House API Docs.
Use the API_KEY environment variable to set the Companies House api key:
webserver-project$ API_KEY=my-api-key sbt
...
[webserver-project] $ run
--- (Running the application, auto-reloading is enabled) ---
[info] p.c.s.AkkaHttpServer - Listening for HTTP on /0:0:0:0:0:0:0:0:9000
(Server started, use Enter to stop and go back to the console...)
Implement the /officer/:id/appointmentsProxy
endpoint.
Pass through the unaltered Companies House API appointments response for an officerId.
E.g. for officerId aEdQfmEjiBuB7tLwOP_Wfg-JA-8
: https://api.company-information.service.gov.uk/officers/aEdQfmEjiBuB7tLwOP_Wfg-JA-8/appointments
Build on the CompaniesHouseService
class in the services
package for talking to the Companies House API.
Implement the /officer/:officerId/appointments
endpoint.
Use Circe to decode the Companies House response into Scala case classes. Use the OfficerAppointmentResponse
model in models/CompaniesHouseModels.scala
.
Then return just the list of companyNumbers, as a JSON array.
Implement the /company/:companyNumber/officers
endpoint.
E.g. for companyNumber 03114488: https://api.company-information.service.gov.uk/company/03114488/officers
Use Circe to decode the Companies House response into Scala case classes. Use the CompanyOfficersResponse
model in models/CompaniesHouseModels.scala
.
Implement the /officer/:officerId/connections
endpoint.
It should take an officerId and return a JSON array of connected officer names.
To do this, the backend must find their companies, then find all other officers of those companies.