Разрешения на уровне поля структуры

#go #go-gin #sqlx

# #Вперед #go-gin #sqlx

Вопрос:

Я играю с gin-gonic sqlx. Теперь мне интересно, каков наилучший способ динамической привязки записей базы данных к структуре?

Скажем, у меня есть структура и запрос, подобный этому.

 type Project struct {
    ID        string    `db:"id"`
    CreatedAt time.Time `db:"created_at"`
    UpdatedAt time.Time `db:"updated_at"`
    DeletedAt NullTime  `db:"deleted_at"`
    Name      string
    Status    string
    OpenDate  NullTime `db:"open_date"`
    Number    uint
}

func (p Project) List() ([]Project, error) {
    var pp []Project
    err := db.Select(amp;pp, "SELECT * FROM Project")
    return pp, err
}
 

Теперь я хочу добавить разрешения на уровне полей к этой структуре. Например, администратор может просматривать и редактировать все поля; Пользователь A может просматривать CreatedAt и Name ; Пользователь B может просматривать, редактировать Name Status и просматривать Number .

Я писал многократные структуры для каждого варианта использования, но, очевидно, я выбрал самый глупый способ. Другой метод, о котором я могу подумать, — это реализовать тег Struct . Я на правильном пути или есть лучший способ сделать это?

Комментарии:

1. Вы хотите, чтобы эти разрешения отражались в базе данных? Или только на уровне приложения?

2. @Flimzy только на уровне приложения. Все поля находятся в одной таблице

3. Хорошо. Это намного проще. Это также делает компонент SQL вопроса неактуальным (именно поэтому он проще!)

Ответ №1:

Мы можем создавать несколько структур и встраивать их друг в друга. Пример:

 
type ProjectSummary struct {
    ID   string `db:"id"`
    Name string
}

type ProjectUser struct {
    ProjectSummary
    CreatedAt time.Time `db:"created_at"`
}

type ProjectSupport struct {
    ProjectSummary
    Status string
    Number uint
}

type ProjectAdmin struct {
    ProjectSupport
    CreatedAt time.Time `db:"created_at"`
    UpdatedAt time.Time `db:"updated_at"`
    DeletedAt NullTime  `db:"deleted_at"`
    OpenDate  NullTime  `db:"open_date"`
}

 

Комментарии:

1. Да, это именно то, что я сейчас делаю. Я просто чувствую, что это как-то недостаточно элегантно. Потому что это нелегко отслеживать и изменять.