Skip to content

xavierigor/work-at-olist

 
 

Repository files navigation

Olist Library

How it works

Olist Library is a library API that lets you create, retrieve, update and delete authors and their books.

It's alive, check it out! Alternatively, if you wanna read the docs, you can click here. Or maybe here :)

Environment used to build the project

Computer
  • Intel Core i7 8th Gen
  • Nvidia GeForce MX150/PCIe/SSE2
  • RAM 16gb
  • SSD 128gb + HDD 1tb
OS
  • Ubuntu 18.04.4 LTS
IDE/Tools
  • PyCharm Professional
  • Insomnia
  • Pyenv (for managing python versions)
  • Poetry (dependency manager)

Dependencies

  • python = "^3.8"
  • django = "^3.0.7"
  • djangorestframework = "^3.11.0"
  • django-filter = "^2.3.0"
  • psycopg2 = "^2.8.5"
  • django-environ = "^0.4.5"
  • drf-yasg = "^1.17.1"
  • django_heroku = "^0.3.1"
  • gunicorn = "^20.0.4"
  • dj-database-url = "^0.5.0"

The database used in this project was POSTGRESQL, that's why we need the psycopg2 dependency.

Installing & Running

You can install Olist Library cloning it from GitHub:

    $ git clone https://github.com/xavierigor/work-at-olist

Create a .env file in the root of the project and copy the contents of .env.example to it:

    $ cd work-at-olist/
    $ touch .env
    $ cp .env.example .env

Now you'll have to modify SECRET_KEY and DATABASE_URL on the newly created .env file with your own database url and app secret key.

Use make setup to install project's dependencies and run migrations:

    $ make setup

Now you can run all tests:

    $ make test

And run the Django built-in server:

    $ make run

Management commands

The application also provides a useful management command that can import authors from a .csv file to the database, import_authors:

    $ python manage.py import_authors <csv-file-path>

The command must receive a valid .csv file as input in the following format:

    name
    Luciano Ramalho
    Osvaldo Santana Neto
    David Beazley
    Chetan Giridhar
    Brian K. Jones
    J.K Rowling

Example below:

    $ python manage.py import_authors authors.csv

Work at Olist

Olist is a company that offers an integration platform for sellers and marketplaces allowing them to sell their products across multiple channels.

The Olist development team consists of developers who love what they do. Our agile development processes and our search for the best development practices provide a great environment for professionals who like to create quality software in good company.

We are always looking for good programmers who love to improve their work. We give preference to small teams with qualified professionals over large teams with average professionals.

This repository contains a problem used to evaluate candidate skills. It's important to notice that satisfactorily solving the problem is just a part of what will be evaluated. We also consider other programming disciplines like documentation, testing, commit timeline, design and coding best practices.

Hints:

  • Carefully read the specification to understand all the problem and artifact requirements before starting, if you don't understand something tell us;
  • Check the recommendations and reference material at the end of this specification;
  • We appreciate simplicity, so create a good project setup that will help us in your evaluation;
  • Please make tests ... we appreciate tests <3... tests make the world better.

How to participate

  1. Make a fork of this repository on Github. If you can't create a public fork of this project, make a private repository (bitbucket/gitlab/github offers free private repos) and add read permission for one of these users below:
  2. Follow the instructions of README.md (this file);
  3. Deploy your project on a hosting service (we recommend Heroku);
  4. Apply for the position at our career page with:
    • Link to the fork on Github (or bitbucket/gitlab);
    • Link to the deployed project in a hosting service.

Specification

You should implement an application for a library to store book and authors data.

This application must provide an HTTP REST API to attend the requirements.

1. Receive a CSV with authors and import to database

Given a CSV file with many authors (more than a million), you need to build a command to import the data into the database. The CSV file will have the following format:

name
Luciano Ramalho
Osvaldo Santana Neto
David Beazley
Chetan Giridhar
Brian K. Jones
J.K Rowling

Each author record in the database must have the following fields:

  • id (self-generated)
  • name

You need to store the authors' data to complement the book data that will be stored afterward (see item #3).

Extra tip: If you use Django Framework you can do something like this...

python manage.py import_authors authors.csv

2. Expose authors' data in an endpoint

This endpoint needs to return a paginated list with the authors' data. Optionally the authors can be searched by name.

3. CRUD (Create, Read, Update and Delete) of books

You need to implement these actions in your API:

  • Create a book
  • Read book's data
  • Update book's data
  • Delete book's data

Each book record has the fields:

  • id (self-generated)
  • name
  • edition
  • publication_year
  • authors (more than one author can write a book)

To retrieve a book (in easy mode) we can filter by 4 fields (or a composition of these four):

  • name
  • publication_year
  • edition
  • author

But these 4 filters are optional. It must be possible to navigate all the books' data without any filter.

To create a book you need to send this payload (in json format) below:

{
 "name": // Name of the book;
 "edition": // Edition number;
 "publication_year": // Publication year of the book;
 "authors": // List of author ids, same ids of previous imported data
}

Project Requirements:

  • Provide a working environment with your project (eg. Heroku)
  • Application must be written in Python or Go.
  • Python
    • Use Python >= 3.5
    • Choose any Python web framework you want to solve the problem
    • Use PEP-8 for code style
    • Python Coding Style
  • Go
  • Every text or code must be in English
  • Write the project documentation containing:
    • Description;
    • Installing (setup) and testing instructions;
    • If you provide a docker solution for setup, ensure it works without docker too.
    • Brief description of the work environment used to run this project (Computer/operating system, text editor/IDE, libraries, etc).
  • Provide API documentation (in English);
  • Variables, code and strings must be all in English.

Recommendations

  • Write tests! Please make tests ... we appreciate tests <3... tests make the world better;
  • Practice the 12 Factor-App concepts;
  • Use SOLID design principles;
  • Use programming good practices;
  • Use git best practices, with clear messages (written in English);
  • Be aware when modeling the database;
  • Be careful with REST API details. They can bite you!

Have fun!

About

Library API made with Django/Django-restframework

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Python 96.4%
  • Makefile 3.6%