A simple search engine wrapper around the OpenLibrary APIs.
This application is a simple wrapper around the OpenLibrary API.
Create a responsive (phone, tablet, desktop) web application that allows the user to quick filter a list of things. The top of the page will have a search input field and then below that a list of things in response to the filter. The things should be sorted alphabetically. The things could be anything, but should be AJAX pulled from a backend service that you write and should ultimately be pulled from an open public API.
Here’s an example list of API’s curated on GitHub, https://github.com/toddmotto/public-apis but feel free to use any public API you wish.
Using the APIs provided by http://openlibrary.org, a simple search application was created to query for documents as stored in the OpenLibrary database. The initial search page contains a text field to enter search criteria and a single, paged grid to display base information about returned documents. There is a detailed view available for each document which is accessible by selecting a row from the search results' grid.
This application was built using NodeJS as the dependency management system and Angular as the core framework. In addition to these core technologies, the following external tools have been included to allow for various features to be present:
The ag-grid-community
and ag-grid-angular
Node modules were installed to allow for a cleaner grid presentation for search results. This also allows for the ability to sort data, which is not present in the current OpenLibrary API.
The search-text-tokenizer
Node module was installed to provide a more robust query syntax for searching through documents via the OpenLibrary API.
While developing the application, several issues were discovered with the existing OpenLibrary APIs.
The OpenLibrary API does not currently support sorting. This is a problem since the problem description requires that a name
field be the default sort of returned data. To get around this, all search results are required to be returned to the client and be displayed in a paginated grid.
The OpenLibrary API does not contain very good documentation on how to get from one set of data to the next (i.e. document data to specific book data). At the same time, many of the data reponses contain URIs to related data, but those URIs point to data that is of a different format than expected. For example, when querying for a document
, the data is returned in JSON format. Within this data, there is a URI in the key
property. Navigating to this URI gives a server-side generated web page that is templated to the OpenLibrary native application; this is not something that is appropriate in a public API since the web page response cannot be used outside of the OpenLibrary application.
Along with this example, while the majority of the public APIs return JSON data by default, there is one API (http://openlibrary.org/api/books) that returns a JavaScript string by default. This requires additional implementation details to ensure that the data is easily consumable in a reusable fashion.
It has been seen in several isolated cases that some data returned via the document
API is not present when requesting related data from the book
API. To be more precise, it has been seen that there are cases where a document
response returns the names of authors, but the related book
data does not contain any authors. This issue was not addressed specifically in this exercise.
Aside from a standard search query, which is the default directive, it is also possible to search against specific fields. Only a few fields are supported in this application to keep scope down:
- author
- title
- text
- subject
In order use these directives, simply specify the field to search against and the value, separated by a colon (:).
Example:
title:dune author:"Frank Herbert" children
- This search will attempt to find all books with Dune
in the title, Frank Herbert
as the author, and the keyword children
in any field of the document.
If a directive other than those supported is used, it will be ignored in the search.
NodeJS is required to install all required dependencies.
In order to start the application server, the angular-cli
Node module will need to be installed globally.
To install and execute the application, the following steps are required.
- Checkout this project.
- Install the application by navigating to the application directory and executing
npm install
. - Start the project server by navigating to the application directory and executing
ng serve
.
Once the server is started, it will be accessible by navigating to http://localhost:4200.
(in no specific priority)
- Complete automated testing.
- Due to the nature of this exercise, only a few tests were created to showcase my ability to write tests.
- Improve layout.
- I'm not much of a UI/UX designer, so my designs are a little minimalistic/spartan.
- Improve data display.
- Current data displayed to user is a small subset of available data.