mirror of https://github.com/go-gorm/gorm.git
Add creatable, updatable, readable permission
This commit is contained in:
parent
d39bdc3513
commit
29cd35219f
|
@ -194,13 +194,13 @@ func AfterCreate(db *gorm.DB) {
|
|||
func ConvertToCreateValues(stmt *gorm.Statement) clause.Values {
|
||||
switch value := stmt.Dest.(type) {
|
||||
case map[string]interface{}:
|
||||
return ConvertMapToValues(stmt, value)
|
||||
return ConvertMapToValuesForCreate(stmt, value)
|
||||
case []map[string]interface{}:
|
||||
return ConvertSliceOfMapToValues(stmt, value)
|
||||
return ConvertSliceOfMapToValuesForCreate(stmt, value)
|
||||
default:
|
||||
var (
|
||||
values = clause.Values{}
|
||||
selectColumns, restricted = SelectAndOmitColumns(stmt)
|
||||
selectColumns, restricted = SelectAndOmitColumns(stmt, true, false)
|
||||
curTime = stmt.DB.NowFunc()
|
||||
isZero = false
|
||||
)
|
||||
|
|
|
@ -8,7 +8,7 @@ import (
|
|||
)
|
||||
|
||||
// SelectAndOmitColumns get select and omit columns, select -> true, omit -> false
|
||||
func SelectAndOmitColumns(stmt *gorm.Statement) (map[string]bool, bool) {
|
||||
func SelectAndOmitColumns(stmt *gorm.Statement, requireCreate, requireUpdate bool) (map[string]bool, bool) {
|
||||
results := map[string]bool{}
|
||||
|
||||
// select columns
|
||||
|
@ -36,13 +36,23 @@ func SelectAndOmitColumns(stmt *gorm.Statement) (map[string]bool, bool) {
|
|||
}
|
||||
}
|
||||
|
||||
if stmt.Schema != nil {
|
||||
for _, field := range stmt.Schema.FieldsByDBName {
|
||||
if requireCreate && !field.Creatable {
|
||||
results[field.DBName] = false
|
||||
} else if requireUpdate && !field.Updatable {
|
||||
results[field.DBName] = false
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return results, len(stmt.Selects) > 0
|
||||
}
|
||||
|
||||
// ConvertMapToValues convert map to values
|
||||
func ConvertMapToValues(stmt *gorm.Statement, mapValue map[string]interface{}) (values clause.Values) {
|
||||
// ConvertMapToValuesForCreate convert map to values
|
||||
func ConvertMapToValuesForCreate(stmt *gorm.Statement, mapValue map[string]interface{}) (values clause.Values) {
|
||||
columns := make([]string, 0, len(mapValue))
|
||||
selectColumns, restricted := SelectAndOmitColumns(stmt)
|
||||
selectColumns, restricted := SelectAndOmitColumns(stmt, true, false)
|
||||
|
||||
var keys []string
|
||||
for k, _ := range mapValue {
|
||||
|
@ -64,12 +74,12 @@ func ConvertMapToValues(stmt *gorm.Statement, mapValue map[string]interface{}) (
|
|||
return
|
||||
}
|
||||
|
||||
// ConvertSliceOfMapToValues convert slice of map to values
|
||||
func ConvertSliceOfMapToValues(stmt *gorm.Statement, mapValues []map[string]interface{}) (values clause.Values) {
|
||||
// ConvertSliceOfMapToValuesForCreate convert slice of map to values
|
||||
func ConvertSliceOfMapToValuesForCreate(stmt *gorm.Statement, mapValues []map[string]interface{}) (values clause.Values) {
|
||||
var (
|
||||
columns = []string{}
|
||||
result = map[string][]interface{}{}
|
||||
selectColumns, restricted = SelectAndOmitColumns(stmt)
|
||||
selectColumns, restricted = SelectAndOmitColumns(stmt, true, false)
|
||||
)
|
||||
|
||||
for idx, mapValue := range mapValues {
|
||||
|
|
|
@ -56,7 +56,11 @@ func Scan(rows *sql.Rows, db *gorm.DB) {
|
|||
fields := make([]*schema.Field, len(columns))
|
||||
|
||||
for idx, column := range columns {
|
||||
fields[idx] = db.Statement.Schema.LookUpField(column)
|
||||
if field := db.Statement.Schema.LookUpField(column); field != nil && field.Readable {
|
||||
fields[idx] = field
|
||||
} else {
|
||||
values[idx] = sql.RawBytes{}
|
||||
}
|
||||
}
|
||||
|
||||
for rows.Next() {
|
||||
|
@ -80,7 +84,7 @@ func Scan(rows *sql.Rows, db *gorm.DB) {
|
|||
}
|
||||
case reflect.Struct:
|
||||
for idx, column := range columns {
|
||||
if field := db.Statement.Schema.LookUpField(column); field != nil {
|
||||
if field := db.Statement.Schema.LookUpField(column); field != nil && field.Readable {
|
||||
values[idx] = field.ReflectValueOf(db.Statement.ReflectValue).Addr().Interface()
|
||||
} else {
|
||||
values[idx] = sql.RawBytes{}
|
||||
|
|
|
@ -91,7 +91,7 @@ func AfterUpdate(db *gorm.DB) {
|
|||
|
||||
// ConvertToAssignments convert to update assignments
|
||||
func ConvertToAssignments(stmt *gorm.Statement) (set clause.Set) {
|
||||
selectColumns, restricted := SelectAndOmitColumns(stmt)
|
||||
selectColumns, restricted := SelectAndOmitColumns(stmt, false, true)
|
||||
reflectModelValue := reflect.ValueOf(stmt.Model)
|
||||
|
||||
switch value := stmt.Dest.(type) {
|
||||
|
|
|
@ -42,6 +42,7 @@ type Field struct {
|
|||
AutoIncrement bool
|
||||
Creatable bool
|
||||
Updatable bool
|
||||
Readable bool
|
||||
HasDefaultValue bool
|
||||
AutoCreateTime TimeType
|
||||
AutoUpdateTime TimeType
|
||||
|
@ -73,6 +74,7 @@ func (schema *Schema) ParseField(fieldStruct reflect.StructField) *Field {
|
|||
StructField: fieldStruct,
|
||||
Creatable: true,
|
||||
Updatable: true,
|
||||
Readable: true,
|
||||
Tag: fieldStruct.Tag,
|
||||
TagSettings: ParseTagSetting(fieldStruct.Tag.Get("gorm"), ";"),
|
||||
Schema: schema,
|
||||
|
@ -117,6 +119,21 @@ func (schema *Schema) ParseField(fieldStruct reflect.StructField) *Field {
|
|||
if _, ok := field.TagSettings["-"]; ok {
|
||||
field.Creatable = false
|
||||
field.Updatable = false
|
||||
field.Readable = false
|
||||
}
|
||||
|
||||
if v, ok := field.TagSettings["<-"]; ok {
|
||||
if !strings.Contains(v, "create") {
|
||||
field.Creatable = false
|
||||
}
|
||||
|
||||
if !strings.Contains(v, "update") {
|
||||
field.Updatable = false
|
||||
}
|
||||
}
|
||||
|
||||
if _, ok := field.TagSettings["->"]; ok {
|
||||
field.Readable = false
|
||||
}
|
||||
|
||||
if dbName, ok := field.TagSettings["COLUMN"]; ok {
|
||||
|
@ -235,6 +252,7 @@ func (schema *Schema) ParseField(fieldStruct reflect.StructField) *Field {
|
|||
var err error
|
||||
field.Creatable = false
|
||||
field.Updatable = false
|
||||
field.Readable = false
|
||||
if field.EmbeddedSchema, err = Parse(fieldValue.Interface(), &sync.Map{}, schema.namer); err != nil {
|
||||
schema.err = err
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue