mirror of
https://iceshrimp.dev/crimekillz/trashposs
synced 2024-11-22 00:43:49 +01:00
[mastodon-client] GET /v1/trends/{statuses,hashtags,links}
This commit is contained in:
parent
fb7713c424
commit
ec55071eb2
@ -75,21 +75,30 @@ export function setupEndpointsMisc(router: Router): void {
|
|||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
|
||||||
router.get("/v1/trends", async (ctx) => {
|
router.get(["/v1/trends/tags", "/v1/trends"], async (ctx) => {
|
||||||
const BASE_URL = `${ctx.request.protocol}://${ctx.request.hostname}`;
|
|
||||||
const accessTokens = ctx.request.headers.authorization;
|
|
||||||
const client = getClient(BASE_URL, accessTokens); // we are using this here, because in private mode some info isnt
|
|
||||||
// displayed without being logged in
|
|
||||||
try {
|
try {
|
||||||
const data = await client.getInstanceTrends();
|
const args = limitToInt(ctx.query);
|
||||||
ctx.body = data.data;
|
ctx.body = await MiscHelpers.getTrendingHashtags(args.limit, args.offset);
|
||||||
} catch (e: any) {
|
} catch (e: any) {
|
||||||
console.error(e);
|
ctx.status = 500;
|
||||||
ctx.status = 401;
|
ctx.body = { error: e.message };
|
||||||
ctx.body = e.response.data;
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
router.get("/v1/trends/statuses", async (ctx) => {
|
||||||
|
try {
|
||||||
|
const args = limitToInt(ctx.query);
|
||||||
|
ctx.body = await MiscHelpers.getTrendingStatuses(args.limit, args.offset);
|
||||||
|
} catch (e: any) {
|
||||||
|
ctx.status = 500;
|
||||||
|
ctx.body = { error: e.message };
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
router.get("/v1/trends/links", async (ctx) => {
|
||||||
|
ctx.body = [];
|
||||||
|
});
|
||||||
|
|
||||||
router.get("/v1/preferences", async (ctx) => {
|
router.get("/v1/preferences", async (ctx) => {
|
||||||
const BASE_URL = `${ctx.request.protocol}://${ctx.request.hostname}`;
|
const BASE_URL = `${ctx.request.protocol}://${ctx.request.hostname}`;
|
||||||
const accessTokens = ctx.request.headers.authorization;
|
const accessTokens = ctx.request.headers.authorization;
|
||||||
|
@ -54,40 +54,4 @@ export function setupEndpointsSearch(router: Router): void {
|
|||||||
ctx.body = {error: e.message};
|
ctx.body = {error: e.message};
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
router.get("/v1/trends/statuses", async (ctx) => {
|
|
||||||
const BASE_URL = `${ctx.request.protocol}://${ctx.request.hostname}`;
|
|
||||||
const accessTokens = ctx.headers.authorization;
|
|
||||||
try {
|
|
||||||
const data = await getHighlight(
|
|
||||||
BASE_URL,
|
|
||||||
ctx.request.hostname,
|
|
||||||
accessTokens,
|
|
||||||
);
|
|
||||||
ctx.body = data.map((status) => convertStatusIds(status));
|
|
||||||
} catch (e: any) {
|
|
||||||
console.error(e);
|
|
||||||
ctx.status = 401;
|
|
||||||
ctx.body = e.response.data;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
async function getHighlight(
|
|
||||||
BASE_URL: string,
|
|
||||||
domain: string,
|
|
||||||
accessTokens: string | undefined,
|
|
||||||
) {
|
|
||||||
const accessTokenArr = accessTokens?.split(" ") ?? [null];
|
|
||||||
const accessToken = accessTokenArr[accessTokenArr.length - 1];
|
|
||||||
try {
|
|
||||||
const api = await axios.post(`${BASE_URL}/api/notes/featured`, {
|
|
||||||
i: accessToken,
|
|
||||||
});
|
|
||||||
const data: MisskeyEntity.Note[] = api.data;
|
|
||||||
return data.map((note) => new Converter(BASE_URL).note(note, domain));
|
|
||||||
} catch (e: any) {
|
|
||||||
console.log(e);
|
|
||||||
console.log(e.response.data);
|
|
||||||
return [];
|
|
||||||
}
|
|
||||||
}
|
}
|
@ -18,6 +18,7 @@ import { generateBlockQueryForUsers } from "@/server/api/common/generate-block-q
|
|||||||
import { uniqBy } from "@/prelude/array.js";
|
import { uniqBy } from "@/prelude/array.js";
|
||||||
import { EmojiConverter } from "@/server/api/mastodon/converters/emoji.js";
|
import { EmojiConverter } from "@/server/api/mastodon/converters/emoji.js";
|
||||||
import { populateEmojis } from "@/misc/populate-emojis.js";
|
import { populateEmojis } from "@/misc/populate-emojis.js";
|
||||||
|
import { NoteConverter } from "@/server/api/mastodon/converters/note.js";
|
||||||
|
|
||||||
export class MiscHelpers {
|
export class MiscHelpers {
|
||||||
public static async getInstance(): Promise<MastodonEntity.Instance> {
|
public static async getInstance(): Promise<MastodonEntity.Instance> {
|
||||||
@ -203,4 +204,27 @@ export class MiscHelpers {
|
|||||||
)
|
)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static async getTrendingStatuses(limit: number = 20, offset: number = 0): Promise<MastodonEntity.Status[]> {
|
||||||
|
if (limit > 40) limit = 40;
|
||||||
|
const query = Notes.createQueryBuilder("note")
|
||||||
|
.addSelect("note.score")
|
||||||
|
.andWhere("note.score > 0")
|
||||||
|
.andWhere("note.createdAt > :date", { date: new Date(Date.now() - 1000 * 60 * 60 * 24) })
|
||||||
|
.andWhere("note.visibility = 'public'")
|
||||||
|
.andWhere("note.userHost IS NULL")
|
||||||
|
.orderBy("note.score", "DESC");
|
||||||
|
|
||||||
|
return query
|
||||||
|
.skip(offset)
|
||||||
|
.take(limit)
|
||||||
|
.getMany()
|
||||||
|
.then(result => NoteConverter.encodeMany(result, null));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static async getTrendingHashtags(limit: number = 10, offset: number = 0): Promise<MastodonEntity.Tag[]> {
|
||||||
|
if (limit > 20) limit = 20;
|
||||||
|
return [];
|
||||||
|
//FIXME: This was already implemented in api/endpoints/hashtags/trend.ts, but the implementation is sketchy at best. Rewrite from scratch.
|
||||||
|
}
|
||||||
}
|
}
|
Loading…
Reference in New Issue
Block a user