pl-api: support GoToSocial custom emoji management

Signed-off-by: mkljczk <git@mkljczk.pl>
This commit is contained in:
mkljczk
2025-02-25 01:44:15 +01:00
parent e858c5921a
commit 5be4f9525c
5 changed files with 132 additions and 0 deletions

View File

@ -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 = {

View File

@ -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<typeof adminCustomEmojiSchema>;
export { adminCustomEmojiSchema, type AdminCustomEmoji };

View File

@ -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';

View File

@ -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

View File

@ -299,6 +299,28 @@ interface AdminCreateRuleParams {
*/
type AdminUpdateRuleParams = Partial<AdminCreateRuleParams>;
/**
* @category Request params
*/
interface AdminGetCustomEmojisParams extends Pick<PaginationParams, 'limit'> {
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,
};