Форум программистов, компьютерный форум, киберфорум
DrType
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  

Написание кастомного правила для go-playground/validator

Запись от DrType размещена 04.01.2024 в 14:14
Показов 1561 Комментарии 0
Метки go, golang

Юзаю пакет github.com/go-playground/validator/v10 для валидации запросов в Fiber (в пет-прожекте).
Захотелось иметь правило валидации наподобие ларавелевского exists. Реализовал следующим образом:
Go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
package validators
 
import (
    "my-project/db"
    "fmt"
    "reflect"
    "strings"
 
    "github.com/go-playground/validator/v10"
)
 
func Exists(fl validator.FieldLevel) bool {
    params := strings.Split(fl.Param(), ".")
    table := params[0]
    column := "id"
    if len(params) > 1 {
        column = params[1]
    }
 
    var value any
    switch valueType := fl.Field().Kind(); valueType {
    case reflect.String:
        value = fl.Field().String()
    case reflect.Int:
        value = fl.Field().Int()
    }
 
    var result int
    db.Database.Raw(
        fmt.Sprintf("SELECT COUNT(*) FROM %s WHERE %s = ?", table, column),
        value,
    ).Scan(&result)
 
    return result > 0
}
Регистрирую новое правило:
Go
1
2
validatorInstance := validator.New()
validatorInstance.RegisterValidation("exists", validators.Exists)
Возможные примеры использования:
Go
1
2
3
4
5
6
7
type UpdateEntityRequest struct {
    Id  int  `json:"id" validate:"omitempty,exists=entities"` //в таблице entities должна найтись запись с таким же id
}
 
type SomeRequest struct {
    Name  string  `json:"name" validate:"exists=users.name"` //в таблице users должна найтись запись с таким же name
}
По поводу реализации. Для транзакций с БД использую Gorm, и db.Database в 29 строчке имеет тип *gorm.DB. Возможно есть более канонический способ динамического построения запроса на основе имени таблицы и имени столбца; но в любом случае об инъекциях речи все равно не идет, так как эти два параметра задаются разработчиком (который при этом легко может поломать запрос, что я как-то раз и сделал, добавив лишний символ ; в struct tag)... Также можно было бы добавить обработку ошибки запроса, но вроде не критично, так как в случае неудачи паники все равно не возникает, а функция просто возвращает false.

Это я к тому, что напиание кастомных правил валидации - плодотворная затея, может упростить жизнь. И при написании таких функций имхо полезно ориентироваться на реализации встроенных (baked in) правил в исходном коде пакета.
Метки go, golang
Размещено в Без категории
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 0
Комментарии
 
Новые блоги и статьи
Транскрипция 55-минутного видео через Whisper: WhisperDesktop облажался, спас Google Colab[
anaschu 01.06.2026
Понадобилось получить текст из свежезагруженного видео на YouTube. Казалось бы, задача на пять минут. Заняла полтора часа. Делюсь опытом — может кому пригодится последовательность решений. . . .
21 мат мед. Планы на развитие модели здравоСохранения
anaschu 01.06.2026
AnyLogic: план развития симуляционной модели рабочего коллектива — динамический абсентеизм, реальные данные, три сценария сравнения Продолжаю серию постов о дискретно-событийной модели рабочего. . .
20. Мат мед. Абсентеизм как отдельный тип простоя
anaschu 29.05.2026
Апдейт модели: исправленные баги, абсентеизм и новые механизмы Продолжаю развивать ранее описанную модель рабочего коллектива на AnyLogic. За последние несколько дней был проведён серьёзный. . .
19. здоровье, усталость и психотип работника влияют на производительность предприятия, и наоборот, производительность на здоровье, усталось и психотип
anaschu 28.05.2026
Дискретно-событийная модель рабочего коллектива на AnyLogic: здоровье, выгорание, психотипы и микростимуляция Привет, коллеги. Хочу поделиться итогами нескольких недель работы над симуляционной. . .
"Прокси" для последовательного порта
Eddy_Em 28.05.2026
Эту штуку написал я достаточно давно. Но сейчас вот понадобилось настроить датчик грозы, но при этом не отключать его от "метеодемона". Соответственно, надо запустить этот "прокси": метеодемон будет. . .
Рефакторинг программы уравнивания.
Massaraksh7 26.05.2026
Пример по предыдущей записи в блоге. Но, надо заметить, что, во-первых, там оптимизация не только математики, но и работы с базой данных, и с графами, а во-вторых, это ещё не всё.
Использование TThread в Lazarus для математических вычислений.
Massaraksh7 25.05.2026
Производя рефакторинг своих программ на предмет ускорения их работы, обратил внимание на такой аспект, как сокращение времени матвычислений. Дело в том, что приходится работать с большими матрицами. . .
Модель здравосохранения 18. Чем здоровее работник, тем быстрее выгорает
anaschu 24.05.2026
Имитационная модель корпоративного здравоохранения: что показывает математика Сегодня в модели рабочего коллектива на AnyLogic появились три новые механики — выгорание через накопленную усталость,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru