Added Team mamagement with backend integration

This commit is contained in:
2026-04-30 11:11:11 +03:00
parent 8449da8373
commit 45c157b910
35 changed files with 1570 additions and 4671 deletions

View File

@@ -0,0 +1,117 @@
import keycloak from "Api/Keycloak/Keycloak";
import axios from "axios";
import type { Team, TeamMember } from "Types/Team/Team";
export interface TeamCreateRequest {
name: string;
description?: string | null;
}
export interface TeamUpdateRequest {
team_id: number;
name: string;
description?: string | null;
}
export interface TeamCreateResponse {
team_id: number;
}
export interface TeamListRequest {
page_num: number;
page_size: number;
}
export interface TeamDeleteRequest {
team_id: number;
}
export interface MemberAddRequest {
team_id: number;
user_id: string;
permissions: string[];
}
export interface MemberDeleteRequest {
team_id: number;
user_id: string;
}
export interface TeamsListResponse {
teams: Team[];
cur_page: number;
total_teams: number;
page_size: number;
}
const api = axios.create({
baseURL: `${import.meta.env.VITE_QUANTUM_BACKEND_URL}/team`,
headers: { "Content-Type": "application/json" },
});
// Add auth token to requests
api.interceptors.request.use((config) => {
const token = keycloak.token;
if (token) {
config.headers.Authorization = `Bearer ${token}`;
}
return config;
});
// 1. Create team
export const createTeam = async (
data: TeamCreateRequest,
): Promise<TeamCreateResponse> => {
const response = await api.post<TeamCreateResponse>("", data);
return response.data;
};
export const updateTeamRequest = async (
data: TeamUpdateRequest,
): Promise<TeamUpdateRequest> => {
const response = await api.put<TeamUpdateRequest>("", data);
return response.data;
};
// 2. Get teams list (paginated)
export const getTeams = async (
params: Partial<TeamListRequest>,
): Promise<TeamsListResponse> => {
const response = await api.get<TeamsListResponse>("", {
headers: {},
params,
});
return response.data;
};
export const getShortTeamsList = async (): Promise<
{ team_id: number; team_name: string }[]
> => {
const response =
await api.get<{ team_id: number; team_name: string }[]>("short_list");
return response.data;
};
// 3. Get single team by ID
export const getTeam = async (teamId: number): Promise<Team> => {
const response = await api.get<Team>(`${teamId}`);
return response.data;
};
// 4. Delete team
export const deleteTeam = async (teamId: number): Promise<void> => {
await api.delete("", { data: { team_id: teamId } });
};
export const addMember = async (
data: MemberAddRequest,
): Promise<TeamMember> => {
const response = await api.put<TeamMember>("user", data);
return response.data;
};
export const deleteMember = async (
data: MemberDeleteRequest,
): Promise<void> => {
await api.delete("user", { data: data });
};

View File

@@ -28,25 +28,34 @@ export const GetCurrentUserInfo = async (): Promise<UserData | undefined> => {
export const UpdateCurrentUserInfo = async (
profile_picture_path: string,
): Promise<UserData | undefined> => {
try {
// Trigger the UPDATE_PASSWORD required action
// This will redirect the user to Keycloak's password change page
const response = await axios.put(
`${import.meta.env.VITE_QUANTUM_BACKEND_URL}/user`,
{ profile_picture_path: profile_picture_path },
{
headers: {
"Content-Type": "application/json",
Authorization: `Bearer ${keycloak.token}`,
},
withCredentials: true, // Important: allows credentials in CORS
const response = await axios.put(
`${import.meta.env.VITE_QUANTUM_BACKEND_URL}/user`,
{ profile_picture_path: profile_picture_path },
{
headers: {
"Content-Type": "application/json",
Authorization: `Bearer ${keycloak.token}`,
},
);
if (response.status === 200) {
return response.data;
}
} catch (error) {
console.error("Error Getting User Data", error);
throw error;
withCredentials: true, // Important: allows credentials in CORS
},
);
if (response.status === 200) {
return response.data;
}
};
export const GetUserByEmail = async (
email: string,
): Promise<UserData | undefined> => {
const response = await axios.get(
`${import.meta.env.VITE_QUANTUM_BACKEND_URL}/user/${email}`,
{
headers: {
"Content-Type": "application/json",
Authorization: `Bearer ${keycloak.token}`,
},
withCredentials: true, // Important: allows credentials in CORS
},
);
return response.data;
};