Display list of topics by array of topics ids

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