pl-api: Start working on supporting Pixelfed groups

Signed-off-by: mkljczk <git@mkljczk.pl>
This commit is contained in:
mkljczk
2024-12-27 20:39:09 +01:00
parent 4c173673db
commit 19ea2e6e16
3 changed files with 49 additions and 11 deletions

View File

@ -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);
},

View File

@ -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 === '<p></p>' ? '' : 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

View File

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