pl-api: Support instance rules management on GoToSocial

Signed-off-by: mkljczk <git@mkljczk.pl>
This commit is contained in:
mkljczk
2025-02-24 23:50:57 +01:00
parent 3a885bfdc9
commit 62f7af2428
6 changed files with 59 additions and 31 deletions

View File

@ -4308,11 +4308,11 @@ class PlApiClient {
/**
* List rules
*
* Requires features{@link Features['pleromaAdminRules']}.
* Requires features{@link Features['adminRules']}.
* @see {@link https://docs.pleroma.social/backend/development/API/admin_api/#get-apiv1pleromaadminrules}
*/
getRules: async () => {
const response = await this.request('/api/v1/pleroma/admin/rules');
const response = await this.request(this.features.version.software === GOTOSOCIAL ? '/api/v1/admin/instance/rules' : '/api/v1/pleroma/admin/rules');
return v.parse(filteredArray(adminRuleSchema), response.json);
},
@ -4320,11 +4320,14 @@ class PlApiClient {
/**
* Create a rule
*
* Requires features{@link Features['pleromaAdminRules']}.
* Requires features{@link Features['adminRules']}.
* @see {@link https://docs.pleroma.social/backend/development/API/admin_api/#post-apiv1pleromaadminrules}
*/
createRule: async (params: AdminCreateRuleParams) => {
const response = await this.request('/api/v1/pleroma/admin/rules', { method: 'POST', body: params });
const response = await this.request(
this.features.version.software === GOTOSOCIAL ? '/api/v1/admin/instance/rules' : '/api/v1/pleroma/admin/rules',
{ method: 'POST', body: params },
);
return v.parse(adminRuleSchema, response.json);
},
@ -4332,11 +4335,14 @@ class PlApiClient {
/**
* Update a rule
*
* Requires features{@link Features['pleromaAdminRules']}.
* Requires features{@link Features['adminRules']}.
* @see {@link https://docs.pleroma.social/backend/development/API/admin_api/#patch-apiv1pleromaadminrulesid}
*/
updateRule: async (ruleId: string, params: AdminUpdateRuleParams) => {
const response = await this.request(`/api/v1/pleroma/admin/rules/${ruleId}`, { method: 'PATCH', body: params });
const response = await this.request(
`/api/v1/${this.features.version.software === GOTOSOCIAL ? 'admin/instance' : 'pleroma/admin'}/rules/${ruleId}`,
{ method: 'PATCH', body: params },
);
return v.parse(adminRuleSchema, response.json);
},
@ -4344,11 +4350,14 @@ class PlApiClient {
/**
* Delete a rule
*
* Requires features{@link Features['pleromaAdminRules']}.
* Requires features{@link Features['adminRules']}.
* @see {@link https://docs.pleroma.social/backend/development/API/admin_api/#delete-apiv1pleromaadminrulesid}
*/
deleteRule: async (ruleId: string) => {
const response = await this.request(`/api/v1/pleroma/admin/rules/${ruleId}`, { method: 'DELETE' });
const response = await this.request(
`/api/v1/${this.features.version.software === GOTOSOCIAL ? 'admin/instance' : 'pleroma/admin'}/rules/${ruleId}`,
{ method: 'DELETE' },
);
return response.json as {};
},

View File

@ -1,5 +1,7 @@
import * as v from 'valibot';
import { datetimeSchema } from '../utils';
/**
* @category Admin schemas
* @see {@link https://docs.pleroma.social/backend/development/API/admin_api/#get-apiv1pleromaadminrules}
@ -9,6 +11,9 @@ const adminRuleSchema = v.object({
text: v.fallback(v.string(), ''),
hint: v.fallback(v.string(), ''),
priority: v.fallback(v.nullable(v.number()), null),
created_at: v.fallback(v.optional(datetimeSchema), undefined),
updated_at: v.fallback(v.optional(datetimeSchema), undefined),
});
/**

View File

@ -681,6 +681,28 @@ const getFeatures = (instance: Instance) => {
v.software === PLEROMA,
]),
/**
* Ability to manage instance rules by admins.
* @see GET /api/v1/pleroma/admin/rules
* @see POST /api/v1/pleroma/admin/rules
* @see PATCH /api/v1/pleroma/admin/rules/:id
* @see DELETE /api/v1/pleroma/admin/rules/:id
* @see GET /api/v1/admin/instance/rules
* @see GET /api/v1/admin/instance/rules/:id
* @see POST /api/v1/admin/instance/rules
* @see PATCH /api/v1/admin/instance/rules/:id
* @see DELETE /api/v1/admin/instance/rules/:id
*/
adminRules: any([
v.software === GOTOSOCIAL,
v.software === PLEROMA && v.build === REBASED && gte(v.version, '2.5.0'),
v.software === PLEROMA && gte(v.version, '2.7.0'),
]),
adminRulesPriority: any([
v.software === PLEROMA && gte(v.version, '2.7.0'),
])
/**
* @see GET /api/v2/notifications/:group_key
* @see GET /api/v2/notifications/:group_key
@ -1011,18 +1033,6 @@ const getFeatures = (instance: Instance) => {
pleromaAdminRelays: v.software === PLEROMA,
/**
* Ability to manage instance rules by admins.
* @see GET /api/v1/pleroma/admin/rules
* @see POST /api/v1/pleroma/admin/rules
* @see PATCH /api/v1/pleroma/admin/rules/:id
* @see DELETE /api/v1/pleroma/admin/rules/:id
*/
pleromaAdminRules: any([
v.software === PLEROMA && v.build === REBASED && gte(v.version, '2.5.0'),
v.software === PLEROMA && gte(v.version, '2.7.0'),
]),
pleromaAdminStatuses: v.software === PLEROMA,
/**

View File

@ -81,7 +81,7 @@ const Dashboard: React.FC = () => {
/>
)}
{features.pleromaAdminRules && (
{features.adminRules && (
<ListItem
to='/pl-fe/admin/rules'
label={<FormattedMessage id='column.admin.rules' defaultMessage='Instance rules' />}

View File

@ -6,6 +6,7 @@ import FormGroup from 'pl-fe/components/ui/form-group';
import Input from 'pl-fe/components/ui/input';
import Modal from 'pl-fe/components/ui/modal';
import { useTextField } from 'pl-fe/hooks/forms/use-text-field';
import { useFeatures } from 'pl-fe/hooks/use-features';
import { useRules } from 'pl-fe/queries/admin/use-rules';
import toast from 'pl-fe/toast';
@ -26,6 +27,7 @@ interface EditRuleModalProps {
const EditRuleModal: React.FC<BaseModalProps & EditRuleModalProps> = ({ onClose, rule }) => {
const intl = useIntl();
const features = useFeatures();
const { createRule, updateRule } = useRules();
@ -79,15 +81,17 @@ const EditRuleModal: React.FC<BaseModalProps & EditRuleModalProps> = ({ onClose,
{...text}
/>
</FormGroup>
<FormGroup
labelText={<FormattedMessage id='admin.edit_rule.fields.priority_label' defaultMessage='Rule priority' />}
>
<Input
placeholder={intl.formatMessage(messages.rulePriorityPlaceholder)}
type='number'
{...priority}
/>
</FormGroup>
{features.adminRulesPriority && (
<FormGroup
labelText={<FormattedMessage id='admin.edit_rule.fields.priority_label' defaultMessage='Rule priority' />}
>
<Input
placeholder={intl.formatMessage(messages.rulePriorityPlaceholder)}
type='number'
{...priority}
/>
</FormGroup>
)}
</Form>
</Modal>
);

View File

@ -316,7 +316,7 @@ const SwitchingColumnsArea: React.FC<ISwitchingColumnsArea> = React.memo(({ chil
<WrappedRoute path='/pl-fe/admin/relays' staffOnly layout={AdminLayout} component={Relays} content={children} exact />
{features.pleromaAdminAnnouncements && <WrappedRoute path='/pl-fe/admin/announcements' staffOnly layout={AdminLayout} component={Announcements} content={children} exact />}
{features.domains && <WrappedRoute path='/pl-fe/admin/domains' staffOnly layout={AdminLayout} component={Domains} content={children} exact />}
{features.pleromaAdminRules && <WrappedRoute path='/pl-fe/admin/rules' staffOnly layout={AdminLayout} component={Rules} content={children} exact />}
{features.adminRules && <WrappedRoute path='/pl-fe/admin/rules' staffOnly layout={AdminLayout} component={Rules} content={children} exact />}
<WrappedRoute path='/info' layout={EmptyLayout} component={ServerInfo} content={children} />
<WrappedRoute path='/developers/apps/create' developerOnly layout={DefaultLayout} component={CreateApp} content={children} />