[API] Cleaner way to create a tag?

Right now, in order to create a tag with the API, I create a temporary topic with the new tag, then delete the temporary topic. Is there a cleaner way?

I don’t know, but a slightly less painful solution would be to create a post in the staff category (where Assets for site design is) and just add the new tags there.

The reason is that you want to create a bunch of tags so that users can use them in the future, but your community doesn’t yet have posts with those tags?

「いいね!」 4

Thanks @pfaffman.

You mean manually adding the new tag? Or is it possible to use the “Update a single topic” API to add a tag to an existing topic? But in that case I would have to store the topic id, which is painful…

I guess this would be a legit use case. But mine is less legit: I use tags to store metadata (object ids from an external app).

Yeah, that’s not a good idea, especially if each tag is only used once.

You should either have a separate database mapping the external IDs to Discourse topic IDs, or write a plugin and use topic custom fields (this is a problem since there’s no existing mechanism to deliver these to the client, I think).

Another solution is to store the value in the post text.

「いいね!」 5

Since there is a legit use case, I believe adding a “new tag” API in the future would be a plus.

I can feel the danger of using tags the way I do. But as I need to display, in Discourse, a list of the topics that relate to a specific external object, the “tags.show” route seems the only way…

Well, what are the external objects? How many topics will one get? will a topic relate to multiple of these things?

You may be able to get away with using search.

「いいね!」 1

The external objects are document subsections. One topic relates to one and only one subsection. A minimum guess is: 100 documents x 100 subsections per document = 10,000 subsections = 10,000 tags in a single Discourse instance. I know this is dangerous, but since I’m in the prototype phase, tags are good enough for me.

Now I didn’t think about the search page before… I’ve just done some tests, but sadly, the results are not formatted like a topic list (with the ‘Replies’, ‘Views’ and ‘Activity’ columns). I guess a “topics only” checkbox that turns the result page into a standard Discourse topic list would be exactly what I need. :slight_smile:

Consider not pre-creating that many topics - there’s often not much to discuss about the Bibliography. You can have a small service that takes a document & subsection ID and redirects you to either the existing topic or opens the composer pre-filled with the document link, subsection ID, etc.

title: Procedures for Smelling, section Keyboards
body: <https://link.to/document/1234#sec-26>

[write your text here]

lookup key: DISCUSS_1234_26

Then it polls /latest.json for new topics and checks them for the magic ID reference phrase I put in on the last line of the example.

「いいね!」 4

Yes, I already have something like this. I don’t create the subsection tags beforehand when a document is created. I’ve changed the “tag not found” page of a subsection so that it looks like an empty topic list with a “New Topic” button at the top. When user clicks the button, I create the tag on the fly using the API and open the composer pre-filled with the generated tag.

Yes there is: create a tag group populated with the tag you want to create (see the API here).

「いいね!」 5

API を使用してタググループを作成することでタグを作成する上記の方法には、1 つの欠点があります。それは、管理者権限を持つ場合にのみ機能するということです。

「いいね!」 1

さらに、API を使用してタグを作成する別の方法があります(ただし、管理者のみが利用可能):Upload Tags メニューで使用される未文書化の API /tags/upload.json。以下のように使用します:

const tags = ['tag1', 'tag2']
const file = new Blob([tags.join('\n')], { type: 'text/plain' })
const formData = new FormData()
formData.append('file', file)
$.ajax({
  type: 'POST',
  url: '/tags/upload.json',
  data: formData,
  contentType: false,
  processData: false
})
「いいね!」 1

タグが数千個になる予定ですが、この回避策(タグごとにグループを作成する方法)は依然として有効でしょうか?タググループはタグと同じくらい軽量でしょうか?

もしそうであれば、私の即座の課題は解決します。そうでない場合、(タグ1つに対してタグ+タググループという重複を避けるため)別の方法を検討したいと考えています。

すみません、わかりません。

API は、1 回の操作で 1 つのグループ内に複数のタグを作成できることを覚えています。

ありがとうございます。はい、同じグループ内で複数のタグを作成することは可能ですが、作成時のみです。更新はできますが、そのためにはグループを取得し、タグを追加してから再度送信する必要があります。追加用のエンドポイントが存在しないためです。

2つ目に提案いただいた、/tags/upload.json エンドポイントに関する件ですが、

アップロードボタンのインターフェースを見つけました。そこでは正常に動作する CSV ファイルを作成できました。しかし、Postman や Go(ご存じであれば csv.NewWriter を使用しました)では動作させることができません。

何かアイデアはありますか?

申し訳ありませんが、それらを使ってバロブを作成して投稿する方法がわかりません。

やり方がわかりました。

必要であれば、私に連絡してください。ここには投稿しません。長いですし、コミュニティの 99.99% にはおそらく関係ないからです。