/** * Teams API Client * Handles team-related API requests */ import type { Team, TeamMember, User } from "@mosaic/shared"; import { TeamMemberRole } from "@mosaic/shared"; import { apiGet, apiPost, apiPatch, apiDelete, type ApiResponse } from "./client"; export interface TeamWithMembers extends Team { members: (TeamMember & { user: User })[]; } export interface CreateTeamDto { name: string; description?: string; } export interface UpdateTeamDto { name?: string; description?: string; } export interface AddTeamMemberDto { userId: string; role?: TeamMemberRole; } /** * Fetch all teams for a workspace */ export async function fetchTeams(workspaceId: string): Promise { const response = await apiGet>(`/api/workspaces/${workspaceId}/teams`); return response.data; } /** * Fetch a single team with members */ export async function fetchTeam(workspaceId: string, teamId: string): Promise { const response = await apiGet>( `/api/workspaces/${workspaceId}/teams/${teamId}` ); return response.data; } /** * Create a new team */ export async function createTeam(workspaceId: string, data: CreateTeamDto): Promise { const response = await apiPost>(`/api/workspaces/${workspaceId}/teams`, data); return response.data; } /** * Update a team */ export async function updateTeam( workspaceId: string, teamId: string, data: UpdateTeamDto ): Promise { const response = await apiPatch>( `/api/workspaces/${workspaceId}/teams/${teamId}`, data ); return response.data; } /** * Delete a team */ export async function deleteTeam(workspaceId: string, teamId: string): Promise { await apiDelete(`/api/workspaces/${workspaceId}/teams/${teamId}`); } /** * Add a member to a team */ export async function addTeamMember( workspaceId: string, teamId: string, data: AddTeamMemberDto ): Promise { const response = await apiPost>( `/api/workspaces/${workspaceId}/teams/${teamId}/members`, data ); return response.data; } /** * Remove a member from a team */ export async function removeTeamMember( workspaceId: string, teamId: string, userId: string ): Promise { await apiDelete(`/api/workspaces/${workspaceId}/teams/${teamId}/members/${userId}`); } /** * Update a team member's role */ export async function updateTeamMemberRole( workspaceId: string, teamId: string, userId: string, role: TeamMemberRole ): Promise { const response = await apiPatch>( `/api/workspaces/${workspaceId}/teams/${teamId}/members/${userId}`, { role } ); return response.data; } /** * Mock teams for development (until backend endpoints are ready) */ export const mockTeams: Team[] = [ { id: "team-1", workspaceId: "workspace-1", name: "Engineering", description: "Product development team", metadata: {}, createdAt: new Date("2026-01-20"), updatedAt: new Date("2026-01-20"), }, { id: "team-2", workspaceId: "workspace-1", name: "Design", description: "UI/UX design team", metadata: {}, createdAt: new Date("2026-01-22"), updatedAt: new Date("2026-01-22"), }, { id: "team-3", workspaceId: "workspace-1", name: "Marketing", description: null, metadata: {}, createdAt: new Date("2026-01-25"), updatedAt: new Date("2026-01-25"), }, ]; /** * Mock team with members for development */ const baseTeam = mockTeams[0]; if (!baseTeam) { throw new Error("Mock team not found"); } export const mockTeamWithMembers: TeamWithMembers = { id: baseTeam.id, workspaceId: baseTeam.workspaceId, name: baseTeam.name, description: baseTeam.description, metadata: baseTeam.metadata, createdAt: baseTeam.createdAt, updatedAt: baseTeam.updatedAt, members: [ { teamId: "team-1", userId: "user-1", role: TeamMemberRole.OWNER, joinedAt: new Date("2026-01-20"), user: { id: "user-1", email: "john@example.com", name: "John Doe", emailVerified: true, image: null, authProviderId: null, preferences: {}, deactivatedAt: null, isLocalAuth: false, passwordHash: null, invitedBy: null, invitationToken: null, invitedAt: null, createdAt: new Date("2026-01-15"), updatedAt: new Date("2026-01-15"), }, }, { teamId: "team-1", userId: "user-2", role: TeamMemberRole.MEMBER, joinedAt: new Date("2026-01-21"), user: { id: "user-2", email: "jane@example.com", name: "Jane Smith", emailVerified: true, image: null, authProviderId: null, preferences: {}, deactivatedAt: null, isLocalAuth: false, passwordHash: null, invitedBy: null, invitationToken: null, invitedAt: null, createdAt: new Date("2026-01-16"), updatedAt: new Date("2026-01-16"), }, }, ], };