in lib/dam/dam_integrity.go [364:395]
func checkAccessRequirements(templateName string, template *pb.ServiceTemplate, resName, viewName string, view *pb.View, cfg *pb.DamConfig, vopts ValidateCfgOpts) (string, error) {
adapt, ok := vopts.Services.ByServiceName[template.ServiceName]
if !ok {
return httputils.StatusPath("services"), fmt.Errorf("service template %q service %q is not a recognized by this DAM", templateName, template.ServiceName)
}
if path, err := adapt.CheckConfig(templateName, template, resName, viewName, view, cfg, vopts.Services); err != nil {
return path, err
}
if path, err := checkAccessRoles(view.Roles, templateName, template.ServiceName, cfg, vopts); err != nil {
return httputils.StatusPath("views", viewName, "roles", path), fmt.Errorf("invalid view: %v", err)
}
desc, ok := vopts.Services.Descriptors[template.ServiceName]
if !ok {
return httputils.StatusPath("services", template.ServiceName), fmt.Errorf("internal error: service %q does not have a service descriptor", template.ServiceName)
}
if len(desc.ItemVariables) > 0 && len(view.Items) == 0 {
return httputils.StatusPath("views", viewName, "items"), fmt.Errorf("view %q does not provide any target items", viewName)
}
if len(desc.ItemVariables) > 0 && desc.Properties != nil && desc.Properties.SingleItem && len(view.Items) > 1 {
return httputils.StatusPath("views", viewName, "items"), fmt.Errorf("view %q provides more than one item when only one was expected for service %q", viewName, template.ServiceName)
}
for idx, item := range view.Items {
vars, path, err := adapter.GetItemVariables(vopts.Services, template.ServiceName, item)
if err != nil {
return httputils.StatusPath("views", viewName, "items", strconv.Itoa(idx), path), err
}
if len(vars) == 0 {
return httputils.StatusPath("views", viewName, "items", strconv.Itoa(idx), "vars"), fmt.Errorf("no variables defined")
}
}
return "", nil
}