Git Product home page Git Product logo

evercodelab-php-test-assignment's Introduction

Частичное решение задания для PHP-разработчика — Разработка API

Описание задачи

Необходимо написать простейшее API для каталога товаров. Приложение должно содержать:

  • Категории товаров
  • Конкретные товары, которые принадлежат к какой-то категории (один товар может принадлежать нескольким категориям)
  • Пользователей, которые могут авторизоваться

Возможные действия:

  • Получение списка всех категорий
  • Получение списка товаров в конкретной категории
  • Авторизация пользователей
  • Добавление/Редактирование/Удаление категории (для авторизованных пользователей)
  • Добавление/Редактирование/Удаление товара (для авторизованных пользователей)

Технические требования

  1. Приложение должно быть написано на PHP
  2. Приложение не должно быть написано с помощью какого-либо фреймворка, однако можно устанавливать для него различные пакеты через compоser
  3. Результаты запросов должны быть представлены в формате JSON
  4. Результат задания должен быть выложен на github, должна быть инструкция по запуску проекта. Также необходимо пояснить, сколько на каждую часть проекта ушло времени

Критерии оценки

  • Архитектурная организация API
  • Грамотное применение ООП и паттернов проектирования
  • Корректная обработка внештатных ситуаций
  • Код-стайл и соблюдение стандартов
  • Покрытие кода тестами (функциональными или unit)

Запуск

  • Для запуска требуется Vagrant
vagrant plugin install vagrant-hostmanager
vagrant up
  • Если запуск осуществляется на ОС Linux
echo "192.168.84.137  store.test" >> /etc/hosts

Описание API

Product store

User login [/api/login]

Login [POST]

  • Request (application/json)

      {
          "username": "username",
          "password": "password"
      }
    
  • Response 200 (application/json)

    • Headers

        Authorization: AuthTokenString
      
    • Body

        {
             "token": "AuthTokenString"
        }
      
  • Response 422 (application/json)

    • Body

        {
            "username": [
              "The username must be at least 3 characters.",
              "The username field is required."
              ],
            "password": [
               "The password must be at least 8 characters.",
            ]
        }
      
  • Response 422 (application/json)

    • Body

        {
            "username": [
              "Incorrect credentials!",
            ]
        }
      

User login [/api/logout]

Logout [POST]

  • Request (application/json)

    • Header

        Authorization: null
      
  • Response 401 (application/json)

    • Body

        {
          "error": "You unauthorized!"
        }
      
  • Request (application/json)

    • Header

        Authorization: CorrentAuthTokenString
      
  • Response 200 (application/json)

    • Header

        Authorization: 
      
    • Body

        {
            "message": "Successfully logged out"
        }
      

List of categories [/api/categories]

Categories [GET]

  • Response 200 (application/json)

    • Body

        [
            {
                "id":1,
                "name":"product category 1"
            },
            {
                "id":2,
                "name":"product category 2"
            },
            {
                "id":3,
                "name":"product category 3"
            },
            {
                "id":4,
                "name":"product category 4"
            }
        ]
      

List of products for selected category [/api/category/{id}/products]

Products [GET]

  • Response 200 (application/json)

    • Body

        [
            {
                "id":1,
                "name":"product 1"
            },
            {
                "id":2,
                "name":"product 2"
            },
            {
                "id":3,
                "name":"product 3"
            },
            {
                "id":4,
                "name":"product 4"
            }
        ]
      
  • Response 404 (application/json)

    • Body

        {
            "error": "Category not found!"
        }
      

Adding product [/api/product/add]

add product [POST]

  • Request (application/json)

    • Header

        Authorization: CorrentAuthTokenString
      
    • Body

      {
          "name": "product name",
          "categoryIds": [1, 2, 3]
      }
      
  • Response 200 (application/json)

    • Body

      {
          "id": (int)"id of new product"
      }
      

Adding category [/api/category/add]

add category [POST]

  • Request (application/json)

    • Header

        Authorization: CorrentAuthTokenString
      
    • Body

        {
          "name": "category name",
        }
      
  • Response 200 (application/json)

    • Body

        {
          "id": "(int)id of new category"
        }
      

Deleting product [/api/product/{id}]

delete product [DELETE]

  • Request (application/json)

    • Header

        Authorization: CorrentAuthTokenString
      
  • Response 200 (application/json)

    • Body

        true
      
  • Response 404 (application/json)

    • Body

        {
            "error": "Product not found!"
        }
      

Deleting category [/api/category/{id}]

delete category [DELETE]

  • Request (application/json)

    • Header

        Authorization: CorrentAuthTokenString
      
  • Response 200 (application/json)

    • Body

        true
      
  • Response 404 (application/json)

    • Body

        {
            "error": "Category not found!"
        }
      

Editing product [/api/product/{id}]

product edit [PUT]

  • Request (application/json)

    • Header

        Authorization: CorrentAuthTokenString
      
    • Body

        {
            "name": "new product name",
            "categoryIds": [2, 3, 4]
        }
      
  • Response 200 (application/json)

    • Body

        true
      
  • Response 404 (application/json)

    • Body

        {
            "error": "Product not found!"
        }
      

Editing category [/api/category/{id}]

category edit [PUT]

  • Request (application/json)

    • Header

        Authorization: CorrentAuthTokenString
      
    • Body

        {
            "name": "new category name"
        }
      
  • Response 200 (application/json)

    • Body

        true
      
  • Response 404 (application/json)

    • Body

        {
            "error": "Category not found!"
        }
      

evercodelab-php-test-assignment's People

Contributors

do6po avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.