Skip to content

Latest commit

 

History

History
174 lines (140 loc) · 5.88 KB

2.md

File metadata and controls

174 lines (140 loc) · 5.88 KB

Задание 2

Реализовать базовые эндпоинты для управления домашней книжной библиотекой с хранением данных в памяти.

Функциональные требования

  1. Для всех эндпоинтов, связанным с управлением книгами, сервис принимает и отдает данные в формате JSON. Для ответа всегда проставляется заголовок Content-Type: application/json.

  2. Пользователь может добавить новую книгу в библиотеку с помощью эндпоинта POST http://127.0.0.1:8080/api/v1/books.

    Пример тела запроса:

    {
      "title": "Три Мушкетера",
      "author": "А. Дюма",
      "publication-date": "06.2022",
      "publisher": "Издательство Эксмо",
      "edition": 1,
      "location": "Первый шкаф, вторая полка, 4 слева"
    }

    Пример тела ответа:

    {
      "id": 1,
      "title": "Три Мушкетера",
      "author": "А. Дюма",
      "publication-date": "06.2022",
      "publisher": "Издательство Эксмо",
      "edition": 1,
      "location": "Первый шкаф, вторая полка, 4 слева"
    }

    Полная OpenAPI схема объекта Book, использующаяся во всех запросах и ответах к api сервиса:

    components:
      schemas:
        Book:
          type: object
          properties:
            id:
              type: integer
              type: int64
            title:
              type: string
              required: true
              minLength: 1
              maxLength: 255
            author:
              type: string
              required: true
              minLength: 1
              maxLength: 128
            publication-date:
              type: string
              required: true
              minLength: 7
              maxLength: 7
            publisher:
              type: string
              minLength: 1
              maxLength: 255
            edition:
              type: int32
              minimum: 1
            location:
              type: string
              minLength: 0
              maxLength: 255
  3. Пользователь может получить список всех книг с помощью эндпоинта GET http://127.0.0.1:8080/api/v1/books.

  4. Пользователь может получить информацию о конкретной книге с помощью эндпоинта GET http://127.0.0.1:8080/api/v1/books/{id}.

  5. Пользователь может книгу из библиотеки с помощью эндпоинта DELETE http://127.0.0.1:8080/api/v1/books/{id}.

  6. Сервис должен возвращать ошибки с кодом 400 в случае невалидного запроса на создание книги и 404 в случае попытки получить информацию по неизвестному ID. Возвращаемая ошибка должна быть в формате JSON и содержать причину.
    Допустимые значения для объекта Book указаны в OpenAPI схеме выше.

    components:
      schemas:
        ValidationError:
          type: object
          properties:
            field:
              type: string
              required: true
            reason:
              type: string
              required: true
        Errors:
          type: array
          items:
            $ref: '#/components/schemas/ValidationError'

Нефункциональные требования

  1. ID книги генерируется на стороне сервиса.

Ограничения

  1. Для построения api допускается использовать только библиотеку net/http и предоставляемый ею роутер.

Об инициализации объектов в Go

Многие разработчики, пришедшие в Go из таких языков как C++, Java или Python, часто пишут код создания и инициализации объекта следующим образом:

type Point struct {
    x, y int
}

func New() *Point {
    return &Point{}
}

func (p *Point) Init(x, y int) {
    p.x = x
    p.y = y
}

В Go применение New в паре с Init считается антипаттерном, так как усложняет код и разбивает процесс создания объекта на две части. Идиоматичный вариант:

type Point struct {
    x, y int
}

func New(x, y int) *Point {
    return &Point{x: x, y: y}
}

Материалы для ознакомления