diff --git a/packages/pl-api/lib/client.ts b/packages/pl-api/lib/client.ts index 1430f7ef9..f6fb7ff2c 100644 --- a/packages/pl-api/lib/client.ts +++ b/packages/pl-api/lib/client.ts @@ -2598,6 +2598,28 @@ class PlApiClient { return response.json as {}; }, + + /** + * Add a list to favourites + * + * Requires features{@link Features['listsFavourite']}. + */ + favouriteList: async (listId: string) => { + const response = await this.request(`/api/v1/lists/${listId}/favourite`, { method: 'POST' }); + + return v.parse(listSchema, response.json); + }, + + /** + * Remove a list from favourites + * + * Requires features{@link Features['listsFavourite']}. + */ + unfavouriteList: async (listId: string) => { + const response = await this.request(`/api/v1/lists/${listId}/unfavourite`, { method: 'POST' }); + + return v.parse(listSchema, response.json); + }, }; public readonly streaming = { diff --git a/packages/pl-api/lib/entities/antenna.ts b/packages/pl-api/lib/entities/antenna.ts index fa5da8bb8..b51e3bc3f 100644 --- a/packages/pl-api/lib/entities/antenna.ts +++ b/packages/pl-api/lib/entities/antenna.ts @@ -1,11 +1,8 @@ import * as v from 'valibot'; -import { listSchema } from './list'; +import { type List, listSchema } from './list'; -/** - * @category Schemas - */ -const antennaSchema = v.object({ +const baseAntennaSchema = v.object({ id: v.string(), title: v.string(), with_media_only: v.boolean(), @@ -13,7 +10,6 @@ const antennaSchema = v.object({ stl: v.boolean(), ltl: v.boolean(), insert_feeds: v.boolean(), - list: v.nullable(listSchema), accounts_count: v.number(), domains_count: v.number(), tags_count: v.number(), @@ -21,9 +17,19 @@ const antennaSchema = v.object({ favourite: v.boolean(), }); +/** + * @category Schemas + */ +const antennaSchema: v.BaseSchema> = v.object({ + ...baseAntennaSchema.entries, + list: v.fallback(v.nullable(v.lazy(() => listSchema)), null), +}); + /** * @category Entity types */ -type Antenna = v.InferOutput; +type Antenna = v.InferOutput & { + list: List | null; +} export { antennaSchema, type Antenna }; diff --git a/packages/pl-api/lib/entities/list.ts b/packages/pl-api/lib/entities/list.ts index 12278a7f3..857fdcd78 100644 --- a/packages/pl-api/lib/entities/list.ts +++ b/packages/pl-api/lib/entities/list.ts @@ -1,5 +1,8 @@ import * as v from 'valibot'; +import { antennaSchema } from './antenna'; +import { filteredArray } from './utils'; + /** * @category Schemas * @see {@link https://docs.joinmastodon.org/entities/List/} @@ -9,6 +12,9 @@ const listSchema = v.object({ title: v.string(), replies_policy: v.fallback(v.optional(v.string()), undefined), exclusive: v.fallback(v.optional(v.boolean()), undefined), + antennas: filteredArray(antennaSchema), + notify: v.fallback(v.optional(v.boolean()), undefined), + favourite: v.fallback(v.optional(v.boolean()), undefined), }); /** diff --git a/packages/pl-api/lib/features.ts b/packages/pl-api/lib/features.ts index cac2e3431..52c3fe2d8 100644 --- a/packages/pl-api/lib/features.ts +++ b/packages/pl-api/lib/features.ts @@ -781,6 +781,13 @@ const getFeatures = (instance: Instance) => { v.software === PLEROMA, ]), + /** + * Can add a list to favourites. + * @see POST /api/v1/lists/:list_id/favourite + * @see POST /api/v1/lists/:list_id/unfavourite + */ + listsFavourites: instance.api_versions['favourite_list.fedibird.pl-api'] >= 1, + /** * Ability to post statuses that don't federate. * @see POST /api/v1/statuses