diff --git a/packages/pl-api/lib/client.ts b/packages/pl-api/lib/client.ts index 8e374bd8d..44b85ef51 100644 --- a/packages/pl-api/lib/client.ts +++ b/packages/pl-api/lib/client.ts @@ -5005,25 +5005,50 @@ class PlApiClient { groups: { /** returns an array of `Group` entities the current user is a member of */ getGroups: async () => { - const response = await this.request('/api/v1/groups'); + let response; + if (this.features.version.software === PIXELFED) { + response = await this.request('/api/v0/groups/self/list'); + } else { + response = await this.request('/api/v1/groups'); + } return v.parse(filteredArray(groupSchema), response.json); }, /** create a group with the given attributes (`display_name`, `note`, `avatar` and `header`). Sets the user who made the request as group administrator */ createGroup: async (params: CreateGroupParams) => { - const response = await this.request('/api/v1/groups', { - method: 'POST', - body: params, - contentType: params.avatar || params.header ? '' : undefined, - }); + let response; + + if (this.features.version.software === PIXELFED) { + response = await this.request('/api/v0/groups/create', { + method: 'POST', + body: { ...params, name: params.display_name, description: params.note, membership: 'public' }, + contentType: params.avatar || params.header ? '' : undefined, + }); + + if (response.json?.id) { + return this.experimental.groups.getGroup(response.json.id); + } + } else { + response = await this.request('/api/v1/groups', { + method: 'POST', + body: params, + contentType: params.avatar || params.header ? '' : undefined, + }); + } return v.parse(groupSchema, response.json); }, /** returns the `Group` entity describing a given group */ getGroup: async (groupId: string) => { - const response = await this.request(`/api/v1/groups/${groupId}`); + let response; + + if (this.features.version.software === PIXELFED) { + response = await this.request(`/api/v0/groups/${groupId}`); + } else { + response = await this.request(`/api/v1/groups/${groupId}`); + } return v.parse(groupSchema, response.json); }, diff --git a/packages/pl-api/lib/entities/group.ts b/packages/pl-api/lib/entities/group.ts index 60e2f00ea..d8bd90df9 100644 --- a/packages/pl-api/lib/entities/group.ts +++ b/packages/pl-api/lib/entities/group.ts @@ -7,7 +7,17 @@ import { datetimeSchema, filteredArray } from './utils'; /** * @category Schemas */ -const groupSchema = v.object({ +const groupSchema = v.pipe(v.any(), v.transform((group: any) => { + if (group.config) { + return { + display_name: group.name, + members_count: group.member_count, + note: group.short_description, + ...group, + }; + } + return group; +}), v.object({ avatar: v.fallback(v.string(), ''), avatar_static: v.fallback(v.string(), ''), created_at: v.fallback(datetimeSchema, new Date().toISOString()), @@ -22,14 +32,14 @@ const groupSchema = v.object({ members_count: v.fallback(v.number(), 0), owner: v.fallback(v.nullable(v.object({ id: v.string() })), null), note: v.fallback(v.pipe(v.string(), v.transform(note => note === '

' ? '' : note)), ''), - relationship: v.fallback(v.nullable(groupRelationshipSchema), null), // Dummy field to be overwritten later + relationship: v.fallback(v.nullable(groupRelationshipSchema), null), statuses_visibility: v.fallback(v.string(), 'public'), uri: v.fallback(v.string(), ''), url: v.fallback(v.string(), ''), avatar_description: v.fallback(v.string(), ''), header_description: v.fallback(v.string(), ''), -}); +})); /** * @category Entity types diff --git a/packages/pl-api/lib/features.ts b/packages/pl-api/lib/features.ts index 8f40e77f6..38d8d75d7 100644 --- a/packages/pl-api/lib/features.ts +++ b/packages/pl-api/lib/features.ts @@ -705,7 +705,10 @@ const getFeatures = (instance: Instance) => { * @see POST /api/v1/admin/groups/:group_id/unsuspend * @see DELETE /api/v1/admin/groups/:group_id */ - groups: instance.api_versions['groups.pleroma.pl-api'] >= 1, + groups: any([ + v.software === PIXELFED, + instance.api_versions['groups.pleroma.pl-api'] >= 1, + ]), groupsSlugs: instance.api_versions['groups.pleroma.pl-api'] >= 1,