Co-authored-by: Jason Woltje <jason@diversecanvas.com> Co-committed-by: Jason Woltje <jason@diversecanvas.com>
216 lines
5.0 KiB
TypeScript
216 lines
5.0 KiB
TypeScript
/**
|
|
* 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<Team[]> {
|
|
const response = await apiGet<ApiResponse<Team[]>>(`/api/workspaces/${workspaceId}/teams`);
|
|
return response.data;
|
|
}
|
|
|
|
/**
|
|
* Fetch a single team with members
|
|
*/
|
|
export async function fetchTeam(workspaceId: string, teamId: string): Promise<TeamWithMembers> {
|
|
const response = await apiGet<ApiResponse<TeamWithMembers>>(
|
|
`/api/workspaces/${workspaceId}/teams/${teamId}`
|
|
);
|
|
return response.data;
|
|
}
|
|
|
|
/**
|
|
* Create a new team
|
|
*/
|
|
export async function createTeam(workspaceId: string, data: CreateTeamDto): Promise<Team> {
|
|
const response = await apiPost<ApiResponse<Team>>(`/api/workspaces/${workspaceId}/teams`, data);
|
|
return response.data;
|
|
}
|
|
|
|
/**
|
|
* Update a team
|
|
*/
|
|
export async function updateTeam(
|
|
workspaceId: string,
|
|
teamId: string,
|
|
data: UpdateTeamDto
|
|
): Promise<Team> {
|
|
const response = await apiPatch<ApiResponse<Team>>(
|
|
`/api/workspaces/${workspaceId}/teams/${teamId}`,
|
|
data
|
|
);
|
|
return response.data;
|
|
}
|
|
|
|
/**
|
|
* Delete a team
|
|
*/
|
|
export async function deleteTeam(workspaceId: string, teamId: string): Promise<void> {
|
|
await apiDelete(`/api/workspaces/${workspaceId}/teams/${teamId}`);
|
|
}
|
|
|
|
/**
|
|
* Add a member to a team
|
|
*/
|
|
export async function addTeamMember(
|
|
workspaceId: string,
|
|
teamId: string,
|
|
data: AddTeamMemberDto
|
|
): Promise<TeamMember> {
|
|
const response = await apiPost<ApiResponse<TeamMember>>(
|
|
`/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<void> {
|
|
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<TeamMember> {
|
|
const response = await apiPatch<ApiResponse<TeamMember>>(
|
|
`/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"),
|
|
},
|
|
},
|
|
],
|
|
};
|