Фильтрация двунаправленных отношений в CRNK - PullRequest
0 голосов
/ 07 ноября 2019

Я играю с crnk, пытаясь определить биты, которые я не могу найти в документах. Я объясню свою проблему на стандартном примере crnk: https://github.com/crnk-project/crnk-framework/tree/master/crnk-integration-examples/spring-boot-example.

Между проектами и задачами существует отношение один ко многим (другие ресурсы не имеют значения). Если я правильно понимаю (в примере используется явно устаревший параметр opposite @JsonApiRelation), владельцем отношения является 1Task.project1. Теперь я хочу перечислить ресурсы, отфильтрованные по некоторым свойствам связанных с ними ресурсов. Например, это работает как ожидалось (оставляя некоторые незначительные биты из ответа):

GET http://127.0.0.1:8080/api/tasks?filter[project.id]=121

{
  "data" : [ {
    "id" : "1",
    "type" : "tasks",
    "links" : {
      "self" : "http://127.0.0.1:8080/api/tasks/1"
    },
    "attributes" : {
      "name" : "Create tasks",
      "description" : null
    },
    "relationships" : {
      "project" : {
        "data" : {
          "id" : "121",
          "type" : "projects"
        }
    }
  } ]
}

Но фильтрация в обратном направлении невозможна:

GET http://127.0.0.1:8080/api/projects?filter[tasks.id]=1

{
  "data" : [ ]
}

Ожидается ли это при настройкересурсы (см. ссылку выше)? Если да, что нужно сделать, чтобы фильтрация работала в обоих направлениях?

1 Ответ

0 голосов
/ 08 ноября 2019

В настоящее время это то, что репозиторий должен обрабатывать, один из способов сделать это - заставить getter / setter стать двунаправленным, поэтому Task.setProject добавит себя в Project.tasks.

IMHO Я думаю, что это такэто то, что должен обрабатывать репозиторий, а не что-то встроенное в crnk-движок. С точки зрения REST POST / PATCH / DELETE ресурса НЕ должен касаться связанных ресурсов. Который отложил бы ответственность за репозиторий, чтобы сделать эти поиски. Но, возможно, есть возможность иметь некоторую встроенную поддержку для обработки в памяти. Проблема возникает с репозиториями в памяти. Например, в случае с JPA об этом позаботится SQL (который также может обеспечить путь решения этой проблемы).

...