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 && }