diff --git a/packages/pl-api/lib/client.ts b/packages/pl-api/lib/client.ts index 47fe2f0a0..808f2c05a 100644 --- a/packages/pl-api/lib/client.ts +++ b/packages/pl-api/lib/client.ts @@ -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 {}; }, diff --git a/packages/pl-api/lib/entities/admin/rule.ts b/packages/pl-api/lib/entities/admin/rule.ts index 9173d4a1b..3b05a480d 100644 --- a/packages/pl-api/lib/entities/admin/rule.ts +++ b/packages/pl-api/lib/entities/admin/rule.ts @@ -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), }); /** diff --git a/packages/pl-api/lib/features.ts b/packages/pl-api/lib/features.ts index 40866307d..084e3b4a2 100644 --- a/packages/pl-api/lib/features.ts +++ b/packages/pl-api/lib/features.ts @@ -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, /** diff --git a/packages/pl-fe/src/features/admin/tabs/dashboard.tsx b/packages/pl-fe/src/features/admin/tabs/dashboard.tsx index b846e7b8d..c05fbdd87 100644 --- a/packages/pl-fe/src/features/admin/tabs/dashboard.tsx +++ b/packages/pl-fe/src/features/admin/tabs/dashboard.tsx @@ -81,7 +81,7 @@ const Dashboard: React.FC = () => { /> )} - {features.pleromaAdminRules && ( + {features.adminRules && ( } diff --git a/packages/pl-fe/src/features/ui/components/modals/edit-rule-modal.tsx b/packages/pl-fe/src/features/ui/components/modals/edit-rule-modal.tsx index 0ca92abd2..0621e9d32 100644 --- a/packages/pl-fe/src/features/ui/components/modals/edit-rule-modal.tsx +++ b/packages/pl-fe/src/features/ui/components/modals/edit-rule-modal.tsx @@ -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 = ({ onClose, rule }) => { const intl = useIntl(); + const features = useFeatures(); const { createRule, updateRule } = useRules(); @@ -79,15 +81,17 @@ const EditRuleModal: React.FC = ({ onClose, {...text} /> - } - > - - + {features.adminRulesPriority && ( + } + > + + + )} ); diff --git a/packages/pl-fe/src/features/ui/index.tsx b/packages/pl-fe/src/features/ui/index.tsx index 1f81acebc..d550867e4 100644 --- a/packages/pl-fe/src/features/ui/index.tsx +++ b/packages/pl-fe/src/features/ui/index.tsx @@ -316,7 +316,7 @@ const SwitchingColumnsArea: React.FC = React.memo(({ chil {features.pleromaAdminAnnouncements && } {features.domains && } - {features.pleromaAdminRules && } + {features.adminRules && }