common

package module
v0.0.0-...-929e0ab Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jul 15, 2021 License: MIT Imports: 3 Imported by: 0

README

License GitHub go.mod Go version Coverage Status Go Report Card

Внимание: Тестовое задание найдено на просторах github-а. Для обучения и тренировки, попробовал решить ее в меру своего понимания. На ревью не отправлял, за оптимальность не ручаюсь.

Упрощенная версия 2ГИС справочника

Задача

Создать REST-API сервис, предполагаемая аудитория которого - 1 000 000 пользователей в месяц.
Размер базы фирм составляет порядка 100 000 записей.
Подробнее здесь

Решение

git clone https://github.com/p12s/2gis-catalog-api.git
cd 2gis-catalog-api

mv configs/config.example.yml configs/config.yml
mv .env.example .env

make init

Что происходит:

  • поднимается контейнер с PostgreSQL, у которого в качестве build-образа используется migrate/migrate:latest для инициализации/миграции БД
  • поднимается контейнер с кодом приложения: документация методов

Реализовать функциональные возможности

  • ✅ выдачу всех организаций находящихся в конкретном здании
  • ✅ выдачу списка всех организаций, которые относятся к указанной рубрике
  • ✅ выдачу информации о фирме по ее идентификатору
  • ✅ добавление в справочник здания вместе с организациями, которые в ней находятся
    Реализовано раздельно:
    1) добавление здания
    2) добавление организации с указанием адреса здания

Реализовать технические моменты

  • ✅ формат маршрутов для доступа к методам, а также формат ответа и запросов
    Swagger - документация методов:
    http://localhost:80/swagger/index.html
  • ✅ спроектировать базу данных + реализовать скрипт ее формирования
  • ✅ подготовить тестовые данные (дамп базы, скрипт для генерации тестового набора данных)
  • ✅ реализовать API согласно ТЗ
  • ✅ инструкцию развертывания на локальной машине makefile + docker-compose

Используемые инструменты

  • ✅ Язык: Go (желательно) или PHP Go
  • ✅ БД: Любая реляционная (например, PostgreSQL или MySQL) PostgreSQL

Добавил от себя

  • бейдж с %-ом покрытия unit-тестами (сейчас 0%)
  • бейдж с результатом запуска тестов и пробной сборки в Github Actions для master-ветки
  • простейшее интеграционное тестирование с Postman
  • работа с docker-compose скрыта в Makefile, все что нужно - команда make init

Что можно улучшить

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

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

This section is empty.

Types

type Building

type Building struct {
	Id       int    `json:"-" db:"id"`
	CityId   int    `json:"city_id" db:"city_id" binding:"required"`
	City     string `json:"city" db:"-"` // название города (если есть), используем при создании записей в БД, если такого еще нет
	StreetId int    `json:"street_id" db:"street_id" binding:"required"`
	Street   string `json:"street" db:"-"` // название улицы (если есть), используем при создании записей в БД, если такой улици еще нет
	House    int    `json:"house" db:"house" binding:"required"`
	Point    string `json:"point" db:"point"`
}

Building - здание содержит в себе как минимум информацию о конкретном здании, а именно

type BuildingCreateRequest

type BuildingCreateRequest struct {
	CityId   int    `json:"city_id" db:"city_id"`
	City     string `json:"city" db:"-"` // название города (если есть), используем при создании записей в БД, если такого еще нет
	StreetId int    `json:"street_id" db:"street_id"`
	Street   string `json:"street" db:"-"` // название улицы (если есть), используем при создании записей в БД, если такой улици еще нет
	House    int    `json:"house" db:"house" binding:"required"`
	Point    string `json:"point" db:"point"`
}

BuildingCreateRequest - пришедший запрос на создание здания

type City

type City struct {
	Id   int    `json:"id" db:"id"`
	Name string `json:"name" db:"name" binding:"required"`
}

City - город

type Company

type Company struct {
	Id       int      `json:"id" db:"id"`
	Name     string   `json:"name" db:"name" binding:"required"`
	Phones   []Phone  `json:"phones"`
	Building Building `json:"building"`
	Rubric   []Rubric `json:"rubric"`
}

Company - Фирма представляет собой карточку организации в справочнике и должна содержать в себе следующую информацию:

type CompanyCreateRequest

type CompanyCreateRequest struct {
	Name   string `json:"name"`
	Phones []struct {
		CompanyId int    `json:"-"`
		Number    string `json:"number"` // номер телефона
	} `json:"phones"`
	Building struct {
		Id       int    `json:"-"`
		CityId   int    `json:"city_id"`   // id города должен существовать в БД
		StreetId int    `json:"street_id"` // id улицы с привязкой к городу должен существовать в БД
		House    int    `json:"house"`
		Point    string `json:"point"` // в формате "(1.00234567, -90.00876211)"
	} `json:"building"`
	Rubric []struct {
		Id             int    `json:"id"` // id рубрики должен существовать в БД
		Name           string `json:"-"`
		ParentRubricId int    `json:"-"`
	} `json:"rubric"`
}

CompanyCreateRequest - пришедший запрос на создание компании

type CompanyResponse

type CompanyResponse struct {
	Name   string  `json:"name"`
	Phones []Phone `json:"phones"`
}

CompanyResponse - объект компании, который отдаем как результат запроса

type Phone

type Phone struct {
	Id        int    `json:"-" db:"id"`
	CompanyId int    `json:"-" db:"company_id"`
	Number    string `json:"number" db:"number"`
}

Phone - телефон

type Rubric

type Rubric struct {
	Id             int    `json:"id" db:"id"`
	Name           string `json:"name" db:"name"`
	ParentRubricId int    `json:"parent_rubric_id" db:"parent_rubric_id"`
}

Rubric - Рубрика

type Server

type Server struct {
	// contains filtered or unexported fields
}

Server - сервер REST-API

func (*Server) Run

func (s *Server) Run(port string, handler http.Handler) error

Run - запуск

func (*Server) Shutdown

func (s *Server) Shutdown(ctx context.Context) error

Shutdown - grace-full-выключение

type Street

type Street struct {
	Id     int    `json:"id"`
	CityId int    `json:"city_id" binding:"required"`
	Name   string `json:"name" binding:"required"`
}

Street - улица

Directories

Path Synopsis
pkg

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL