From 5be4f9525cf369ef8591b8e99bd486b558bc19c4 Mon Sep 17 00:00:00 2001 From: mkljczk Date: Tue, 25 Feb 2025 01:44:15 +0100 Subject: [PATCH] pl-api: support GoToSocial custom emoji management Signed-off-by: mkljczk --- packages/pl-api/lib/client.ts | 66 +++++++++++++++++++ .../pl-api/lib/entities/admin/custom-emoji.ts | 31 +++++++++ packages/pl-api/lib/entities/index.ts | 1 + packages/pl-api/lib/features.ts | 9 +++ packages/pl-api/lib/params/admin.ts | 25 +++++++ 5 files changed, 132 insertions(+) create mode 100644 packages/pl-api/lib/entities/admin/custom-emoji.ts diff --git a/packages/pl-api/lib/client.ts b/packages/pl-api/lib/client.ts index d5dc19109..a0d38f202 100644 --- a/packages/pl-api/lib/client.ts +++ b/packages/pl-api/lib/client.ts @@ -9,6 +9,7 @@ import { adminAnnouncementSchema, adminCanonicalEmailBlockSchema, adminCohortSchema, + adminCustomEmojiSchema, adminDimensionSchema, adminDomainAllowSchema, adminDomainBlockSchema, @@ -114,6 +115,7 @@ import type { import type { AdminAccountAction, AdminCreateAnnouncementParams, + AdminCreateCustomEmojiParams, AdminCreateDomainBlockParams, AdminCreateDomainParams, AdminCreateIpBlockParams, @@ -122,6 +124,7 @@ import type { AdminGetAccountsParams, AdminGetAnnouncementsParams, AdminGetCanonicalEmailBlocks, + AdminGetCustomEmojisParams, AdminGetDimensionsParams, AdminGetDomainAllowsParams, AdminGetDomainBlocksParams, @@ -135,6 +138,7 @@ import type { AdminMeasureKey, AdminPerformAccountActionParams, AdminUpdateAnnouncementParams, + AdminUpdateCustomEmojiParams, AdminUpdateDomainBlockParams, AdminUpdateReportParams, AdminUpdateRuleParams, @@ -4379,6 +4383,68 @@ class PlApiClient { return v.parse(pleromaConfigSchema, response.json); }, }, + + customEmojis: { + /** + * View local and remote emojis available to/known by this instance. + * + * Requires features{@link Features['adminCustomEmojis']}. + * @see {@link https://docs.gotosocial.org/en/latest/api/swagger/} + */ + getCustomEmojis: (params: AdminGetCustomEmojisParams) => + this.#paginatedGet('/api/v1/admin/custom_emojis', { params }, adminCustomEmojiSchema), + + /** + * Get the admin view of a single emoji. + * + * Requires features{@link Features['adminCustomEmojis']}. + * @see {@link https://docs.gotosocial.org/en/latest/api/swagger/} + */ + getCustomEmoji: async (emojiId: string) => { + const response = await this.request(`/api/v1/admin/custom_emojis/${emojiId}`); + + return v.parse(adminCustomEmojiSchema, response.json); + }, + + /** + * Get the admin view of a single emoji. + * + * Requires features{@link Features['adminCustomEmojis']}. + * @see {@link https://docs.gotosocial.org/en/latest/api/swagger/} + */ + createCustomEmoji: async (params: AdminCreateCustomEmojiParams) => { + const response = await this.request( + '/api/v1/admin/custom_emojis', + { method: 'POST', body: params, contentType: '' }, + ); + + return v.parse(adminCustomEmojiSchema, response.json); + }, + + updateCustomEmoji: async (emojiId: string, params: AdminUpdateCustomEmojiParams) => { + const response = await this.request( + `/api/v1/admin/custom_emojis/${emojiId}`, + { method: 'PATCH', body: params, contentType: '' }, + ); + + return v.parse(adminCustomEmojiSchema, response.json); + }, + + /** + * Delete a **local** emoji with the given ID from the instance. + * + * Requires features{@link Features['adminCustomEmojis']}. + * @see {@link https://docs.gotosocial.org/en/latest/api/swagger/} + */ + deleteCustomEmoji: async (emojiId: string) => { + const response = await this.request( + `/api/v1/admin/custom_emojis/${emojiId}`, + { method: 'DELETE' }, + ); + + return v.parse(adminCustomEmojiSchema, response.json); + }, + }, }; public readonly oembed = { diff --git a/packages/pl-api/lib/entities/admin/custom-emoji.ts b/packages/pl-api/lib/entities/admin/custom-emoji.ts new file mode 100644 index 000000000..90021dfad --- /dev/null +++ b/packages/pl-api/lib/entities/admin/custom-emoji.ts @@ -0,0 +1,31 @@ +import * as v from 'valibot'; + +import { datetimeSchema } from '../utils'; + +/** + * Admin view of a custom emoji. + * + * @category Admin schemas + * @see {@link https://docs.gotosocial.org/en/latest/api/swagger/} + */ +const adminCustomEmojiSchema = v.object({ + category: v.fallback(v.nullable(v.string()), null), + content_type: v.fallback(v.nullable(v.string()), null), + disabled: v.fallback(v.boolean(), false), + domain: v.fallback(v.nullable(v.string()), null), + id: v.string(), + shortcode: v.string(), + static_url: v.fallback(v.string(), ''), + total_file_size: v.fallback(v.nullable(v.number()), null), + updated_at: v.fallback(v.optional(datetimeSchema), undefined), + uri: v.fallback(v.string(), ''), + url: v.string(), + visible_in_picker: v.fallback(v.boolean(), true), +}); + +/** + * @category Entity types + */ +type AdminCustomEmoji = v.InferOutput; + +export { adminCustomEmojiSchema, type AdminCustomEmoji }; diff --git a/packages/pl-api/lib/entities/index.ts b/packages/pl-api/lib/entities/index.ts index a47ce4d45..22d27c550 100644 --- a/packages/pl-api/lib/entities/index.ts +++ b/packages/pl-api/lib/entities/index.ts @@ -4,6 +4,7 @@ export * from './admin/account'; export * from './admin/announcement'; export * from './admin/canonical-email-block'; export * from './admin/cohort'; +export * from './admin/custom-emoji'; export * from './admin/dimension'; export * from './admin/domain'; export * from './admin/domain-allow'; diff --git a/packages/pl-api/lib/features.ts b/packages/pl-api/lib/features.ts index 052b3e4e9..7dbc7290b 100644 --- a/packages/pl-api/lib/features.ts +++ b/packages/pl-api/lib/features.ts @@ -670,6 +670,15 @@ const getFeatures = (instance: Instance) => { v.software === PLEROMA, ]), + /** + * @see GET /api/v1/admin/custom_emojis + * @see GET /api/v1/admin/custom_emojis/:id + * @see POST /api/v1/admin/custom_emojis + * @see PATCH /api/v1/admin/custom_emojis/:id + * @see DELETE /api/v1/admin/custom_emojis/:id + */ + adminCustomEmojis: v.software === GOTOSOCIAL, + /** * Ability to manage instance rules by admins. * @see GET /api/v1/pleroma/admin/rules diff --git a/packages/pl-api/lib/params/admin.ts b/packages/pl-api/lib/params/admin.ts index 21fa51e5b..55df70b5a 100644 --- a/packages/pl-api/lib/params/admin.ts +++ b/packages/pl-api/lib/params/admin.ts @@ -299,6 +299,28 @@ interface AdminCreateRuleParams { */ type AdminUpdateRuleParams = Partial; +/** + * @category Request params + */ +interface AdminGetCustomEmojisParams extends Pick { + filter?: string; + max_shortcode_domain?: string; + min_shortcode_domain?: string; +} + +interface AdminCreateCustomEmojiParams { + shortcode: string; + image: File; + category?: string; +} + +interface AdminUpdateCustomEmojiParams { + type: 'disable' | 'copy' | 'modify'; + shortcode?: string; + image?: File; + category?: string; +} + /** * @category Request params */ @@ -333,5 +355,8 @@ export type { AdminGetModerationLogParams, AdminCreateRuleParams, AdminUpdateRuleParams, + AdminGetCustomEmojisParams, + AdminCreateCustomEmojiParams, + AdminUpdateCustomEmojiParams, AdminGetGroupsParams, };