Skip to content

Тестовое задание для Frontend-разработчика на Revel (Go)

Notifications You must be signed in to change notification settings

alexandertopskiy/revel-pg-testtask

Repository files navigation

Тестовое задание для Frontend-разработчика на Revel (Go)

Стек: Revel (Go), PostgreSql


Скриншот приложения - 1


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

Цель

Продемонстрировать владение определенным стеком технологий:

  • Go, Revel
  • PostgreSql
  • HTML, CSS, JavaScript

Начальные условия

Представим что у нас есть некий список книг, авторов и издательств.

  • У каждой книги есть автор и издательство, в котором она издана.
  • У автора может быть несколько книг, и он может работать с разными издательствами.
  • Книга может быть издана сразу несколькими издательствами.
  • Над некоторыми книгами могли работать несколько авторов.
  • Наш список авторов и издательств неполный - то есть в базе данных присутствуют записи с книгами, которые не соответствуют какому либо автору и/или издательству.

Задача

  1. Продумать бизнес-логику базы данных.
  2. Создать оптимизированную структуру таблиц под данную задачу.
  3. Сверстать страничку, которая будет отображать списки книг, авторов и издательств. Возможно использование css шаблонов (Bootstram, Tailwind и т.д.).
  4. Реализовать возможность сортировки данных.
  5. Сделать возможность вывода списков в соответствии с заданными исходными данными, например:
    • вывод списка авторов соответствующих определенному издательству
    • вывод списка книг соответствующих определенному автору и/или издательству
    • вывода списка книг, которые не соответствуют ни одному автору, и/или ни одному издательству в нашем списке.

Инструменты

Для выполнения данного задания необходимо использовать

  • В качестве Базы данных: PostgreSql
  • Фреймворк Revel, который написан на языке Go.

Результат

  • Результат опубликовать на сайте github.com в виде репозитория
  • В процессе работы необходимо активно использовать git и создавать коммиты на основных этапах разработки.
  • Бизнес-логику базы данных оформить в виде миграций и опубликовать в отдельной папке проекта.

Описание решения задачи

Исходные данные для создания Базы данных

Cписок книг, авторов и издательств.

  • У каждой книги есть автор и издательство, в котором она издана.
  • У автора может быть несколько книг, и он может работать с разными издательствами.
  • Книга может быть издана сразу несколькими издательствами.
  • Над некоторыми книгами могли работать несколько авторов.
  • Наш список авторов и издательств неполный - то есть в базе данных присутствуют записи с книгами, которые не соответствуют какому либо автору и/или издательству.

Сущности/Таблицы

Из исходных данных можно выделить 3 сущности-таблицы:

  • Книги / book
  • Авторы / author
  • Издательства / publisher

Книги / book

Название поля Тип Свойства
Id Число Уникальное, Автоинкрементируемое, Первичный ключ
Название книги Строка Не может быть пустым

Авторы / author

Название поля Тип Свойства
Id Число Уникальное, Автоинкрементируемое, Первичный ключ
Имя автора Строка Не может быть пустым

Издательства / publisher

Название поля Тип Свойства
Id Число Уникальное, Автоинкрементируемое, Первичный ключ
Название издательства Строка Не может быть пустым

Связи между таблицами

Все таблицы связаны друг с другом отношением "Многие-ко-Многим":

  • Книги - Авторы:
    • у книги может быть несколько авторов
    • автор может иметь несколько книг
  • Книги - Издательтва:
    • книга может быть издана несколькими издательствами
    • издательство может иметь несколько разных книг
  • Авторы - Издательства:
    • автор может работать с разными издательсвами
    • издательство может работать с разными авторами

Следовательно, необходимо создать отдельные таблицы, в которых каждая запись/строка будет состоять из 2 внешних ключей и хранить связь между двумя таблицами.

  • book_author
  • book_publisher
  • author_publisher

TODO: Добавление данных в Many-To-Many таблицы

По хорошему нужно сделать триггер для добавления записей в author_publisher

  • "Вручную" записи имеет смысл добавлять только в таблицы book_author и book_publisher
  • author_publisher зависит от них: если у автора нет ни одной книги или книга есть, но она нигде не издана, то с издательствами этот автор не работает
  • Соответственно добавление связи автор-издательство должно происходить при добавлении данных в таблицы book_author/book_publisher
  • При добавлении в одну из этих таблиц нужно проверить, есть ли связь во второй таблице, и если есть, то создать новую запись в author_publisher

Например

  • Добавление записи в таблицу book_author: Автор - 1, Книга - 1
    • Проверка: издана ли эта книга кем-либо?
    • Если да, то добавляем в author_publisher данные об авторе и издательстве
    • Если нет, то ничего не делаем (создадим запись при добавления данных в book_publisher)

Верстка страницы

По условиям задания необходимо реализовать возможность вывода списков в соответствии с заданными исходными данными, например:

  • вывод списка авторов соответствующих определенному издательству
  • вывод списка книг соответствующих определенному автору и/или издательству
  • вывода списка книг, которые не соответствуют ни одному автору, и/или ни одному издательству в нашем списке.

В качестве решения можно добавить 2 селект-инпута:

  • Выбор издательства (с пунктами "Без издательства"/"Любое")
  • Выбор автора (с пунктами "Без автора"/"Любой")

Опционально добавить: подсветить строки или убрать ненужные

Запуск проекта

Докер-контейнер (требуется установленный Docker)

Находясь в корне проекта запустить команду:

docker-compose up
# выход из консоли Ctrl+C

Открыть сайт по адресу: http://localhost:8090/

Локально

  1. Создать БД PostgreSQL (в pgAdmin или в CLI psql)
create database book_store;
  1. Запустить миграции БД для создания всех таблиц и добавления в них данных

Вручную:

export DB_URL='postgres://postgres:root@localhost:5432/book_store?sslmode=disable'
export MG_PATH='database/migrations'
migrate -database ${DB_URL} -path $(MG_PATH) up

Или make-скриптом (требуется установленная утилита Make):

make mg_up
  1. Запуск сервера
revel run

Открыть сайт по адресу: http://localhost:9000/

About

Тестовое задание для Frontend-разработчика на Revel (Go)

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published