Added Team mamagement with backend integration
This commit is contained in:
117
src/Api/QuantumBackend/TeamManagement.tsx
Normal file
117
src/Api/QuantumBackend/TeamManagement.tsx
Normal 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 });
|
||||
};
|
||||
@@ -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;
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user