- база своя: два пула, захват одним UPDATE ... RETURNING, шаги схемы на goose под файловым замком, одна миграция начальной схемы вместо семи прежних - транспорт переписан на net/http: свои слои, свой ограничитель частоты, отдача файла с проверкой владельца; панель /_/ и пространство /api/ исчезли - по находкам ревью: журнал не пишет путь под корнем приложения, ключ бюджета читается справа налево, узнавание известного идёт читающим пулом
41 lines
1.9 KiB
Go
41 lines
1.9 KiB
Go
package entity
|
||
|
||
// Источник события журнала записи.
|
||
const (
|
||
// EventOriginPipeline — событие произвёл шаг конвейера.
|
||
EventOriginPipeline = "pipeline"
|
||
// EventOriginHuman — событие произвёл человек: перезапуск виден в журнале с
|
||
// указанием, кто его сделал.
|
||
EventOriginHuman = "human"
|
||
)
|
||
|
||
// Исход события.
|
||
const (
|
||
EventOutcomeDone = "done"
|
||
EventOutcomeFailed = "failed"
|
||
EventOutcomeHalted = "halted"
|
||
EventOutcomeResumed = "resumed"
|
||
)
|
||
|
||
// RecordEvent — строка журнала событий одной записи.
|
||
//
|
||
// Пишется на смену рубежа, на остановку и на снятие остановки — не на каждое
|
||
// откладывание опроса: часовая запись дала бы сотни строк ни о чём. Ни один шаг
|
||
// конвейера этот журнал не читает, чтобы решить, что делать дальше: решение
|
||
// принимается по рубежу записи, и второй источник решения разошёлся бы с первым
|
||
// молча.
|
||
//
|
||
// Содержимое записи сюда не попадает — инвариант приватности действует здесь
|
||
// наравне с журналом сервиса. Поле текста отказа зовётся `OutcomeText`, а не
|
||
// `error_text`: последнее имя названо поимённо инвариантом о секрете, и две
|
||
// колонки с этим именем сделали бы инвариант двусмысленным.
|
||
type RecordEvent struct {
|
||
Id string
|
||
RecordID string
|
||
Origin string
|
||
Step string
|
||
Outcome string
|
||
OutcomeText string
|
||
DurationMs int64
|
||
}
|