diff --git a/services/appview/src/index.ts b/services/appview/src/index.ts index 44c3f33..e0fbdc2 100644 --- a/services/appview/src/index.ts +++ b/services/appview/src/index.ts @@ -26,6 +26,7 @@ import { createUpdateSubjectStatusRouter } from './routes/com/atproto/admin/upda import { createGetRecordRouter } from './routes/com/atproto/repo/getRecord.js' import { createGetAccountInfosRouter } from './routes/com/atproto/admin/getAccountInfos.js' import { createGetSubjectStatusRouter } from './routes/com/atproto/admin/getSubjectStatus.js' +import { createResolveHandleRouter } from './routes/com/atproto/identity/resolveHandle.js' import wellKnownRouter from './well-known.js' import { TakedownService } from './services/takedown.js' import { IndexingService } from './services/indexing.js' @@ -114,7 +115,8 @@ export class Server { const getRecordRouter = createGetRecordRouter(ctx) const getAccountInfosRouter = createGetAccountInfosRouter(ctx) const getSubjectStatusRouter = createGetSubjectStatusRouter(ctx) - + const resolveHandleRouter = createResolveHandleRouter(ctx) + app.route('/', getPostsRouter) app.route('/', getPostThreadRouter) app.route('/', getProfileRouter) @@ -127,6 +129,7 @@ export class Server { app.route('/', getRecordRouter) app.route('/', getAccountInfosRouter) app.route('/', getSubjectStatusRouter) + app.route('/', resolveHandleRouter) app.route('/', wellKnownRouter()) // Root route diff --git a/services/appview/src/routes/com/atproto/admin/getSubjectStatus.ts b/services/appview/src/routes/com/atproto/admin/getSubjectStatus.ts index 72b6d70..990c05e 100644 --- a/services/appview/src/routes/com/atproto/admin/getSubjectStatus.ts +++ b/services/appview/src/routes/com/atproto/admin/getSubjectStatus.ts @@ -5,7 +5,7 @@ import { AppContext } from '../../../../index.js' export const createGetSubjectStatusRouter = (ctx: AppContext) => { const router = new Hono() - router.get('/xrpc/com.atproto.admin.getSubjectStatus', (c, next) => optionalAuthMiddleware(c, next), async (c) => { + router.get('/xrpc/com.atproto.admin.getSubjectStatus', (c, next) => authMiddleware(c, next, true), async (c) => { const did = c.req.query('did') const uri = c.req.query('uri') const blob = c.req.query('blob') diff --git a/services/appview/src/routes/com/atproto/identity/resolveHandle.ts b/services/appview/src/routes/com/atproto/identity/resolveHandle.ts new file mode 100644 index 0000000..d5e97b8 --- /dev/null +++ b/services/appview/src/routes/com/atproto/identity/resolveHandle.ts @@ -0,0 +1,26 @@ +import * as ident from '@atproto/syntax' +import { InvalidRequestError } from '@atproto/xrpc-server' +import { Server } from '../../../../lexicon' +import { AppContext } from '../../../..' +import { Hono } from 'hono' + +export const createResolveHandleRouter = (ctx: AppContext) => { + const router = new Hono() + + router.get('/xrpc/com.atproto.identity.resolveHandle', async (c) => { + if (!c.req.query('handle')) { + throw new InvalidRequestError('Missing handle') + } + + const handle = ident.normalizeHandle(c.req.query('handle')!) + + const actor = await ctx.db.models.Actor.findOne({ handle }) + if (!actor) { + throw new InvalidRequestError('Unable to resolve handle') + } + + return c.json({ did: actor.did }) + }) + + return router +} \ No newline at end of file