|
9 | 9 | "strconv" |
10 | 10 | "strings" |
11 | 11 |
|
| 12 | + "windshift/internal/contextkeys" |
12 | 13 | "windshift/internal/models" |
13 | 14 | "windshift/internal/objecttranslation" |
14 | 15 | "windshift/internal/repository" |
@@ -74,7 +75,7 @@ func registerCatalogRoutes(builder *routeBuilder, deps Deps) { |
74 | 75 | builder.Read("/priorities/{priority_id}", AuthAuthenticated, []string{"priorities:read"}, getPriority(deps.Configuration, deps.ObjectTranslations)) |
75 | 76 | builder.JSON(http.MethodPatch, "/priorities/{priority_id}", http.StatusOK, true, AuthAuthenticated, []string{"priorities:write"}, patchPriority(deps.CatalogMutations)) |
76 | 77 | builder.Command(http.MethodDelete, "/priorities/{priority_id}", AuthAuthenticated, []string{"priorities:write"}, deletePriority(deps.CatalogMutations)) |
77 | | - builder.Metadata("/custom-fields", AuthAuthenticated, []string{"custom-fields:read"}, listCustomFields(deps.Configuration)) |
| 78 | + builder.Metadata("/custom-fields", AuthAuthenticated, []string{"custom-fields:read"}, listCustomFields(deps)) |
78 | 79 | builder.Read("/custom-fields/{custom_field_id}", AuthAuthenticated, []string{"custom-fields:read"}, getCustomField(deps.Configuration)) |
79 | 80 | } |
80 | 81 |
|
@@ -424,18 +425,47 @@ type customFieldDTO struct { |
424 | 425 | Indexed models.CustomFieldIndexInfo `json:"indexed"` |
425 | 426 | } |
426 | 427 |
|
427 | | -func listCustomFields(reader configurationReader) metadataOperation[[]customFieldDTO, services.CustomFieldCatalogMeta] { |
428 | | - return func(*http.Request) ([]customFieldDTO, services.CustomFieldCatalogMeta, error) { |
429 | | - results, meta, err := reader.ListCustomFieldsWithMeta() |
| 428 | +func listCustomFields(deps Deps) metadataOperation[[]customFieldDTO, services.CustomFieldCatalogMeta] { |
| 429 | + return func(r *http.Request) ([]customFieldDTO, services.CustomFieldCatalogMeta, error) { |
| 430 | + results, meta, err := deps.Configuration.ListCustomFieldsWithMeta() |
430 | 431 | if err != nil { |
431 | 432 | return nil, services.CustomFieldCatalogMeta{}, internalError(err) |
432 | 433 | } |
433 | 434 | items := make([]customFieldDTO, len(results)) |
| 435 | + visibleSets := make(map[int]bool) |
| 436 | + hasAssetUsages := false |
| 437 | + for _, result := range results { |
| 438 | + for _, usage := range result.AssetTypeUsages { |
| 439 | + if usage.SetID > 0 { |
| 440 | + hasAssetUsages = true |
| 441 | + } |
| 442 | + } |
| 443 | + } |
| 444 | + token, _ := r.Context().Value(contextkeys.APIToken).(*models.APIToken) |
| 445 | + if hasAssetUsages && (token == nil || deps.Tokens.CheckTokenPermissions(token, []string{"assets:read"})) { |
| 446 | + user, authErr := principal(r) |
| 447 | + if authErr != nil { |
| 448 | + return nil, meta, authErr |
| 449 | + } |
| 450 | + sets, setErr := deps.Assets.ListSets(user.ID) |
| 451 | + if setErr != nil { |
| 452 | + return nil, meta, internalError(setErr) |
| 453 | + } |
| 454 | + for _, set := range sets { |
| 455 | + visibleSets[set.ID] = true |
| 456 | + } |
| 457 | + } |
434 | 458 | for i := range results { |
435 | 459 | items[i], err = customFieldFromResult(results[i]) |
436 | 460 | if err != nil { |
437 | 461 | return nil, services.CustomFieldCatalogMeta{}, internalError(err) |
438 | 462 | } |
| 463 | + items[i].AssetTypeUsages = []services.CustomFieldAssetUsage{} |
| 464 | + for _, usage := range results[i].AssetTypeUsages { |
| 465 | + if visibleSets[usage.SetID] { |
| 466 | + items[i].AssetTypeUsages = append(items[i].AssetTypeUsages, usage) |
| 467 | + } |
| 468 | + } |
439 | 469 | } |
440 | 470 | return items, meta, nil |
441 | 471 | } |
|
0 commit comments