Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

フォロー中チャンネル一覧取得API(channels/followed)のuntilIdを設定すると想定通りの動作をしない #12175

Open
samunohito opened this issue Oct 29, 2023 · 18 comments · May be fixed by #13698
Assignees
Labels
⚠️bug? This might be a bug

Comments

@samunohito
Copy link
Member

💡 Summary

channels/followedはページネーションに対応しており、前回取得したチャンネル一覧のなかで最も古いチャンネルのIDをuntilIdに設定することで、数珠つなぎに一覧を取得する事ができる認識でおります。
しかし…いまは綺麗に数珠つなぎとならず、本来取得できるはずのチャンネルが結果に含まれないケースがありました。

検索タブでクエリを何も指定せずに検索してすべてのチャンネルを取得した状態です(こちらは意図通りに動いている)
テスト1~3のとおりの順番で作成しており、作成後にフォローもしていますのでchannels/followedの結果も同様になる想定でした。

 
しかし、フォロー中タブに遷移してスクロールすると、以下のようにテスト2チャンネルが抜けてしまっています。

テスト2チャンネルはフォロー済みです。

🥰 Expected Behavior

フォロー中のチャンネル一覧にすべての結果が表示される

🤬 Actual Behavior

一覧の中に含まれないチャンネルがある

📝 Steps to Reproduce

  1. チャンネルを12件以上作っておく
  2. チャンネルのフォロー中タブへ遷移する
  3. ページを下部にスクロールし、一覧の続きを取得させる

📌 Environment

💻 Frontend

  • Model and OS of the device(s): Windows10 64bit
  • Browser: Chrome 118.0.5993.118(Official Build) (64 ビット)
  • Server URL: localhost:3000
  • Misskey: 2023.11.0-beta.4(develop最新)

🛰 Backend (for server admin)

  • Installation Method or Hosting Service:
  • Misskey: 2023.11.0-beta.4(develop最新)
  • Node: v18.15.0
  • PostgreSQL: 15.x.x
  • Redis: 7.x.x
  • OS and Architecture: Windows10 64bit(nodeはWindows版を使用、PostgreSQLとRedisはDocker上で実行中)
@samunohito samunohito added the ⚠️bug? This might be a bug label Oct 29, 2023
@samunohito
Copy link
Member Author

以下の実装が噛み合っていないものと推測しています。

上記から、channel_following.idに対しsinceId/untilIdを使って絞り込みを測るも、channel.idとchannel_following.idは別物であるため意図せぬ動作をしているものと考えました。
なので、絞り込み対象のカラムをchannel.idと同種であるchannel_following.followeeIdにすれば期待する動作となるかと思います。

@samunohito
Copy link
Member Author

以下のようにすればいけるかなと思ったのですが、如何でしょうか。
方針的によさそうであれば、プルリクを作ろうかと思います。

// 絞り込み対象とするカラムを外から設定できるようにする
// (他箇所に影響がないように元々固定で設定されていたidカラムをデフォルト値とする)
public makePaginationQuery<T extends ObjectLiteral>(
	q: SelectQueryBuilder<T>,
	sinceId?: string | null,
	untilId?: string | null,
	sinceDate?: number | null,
	untilDate?: number | null,
	columnName = 'id',
): SelectQueryBuilder<T> {
	if (sinceId && untilId) {
		q.andWhere(`${q.alias}.${columnName} > :sinceId`, { sinceId: sinceId });
		q.andWhere(`${q.alias}.${columnName} < :untilId`, { untilId: untilId });
		q.orderBy(`${q.alias}.${columnName}`, 'DESC');
	} else if (sinceId) {
	        q.andWhere(`${q.alias}.${columnName} > :sinceId`, { sinceId: sinceId });
        	q.orderBy(`${q.alias}.${columnName}`, 'ASC');
        } else if (untilId) {
	        q.andWhere(`${q.alias}.${columnName} < :untilId`, { untilId: untilId });
	        q.orderBy(`${q.alias}.${columnName}`, 'DESC');
        ....
// sinceId/untilIdと同種のfolloweeIdで絞り込めるようにカラム名を渡す
const query = this.queryService.makePaginationQuery(this.channelFollowingsRepository.createQueryBuilder(), ps.sinceId, ps.untilId, null, null, 'followeeId')
    .andWhere({ followerId: me.id });

@syuilo
Copy link
Member

syuilo commented Oct 29, 2023

channels/followed でチャンネルではなく ChannelFollowing を返さないとダメそう

@samunohito
Copy link
Member Author

samunohito commented Oct 29, 2023

ChannelFollowing を返さないとダメそう

となると…channelEntityService.pack()の流用はできなくなるので、channels/followed専用のものを新たに作成してそれを使うようにするイメージでしょうか(idはchannel_following.idを返すようにして、別にchannelIdみたいなパラメータを増やして返す)

上記方針だとフロント側やサードパーティアプリの該当機能も修正する必要が出てきますね…

@samunohito samunohito self-assigned this Feb 29, 2024
@samunohito
Copy link
Member Author

@syuilo
互換性の観点から今のchannelIdを返す形を崩したくないのですが、どうでしょうか…

@syuilo
Copy link
Member

syuilo commented Mar 1, 2024

v2として新設するとか

@samunohito
Copy link
Member Author

v2として新設するとか

これはバグの認識なので、仕様(channelのidを返す)を維持したまま期待動作になるよう修正するのがベストだと考えます。
平行線だと良くないので、以下の2点についてお伺いします。

  • 現行のchannel.idを軸としたリストを返却することに対して懸念はありますか?
  • ChannelFollowing を返さないとダメそうという理由もご教示願いたいです

@syuilo
Copy link
Member

syuilo commented Mar 1, 2024

現行のchannel.idを軸としたリストを返却することに対して懸念はありますか?

ChannelFollowing を返さないとダメそうという理由もご教示願いたいです

ChannelFollowingを取得するAPIでChannelが返ってきてしまっているからいつフォローしたかとかの情報が取れない

@samunohito
Copy link
Member Author

ChannelFollowingを取得するAPIでChannelが返ってきてしまっているからいつフォローしたかとかの情報が取れない

現状持ってないです…
image

@syuilo
Copy link
Member

syuilo commented Mar 1, 2024

IDは日時情報入ってるわね

@syuilo
Copy link
Member

syuilo commented Mar 1, 2024

ChannelFollowingに限らずMisskeyにおける全てのIDは日時情報がミリ秒単位で入っていてレスポンスのcreatedAtとかはそこから持ってきてる

@samunohito
Copy link
Member Author

いつフォローしたかとかの情報をどう賄うかは理解しました。
しかし、現状は「いつフォローしたか」の情報を使用していないので、互換性を切ってまでChannelFollowingのIDを返す理由が思い当たらず…

@syuilo
Copy link
Member

syuilo commented Mar 1, 2024

v2で新設すれば全てが解決すると思ったけど懸念あるかしら

@samunohito
Copy link
Member Author

samunohito commented Mar 1, 2024

v2で新設というのは、ChannelFollowingのIDをベースにしたものを新しく作るという事ですか?
となると、現行のバグはそのままということでしょうか…(これが懸念)

@syuilo
Copy link
Member

syuilo commented Mar 1, 2024

そうね
バグを解決するには現状のレスポンスだと不可能と思うからバグを解決したエンドポイント新設して現行のはそのままにするしかない気がする

@samunohito
Copy link
Member Author

なるほど。v2を推される理由は理解しました。

現状のレスポンスだと不可能

#12175 (comment)
それこそ上記コメントの実装か、上記が適わない場合はchannelIdを使用したsinceId/untilIdによる絞り込みクエリを追加する処理をフォロー中チャンネル一覧APIに追加すれば直せそうですが…

@syuilo
Copy link
Member

syuilo commented Mar 1, 2024

ほむん

@syuilo
Copy link
Member

syuilo commented Mar 1, 2024

実装できるならそれで良さそう

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
⚠️bug? This might be a bug
Projects
None yet
2 participants