126 lines
5.5 KiB
TypeScript
126 lines
5.5 KiB
TypeScript
|
|
import { convertId, IdConvertType as IdType, convertAccount, convertAttachment, convertPoll, convertStatus } from '../converters.js';
|
||
|
|
import querystring from 'querystring';
|
||
|
|
import type { Entity, MegalodonInterface } from 'megalodon';
|
||
|
|
import type { FastifyInstance } from 'fastify';
|
||
|
|
import { getClient } from '../MastodonApiServerService.js';
|
||
|
|
import { convertTimelinesArgsId, limitToInt } from './timeline.js';
|
||
|
|
|
||
|
|
function normalizeQuery(data: any) {
|
||
|
|
const str = querystring.stringify(data);
|
||
|
|
return querystring.parse(str);
|
||
|
|
}
|
||
|
|
|
||
|
|
export class apiStatusMastodon {
|
||
|
|
private fastify: FastifyInstance;
|
||
|
|
|
||
|
|
constructor(fastify: FastifyInstance) {
|
||
|
|
this.fastify = fastify;
|
||
|
|
}
|
||
|
|
|
||
|
|
public async getStatus() {
|
||
|
|
this.fastify.get<{ Params: { id: string } }>("/v1/statuses/:id", async (_request, reply) => {
|
||
|
|
const BASE_URL = `${_request.protocol}://${_request.hostname}`;
|
||
|
|
const accessTokens = _request.headers.authorization;
|
||
|
|
const client = getClient(BASE_URL, accessTokens);
|
||
|
|
try {
|
||
|
|
const data = await client.getStatus(convertId(_request.params.id, IdType.SharkeyId));
|
||
|
|
reply.send(convertStatus(data.data));
|
||
|
|
} catch (e: any) {
|
||
|
|
console.error(e);
|
||
|
|
reply.code(_request.is404 ? 404 : 401).send(e.response.data);
|
||
|
|
}
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
public async getContext() {
|
||
|
|
this.fastify.get<{ Params: { id: string } }>("/v1/statuses/:id/context", async (_request, reply) => {
|
||
|
|
const BASE_URL = `${_request.protocol}://${_request.hostname}`;
|
||
|
|
const accessTokens = _request.headers.authorization;
|
||
|
|
const client = getClient(BASE_URL, accessTokens);
|
||
|
|
const query: any = _request.query;
|
||
|
|
try {
|
||
|
|
const data = await client.getStatusContext(
|
||
|
|
convertId(_request.params.id, IdType.SharkeyId),
|
||
|
|
convertTimelinesArgsId(limitToInt(query))
|
||
|
|
);
|
||
|
|
data.data.ancestors = data.data.ancestors.map((status: Entity.Status) => convertStatus(status));
|
||
|
|
data.data.descendants = data.data.descendants.map((status: Entity.Status) => convertStatus(status));
|
||
|
|
reply.send(data.data);
|
||
|
|
} catch (e: any) {
|
||
|
|
console.error(e);
|
||
|
|
reply.code(_request.is404 ? 404 : 401).send(e.response.data);
|
||
|
|
}
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
public async getHistory() {
|
||
|
|
this.fastify.get<{ Params: { id: string } }>("/v1/statuses/:id/history", async (_request, reply) => {
|
||
|
|
try {
|
||
|
|
reply.code(401).send({ message: 'Not Implemented' });
|
||
|
|
} catch (e: any) {
|
||
|
|
console.error(e);
|
||
|
|
reply.code(401).send(e.response.data);
|
||
|
|
}
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
public async getReblogged() {
|
||
|
|
this.fastify.get<{ Params: { id: string } }>("/v1/statuses/:id/reblogged_by", async (_request, reply) => {
|
||
|
|
const BASE_URL = `${_request.protocol}://${_request.hostname}`;
|
||
|
|
const accessTokens = _request.headers.authorization;
|
||
|
|
const client = getClient(BASE_URL, accessTokens);
|
||
|
|
try {
|
||
|
|
const data = await client.getStatusRebloggedBy(convertId(_request.params.id, IdType.SharkeyId));
|
||
|
|
reply.send(data.data.map((account: Entity.Account) => convertAccount(account)));
|
||
|
|
} catch (e: any) {
|
||
|
|
console.error(e);
|
||
|
|
reply.code(401).send(e.response.data);
|
||
|
|
}
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
public async getFavourites() {
|
||
|
|
this.fastify.get<{ Params: { id: string } }>("/v1/statuses/:id/favourited_by", async (_request, reply) => {
|
||
|
|
const BASE_URL = `${_request.protocol}://${_request.hostname}`;
|
||
|
|
const accessTokens = _request.headers.authorization;
|
||
|
|
const client = getClient(BASE_URL, accessTokens);
|
||
|
|
try {
|
||
|
|
const data = await client.getStatusFavouritedBy(convertId(_request.params.id, IdType.SharkeyId));
|
||
|
|
reply.send(data.data.map((account: Entity.Account) => convertAccount(account)));
|
||
|
|
} catch (e: any) {
|
||
|
|
console.error(e);
|
||
|
|
reply.code(401).send(e.response.data);
|
||
|
|
}
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
public async getMedia() {
|
||
|
|
this.fastify.get<{ Params: { id: string } }>("/v1/media/:id", async (_request, reply) => {
|
||
|
|
const BASE_URL = `${_request.protocol}://${_request.hostname}`;
|
||
|
|
const accessTokens = _request.headers.authorization;
|
||
|
|
const client = getClient(BASE_URL, accessTokens);
|
||
|
|
try {
|
||
|
|
const data = await client.getMedia(convertId(_request.params.id, IdType.SharkeyId));
|
||
|
|
reply.send(convertAttachment(data.data));
|
||
|
|
} catch (e: any) {
|
||
|
|
console.error(e);
|
||
|
|
reply.code(401).send(e.response.data);
|
||
|
|
}
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
public async getPoll() {
|
||
|
|
this.fastify.get<{ Params: { id: string } }>("/v1/polls/:id", async (_request, reply) => {
|
||
|
|
const BASE_URL = `${_request.protocol}://${_request.hostname}`;
|
||
|
|
const accessTokens = _request.headers.authorization;
|
||
|
|
const client = getClient(BASE_URL, accessTokens);
|
||
|
|
try {
|
||
|
|
const data = await client.getPoll(convertId(_request.params.id, IdType.SharkeyId));
|
||
|
|
reply.send(convertPoll(data.data));
|
||
|
|
} catch (e: any) {
|
||
|
|
console.error(e);
|
||
|
|
reply.code(401).send(e.response.data);
|
||
|
|
}
|
||
|
|
});
|
||
|
|
}
|
||
|
|
}
|