diff --git a/deno.json b/deno.json index 412f32a3..915fd175 100644 --- a/deno.json +++ b/deno.json @@ -5,7 +5,8 @@ "./packages/conf", "./packages/db", "./packages/ditto", - "./packages/metrics" + "./packages/metrics", + "./packages/translators" ], "tasks": { "start": "deno run -A --env-file --deny-read=.env packages/ditto/server.ts", diff --git a/packages/api/DittoRoute.ts b/packages/api/DittoRoute.ts new file mode 100644 index 00000000..cebbc06a --- /dev/null +++ b/packages/api/DittoRoute.ts @@ -0,0 +1,52 @@ +import { type Env, Hono } from '@hono/hono'; + +import type { DittoConf } from '@ditto/conf'; +import type { DittoDatabase, DittoTables } from '@ditto/db'; +import type { HonoOptions } from '@hono/hono/hono-base'; +import type { NostrSigner, NPool, NRelay, NStore, NUploader } from '@nostrify/nostrify'; +import type { Kysely } from 'kysely'; + +interface DittoEnv extends Env { + Variables: { + conf: DittoConf; + user?: { + /** Signer to get the logged-in user's pubkey, relays, and to sign events, or `undefined` if the user isn't logged in. */ + signer: NostrSigner; + /** Storage for the user, might filter out unwanted content. */ + store: NStore; + }; + /** Uploader for the user to upload files. */ + uploader?: NUploader; + /** Kysely instance for the database. */ + kysely: Kysely; + /** Main database. */ + store: NRelay; + /** Internal Nostr relay for realtime subscriptions. */ + pubsub: NRelay; + /** Nostr relay pool. */ + pool: NPool; + /** Database object. */ + db: DittoDatabase; + /** Normalized pagination params. */ + pagination: { since?: number; until?: number; limit: number }; + /** Normalized list pagination params. */ + listPagination: { offset: number; limit: number }; + /** Translation service. */ + translator?: DittoTranslator; + signal: AbortSignal; + pipeline: Pick; + }; +} + +export class DittoRoute extends Hono { + constructor(opts: HonoOptions = {}) { + super(opts); + this.init(); + } + + init(): void { + this.use((c, next) => { + return next(); + }); + } +} diff --git a/packages/api/mod.ts b/packages/api/mod.ts new file mode 100644 index 00000000..ee8dc644 --- /dev/null +++ b/packages/api/mod.ts @@ -0,0 +1 @@ +export { DittoRoute } from './DittoRoute.ts'; diff --git a/packages/ditto/controllers/api/timelines.ts b/packages/ditto/controllers/api/timelines.ts index e8b8987a..d3c9dd0b 100644 --- a/packages/ditto/controllers/api/timelines.ts +++ b/packages/ditto/controllers/api/timelines.ts @@ -7,19 +7,33 @@ import { booleanParamSchema, languageSchema } from '@/schema.ts'; import { hydrateEvents } from '@/storages/hydrate.ts'; import { paginated } from '@/utils/api.ts'; import { getTagSet } from '@/utils/tags.ts'; -import { renderReblog, renderStatus } from '@/views/mastodon/statuses.ts'; +import { StatusView } from '@/views/mastodon/StatusView.ts'; +import { Hono } from '@hono/hono'; const homeQuerySchema = z.object({ exclude_replies: booleanParamSchema.optional(), only_media: booleanParamSchema.optional(), }); +export interface TimelineRouteOpts { +} + +export class TimelineRoute { + private app: Hono; + + constructor(private opts: TimelineRouteOpts) { + this.app = new Hono(); + } +} + const homeTimelineController: AppController = async (c) => { - const params = c.get('pagination'); - const pubkey = await c.get('signer')?.getPublicKey()!; + const { user, pagination } = c.var; + + const pubkey = await user.signer.getPublicKey()!; const result = homeQuerySchema.safeParse(c.req.query()); - if (!result.success) { + if (!result.success) {const homeTimelineController: AppController = async (c) => { + return c.json({ error: 'Bad request', schema: result.error }, 400); } diff --git a/packages/ditto/middleware/cspMiddleware.ts b/packages/ditto/middleware/cspMiddleware.ts index 208fe466..df18eac6 100644 --- a/packages/ditto/middleware/cspMiddleware.ts +++ b/packages/ditto/middleware/cspMiddleware.ts @@ -6,10 +6,10 @@ let configDBCache: Promise | undefined; export const cspMiddleware = (): AppMiddleware => { return async (c, next) => { - const { conf, store } = c.var; + const { conf } = c.var; if (!configDBCache) { - configDBCache = getPleromaConfigs(conf, store); + configDBCache = getPleromaConfigs(c.var); } const { host, protocol, origin } = conf.url; diff --git a/packages/ditto/translators/DeepLTranslator.test.ts b/packages/translators/DeepLTranslator.test.ts similarity index 100% rename from packages/ditto/translators/DeepLTranslator.test.ts rename to packages/translators/DeepLTranslator.test.ts diff --git a/packages/ditto/translators/DeepLTranslator.ts b/packages/translators/DeepLTranslator.ts similarity index 100% rename from packages/ditto/translators/DeepLTranslator.ts rename to packages/translators/DeepLTranslator.ts diff --git a/packages/ditto/interfaces/DittoTranslator.ts b/packages/translators/DittoTranslator.ts similarity index 100% rename from packages/ditto/interfaces/DittoTranslator.ts rename to packages/translators/DittoTranslator.ts diff --git a/packages/ditto/translators/LibreTranslateTranslator.test.ts b/packages/translators/LibreTranslateTranslator.test.ts similarity index 100% rename from packages/ditto/translators/LibreTranslateTranslator.test.ts rename to packages/translators/LibreTranslateTranslator.test.ts diff --git a/packages/ditto/translators/LibreTranslateTranslator.ts b/packages/translators/LibreTranslateTranslator.ts similarity index 100% rename from packages/ditto/translators/LibreTranslateTranslator.ts rename to packages/translators/LibreTranslateTranslator.ts diff --git a/packages/translators/deno.json b/packages/translators/deno.json new file mode 100644 index 00000000..5d603f3a --- /dev/null +++ b/packages/translators/deno.json @@ -0,0 +1,7 @@ +{ + "name": "@ditto/translators", + "version": "1.1.0", + "exports": { + ".": "./mod.ts" + } +} diff --git a/packages/translators/mod.ts b/packages/translators/mod.ts new file mode 100644 index 00000000..df177bd6 --- /dev/null +++ b/packages/translators/mod.ts @@ -0,0 +1,5 @@ +export { DeepLTranslator } from './DeepLTranslator.ts'; +export { LibreTranslateTranslator } from './LibreTranslateTranslator.ts'; + +export type { LanguageCode } from 'iso-639-1'; +export type { DittoTranslator } from './DittoTranslator.ts';