BukhryakovVladimir / vkTest

Тестовое задание на стажировку VK

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

vkTest

Тестовое задание на стажировку VK

Необходимо разработать бэкенд приложения “Фильмотека”, который предоставляет REST API для управления базой данных фильмов.

Приложение должно поддерживать следующие функции:

  • добавление информации об актёре (имя, пол, дата рождения),
  • изменение информации об актёре.

Возможно изменить любую информацию об актёре, как частично, так и полностью:

  • удаление информации об актёре,
  • добавление информации о фильме.

При добавлении фильма указываются его название (не менее 1 и не более 150 символов), описание (не более 1000 символов), дата выпуска, рейтинг (от 0 до 10) и список актёров:

  • изменение информации о фильме.

Возможно изменить любую информацию о фильме, как частично, так и полностью:

  • удаление информации о фильме,
  • получение списка фильмов с возможностью сортировки по названию, по рейтингу, по дате выпуска. По умолчанию используется сортировка по рейтингу (по убыванию),
  • поиск фильма по фрагменту названия, по фрагменту имени актёра,
  • получение списка актёров, для каждого актёра выдаётся также список фильмов с его участием,
  • API должен быть закрыт авторизацией,
  • поддерживаются две роли пользователей - обычный пользователь и администратор. Обычный пользователь имеет доступ только на получение данных и поиск, администратор - на все действия. Для упрощения можно считать, что соответствие пользователей и ролей задаётся вручную (например, напрямую через БД).

Требования к реализации:

  • язык реализации - go,
  • для хранения данных используется реляционная СУБД (предпочтительно - PostgreSQL),
  • предоставлена спецификация на API (в формате Swagger 2.0 или OpenAPI 3.0).

Бонус: используется подход api-first (генерация кода из спецификации) или code-first (генерация спецификации из кода).

  • Для реализации http сервера разрешается использовать только стандартную библиотеку http (без фреймворков),
  • логирование - в лог должна попадать базовая информация об обрабатываемых запросах, ошибки,
  • код приложения покрыт юнит-тестами не менее чем на 70%,
  • Dockerfile для сборки образа,
  • docker-compose файл для запуска окружения с работающим приложением и СУБД.

Тестирование

Чтобы протестировать введите команду в терминале

make test

image

Запуск

Чтобы запустить введите команду в терминале

make run

image

Примеры

localhost:3000/api/signup

тело запроса:

{
	"username": "kidala",
	"password": "*****",
	"firstName": "Vladimir",
	"lastName": "Bukhryakov",
	"sex": "Male",
	"birthdate": "2002-04-18T00:00:00Z"
}

тело ответа:

"Signup successful"

localhost:3000/api/login

тело запроса:

{
	"username": "kidala",
	"password": "*****"
}

тело ответа:

"Successfully logged in"

localhost:3000/api/add-actor

тело запроса:

{
	"firstName": "Cillian", 
	"lastName": "Murphy", 
	"sex": "Male",
	"birthDate": "1976-05-25T00:00:00Z"
}

тело ответа:

"Actor added successfully"

localhost:3000/api/update-actor

тело запроса:

{
    "id": 4, 
	"firstName": "Robert", 
	"lastName": "De Niro", 
	"sex": "Male",
	"birthDate": "1943-08-17T00:00:00Z"
}

тело ответа:

"Actor updated successfully"

localhost:3000/api/delete-actor

тело запроса:

{
    "id": 44
}

вывод:

"Actor deleted successfully"

localhost:3000/api/get-actors-with-id

тело запроса:

{
	"firstName": "Al" 
}

тело ответа:

[
    {
        "id": 1,
        "firstName": "Al",
        "lastName": "Pacino",
        "sex": "Male",
        "birthDate": "1940-04-25T00:00:00Z"
    }
]

localhost:3000/api/add-movie

тело запроса:

{
    "name": "somethin",
    "description": "once upon a time in...",
    "date": "2010-01-01T00:00:00Z",
    "rating": 8,
    "actors":   [
        {
        "firstName": "Al", 
        "lastName": "Pacino", 
        "sex": "Male",
        "birthDate": "1940-04-25T00:00:00Z"
        },
        {
	    "firstName": "Robert", 
	    "lastName": "De Niro", 
	    "sex": "Male",
	    "birthDate": "1943-08-17T00:00:00Z"
        },
        {
	    "firstName": "Robert", 
	    "lastName": "Pattinson", 
	    "sex": "Male",
	    "birthDate": "1986-05-13T00:00:00Z"
        }
    ]
}

тело ответа:

"Added a movie successfully"

localhost:3000/api/get-movies-with-id

тело запроса:

{
    "actorFirstName": "Robert"
}

тело ответа:

[
    {
        "id": 10,
        "name": "somethin",
        "description": "once upon a time in...",
        "date": "2010-01-01T00:00:00Z",
        "rating": 8,
        "actorFirstName": "",
        "actorLastName": ""
    },
    {
        "id": 8,
        "name": "joska",
        "description": "az",
        "date": "2011-01-01T00:00:00Z",
        "rating": 7,
        "actorFirstName": "",
        "actorLastName": ""
    },
    {
        "id": 9,
        "name": "gaaaa",
        "description": "there was once a gzxczxczxczxczxczxcoy",
        "date": "2010-01-01T00:00:00Z",
        "rating": 8,
        "actorFirstName": "",
        "actorLastName": ""
    }
]

localhost:3000/api/update-movie

тело запроса:

{
    "id": 9,
    "name": "who",
    "description": "123123123",
    "date": "2011-01-01T00:00:00Z",
    "rating": 7
}

тело ответа:

"Movie updated successfully"

localhost:3000/api/add-actor-to-movie

тело запроса:

{
  "movieID": 8,
	"firstName": "Solo", 
	"lastName": "Pacino", 
	"sex": "Male",
	"birthDate": "1990-04-25T00:00:00Z"
}

тело ответа:

"Added an actor to movie successfully"

localhost:3000/api/delete-actor-from-movie

тело запроса:

{
    "movieID": 10,
    "actorID": 4
}

тело ответа:

"Actor deleted from movie successfully"

localhost:3000/api/delete-movie

тело запроса:

{
    "id": 10
}

тело ответа:

"Movie deleted successfully"

localhost:3000/api/movies?order=&by=date

тело ответа:

[
    {
        "id": 0,
        "name": "joska",
        "description": "az",
        "date": "2011-01-01T00:00:00Z",
        "rating": 7,
        "actors": [
            {
                "id": 0,
                "firstName": "Al",
                "lastName": "Pacino",
                "sex": "Male",
                "birthDate": "1940-04-25T00:00:00Z"
            },
            {
                "id": 0,
                "firstName": "Robert",
                "lastName": "De Niro",
                "sex": "Male",
                "birthDate": "1943-08-17T00:00:00Z"
            }
        ]
    },
    {
        "id": 0,
        "name": "who",
        "description": "123123123",
        "date": "2011-01-01T00:00:00Z",
        "rating": 7,
        "actors": [
            {
                "id": 0,
                "firstName": "Al",
                "lastName": "Pacino",
                "sex": "Male",
                "birthDate": "1940-04-25T00:00:00Z"
            },
            {
                "id": 0,
                "firstName": "Robert",
                "lastName": "De Niro",
                "sex": "Male",
                "birthDate": "1943-08-17T00:00:00Z"
            },
            {
                "id": 0,
                "firstName": "Robert",
                "lastName": "Pattinson",
                "sex": "Male",
                "birthDate": "1986-05-13T00:00:00Z"
            }
        ]
    }
]

localhost:3000/api/search-movie

тело запроса:

{
    "name": "o"
}

тело ответа:

[
    {
        "id": 0,
        "name": "joska",
        "description": "az",
        "date": "2011-01-01T00:00:00Z",
        "rating": 7,
        "actors": [
            {
                "id": 0,
                "firstName": "Al",
                "lastName": "Pacino",
                "sex": "Male",
                "birthDate": "1940-04-25T00:00:00Z"
            },
            {
                "id": 0,
                "firstName": "Robert",
                "lastName": "De Niro",
                "sex": "Male",
                "birthDate": "1943-08-17T00:00:00Z"
            }
        ]
    },
    {
        "id": 0,
        "name": "who",
        "description": "123123123",
        "date": "2011-01-01T00:00:00Z",
        "rating": 7,
        "actors": [
            {
                "id": 0,
                "firstName": "Al",
                "lastName": "Pacino",
                "sex": "Male",
                "birthDate": "1940-04-25T00:00:00Z"
            },
            {
                "id": 0,
                "firstName": "Robert",
                "lastName": "De Niro",
                "sex": "Male",
                "birthDate": "1943-08-17T00:00:00Z"
            },
            {
                "id": 0,
                "firstName": "Robert",
                "lastName": "Pattinson",
                "sex": "Male",
                "birthDate": "1986-05-13T00:00:00Z"
            }
        ]
    }
]

localhost:3000/api/actors

тело ответа:

[
    {
        "id": 0,
        "firstName": "Al",
        "lastName": "Pacino",
        "sex": "Male",
        "birthDate": "1940-04-25T00:00:00Z",
        "movies": [
            {
                "id": 0,
                "name": "joska",
                "description": "az",
                "date": "2011-01-01T00:00:00Z",
                "rating": 7
            },
            {
                "id": 0,
                "name": "who",
                "description": "123123123",
                "date": "2011-01-01T00:00:00Z",
                "rating": 7
            }
        ]
    },
    {
        "id": 0,
        "firstName": "Robert",
        "lastName": "De Niro",
        "sex": "Male",
        "birthDate": "1943-08-17T00:00:00Z",
        "movies": [
            {
                "id": 0,
                "name": "joska",
                "description": "az",
                "date": "2011-01-01T00:00:00Z",
                "rating": 7
            },
            {
                "id": 0,
                "name": "who",
                "description": "123123123",
                "date": "2011-01-01T00:00:00Z",
                "rating": 7
            }
        ]
    },
    {
        "id": 0,
        "firstName": "Robert",
        "lastName": "Pattinson",
        "sex": "Male",
        "birthDate": "1986-05-13T00:00:00Z",
        "movies": [
            {
                "id": 0,
                "name": "who",
                "description": "123123123",
                "date": "2011-01-01T00:00:00Z",
                "rating": 7
            }
        ]
    },
    {
        "id": 0,
        "firstName": "Solo",
        "lastName": "Pacino",
        "sex": "Male",
        "birthDate": "1990-04-25T00:00:00Z",
        "movies": [
            {
                "id": 0,
                "name": "joska",
                "description": "az",
                "date": "2011-01-01T00:00:00Z",
                "rating": 7
            }
        ]
    }
]

About

Тестовое задание на стажировку VK


Languages

Language:Go 98.8%Language:Dockerfile 1.0%Language:Makefile 0.2%