- колонка `owner` связью с `users` в обеих коллекциях новым шагом схемы `202608140001`; чтение задачи сужено владельцем, и чужая, ничья и несуществующая дают один ответ; правило просмотра файлов сужено им же - приём по HTTP берёт владельца из сессии, а предъявителя без учётной записи пользователя отвергает до чтения тела: позже пришлось бы убирать уложенный файл, а уборки файлов сервис не умеет. Выборка воркера владельцем не сужается - удаление учётной записи с записями отвергается стражем, и вешает его сама сборка хранилища: сборка, забывшая его позвать, теряла защиту молча
50 lines
2.1 KiB
Go
50 lines
2.1 KiB
Go
package contract
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
)
|
|
|
|
// ErrDeliveryChannelDown — канал, которым отвечают отправителю, не поднят.
|
|
// Отдаётся отправителем-заглушкой, которого получает ядро, когда вход не
|
|
// настроен.
|
|
//
|
|
// Значение сентинельное, а не тип: соседям по ряду есть что нести — состояние,
|
|
// идентификатор задачи, — а этому нечего. Заглушка не знает ни задачи, ни чата,
|
|
// и запись о недоставке делает шаг, у которого задача под рукой.
|
|
var ErrDeliveryChannelDown = errors.New("delivery channel is down")
|
|
|
|
// ErrOwnerRequired — приём по HTTP дошёл до заведения задачи, а владельца ему не
|
|
// назвали. Значение сентинельное: нести отказу нечего, а имя учётной записи в
|
|
// него не кладётся никогда.
|
|
var ErrOwnerRequired = errors.New("owner is required to accept a record")
|
|
|
|
type JobNotFoundError struct {
|
|
State string
|
|
Message string
|
|
}
|
|
|
|
func (e *JobNotFoundError) Error() string {
|
|
return fmt.Sprintf("%s - %s", e.State, e.Message)
|
|
}
|
|
|
|
// LostAcquisitionError — захват задачи за время работы шага достался другому.
|
|
// Шаг, получивший его, завершается без записи результата и без ответа
|
|
// отправителю: иначе два воркера пишут в одну задачу по очереди, а отправитель
|
|
// получает два ответа на одну запись.
|
|
type LostAcquisitionError struct {
|
|
JobID string
|
|
}
|
|
|
|
func (e *LostAcquisitionError) Error() string {
|
|
return fmt.Sprintf("%s: job acquisition lost", e.JobID)
|
|
}
|
|
|
|
type NoopJobError struct {
|
|
State string
|
|
}
|
|
|
|
func (e *NoopJobError) Error() string {
|
|
return fmt.Sprintf("%s: no op job occur", e.State)
|
|
}
|