48 lines
1.3 KiB
Go
48 lines
1.3 KiB
Go
package relationsCheck
|
|
|
|
import (
|
|
"go/types"
|
|
"golang.org/x/tools/go/analysis"
|
|
"gormlint/common"
|
|
"strings"
|
|
)
|
|
|
|
func checkManyToOne(pass *analysis.Pass, nestedField common.Field, model common.Model, relatedModel common.Model) bool {
|
|
foreignKey := nestedField.Tags.GetParamOr("foreignKey", model.Name+"Id")
|
|
references := nestedField.Tags.GetParamOr("references", "Id")
|
|
if !relatedModel.HasField(foreignKey) {
|
|
pass.Reportf(
|
|
nestedField.Pos,
|
|
"Expected foreignKey `%s` in model `%s` for 1:M relation with model `%s`",
|
|
foreignKey,
|
|
relatedModel.Name,
|
|
model.Name,
|
|
)
|
|
return true
|
|
}
|
|
if !model.HasField(references) {
|
|
pass.Reportf(
|
|
nestedField.Pos,
|
|
"Expected references `%s` in model `%s` for 1:M relation with model `%s`",
|
|
references,
|
|
model.Name,
|
|
relatedModel.Name,
|
|
)
|
|
return true
|
|
}
|
|
foreignKeyType := types.ExprString(relatedModel.Fields[foreignKey].Type)
|
|
referencesType := types.ExprString(model.Fields[references].Type)
|
|
if !strings.Contains(foreignKeyType, "int") {
|
|
// TODO: process UUID as foreign key type
|
|
pass.Reportf(relatedModel.Fields[foreignKey].Pos, "Foreign key `%s` has invalid type", foreignKeyType)
|
|
return true
|
|
}
|
|
|
|
if !strings.Contains(referencesType, "int") {
|
|
pass.Reportf(model.Fields[references].Pos, "References key `%s` has invalid type", referencesType)
|
|
return true
|
|
}
|
|
|
|
return false
|
|
}
|