diff --git a/app/assets/javascripts/discourse/app/adapters/topic-list.js b/app/assets/javascripts/discourse/app/adapters/topic-list.js index 0a6aeb81fa5..e5bdd606dbb 100644 --- a/app/assets/javascripts/discourse/app/adapters/topic-list.js +++ b/app/assets/javascripts/discourse/app/adapters/topic-list.js @@ -2,39 +2,37 @@ import PreloadStore from "discourse/lib/preload-store"; import RestAdapter from "discourse/adapters/rest"; import { ajax } from "discourse/lib/ajax"; -export function finderFor(filter, params) { - return function () { - let url = `/${filter}.json`; +export default RestAdapter.extend({ + find(store, type, { filter, params }) { + return PreloadStore.getAndRemove("topic_list", () => { + let url = `/${filter}.json`; - if (params) { - const urlSearchParams = new URLSearchParams(); + if (params) { + const urlSearchParams = new URLSearchParams(); - for (const [key, value] of Object.entries(params)) { - if (typeof value !== "undefined") { - urlSearchParams.set(key, value); + for (const [key, value] of Object.entries(params)) { + if (typeof value === "undefined") { + continue; + } + + if (Array.isArray(value)) { + for (const arrayValue of value) { + urlSearchParams.append(`${key}[]`, arrayValue); + } + } else { + urlSearchParams.set(key, value); + } + } + + const queryString = urlSearchParams.toString(); + + if (queryString) { + url += `?${queryString}`; } } - const queryString = urlSearchParams.toString(); - - if (queryString) { - url += `?${queryString}`; - } - } - - return ajax(url); - }; -} - -export default RestAdapter.extend({ - find(store, type, findArgs) { - const filter = findArgs.filter; - const params = findArgs.params; - - return PreloadStore.getAndRemove( - "topic_list", - finderFor(filter, params) - ).then(function (result) { + return ajax(url); + }).then((result) => { result.filter = filter; result.params = params; return result; diff --git a/app/assets/javascripts/discourse/app/models/topic-list.js b/app/assets/javascripts/discourse/app/models/topic-list.js index ac6c03b9662..aefae16d707 100644 --- a/app/assets/javascripts/discourse/app/models/topic-list.js +++ b/app/assets/javascripts/discourse/app/models/topic-list.js @@ -7,6 +7,7 @@ import { ajax } from "discourse/lib/ajax"; import { getOwner } from "discourse-common/lib/get-owner"; import { isEmpty } from "@ember/utils"; import { notEmpty } from "@ember/object/computed"; +import deprecated from "discourse-common/lib/deprecated"; function extractByKey(collection, klass) { const retval = {}; @@ -195,6 +196,15 @@ TopicList.reopenClass({ }, find(filter, params) { + deprecated( + `TopicList.find is deprecated. Use \`findFiltered("topicList")\` on the \`store\` service instead.`, + { + id: "topic-list-find", + since: "3.1.0.beta5", + dropFrom: "3.2.0.beta1", + } + ); + const store = getOwner(this).lookup("service:store"); return store.findFiltered("topicList", { filter, params }); }, diff --git a/app/assets/javascripts/discourse/tests/unit/services/store-test.js b/app/assets/javascripts/discourse/tests/unit/services/store-test.js index 9ff3d01bf26..0fe2e214a9b 100644 --- a/app/assets/javascripts/discourse/tests/unit/services/store-test.js +++ b/app/assets/javascripts/discourse/tests/unit/services/store-test.js @@ -1,7 +1,10 @@ import { module, test } from "qunit"; import { setupTest } from "ember-qunit"; import { getOwner } from "discourse-common/lib/get-owner"; -import pretender, { response } from "discourse/tests/helpers/create-pretender"; +import pretender, { + fixturesByUrl, + response, +} from "discourse/tests/helpers/create-pretender"; module("Unit | Service | store", function (hooks) { setupTest(hooks); @@ -236,4 +239,28 @@ module("Unit | Service | store", function (hooks) { const users = await store.findAll("user"); assert.strictEqual(users.objectAt(0).username, "souna"); }); + + test("findFiltered", async function (assert) { + pretender.get("/topics/created-by/trout.json", ({ queryParams }) => { + assert.deepEqual(queryParams, { + order: "latest", + tags: ["dev", "bug"], + }); + return response(fixturesByUrl["/c/bug/1/l/latest.json"]); + }); + + const store = getOwner(this).lookup("service:store"); + const result = await store.findFiltered("topicList", { + filter: "topics/created-by/trout", + params: { + order: "latest", + tags: ["dev", "bug"], + }, + }); + + assert.true(result.loaded); + assert.true("topic_list" in result); + assert.true(Array.isArray(result.topics)); + assert.strictEqual(result.filter, "topics/created-by/trout"); + }); });