pl-fe: steal code from mastodon, pl-api: masto admin api fixes

Signed-off-by: Nicole Mikołajczyk <git@mkljczk.pl>
This commit is contained in:
Nicole Mikołajczyk
2025-04-26 19:32:04 +02:00
parent 1f857a3e14
commit 0d59691dba
7 changed files with 224 additions and 23 deletions

View File

@@ -4237,7 +4237,7 @@ class PlApiClient {
* @see {@link https://docs.joinmastodon.org/methods/admin/dimensions/#get}
*/
getDimensions: async (keys: AdminDimensionKey[], params?: AdminGetDimensionsParams) => {
const response = await this.request('/api/v1/admin/dimensions', { params: { ...params, keys } });
const response = await this.request('/api/v1/admin/dimensions', { method: 'POST', params: { ...params, keys } });
return v.parse(filteredArray(adminDimensionSchema), response.json);
},
@@ -4394,7 +4394,7 @@ class PlApiClient {
* @see {@link https://docs.joinmastodon.org/methods/admin/measures/#get}
*/
getMeasures: async (keys: AdminMeasureKey[], start_at: string, end_at: string, params?: AdminGetMeasuresParams) => {
const response = await this.request('/api/v1/admin/measures', { params: { ...params, keys, start_at, end_at } });
const response = await this.request('/api/v1/admin/measures', { method: 'POST', params: { ...params, keys, start_at, end_at } });
return v.parse(filteredArray(adminMeasureSchema), response.json);
},
@@ -4409,7 +4409,7 @@ class PlApiClient {
* @see {@link https://docs.joinmastodon.org/methods/admin/retention/#create}
*/
getRetention: async (start_at: string, end_at: string, frequency: 'day' | 'month') => {
const response = await this.request('/api/v1/admin/retention', { params: { start_at, end_at, frequency } });
const response = await this.request('/api/v1/admin/retention', { method: 'POST', params: { start_at, end_at, frequency } });
return v.parse(adminCohortSchema, response.json);
},

View File

@@ -1,6 +1,6 @@
import * as v from 'valibot';
import { datetimeSchema } from '../utils';
import { dateSchema } from '../utils';
/**
* @category Admin schemas
@@ -11,10 +11,10 @@ const adminMeasureSchema = v.object({
unit: v.fallback(v.nullable(v.string()), null),
total: v.pipe(v.unknown(), v.transform(Number)),
human_value: v.fallback(v.optional(v.string()), undefined),
previous_total: v.fallback(v.optional(v.pipe(v.unknown(), v.transform(String))), undefined),
previous_total: v.fallback(v.optional(v.pipe(v.unknown(), v.transform(Number))), undefined),
data: v.array(v.object({
date: datetimeSchema,
value: v.pipe(v.unknown(), v.transform(String)),
date: dateSchema,
value: v.pipe(v.unknown(), v.transform(Number)),
})),
});

View File

@@ -9,6 +9,8 @@ const datetimeSchema = v.pipe(
v.regex(/^\d{4}-\d{2}-\d{2}T([01]\d|2[0-3]):[0-5]\d:[0-5]\d(\.\d+)?(([+-]\d{2}:?\d{2})|(Z)?)$/),
);
const dateSchema = v.pipe(v.string(), v.transform((value) => value.slice(0, 10)), v.regex(/^\d{4}-\d{2}-\d{2}$/));
/** Validates individual items in an array, dropping any that aren't valid. */
const filteredArray = <T>(schema: v.BaseSchema<any, T, v.BaseIssue<unknown>>) =>
v.pipe(
@@ -35,4 +37,4 @@ const coerceObject = <T extends v.ObjectEntries>(shape: T) =>
v.object(shape),
);
export { filteredArray, emojiSchema, datetimeSchema, mimeSchema, coerceObject };
export { filteredArray, emojiSchema, datetimeSchema, dateSchema, mimeSchema, coerceObject };

View File

@@ -1070,6 +1070,14 @@ const getFeatures = (instance: Instance) => {
v.software === PLEROMA && v.build === PL,
]),
/**
* @see POST /api/v1/admin/dimensions
* @see POST /api/v1/admin/measures
* @see POST /api/v1/admin/retention
*/
mastodonAdminMetrics: v.software === MASTODON && gte(v.version, '3.5.0'),
/**
* Can perform moderation actions with account and reports.
* @see {@link https://docs.joinmastodon.org/methods/admin/}