From e92dde20ca1e52ecbf060ae78427c0773f0b990a Mon Sep 17 00:00:00 2001 From: LandaMm Date: Sat, 31 May 2025 17:31:33 +0200 Subject: [PATCH] feat: create api service PAI --- web/src/api/admin/apiServices.ts | 30 +++++++++++++++++++++++++++++- web/src/store/admin.ts | 31 +++++++++++++++++++++++++++++-- web/src/types/index.ts | 5 +++++ 3 files changed, 63 insertions(+), 3 deletions(-) diff --git a/web/src/api/admin/apiServices.ts b/web/src/api/admin/apiServices.ts index 7cbab68..7e998f8 100644 --- a/web/src/api/admin/apiServices.ts +++ b/web/src/api/admin/apiServices.ts @@ -1,4 +1,4 @@ -import type { ApiService } from "@/types"; +import type { ApiService, ApiServiceCredentials } from "@/types"; import { axios, handleApiError } from ".."; export interface FetchApiServicesResponse { @@ -16,3 +16,31 @@ export const getApiServices = async (): Promise => { return response.data; }; + +export interface CreateApiServiceRequest { + name: string; + description: string; + redirect_uris: string[]; + scopes: string[]; + grant_types: string[]; + is_active: boolean; +} + +export interface CreateApiServiceResponse { + service: ApiService; + credentials: ApiServiceCredentials; +} + +export const postApiService = async ( + req: CreateApiServiceRequest, +): Promise => { + const response = await axios.post( + "/api/v1/admin/api-services", + req, + ); + + if (response.status !== 200 && response.status !== 201) + throw await handleApiError(response); + + return response.data; +}; diff --git a/web/src/store/admin.ts b/web/src/store/admin.ts index 7d4e853..9eea1ce 100644 --- a/web/src/store/admin.ts +++ b/web/src/store/admin.ts @@ -1,18 +1,32 @@ -import { getApiServices } from "@/api/admin/apiServices"; -import type { ApiService } from "@/types"; +import { + getApiServices, + postApiService, + type CreateApiServiceRequest, +} from "@/api/admin/apiServices"; +import type { ApiService, ApiServiceCredentials } from "@/types"; import { create } from "zustand"; interface IAdminState { apiServices: ApiService[]; loadingApiServices: boolean; + createdCredentials: ApiServiceCredentials | null; + creatingApiService: boolean; + fetchApiServices: () => Promise; + createApiService: (req: CreateApiServiceRequest) => Promise; + resetCredentials: () => void; } export const useAdmin = create((set) => ({ apiServices: [], loadingApiServices: false, + createdCredentials: null, + creatingApiService: false, + + resetCredentials: () => set({ createdCredentials: null }), + fetchApiServices: async () => { set({ loadingApiServices: true }); @@ -25,4 +39,17 @@ export const useAdmin = create((set) => ({ set({ loadingApiServices: false }); } }, + + createApiService: async (req: CreateApiServiceRequest) => { + set({ creatingApiService: true }); + + try { + const response = await postApiService(req); + set({ createdCredentials: response.credentials }); + } catch (err) { + console.log("ERR: Failed to fetch services:", err); + } finally { + set({ creatingApiService: false }); + } + }, })); diff --git a/web/src/types/index.ts b/web/src/types/index.ts index cb81811..3d97fc4 100644 --- a/web/src/types/index.ts +++ b/web/src/types/index.ts @@ -21,3 +21,8 @@ export interface ApiService { updated_at: string; is_active: boolean; } + +export interface ApiServiceCredentials { + client_id: string; + client_secret: string; +}