// Extend extends target schema func (schema *Schema) Extend(fromSchema *Schema) error { if schema.Parent == "" { schema.Parent = fromSchema.Parent } if schema.Prefix == "" { schema.Prefix = fromSchema.Prefix } if schema.URL == "" { schema.URL = fromSchema.URL } if schema.NamespaceID == "" { schema.NamespaceID = fromSchema.NamespaceID } schema.JSONSchema["properties"] = util.ExtendMap( util.MaybeMap(schema.JSONSchema["properties"]), util.MaybeMap(fromSchema.JSONSchema["properties"])) schema.JSONSchema["propertiesOrder"] = util.ExtendStringList( util.MaybeStringList(fromSchema.JSONSchema["propertiesOrder"]), util.MaybeStringList(schema.JSONSchema["propertiesOrder"])) MergeAction: for _, action := range fromSchema.Actions { for _, existingAction := range schema.Actions { if action.ID == existingAction.ID { continue MergeAction } } schema.Actions = append(schema.Actions, action) } schema.Metadata = util.ExtendMap(schema.Metadata, fromSchema.Metadata) return schema.Init() }
//GetSchema returns the schema filtered and trimmed for a specific user or nil when the user shouldn't see it at all func GetSchema(s *schema.Schema, authorization schema.Authorization) (result *schema.Resource, err error) { manager := schema.GetManager() metaschema, _ := manager.Schema("schema") policy, _ := manager.PolicyValidate("read", s.GetPluralURL(), authorization) if policy == nil { return } if s.IsAbstract() { return } rawSchema := s.JSON() filteredSchema := util.ExtendMap(nil, s.JSONSchema) rawSchema["schema"] = filteredSchema schemaProperties, schemaPropertiesOrder, schemaRequired := policy.FilterSchema( util.MaybeMap(s.JSONSchema["properties"]), util.MaybeStringList(s.JSONSchema["propertiesOrder"]), util.MaybeStringList(s.JSONSchema["required"])) filteredSchema["properties"] = schemaProperties filteredSchema["propertiesOrder"] = schemaPropertiesOrder filteredSchema["required"] = schemaRequired result, err = schema.NewResource(metaschema, rawSchema) if err != nil { log.Warning("%s %s", result, err) return } return }