Display list of topics by array of topics ids

In our company we use discourse for everyday business.
Discourse is deeply integrated in our erp software.
For better organization of topics,our erp holds many kind of topics ids and posts ids.
In some parts of our app we want to show user list of specific topics in discource. (filtered by our citiera).
In our app there is form which users fills and our app has array of filtered topics.

Is there a way to send query string or formdata to discource endpoint among with array of wanted topics ids and to get list of topics in discource. (ideally with predefined order or ordered as array was)

Same needs we have for getting specific lists of posts by providing array of topics ids.

1 Like

I also need this functionality. right now I am doing it like this, but this takes way too long.

    const selectedTopics = this.selectedTopics
     //eat topics as ids and let out real topics
     this.selectedTopicsID.forEach(function(tid,index){
       Topic.find(tid,{}).then(results => {
         selectedTopics.pushObject(results)
       })
     });

I am about to reopen the listcontroller in my plugin.rb and add a new endpoint and reopen the topic-list in the frontend initializer and do something similar to this:

https://github.com/discourse/discourse/blob/master/app/assets/javascripts/discourse/models/topic-list.js.es6#L129
But there must be an easier way to do this. Is there really no endpoint yet to fetch topics in bulk by id?
I would be very glad for some help :smiley:
EDIT: This is how I solved this problem for me:
https://github.com/spirobel/projects/commit/b514a366f05005888805fc2f57118dfd9fd61fa1
This is how it can be used.

import TopicList from 'discourse/models/topic-list';
    const selectedTopics = this.selectedTopics
    //eat topics as ids
    TopicList.topics_array(this.selectedTopicsID).then(results => selectedTopics.pushObjects(results.topic_list.topics))

right now this still has the downside, that it doesnt return “real” Topic objects, but I guess adding a line like this will fix it:
https://github.com/discourse/discourse/blob/25fd2b544a6cc68b8cf6cd5a16178e52214c01e9/app/assets/javascripts/discourse/models/user.js.es6#L732
I am still unsure if this is the right way to do it and/or if this breaks security.
Another thing that could be done: first look in the store if the record is already there and then only load what isnt there, with fromMap. Similar to:
https://github.com/discourse/discourse/blob/cd5b7109d04722df5c39b2ded9fa4ead6c290ce4/app/assets/javascripts/discourse/models/store.js.es6#L355
anyways this is getting to verbose here :smiley:
This is my final solution I will call it a day now:
https://github.com/spirobel/projects/commit/004da260f15486bf71ca48fa7c6ecee11ce646f0

2 Likes