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

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

Запись от DrType размещена 04.01.2024 в 14:14
Показов 1697 Комментарии 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
Комментарии
 
Новые блоги и статьи
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru