2026-04-14 01:43:30 -07:00
|
|
|
import { z } from "zod";
|
2025-12-11 20:11:32 +00:00
|
|
|
import {
|
2026-07-06 15:12:40 +05:30
|
|
|
type CreateWorkspaceRequest,
|
|
|
|
|
createWorkspaceRequest,
|
|
|
|
|
createWorkspaceResponse,
|
|
|
|
|
type DeleteWorkspaceRequest,
|
|
|
|
|
deleteWorkspaceRequest,
|
|
|
|
|
deleteWorkspaceResponse,
|
|
|
|
|
type GetWorkspaceRequest,
|
|
|
|
|
type GetWorkspacesRequest,
|
|
|
|
|
getWorkspaceRequest,
|
|
|
|
|
getWorkspaceResponse,
|
|
|
|
|
getWorkspacesRequest,
|
|
|
|
|
getWorkspacesResponse,
|
|
|
|
|
leaveWorkspaceResponse,
|
|
|
|
|
type UpdateWorkspaceApiAccessRequest,
|
|
|
|
|
type UpdateWorkspaceRequest,
|
|
|
|
|
updateWorkspaceApiAccessRequest,
|
|
|
|
|
updateWorkspaceApiAccessResponse,
|
|
|
|
|
updateWorkspaceRequest,
|
|
|
|
|
updateWorkspaceResponse,
|
2026-07-05 23:17:13 -07:00
|
|
|
} from "@/contracts/types/workspace.types";
|
2025-12-11 20:11:32 +00:00
|
|
|
import { ValidationError } from "../error";
|
|
|
|
|
import { baseApiService } from "./base-api.service";
|
|
|
|
|
|
2026-07-06 15:12:40 +05:30
|
|
|
class WorkspacesApiService {
|
2025-12-11 20:11:32 +00:00
|
|
|
/**
|
2026-07-06 15:12:40 +05:30
|
|
|
* Get a list of workspaces with optional filtering and pagination
|
2025-12-11 20:11:32 +00:00
|
|
|
*/
|
2026-07-06 15:12:40 +05:30
|
|
|
getWorkspaces = async (request?: GetWorkspacesRequest) => {
|
|
|
|
|
const parsedRequest = getWorkspacesRequest.safeParse(request || {});
|
2025-12-11 20:11:32 +00:00
|
|
|
|
|
|
|
|
if (!parsedRequest.success) {
|
|
|
|
|
console.error("Invalid request:", parsedRequest.error);
|
|
|
|
|
|
2025-12-20 05:10:47 -08:00
|
|
|
const errorMessage = parsedRequest.error.issues.map((issue) => issue.message).join(", ");
|
2025-12-11 20:11:32 +00:00
|
|
|
throw new ValidationError(`Invalid request: ${errorMessage}`);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Transform query params to be string values
|
|
|
|
|
const transformedQueryParams = parsedRequest.data.queryParams
|
|
|
|
|
? Object.fromEntries(
|
|
|
|
|
Object.entries(parsedRequest.data.queryParams).map(([k, v]) => {
|
|
|
|
|
return [k, String(v)];
|
|
|
|
|
})
|
|
|
|
|
)
|
|
|
|
|
: undefined;
|
|
|
|
|
|
|
|
|
|
const queryParams = transformedQueryParams
|
|
|
|
|
? new URLSearchParams(transformedQueryParams).toString()
|
|
|
|
|
: "";
|
|
|
|
|
|
2026-07-06 15:12:40 +05:30
|
|
|
return baseApiService.get(`/api/v1/workspaces?${queryParams}`, getWorkspacesResponse);
|
2025-12-11 20:11:32 +00:00
|
|
|
};
|
2025-12-11 20:17:20 +00:00
|
|
|
|
|
|
|
|
/**
|
2026-07-06 15:12:40 +05:30
|
|
|
* Create a new workspace
|
2025-12-11 20:17:20 +00:00
|
|
|
*/
|
2026-07-06 15:12:40 +05:30
|
|
|
createWorkspace = async (request: CreateWorkspaceRequest) => {
|
|
|
|
|
const parsedRequest = createWorkspaceRequest.safeParse(request);
|
2025-12-11 20:17:20 +00:00
|
|
|
|
|
|
|
|
if (!parsedRequest.success) {
|
|
|
|
|
console.error("Invalid request:", parsedRequest.error);
|
|
|
|
|
|
2025-12-20 05:10:47 -08:00
|
|
|
const errorMessage = parsedRequest.error.issues.map((issue) => issue.message).join(", ");
|
2025-12-11 20:17:20 +00:00
|
|
|
throw new ValidationError(`Invalid request: ${errorMessage}`);
|
|
|
|
|
}
|
|
|
|
|
|
2026-07-06 15:12:40 +05:30
|
|
|
return baseApiService.post(`/api/v1/workspaces`, createWorkspaceResponse, {
|
2025-12-11 20:17:20 +00:00
|
|
|
body: parsedRequest.data,
|
|
|
|
|
});
|
|
|
|
|
};
|
2025-12-11 20:21:16 +00:00
|
|
|
|
2025-12-11 20:26:30 +00:00
|
|
|
/**
|
2026-07-06 15:12:40 +05:30
|
|
|
* Get a single workspace by ID
|
2025-12-11 20:26:30 +00:00
|
|
|
*/
|
2026-07-06 15:12:40 +05:30
|
|
|
getWorkspace = async (request: GetWorkspaceRequest) => {
|
|
|
|
|
const parsedRequest = getWorkspaceRequest.safeParse(request);
|
2025-12-11 20:26:30 +00:00
|
|
|
|
|
|
|
|
if (!parsedRequest.success) {
|
|
|
|
|
console.error("Invalid request:", parsedRequest.error);
|
|
|
|
|
|
2025-12-20 05:10:47 -08:00
|
|
|
const errorMessage = parsedRequest.error.issues.map((issue) => issue.message).join(", ");
|
2025-12-11 20:26:30 +00:00
|
|
|
throw new ValidationError(`Invalid request: ${errorMessage}`);
|
|
|
|
|
}
|
|
|
|
|
|
2026-07-06 15:12:40 +05:30
|
|
|
return baseApiService.get(`/api/v1/workspaces/${request.id}`, getWorkspaceResponse);
|
2025-12-11 20:26:30 +00:00
|
|
|
};
|
2025-12-11 20:28:56 +00:00
|
|
|
|
|
|
|
|
/**
|
2026-07-06 15:12:40 +05:30
|
|
|
* Update an existing workspace
|
2025-12-11 20:28:56 +00:00
|
|
|
*/
|
2026-07-06 15:12:40 +05:30
|
|
|
updateWorkspace = async (request: UpdateWorkspaceRequest) => {
|
|
|
|
|
const parsedRequest = updateWorkspaceRequest.safeParse(request);
|
2025-12-11 20:28:56 +00:00
|
|
|
|
|
|
|
|
if (!parsedRequest.success) {
|
|
|
|
|
console.error("Invalid request:", parsedRequest.error);
|
|
|
|
|
|
2025-12-20 05:10:47 -08:00
|
|
|
const errorMessage = parsedRequest.error.issues.map((issue) => issue.message).join(", ");
|
2025-12-11 20:28:56 +00:00
|
|
|
throw new ValidationError(`Invalid request: ${errorMessage}`);
|
|
|
|
|
}
|
|
|
|
|
|
2026-07-06 15:12:40 +05:30
|
|
|
return baseApiService.put(`/api/v1/workspaces/${request.id}`, updateWorkspaceResponse, {
|
2025-12-11 20:28:56 +00:00
|
|
|
body: parsedRequest.data.data,
|
|
|
|
|
});
|
|
|
|
|
};
|
2025-12-11 20:31:09 +00:00
|
|
|
|
2026-07-06 15:12:40 +05:30
|
|
|
updateWorkspaceApiAccess = async (request: UpdateWorkspaceApiAccessRequest) => {
|
|
|
|
|
const parsedRequest = updateWorkspaceApiAccessRequest.safeParse(request);
|
2026-06-19 20:27:17 +05:30
|
|
|
|
|
|
|
|
if (!parsedRequest.success) {
|
|
|
|
|
console.error("Invalid request:", parsedRequest.error);
|
|
|
|
|
const errorMessage = parsedRequest.error.issues.map((issue) => issue.message).join(", ");
|
|
|
|
|
throw new ValidationError(`Invalid request: ${errorMessage}`);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return baseApiService.put(
|
2026-07-05 23:17:13 -07:00
|
|
|
`/api/v1/workspaces/${request.id}/api-access`,
|
2026-07-06 15:12:40 +05:30
|
|
|
updateWorkspaceApiAccessResponse,
|
2026-06-19 20:27:17 +05:30
|
|
|
{
|
|
|
|
|
body: { api_access_enabled: parsedRequest.data.api_access_enabled },
|
|
|
|
|
}
|
|
|
|
|
);
|
|
|
|
|
};
|
|
|
|
|
|
2025-12-11 20:31:09 +00:00
|
|
|
/**
|
2026-07-06 15:12:40 +05:30
|
|
|
* Delete a workspace
|
2025-12-11 20:31:09 +00:00
|
|
|
*/
|
2026-07-06 15:12:40 +05:30
|
|
|
deleteWorkspace = async (request: DeleteWorkspaceRequest) => {
|
|
|
|
|
const parsedRequest = deleteWorkspaceRequest.safeParse(request);
|
2025-12-11 20:31:09 +00:00
|
|
|
|
|
|
|
|
if (!parsedRequest.success) {
|
|
|
|
|
console.error("Invalid request:", parsedRequest.error);
|
|
|
|
|
|
2025-12-20 05:10:47 -08:00
|
|
|
const errorMessage = parsedRequest.error.issues.map((issue) => issue.message).join(", ");
|
2025-12-11 20:31:09 +00:00
|
|
|
throw new ValidationError(`Invalid request: ${errorMessage}`);
|
|
|
|
|
}
|
|
|
|
|
|
2026-07-06 15:12:40 +05:30
|
|
|
return baseApiService.delete(`/api/v1/workspaces/${request.id}`, deleteWorkspaceResponse);
|
2025-12-11 20:31:09 +00:00
|
|
|
};
|
2026-01-13 02:06:35 -08:00
|
|
|
|
2026-04-14 01:43:30 -07:00
|
|
|
/**
|
2026-07-06 15:12:40 +05:30
|
|
|
* Trigger AI file sorting for all documents in a workspace
|
2026-04-14 01:43:30 -07:00
|
|
|
*/
|
2026-07-06 15:12:40 +05:30
|
|
|
triggerAiSort = async (workspaceId: number) => {
|
2026-04-14 01:43:30 -07:00
|
|
|
return baseApiService.post(
|
2026-07-06 15:12:40 +05:30
|
|
|
`/api/v1/workspaces/${workspaceId}/ai-sort`,
|
2026-04-14 01:43:30 -07:00
|
|
|
z.object({ message: z.string() }),
|
|
|
|
|
{}
|
|
|
|
|
);
|
|
|
|
|
};
|
|
|
|
|
|
2026-01-13 02:06:35 -08:00
|
|
|
/**
|
2026-07-06 15:12:40 +05:30
|
|
|
* Leave a workspace (remove own membership)
|
|
|
|
|
* This is used by non-owners to leave a shared workspace
|
2026-01-13 02:06:35 -08:00
|
|
|
*/
|
2026-07-06 15:12:40 +05:30
|
|
|
leaveWorkspace = async (workspaceId: number) => {
|
2026-01-13 02:06:35 -08:00
|
|
|
return baseApiService.delete(
|
2026-07-06 15:12:40 +05:30
|
|
|
`/api/v1/workspaces/${workspaceId}/members/me`,
|
|
|
|
|
leaveWorkspaceResponse
|
2026-01-13 02:06:35 -08:00
|
|
|
);
|
|
|
|
|
};
|
2025-12-11 20:11:32 +00:00
|
|
|
}
|
|
|
|
|
|
2026-07-06 15:12:40 +05:30
|
|
|
export const workspacesApiService = new WorkspacesApiService();
|