Дальше везде используются placeholder-ы:
{domain}
,{Domain}
{subdomain}
,{Subdomain}
Например, для поддомена package
из домена logistic
значение placeholder-ов будет:
{domain}
,{Domain}
=logistic
,Logistic
{subdomain}
,{Subdomain}
=package
,Package
{domain}
/{subdomain}
=logistic
/package
{subdomains}
,{Subdomains}
=packages
,Packages
Задание IV
- Реализовать методы для интерфейса
Repo
- Написать миграции для создания таблиц и создания индексов
- Реализовать методы для интерфейса
RepoEvent
(сообщения в proto) - Подготовить dataset для таблиц
subdomains
иsubdomains_events
💎 - Реализовать поддержку вариаций типов событий на обновление сущности
subdomain
💎 - Обеспечить защиту от sql-инъекции 💎
- Настроить партиципирование таблицы на N частей 💎
- Написать тесты 💎
Рецепт
Используя паттерн Transactional Outbox Pattern
- Создать таблицы следующих форматов:
{subdomains}
таблица
id bigint | ... | removed bool | created timestamp | updated timestamp |
---|---|---|---|---|
{subdomains}_events
📤 таблица
id bigint | {subdomain}_id bigint | type text | status | payload jsonb | updated timestamp |
---|---|---|---|---|---|
Created | lock | SubdomainCreated |
|||
Updated | lock | SubdomainUpdated |
|||
Removed | SubdomainRemoved |
- Составить список sql запросов для таблицы
{subdomains}
, потом для{subdomains}_events
-- Lock n events 🐘 🏆
- Имплементировать методы интерфейсов с помощью squirell
type Repo interface {
Add(*model.Subdomain) (uint64, error)
Get(subdomainID uint64) (*model.Subdomain, error)
List(limit uint64, cursor uint64) ([]model.Subdomain, error)
Remove(subdomainID uint64) (bool, error)
}
type EventRepo interface {
Lock(n uint64) ([]model.SubdomainEvent, error)
Unlock(eventIDs []uint64) error
Remove(eventIDs []uint64) (bool, error)
}
- Написать и накатить миграции
$ cd migrations
$ cat .env
PGPASSWORD=docker
PGUSER=docker
$ set -o allexport; source .env; set +o allexport
$ goose postgres "host=localhost sslmode=disable dbname={domain-kw}_{subdomain}_api port=5432" up
$ goose postgres "host=localhost sslmode=disable dbname={domain-kw}_{subdomain}_api port=5432" status
- Поднять сервис и пострелять в него разными запросами пример