mirror of
https://github.com/aljazceru/ditto.git
synced 2025-12-25 01:04:25 +01:00
Add TrendsWorker for tracking/querying trending tags with a Web Worker
This commit is contained in:
@@ -1,13 +1,15 @@
|
||||
import { type AppController } from '@/app.ts';
|
||||
import { Conf } from '@/config.ts';
|
||||
import { z } from '@/deps.ts';
|
||||
import { trends } from '@/trends.ts';
|
||||
import { Time } from '@/utils.ts';
|
||||
import { stripTime } from '@/utils/time.ts';
|
||||
import { TrendsWorker } from '@/workers/trends.ts';
|
||||
|
||||
await TrendsWorker.open('data/trends.sqlite3');
|
||||
|
||||
const limitSchema = z.coerce.number().catch(10).transform((value) => Math.min(Math.max(value, 0), 20));
|
||||
|
||||
const trendingTagsController: AppController = (c) => {
|
||||
const trendingTagsController: AppController = async (c) => {
|
||||
const limit = limitSchema.parse(c.req.query('limit'));
|
||||
if (limit < 1) return c.json([]);
|
||||
|
||||
@@ -16,37 +18,39 @@ const trendingTagsController: AppController = (c) => {
|
||||
const lastWeek = new Date(now.getTime() - Time.days(7));
|
||||
|
||||
/** Most used hashtags within the past 24h. */
|
||||
const tags = trends.getTrendingTags({
|
||||
const tags = await TrendsWorker.getTrendingTags({
|
||||
since: yesterday,
|
||||
until: now,
|
||||
limit,
|
||||
});
|
||||
|
||||
return c.json(tags.map(({ name, uses, accounts }) => ({
|
||||
name,
|
||||
url: Conf.local(`/tags/${name}`),
|
||||
history: [
|
||||
// Use the full 24h query for the current day. Then use `offset: 1` to adjust for this below.
|
||||
// This result is more accurate than what Mastodon returns.
|
||||
{
|
||||
day: String(Math.floor(stripTime(now).getTime() / 1000)),
|
||||
accounts: String(accounts),
|
||||
uses: String(uses),
|
||||
},
|
||||
...trends.getTagHistory({
|
||||
tag: name,
|
||||
since: lastWeek,
|
||||
until: now,
|
||||
limit: 6,
|
||||
offset: 1,
|
||||
}).map((history) => ({
|
||||
// For some reason, Mastodon wants these to be strings... oh well.
|
||||
day: String(Math.floor(history.day.getTime() / 1000)),
|
||||
accounts: String(history.accounts),
|
||||
uses: String(history.uses),
|
||||
})),
|
||||
],
|
||||
})));
|
||||
return c.json(
|
||||
await Promise.all(tags.map(async ({ name, uses, accounts }) => ({
|
||||
name,
|
||||
url: Conf.local(`/tags/${name}`),
|
||||
history: [
|
||||
// Use the full 24h query for the current day. Then use `offset: 1` to adjust for this below.
|
||||
// This result is more accurate than what Mastodon returns.
|
||||
{
|
||||
day: String(Math.floor(stripTime(now).getTime() / 1000)),
|
||||
accounts: String(accounts),
|
||||
uses: String(uses),
|
||||
},
|
||||
...(await TrendsWorker.getTagHistory({
|
||||
tag: name,
|
||||
since: lastWeek,
|
||||
until: now,
|
||||
limit: 6,
|
||||
offset: 1,
|
||||
})).map((history) => ({
|
||||
// For some reason, Mastodon wants these to be strings... oh well.
|
||||
day: String(Math.floor(history.day.getTime() / 1000)),
|
||||
accounts: String(history.accounts),
|
||||
uses: String(history.uses),
|
||||
})),
|
||||
],
|
||||
}))),
|
||||
);
|
||||
};
|
||||
|
||||
export { trendingTagsController };
|
||||
|
||||
Reference in New Issue
Block a user