Merge branch 'suggestions' into 'main'
Start suggestions API See merge request soapbox-pub/ditto!218
This commit is contained in:
commit
cfb0d3f04c
|
@ -63,6 +63,7 @@ import {
|
||||||
zapController,
|
zapController,
|
||||||
} from '@/controllers/api/statuses.ts';
|
} from '@/controllers/api/statuses.ts';
|
||||||
import { streamingController } from '@/controllers/api/streaming.ts';
|
import { streamingController } from '@/controllers/api/streaming.ts';
|
||||||
|
import { suggestionsV1Controller, suggestionsV2Controller } from '@/controllers/api/suggestions.ts';
|
||||||
import {
|
import {
|
||||||
hashtagTimelineController,
|
hashtagTimelineController,
|
||||||
homeTimelineController,
|
homeTimelineController,
|
||||||
|
@ -186,6 +187,9 @@ app.get('/api/pleroma/frontend_configurations', frontendConfigController);
|
||||||
app.get('/api/v1/trends/tags', cache({ cacheName: 'web', expires: Time.minutes(15) }), trendingTagsController);
|
app.get('/api/v1/trends/tags', cache({ cacheName: 'web', expires: Time.minutes(15) }), trendingTagsController);
|
||||||
app.get('/api/v1/trends', cache({ cacheName: 'web', expires: Time.minutes(15) }), trendingTagsController);
|
app.get('/api/v1/trends', cache({ cacheName: 'web', expires: Time.minutes(15) }), trendingTagsController);
|
||||||
|
|
||||||
|
app.get('/api/v1/suggestions', suggestionsV1Controller);
|
||||||
|
app.get('/api/v2/suggestions', suggestionsV2Controller);
|
||||||
|
|
||||||
app.get('/api/v1/notifications', requirePubkey, notificationsController);
|
app.get('/api/v1/notifications', requirePubkey, notificationsController);
|
||||||
app.get('/api/v1/favourites', requirePubkey, favouritesController);
|
app.get('/api/v1/favourites', requirePubkey, favouritesController);
|
||||||
app.get('/api/v1/bookmarks', requirePubkey, bookmarksController);
|
app.get('/api/v1/bookmarks', requirePubkey, bookmarksController);
|
||||||
|
|
|
@ -0,0 +1,50 @@
|
||||||
|
import { NStore } from '@nostrify/nostrify';
|
||||||
|
|
||||||
|
import { AppController } from '@/app.ts';
|
||||||
|
import { Conf } from '@/config.ts';
|
||||||
|
import { getTagSet } from '@/tags.ts';
|
||||||
|
import { hydrateEvents } from '@/storages/hydrate.ts';
|
||||||
|
import { accountFromPubkey, renderAccount } from '@/views/mastodon/accounts.ts';
|
||||||
|
|
||||||
|
export const suggestionsV1Controller: AppController = async (c) => {
|
||||||
|
const store = c.get('store');
|
||||||
|
const signal = c.req.raw.signal;
|
||||||
|
const accounts = await renderSuggestedAccounts(store, signal);
|
||||||
|
|
||||||
|
return c.json(accounts);
|
||||||
|
};
|
||||||
|
|
||||||
|
export const suggestionsV2Controller: AppController = async (c) => {
|
||||||
|
const store = c.get('store');
|
||||||
|
const signal = c.req.raw.signal;
|
||||||
|
const accounts = await renderSuggestedAccounts(store, signal);
|
||||||
|
|
||||||
|
const suggestions = accounts.map((account) => ({
|
||||||
|
source: 'staff',
|
||||||
|
account,
|
||||||
|
}));
|
||||||
|
|
||||||
|
return c.json(suggestions);
|
||||||
|
};
|
||||||
|
|
||||||
|
async function renderSuggestedAccounts(store: NStore, signal?: AbortSignal) {
|
||||||
|
const [follows] = await store.query(
|
||||||
|
[{ kinds: [3], authors: [Conf.pubkey], limit: 1 }],
|
||||||
|
{ signal },
|
||||||
|
);
|
||||||
|
|
||||||
|
const pubkeys = [...getTagSet(follows?.tags ?? [], 'p')];
|
||||||
|
|
||||||
|
const profiles = await store.query(
|
||||||
|
[{ kinds: [1], authors: pubkeys }],
|
||||||
|
{ signal },
|
||||||
|
)
|
||||||
|
.then((events) => hydrateEvents({ events, storage: store, signal }));
|
||||||
|
|
||||||
|
const accounts = await Promise.all(pubkeys.map((pubkey) => {
|
||||||
|
const profile = profiles.find((event) => event.pubkey === pubkey);
|
||||||
|
return profile ? renderAccount(profile) : accountFromPubkey(pubkey);
|
||||||
|
}));
|
||||||
|
|
||||||
|
return accounts.filter(Boolean);
|
||||||
|
}
|
Loading…
Reference in New Issue