From db19522a54add0c5c23fcc11228f300f650d5295 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?marcin=20miko=C5=82ajczak?= Date: Fri, 30 Aug 2024 19:28:12 +0200 Subject: [PATCH] pl-api: add server directory client MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: marcin mikołajczak --- packages/pl-api/lib/directory-client.ts | 52 +++++++++++++++++++ .../pl-api/lib/entities/directory/category.ts | 10 ++++ .../pl-api/lib/entities/directory/language.ts | 11 ++++ .../pl-api/lib/entities/directory/server.ts | 21 ++++++++ .../entities/directory/statistics-period.ts | 12 +++++ packages/pl-api/lib/entities/index.ts | 4 ++ packages/pl-api/lib/main.ts | 1 + packages/pl-api/lib/request.ts | 2 +- 8 files changed, 112 insertions(+), 1 deletion(-) create mode 100644 packages/pl-api/lib/directory-client.ts create mode 100644 packages/pl-api/lib/entities/directory/category.ts create mode 100644 packages/pl-api/lib/entities/directory/language.ts create mode 100644 packages/pl-api/lib/entities/directory/server.ts create mode 100644 packages/pl-api/lib/entities/directory/statistics-period.ts diff --git a/packages/pl-api/lib/directory-client.ts b/packages/pl-api/lib/directory-client.ts new file mode 100644 index 000000000..69ad428e1 --- /dev/null +++ b/packages/pl-api/lib/directory-client.ts @@ -0,0 +1,52 @@ +import { directoryCategorySchema, directoryLanguageSchema, directoryServerSchema, directoryStatisticsPeriodSchema } from './entities'; +import { filteredArray } from './entities/utils'; +import request from './request'; + +interface Params { + language?: string; + category?: string; + region?: 'europe' | 'north_america' | 'south_america' | 'africa' | 'asia' | 'oceania'; + ownership?: 'juridicial' | 'natural'; + registrations?: 'instant' | 'manual'; +} + +class PlApiDirectoryClient { + + accessToken = undefined; + baseURL: string; + public request = request.bind(this) as typeof request; + + constructor(baseURL: string) { + this.baseURL = baseURL; + } + + async getStatistics() { + const response = await this.request('/statistics'); + + return filteredArray(directoryStatisticsPeriodSchema).parse(response.json); + } + + async getCategories(params?: Params) { + const response = await this.request('/categories', { params }); + + return filteredArray(directoryCategorySchema).parse(response.json); + } + + async getLanguages(params?: Params) { + const response = await this.request('/categories', { params }); + + return filteredArray(directoryLanguageSchema).parse(response.json); + } + + async getServers(params?: Params) { + const response = await this.request('/servers', { params }); + + return filteredArray(directoryServerSchema).parse(response.json); + } + +} + +export { + PlApiDirectoryClient, + PlApiDirectoryClient as default, +}; diff --git a/packages/pl-api/lib/entities/directory/category.ts b/packages/pl-api/lib/entities/directory/category.ts new file mode 100644 index 000000000..d40bf48df --- /dev/null +++ b/packages/pl-api/lib/entities/directory/category.ts @@ -0,0 +1,10 @@ +import { z } from 'zod'; + +const directoryCategorySchema = z.object({ + category: z.string(), + servers_count: z.coerce.number().nullable().catch(null), +}); + +type DirectoryCategory = z.infer; + +export { directoryCategorySchema, type DirectoryCategory }; diff --git a/packages/pl-api/lib/entities/directory/language.ts b/packages/pl-api/lib/entities/directory/language.ts new file mode 100644 index 000000000..4ac2e1071 --- /dev/null +++ b/packages/pl-api/lib/entities/directory/language.ts @@ -0,0 +1,11 @@ +import { z } from 'zod'; + +const directoryLanguageSchema = z.object({ + locale: z.string(), + language: z.string(), + servers_count: z.coerce.number().nullable().catch(null), +}); + +type DirectoryLanguage = z.infer; + +export { directoryLanguageSchema, type DirectoryLanguage }; diff --git a/packages/pl-api/lib/entities/directory/server.ts b/packages/pl-api/lib/entities/directory/server.ts new file mode 100644 index 000000000..7ed72c320 --- /dev/null +++ b/packages/pl-api/lib/entities/directory/server.ts @@ -0,0 +1,21 @@ +import { z } from 'zod'; + +const directoryServerSchema = z.object({ + domain: z.string(), + version: z.string(), + description: z.string(), + languages: z.array(z.string()), + region: z.string(), + categories: z.array(z.string()), + proxied_thumbnail: z.string().url().nullable().catch(null), + blurhash: z.string().nullable().catch(null), + total_users: z.coerce.number(), + last_week_users: z.coerce.number(), + approval_required: z.boolean(), + language: z.string(), + category: z.string(), +}); + +type DirectoryServer = z.infer; + +export { directoryServerSchema, type DirectoryServer }; diff --git a/packages/pl-api/lib/entities/directory/statistics-period.ts b/packages/pl-api/lib/entities/directory/statistics-period.ts new file mode 100644 index 000000000..7df181346 --- /dev/null +++ b/packages/pl-api/lib/entities/directory/statistics-period.ts @@ -0,0 +1,12 @@ +import { z } from 'zod'; + +const directoryStatisticsPeriodSchema = z.object({ + period: z.string().date(), + server_count: z.coerce.number().nullable().catch(null), + user_count: z.coerce.number().nullable().catch(null), + active_user_count: z.coerce.number().nullable().catch(null), +}); + +type DirectoryStatisticsPeriod = z.infer; + +export { directoryStatisticsPeriodSchema, type DirectoryStatisticsPeriod }; diff --git a/packages/pl-api/lib/entities/index.ts b/packages/pl-api/lib/entities/index.ts index e65ec4ce7..6fd08cbf9 100644 --- a/packages/pl-api/lib/entities/index.ts +++ b/packages/pl-api/lib/entities/index.ts @@ -28,6 +28,10 @@ export * from './chat-message'; export * from './context'; export * from './conversation'; export * from './custom-emoji'; +export * from './directory/category'; +export * from './directory/language'; +export * from './directory/server'; +export * from './directory/statistics-period'; export * from './domain-block'; export * from './emoji-reaction'; export * from './extended-description'; diff --git a/packages/pl-api/lib/main.ts b/packages/pl-api/lib/main.ts index b414c5e89..9d4abc3d4 100644 --- a/packages/pl-api/lib/main.ts +++ b/packages/pl-api/lib/main.ts @@ -1,4 +1,5 @@ export { PlApiClient } from './client'; +export { PlApiDirectoryClient } from './directory-client'; export { type Response as PlApiResponse } from './request'; export * from './entities'; export * from './features'; diff --git a/packages/pl-api/lib/request.ts b/packages/pl-api/lib/request.ts index e9dff6858..ad7f209a9 100644 --- a/packages/pl-api/lib/request.ts +++ b/packages/pl-api/lib/request.ts @@ -42,7 +42,7 @@ interface RequestBody> { type RequestMeta = Pick; -function request(this: PlApiClient, input: URL | RequestInfo, { +function request(this: Pick, input: URL | RequestInfo, { body, method = body ? 'POST' : 'GET', params,