Small Nest.js-based project
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
Inga 🏳‍🌈 97d4d55381 solution.md (probably still a draft) 12 months ago
src support for case insensitive search 12 months ago
test use actual omdb instead of test mock in npm start; read omdb api token from environment 12 months ago
.eslintrc.js implemented enrichment service (without search support) 12 months ago
.gitignore initialized nest.js project 12 months ago
.prettierrc set tab width to 4 12 months ago
README.md Initial commit 12 months ago
nest-cli.json initialized nest.js project 12 months ago
package-lock.json use actual omdb instead of test mock in npm start; read omdb api token from environment 12 months ago
package.json use actual omdb instead of test mock in npm start; read omdb api token from environment 12 months ago
solution.md solution.md (probably still a draft) 12 months ago
tsconfig.build.json initialized nest.js project 12 months ago
tsconfig.json normalize omdb response 12 months ago

README.md

Movie Metadata Search

Preface

Hello,

this is part of your interview with Joyn that aims to test your ability to write services that efficiently solve problems we have in our business.

Please read this document carefully before starting, as it outlines your task, the constraints and by what criteria you will be evaluated.

Use git to document your work. When finished, please create a pull request on the master branch, according to the following naming convention: <your name>-solution

We will look at the git history of your pull request to determine the way you approached this. Please do not squash commits or bundle many unrelated changes into one large commit.

The service

You are tasked to implement a RESTful API that provides the following two basic functionalities to retrieve movie metadata from a content catalogue.

The data used for this comes from two sources:

  • Typically, our own movie data would come from a database, but to simplify this, we use the static json files in ./movies as our content catalogue.
  • OMDb movie metadata can be retrieved as follows:
    • https://www.omdbapi.com/?i=<imdb movie id>&apikey=<apikey>&plot=full
    • You can use the following API key: 68fd98ab (Limited to 1000 requests per day)
    • Please see https://www.omdbapi.com for details

Getting enriched movie metadata (title, description, ..)

The first task is to merge movie metadata from our systems with movie metadata from the Open Movie Database (OMDb).

  • Calling GET /api/movies/:id should return a JSON object representing the merged movie object.
  • :id is an alphanumeric value that can either refer to OMDb movie ids or our internal ids.
  • When merging the two objects with the same fields (i.e. both JSON objects have a title / Title), it depends on the name of the field, which metadata should be used.
  • The following rules apply, with capitalized field names (i.e. Title vs title) always referring to OMDb data
    • Title overwrites title
    • Plot overwrites description
    • duration overwrites Runtime
    • userrating will become part of Ratings, applying a similar logic than Ratings currently has
    • Director, Writer and Actors should be transformed from String to an String[]
  • Fields not covered by any of these rules should be merged into the resulting JSON in a normalized way
  • If fields are unclear, make reasonable assumptions and choose your implementation accordingly

Search movies in our catalogue

We want to be able to search movies in our catalogue. To that end, we implement a simple search that returns a movie object if all search terms are true. A search term is a query param in your REST call in the form of <search_field>=<search value>

  • If no search term is provided, return all movies
  • Search terms are case-insensitive
  • Search is performed on the merged json objects of movies
  • If <search_field> is of type Number or String in the movie metadata, the search matches if the values are equal, i.e. ?title=Sin City matches 3532674.json
  • If <search_field> is of type Array in the movie metadata, the search matches if the <search value> is contained in the array, i.e. ?director=Frank Miller matches 3532674.json / the corresponding OMBd object
  • Calling GET /api/movies?<search_field>=<search value> should return a JSON array representing all movies that match the search criteria

Additional Tasks

The following tasks are optional but it would be nice to have at least one, in case you have additional time.

AWS Lambda Function

Use the code you have written and create an AWS Lambda function. For setting up the Lambda function and the deployment please use IaC. You are free to use any framework or tool for this task.

Caching

To improve response times it might be beneficial to add caching to the service. Go through your implementation and check where adding caching would make sense. Then pick an appropriate caching mechanism and implement it in your code. Please also take TTLs and application scaling into account.

Constraints

  • Use TypeScript
  • Use node.js in version 14+
  • Do not introduce any system dependencies (databases, caches, search engines, docker, ..) to solve this task. This task is about your problem solving skills and not about creating a production ready system. It should not require more than npm install and npm start to have a running service.
  • 72h after being added to the project, your pushing rights will be revoked and the latest commit of your implementation will be the basis for your evaluation.
  • We respect your time and encourage you to keep it simple: You are not expected to spend days on this - just proof that you know how to write great software in node.js

Evaluation criteria

In general you can think of the evaluation being a thorough peer review of your code. You will be evaluated by a number of criteria, among others:

  • How well did you apply engineering best practices (general & node.js specific)?
  • Is the service working as intended?
  • How readable is your code?
  • Does the service solve the problem
    • correctly?
    • efficiently?
  • Is your code consistent in itself (styling, language constructs, ..)?
  • Appropriate use of 3rd party modules
  • We do not expect you to have a high test coverage, BUT it is important that you demonstrate that you know how to write testable code and provide a few tests that showcase this.
  • Proper use of git
  • Making good assumptions and documenting them

Questions

If you have any further questions, please open an issue in this GitHub repository and we'll try to give you an answer as quickly as possible.

Good luck