mirror of
https://github.com/aljazceru/ditto.git
synced 2026-01-13 18:44:22 +01:00
Fix Mastodon legacy pagination
This commit is contained in:
@@ -9,7 +9,7 @@ import { booleanParamSchema, fileSchema } from '@/schema.ts';
|
||||
import { Storages } from '@/storages.ts';
|
||||
import { uploadFile } from '@/utils/upload.ts';
|
||||
import { nostrNow } from '@/utils.ts';
|
||||
import { createEvent, paginated, paginationSchema, parseBody, updateListEvent } from '@/utils/api.ts';
|
||||
import { createEvent, paginated, parseBody, updateListEvent } from '@/utils/api.ts';
|
||||
import { lookupAccount } from '@/utils/lookup.ts';
|
||||
import { renderAccounts, renderEventAccounts, renderStatuses } from '@/views.ts';
|
||||
import { accountFromPubkey, renderAccount } from '@/views/mastodon/accounts.ts';
|
||||
@@ -192,7 +192,7 @@ const accountStatusesQuerySchema = z.object({
|
||||
|
||||
const accountStatusesController: AppController = async (c) => {
|
||||
const pubkey = c.req.param('pubkey');
|
||||
const { since, until } = paginationSchema.parse(c.req.query());
|
||||
const { since, until } = c.get('pagination');
|
||||
const { pinned, limit, exclude_replies, tagged } = accountStatusesQuerySchema.parse(c.req.query());
|
||||
const { signal } = c.req.raw;
|
||||
|
||||
@@ -366,7 +366,7 @@ const unfollowController: AppController = async (c) => {
|
||||
|
||||
const followersController: AppController = (c) => {
|
||||
const pubkey = c.req.param('pubkey');
|
||||
const params = paginationSchema.parse(c.req.query());
|
||||
const params = c.get('pagination');
|
||||
return renderEventAccounts(c, [{ kinds: [3], '#p': [pubkey], ...params }]);
|
||||
};
|
||||
|
||||
@@ -418,7 +418,7 @@ const unmuteController: AppController = async (c) => {
|
||||
|
||||
const favouritesController: AppController = async (c) => {
|
||||
const pubkey = await c.get('signer')?.getPublicKey()!;
|
||||
const params = paginationSchema.parse(c.req.query());
|
||||
const params = c.get('pagination');
|
||||
const { signal } = c.req.raw;
|
||||
|
||||
const store = await Storages.db();
|
||||
|
||||
@@ -6,7 +6,7 @@ import { Conf } from '@/config.ts';
|
||||
import { booleanParamSchema } from '@/schema.ts';
|
||||
import { Storages } from '@/storages.ts';
|
||||
import { hydrateEvents } from '@/storages/hydrate.ts';
|
||||
import { createAdminEvent, paginated, paginationSchema, parseBody, updateEventInfo, updateUser } from '@/utils/api.ts';
|
||||
import { createAdminEvent, paginated, parseBody, updateEventInfo, updateUser } from '@/utils/api.ts';
|
||||
import { renderNameRequest } from '@/views/ditto.ts';
|
||||
import { renderAdminAccount, renderAdminAccountFromPubkey } from '@/views/mastodon/admin-accounts.ts';
|
||||
|
||||
@@ -29,7 +29,7 @@ const adminAccountQuerySchema = z.object({
|
||||
|
||||
const adminAccountsController: AppController = async (c) => {
|
||||
const store = await Storages.db();
|
||||
const params = paginationSchema.parse(c.req.query());
|
||||
const params = c.get('pagination');
|
||||
const { signal } = c.req.raw;
|
||||
const {
|
||||
local,
|
||||
|
||||
@@ -7,7 +7,7 @@ import { addTag } from '@/utils/tags.ts';
|
||||
import { AdminSigner } from '@/signers/AdminSigner.ts';
|
||||
import { booleanParamSchema } from '@/schema.ts';
|
||||
import { Conf } from '@/config.ts';
|
||||
import { createEvent, paginated, paginationSchema, parseBody } from '@/utils/api.ts';
|
||||
import { createEvent, paginated, parseBody } from '@/utils/api.ts';
|
||||
import { deleteTag } from '@/utils/tags.ts';
|
||||
import { DittoZapSplits, getZapSplits } from '@/utils/zap-split.ts';
|
||||
import { getAuthor } from '@/queries.ts';
|
||||
@@ -114,7 +114,7 @@ export const nameRequestsController: AppController = async (c) => {
|
||||
const signer = c.get('signer')!;
|
||||
const pubkey = await signer.getPublicKey();
|
||||
|
||||
const params = paginationSchema.parse(c.req.query());
|
||||
const params = c.get('pagination');
|
||||
const { approved, rejected } = nameRequestsSchema.parse(c.req.query());
|
||||
|
||||
const filter: NostrFilter = {
|
||||
|
||||
@@ -3,8 +3,9 @@ import { z } from 'zod';
|
||||
|
||||
import { AppContext, AppController } from '@/app.ts';
|
||||
import { Conf } from '@/config.ts';
|
||||
import { DittoPagination } from '@/interfaces/DittoPagination.ts';
|
||||
import { hydrateEvents } from '@/storages/hydrate.ts';
|
||||
import { paginated, PaginationParams, paginationSchema } from '@/utils/api.ts';
|
||||
import { paginated } from '@/utils/api.ts';
|
||||
import { renderNotification } from '@/views/mastodon/notifications.ts';
|
||||
|
||||
/** Set of known notification types across backends. */
|
||||
@@ -30,7 +31,7 @@ const notificationsSchema = z.object({
|
||||
|
||||
const notificationsController: AppController = async (c) => {
|
||||
const pubkey = await c.get('signer')?.getPublicKey()!;
|
||||
const params = paginationSchema.parse(c.req.query());
|
||||
const params = c.get('pagination');
|
||||
|
||||
const types = notificationTypes
|
||||
.intersection(new Set(c.req.queries('types[]') ?? notificationTypes))
|
||||
@@ -72,7 +73,7 @@ const notificationsController: AppController = async (c) => {
|
||||
async function renderNotifications(
|
||||
filters: NostrFilter[],
|
||||
types: Set<string>,
|
||||
params: PaginationParams,
|
||||
params: DittoPagination,
|
||||
c: AppContext,
|
||||
) {
|
||||
const store = c.get('store');
|
||||
|
||||
@@ -3,7 +3,7 @@ import { z } from 'zod';
|
||||
|
||||
import { type AppController } from '@/app.ts';
|
||||
import { Conf } from '@/config.ts';
|
||||
import { createEvent, paginated, paginationSchema, parseBody, updateEventInfo } from '@/utils/api.ts';
|
||||
import { createEvent, paginated, parseBody, updateEventInfo } from '@/utils/api.ts';
|
||||
import { hydrateEvents } from '@/storages/hydrate.ts';
|
||||
import { renderAdminReport } from '@/views/mastodon/reports.ts';
|
||||
import { renderReport } from '@/views/mastodon/reports.ts';
|
||||
@@ -64,7 +64,7 @@ const adminReportsController: AppController = async (c) => {
|
||||
const store = c.get('store');
|
||||
const viewerPubkey = await c.get('signer')?.getPublicKey();
|
||||
|
||||
const params = paginationSchema.parse(c.req.query());
|
||||
const params = c.get('pagination');
|
||||
const { resolved, account_id, target_account_id } = adminReportsSchema.parse(c.req.query());
|
||||
|
||||
const filter: NostrFilter = {
|
||||
|
||||
@@ -19,15 +19,7 @@ import { renderEventAccounts } from '@/views.ts';
|
||||
import { renderReblog, renderStatus } from '@/views/mastodon/statuses.ts';
|
||||
import { Storages } from '@/storages.ts';
|
||||
import { hydrateEvents, purifyEvent } from '@/storages/hydrate.ts';
|
||||
import {
|
||||
createEvent,
|
||||
listPaginationSchema,
|
||||
paginated,
|
||||
paginatedList,
|
||||
paginationSchema,
|
||||
parseBody,
|
||||
updateListEvent,
|
||||
} from '@/utils/api.ts';
|
||||
import { createEvent, paginated, paginatedList, parseBody, updateListEvent } from '@/utils/api.ts';
|
||||
import { getInvoice, getLnurl } from '@/utils/lnurl.ts';
|
||||
import { getZapSplits } from '@/utils/zap-split.ts';
|
||||
|
||||
@@ -296,7 +288,7 @@ const favouriteController: AppController = async (c) => {
|
||||
|
||||
const favouritedByController: AppController = (c) => {
|
||||
const id = c.req.param('id');
|
||||
const params = paginationSchema.parse(c.req.query());
|
||||
const params = c.get('pagination');
|
||||
|
||||
return renderEventAccounts(c, [{ kinds: [7], '#e': [id], ...params }], {
|
||||
filterFn: ({ content }) => content === '+',
|
||||
@@ -364,13 +356,13 @@ const unreblogStatusController: AppController = async (c) => {
|
||||
|
||||
const rebloggedByController: AppController = (c) => {
|
||||
const id = c.req.param('id');
|
||||
const params = paginationSchema.parse(c.req.query());
|
||||
const params = c.get('pagination');
|
||||
return renderEventAccounts(c, [{ kinds: [6], '#e': [id], ...params }]);
|
||||
};
|
||||
|
||||
const quotesController: AppController = async (c) => {
|
||||
const id = c.req.param('id');
|
||||
const params = paginationSchema.parse(c.req.query());
|
||||
const params = c.get('pagination');
|
||||
const store = await Storages.db();
|
||||
|
||||
const [event] = await store.query([{ ids: [id], kinds: [1] }]);
|
||||
@@ -571,7 +563,7 @@ const zapController: AppController = async (c) => {
|
||||
|
||||
const zappedByController: AppController = async (c) => {
|
||||
const id = c.req.param('id');
|
||||
const params = listPaginationSchema.parse(c.req.query());
|
||||
const params = c.get('pagination');
|
||||
const store = await Storages.db();
|
||||
const db = await DittoDB.getInstance();
|
||||
|
||||
|
||||
@@ -4,13 +4,13 @@ import { matchFilter } from 'nostr-tools';
|
||||
import { AppContext, AppController } from '@/app.ts';
|
||||
import { Conf } from '@/config.ts';
|
||||
import { hydrateEvents } from '@/storages/hydrate.ts';
|
||||
import { listPaginationSchema, paginatedList, PaginatedListParams } from '@/utils/api.ts';
|
||||
import { paginatedList } from '@/utils/api.ts';
|
||||
import { getTagSet } from '@/utils/tags.ts';
|
||||
import { accountFromPubkey, renderAccount } from '@/views/mastodon/accounts.ts';
|
||||
|
||||
export const suggestionsV1Controller: AppController = async (c) => {
|
||||
const signal = c.req.raw.signal;
|
||||
const params = listPaginationSchema.parse(c.req.query());
|
||||
const params = c.get('pagination');
|
||||
const suggestions = await renderV2Suggestions(c, params, signal);
|
||||
const accounts = suggestions.map(({ account }) => account);
|
||||
return paginatedList(c, params, accounts);
|
||||
@@ -18,12 +18,12 @@ export const suggestionsV1Controller: AppController = async (c) => {
|
||||
|
||||
export const suggestionsV2Controller: AppController = async (c) => {
|
||||
const signal = c.req.raw.signal;
|
||||
const params = listPaginationSchema.parse(c.req.query());
|
||||
const params = c.get('pagination');
|
||||
const suggestions = await renderV2Suggestions(c, params, signal);
|
||||
return paginatedList(c, params, suggestions);
|
||||
};
|
||||
|
||||
async function renderV2Suggestions(c: AppContext, params: PaginatedListParams, signal?: AbortSignal) {
|
||||
async function renderV2Suggestions(c: AppContext, params: { offset: number; limit: number }, signal?: AbortSignal) {
|
||||
const { offset, limit } = params;
|
||||
|
||||
const store = c.get('store');
|
||||
|
||||
@@ -6,12 +6,12 @@ import { Conf } from '@/config.ts';
|
||||
import { getFeedPubkeys } from '@/queries.ts';
|
||||
import { booleanParamSchema } from '@/schema.ts';
|
||||
import { hydrateEvents } from '@/storages/hydrate.ts';
|
||||
import { paginated, paginationSchema } from '@/utils/api.ts';
|
||||
import { paginated } from '@/utils/api.ts';
|
||||
import { getTagSet } from '@/utils/tags.ts';
|
||||
import { renderReblog, renderStatus } from '@/views/mastodon/statuses.ts';
|
||||
|
||||
const homeTimelineController: AppController = async (c) => {
|
||||
const params = paginationSchema.parse(c.req.query());
|
||||
const params = c.get('pagination');
|
||||
const pubkey = await c.get('signer')?.getPublicKey()!;
|
||||
const authors = await getFeedPubkeys(pubkey);
|
||||
return renderStatuses(c, [{ authors, kinds: [1, 6], ...params }]);
|
||||
@@ -23,7 +23,7 @@ const publicQuerySchema = z.object({
|
||||
});
|
||||
|
||||
const publicTimelineController: AppController = (c) => {
|
||||
const params = paginationSchema.parse(c.req.query());
|
||||
const params = c.get('pagination');
|
||||
const { local, instance } = publicQuerySchema.parse(c.req.query());
|
||||
|
||||
const filter: NostrFilter = { kinds: [1], ...params };
|
||||
@@ -39,13 +39,13 @@ const publicTimelineController: AppController = (c) => {
|
||||
|
||||
const hashtagTimelineController: AppController = (c) => {
|
||||
const hashtag = c.req.param('hashtag')!.toLowerCase();
|
||||
const params = paginationSchema.parse(c.req.query());
|
||||
const params = c.get('pagination');
|
||||
return renderStatuses(c, [{ kinds: [1], '#t': [hashtag], ...params }]);
|
||||
};
|
||||
|
||||
const suggestedTimelineController: AppController = async (c) => {
|
||||
const store = c.get('store');
|
||||
const params = paginationSchema.parse(c.req.query());
|
||||
const params = c.get('pagination');
|
||||
|
||||
const [follows] = await store.query(
|
||||
[{ kinds: [3], authors: [Conf.pubkey], limit: 1 }],
|
||||
|
||||
Reference in New Issue
Block a user