From 1ecd68e4a0a73cc61a4b073ce6b436f34ec33d10 Mon Sep 17 00:00:00 2001 From: sriramveeraghanta Date: Fri, 1 Aug 2025 12:45:40 +0530 Subject: [PATCH] feat: implementing zod schema in services pacakges --- .../plane/license/api/serializers/instance.py | 13 +++-- .../src/ai/{ai.service.ts => core.ts} | 0 packages/services/src/ai/extended.ts | 1 + packages/services/src/ai/index.ts | 3 +- packages/services/src/auth/admin.ts | 1 + packages/services/src/auth/index.ts | 5 +- .../auth/{sites-auth.service.ts => sites.ts} | 12 ++-- packages/services/src/auth/types.ts | 14 +++++ .../src/auth/{auth.service.ts => web.ts} | 0 .../instance/{instance.service.ts => core.ts} | 18 ------ packages/services/src/instance/index.ts | 2 +- packages/services/src/instance/types.ts | 57 +++++++++++++++++++ packages/services/src/live.service.ts | 8 --- 13 files changed, 91 insertions(+), 43 deletions(-) rename packages/services/src/ai/{ai.service.ts => core.ts} (100%) create mode 100644 packages/services/src/ai/extended.ts create mode 100644 packages/services/src/auth/admin.ts rename packages/services/src/auth/{sites-auth.service.ts => sites.ts} (84%) create mode 100644 packages/services/src/auth/types.ts rename packages/services/src/auth/{auth.service.ts => web.ts} (100%) rename packages/services/src/instance/{instance.service.ts => core.ts} (88%) create mode 100644 packages/services/src/instance/types.ts delete mode 100644 packages/services/src/live.service.ts diff --git a/apps/api/plane/license/api/serializers/instance.py b/apps/api/plane/license/api/serializers/instance.py index 49c5194c86..69985198bb 100644 --- a/apps/api/plane/license/api/serializers/instance.py +++ b/apps/api/plane/license/api/serializers/instance.py @@ -1,15 +1,18 @@ # Module imports from plane.license.models import Instance from plane.app.serializers import BaseSerializer -from plane.app.serializers import UserAdminLiteSerializer class InstanceSerializer(BaseSerializer): - primary_owner_details = UserAdminLiteSerializer( - source="primary_owner", read_only=True - ) - class Meta: model = Instance fields = "__all__" read_only_fields = ["id", "email", "last_checked_at", "is_setup_done"] + exclude = [ + "created_by", + "deleted_at", + "created_at", + "last_checked_at", + "updated_at", + "updated_by", + ] diff --git a/packages/services/src/ai/ai.service.ts b/packages/services/src/ai/core.ts similarity index 100% rename from packages/services/src/ai/ai.service.ts rename to packages/services/src/ai/core.ts diff --git a/packages/services/src/ai/extended.ts b/packages/services/src/ai/extended.ts new file mode 100644 index 0000000000..cb0ff5c3b5 --- /dev/null +++ b/packages/services/src/ai/extended.ts @@ -0,0 +1 @@ +export {}; diff --git a/packages/services/src/ai/index.ts b/packages/services/src/ai/index.ts index bce346aa66..c6c1c2a060 100644 --- a/packages/services/src/ai/index.ts +++ b/packages/services/src/ai/index.ts @@ -1 +1,2 @@ -export * from "./ai.service"; +export * from "./core"; +export * from "./extended"; diff --git a/packages/services/src/auth/admin.ts b/packages/services/src/auth/admin.ts new file mode 100644 index 0000000000..cb0ff5c3b5 --- /dev/null +++ b/packages/services/src/auth/admin.ts @@ -0,0 +1 @@ +export {}; diff --git a/packages/services/src/auth/index.ts b/packages/services/src/auth/index.ts index 340b36856d..8278fc1a5a 100644 --- a/packages/services/src/auth/index.ts +++ b/packages/services/src/auth/index.ts @@ -1,2 +1,3 @@ -export * from "./auth.service"; -export * from "./sites-auth.service"; +export * from "./admin"; +export * from "./sites"; +export * from "./web"; diff --git a/packages/services/src/auth/sites-auth.service.ts b/packages/services/src/auth/sites.ts similarity index 84% rename from packages/services/src/auth/sites-auth.service.ts rename to packages/services/src/auth/sites.ts index 638a7b6f26..d713302731 100644 --- a/packages/services/src/auth/sites-auth.service.ts +++ b/packages/services/src/auth/sites.ts @@ -1,8 +1,8 @@ import { API_BASE_URL } from "@plane/constants"; -// types -import { IEmailCheckData, IEmailCheckResponse } from "@plane/types"; // services import { APIService } from "../api.service"; +// types +import { EmailCheckResponseSchema, TEmailCheckResponse, TEmailCheckData } from "./types"; /** * Service class for handling authentication-related operations for Plane space application @@ -11,10 +11,6 @@ import { APIService } from "../api.service"; * @remarks This service is only available for plane sites */ export class SitesAuthService extends APIService { - /** - * Creates an instance of SitesAuthService - * Initializes with the base API URL - */ constructor(BASE_URL?: string) { super(BASE_URL || API_BASE_URL); } @@ -25,9 +21,9 @@ export class SitesAuthService extends APIService { * @returns {Promise} Response indicating email status * @throws {Error} Throws response data if the request fails */ - async emailCheck(data: IEmailCheckData): Promise { + async emailCheck(data: TEmailCheckData): Promise { return this.post("/auth/spaces/email-check/", data, { headers: {} }) - .then((response) => response?.data) + .then((response) => EmailCheckResponseSchema.parse(response?.data)) .catch((error) => { throw error?.response?.data; }); diff --git a/packages/services/src/auth/types.ts b/packages/services/src/auth/types.ts new file mode 100644 index 0000000000..f1aa298986 --- /dev/null +++ b/packages/services/src/auth/types.ts @@ -0,0 +1,14 @@ +import * as z from "zod"; + +export const EmailCheckResponseSchema = z.object({ + email: z.string().email(), + status: z.enum(["MAGIC_CODE", "CREDENTIAL"]), + existing: z.boolean(), + is_password_autoset: z.boolean(), +}); + +export type TEmailCheckResponse = z.infer; + +export type TEmailCheckData = { + email: string; +}; diff --git a/packages/services/src/auth/auth.service.ts b/packages/services/src/auth/web.ts similarity index 100% rename from packages/services/src/auth/auth.service.ts rename to packages/services/src/auth/web.ts diff --git a/packages/services/src/instance/instance.service.ts b/packages/services/src/instance/core.ts similarity index 88% rename from packages/services/src/instance/instance.service.ts rename to packages/services/src/instance/core.ts index 6af821d9b6..4d002a587d 100644 --- a/packages/services/src/instance/instance.service.ts +++ b/packages/services/src/instance/core.ts @@ -6,7 +6,6 @@ import type { IInstanceAdmin, IInstanceConfiguration, IInstanceInfo, - TPage, } from "@plane/types"; // api service import { APIService } from "../api.service"; @@ -17,10 +16,6 @@ import { APIService } from "../api.service"; * @extends {APIService} */ export class InstanceService extends APIService { - /** - * Creates an instance of InstanceService - * Initializes the service with the base API URL - */ constructor() { super(API_BASE_URL); } @@ -39,19 +34,6 @@ export class InstanceService extends APIService { }); } - /** - * Fetches the changelog for the current instance - * @returns {Promise} Promise resolving to the changelog page data - * @throws {Error} If the API request fails - */ - async changelog(): Promise { - return this.get("/api/instances/changelog/") - .then((response) => response.data) - .catch((error) => { - throw error?.response?.data; - }); - } - /** * Fetches the list of instance admins * @returns {Promise} Promise resolving to an array of instance admins diff --git a/packages/services/src/instance/index.ts b/packages/services/src/instance/index.ts index dd3d4a663c..8d119dee81 100644 --- a/packages/services/src/instance/index.ts +++ b/packages/services/src/instance/index.ts @@ -1 +1 @@ -export * from "./instance.service"; +export * from "./core"; diff --git a/packages/services/src/instance/types.ts b/packages/services/src/instance/types.ts new file mode 100644 index 0000000000..e13352dcf7 --- /dev/null +++ b/packages/services/src/instance/types.ts @@ -0,0 +1,57 @@ +import * as z from "zod"; + +export const InstanceSchema = z.object({ + id: z.string(), + created_at: z.string(), + updated_at: z.string(), + instance_name: z.string().optional(), + whitelist_emails: z.string().optional(), + instance_id: z.string().optional(), + current_version: z.string().optional(), + latest_version: z.string().optional(), + last_checked_at: z.string().optional(), + namespace: z.string().optional(), + is_telemetry_enabled: z.boolean(), + is_support_required: z.boolean(), + is_activated: z.boolean(), + is_setup_done: z.boolean(), + is_signup_screen_visited: z.boolean(), + user_count: z.number().optional(), + is_verified: z.boolean(), + workspaces_exist: z.boolean(), +}); + +export type TInstance = z.infer; + +export const InstanceConfigSchema = z.object({ + enable_signup: z.boolean(), + is_workspace_creation_disabled: z.boolean(), + is_google_enabled: z.boolean(), + is_github_enabled: z.boolean(), + is_gitlab_enabled: z.boolean(), + is_magic_login_enabled: z.boolean(), + is_email_password_enabled: z.boolean(), + github_app_name: z.string().optional(), + slack_client_id: z.string().optional(), + posthog_api_key: z.string().optional(), + posthog_host: z.string().optional(), + has_unsplash_configured: z.boolean(), + has_llm_configured: z.boolean(), + file_size_limit: z.number().optional(), + is_smtp_configured: z.boolean(), + app_base_url: z.string().optional(), + space_base_url: z.string().optional(), + admin_base_url: z.string().optional(), + is_intercom_enabled: z.boolean(), + intercom_app_id: z.string().optional(), + instance_changelog_url: z.string().optional(), +}); + +export type TInstanceConfig = z.infer; + +export const InstanceResponseSchema = z.object({ + instance: InstanceSchema, + config: InstanceConfigSchema, +}); + +export type TInstanceResponse = z.infer; diff --git a/packages/services/src/live.service.ts b/packages/services/src/live.service.ts deleted file mode 100644 index ae4b80864c..0000000000 --- a/packages/services/src/live.service.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { API_BASE_URL } from "@plane/constants"; -import { APIService } from "./api.service"; - -export abstract class LiveService extends APIService { - constructor(BASE_URL?: string) { - super(BASE_URL || API_BASE_URL); - } -}