# README
go mod init - позволяет инициализировать go модули для управления зависимостями и тд
*Makefile - набор инструкций для программы make, которая позволяет легко собирать и запускать проект При вызове make в терминале, программа попытается найти файл с именем Makefile в текущем каталоге и выполнить его инструкции. Если таких файлов несколько, то make -f MakefileName
Сборка = Компиляция + Линковка. Сначала компилятор берет файлы с исходным кодом и получает из них объектные файлы. Затем линковщик берет объектные файл и получает из них исполняемый файл
.PHONY используется для того, чтобы make не искал файлы с определенным именем .PHONY: all build install ..etc.. .DEFAULT_GOLE: устанавливает задачу по умолчанию
cmd/apiserver/main.go - точка входа в программу internal/app/apiserver/apiserver.go - сам apiserver
Чтобы не хардкодить параметры, порты для запуска веб сервера или url доступа к БД, можно использовать toml файлы, чтобы конфигурировать apiserver
configs/apiserver.toml - файл с конфигом Добавляем в проект зависимость, которая нужна для парсинга конфиг файла - github.com/BurntSushi/toml
go get github.com/BurntSushi/toml - обновляет go.mod файл и добавляет туда новую зависимость
Библиотека toml позволяет парсить конфиг из файла apiserver.toml и записывать результат в перменную config. Это происходит в файле main.go
Библиотека logrus - позволяет реализовать логирование Логирование - это процесс формирования логов, а именно: фиксация и структурирование информации о работе системы в отдельные лог-файлы с возможностью быстрого доступа к ним в случае необходимости
go get github.com/sirupsen/logrus У logrus есть много уровней логирования(debug, error, trace, warning, etc...) Нужно иметь возможность конфигурировать эти уровни с помощью config файлов
Для http сервера понадобится роутер, чтобы обрабатывать все входящие запросы. go get -u github.com/gorilla/mux - эта Библиотека как раз поможет создать роутер и работать с ним!
Тесты, Библиотека - go get github.com/stretchr/testify Тесты будут в internal/app/apiserver/apiserver_internal_test internal потому что тестироваться будут внутренние непубличные методы, если бы тестировались публичные методы, то файл был бы apiserver_test
Чтобы в тестах использовать библиотеку assert - go get github.com/stretchr/testify/[email protected]
БД - postgres Хранилище скрывает детали реализации и предоставляет удобные методы работы с БД и будет состоять из нескольких репозиториев
Установка драйвера для пакета "database/sql", тк БД - postgres, то ставим - go get github.com/lib/pq Анонимно импортируем его в store.go
Далее в конфиг apiserver.toml добавляем секцию [store]
sudo apt install postgresql - установка postgres
sudo -u postgres psql - вход в оболочку postgres
\du - список пользователей, по умолчанию там postgres
\l - список БД
\dt - посмотреть список таблицу
\d tableName - посмотреть конкретную таблицу
\q - выход
\d - показывает отношения
CREATE USER argodev WITH PASSWORD '1'; - добавляет пользователя с паролем
ALTER USER argodev WITH SUPERUSER; - из обычного делает superuser
DROP USER argodev; - удаляет юзера
DROP DATABASE dbname; - удаляет БД
Миграции - перенос инфы из одной бд в другую бд (up(продвигает базу вперед)|down(откатывает миграцию)): Качаем с github релиз версию, через deb ставим на систему - Используем утилиту - migrate Создать Миграцию - migrate -path migrations -database "postgres://localhost/restapi_dev?sslmode=disable" up В up - создаем таблицу, в down - дропаем ее
internal/app/model - Хранит все структуры, которые являются представлениями записей в БД (модели данных)
Модели не знают о взаимодействии с БД, за работу с БД отвечают репозитории -internal/app/store/userrepository.go
store/testing.go - возвращает тестовый store, который будет сконфигурирован и функцию, которая позволит очищать заполненные таблицы, чтобы следующие тесты работали с пустой БД
store_test.go - позволит избежать хардкода БД и конфигурить ее, с помощью env переменных Создаем БД restapi_test, прогоняем миграцию migrate -path migrations -database "postgres://localhost/restapi_test?sslmode=disable" up
userrepository_test.go - в нем будут тесты для метода create и findbyemail
go get golang.org/x/crypto - Для шифрования использую bcrypt
go get github.com/go-ozzo/ozzo-validation } Валидация данных будет реализована с помощью ozzo-validation go get github.com/go-ozzo/ozzo-validation/is }