feat: integrate all backend APIs into frontend apps

- Fix API service paths to use /v1/iam/, /v1/dimentorin/, /v1/gacha/, /v1/hackathon/ prefixes
- Add roles, permissions, events, testimonials, sessions API services and hooks
- Rewrite gacha service with full CRUD + roll/claim endpoints
- Replace all mock data in backoffice pages with real API calls (accounts, roles, permissions, gacha-roll, dashboard, sessions, users-dimentorin, feedback-review, settings)
- Wire dimentorin mentoring list to useMentorList with search + pagination
- Wire dimentorin mentor detail page to useMentorById, pass real data to all sections
- Wire appointment modal to useBookSession with controlled schedule inputs
- Wire gacha app Spin Now to useExecuteGachaRoll, show credits and real items

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
maulanasdqn
2026-04-05 17:08:58 +07:00
co-authored by Claude Sonnet 4.6
parent 8d2aaf5188
commit 53ad40f3fd
74 changed files with 3028 additions and 1942 deletions
+38 -19
View File
@@ -5,23 +5,28 @@ import type {
TAdminSubmissionsResponse,
} from '../../types/admin';
const ADMIN_BASE_URL = '/admin';
export const getAdminUsers = async (params?: {
page?: number;
per_page?: number;
search?: string;
is_admin?: boolean;
}) => {
const response = await api.get<TAdminUsersResponse>(
`${ADMIN_BASE_URL}/users`,
{
params: {
...params,
is_admin: params?.is_admin ?? false,
},
}
);
const response = await api.get<TAdminUsersResponse>('/v1/hackathon/admin/users', { params });
return response.data;
};
export const getAdminUserById = async (userId: string) => {
const response = await api.get(`/v1/hackathon/admin/users/${userId}`);
return response.data;
};
export const deleteAdminUser = async (userId: string) => {
const response = await api.delete(`/v1/hackathon/admin/users/${userId}`);
return response.data;
};
export const setAdminUser = async (userId: string, is_admin: boolean) => {
const response = await api.post(`/v1/hackathon/admin/users/${userId}/set-admin`, { is_admin });
return response.data;
};
@@ -30,10 +35,12 @@ export const getAdminTeams = async (params?: {
per_page?: number;
search?: string;
}) => {
const response = await api.get<TAdminTeamsResponse>(
`${ADMIN_BASE_URL}/teams`,
{ params }
);
const response = await api.get<TAdminTeamsResponse>('/v1/hackathon/admin/teams', { params });
return response.data;
};
export const deleteAdminTeam = async (teamId: string) => {
const response = await api.delete(`/v1/hackathon/admin/teams/${teamId}`);
return response.data;
};
@@ -43,9 +50,21 @@ export const getAdminSubmissions = async (params?: {
search?: string;
status?: string;
}) => {
const response = await api.get<TAdminSubmissionsResponse>(
`${ADMIN_BASE_URL}/submissions`,
{ params }
);
const response = await api.get<TAdminSubmissionsResponse>('/v1/hackathon/admin/submissions', { params });
return response.data;
};
export const getAdminWinners = async () => {
const response = await api.get('/v1/hackathon/admin/winners');
return response.data;
};
export const setWinner = async (data: { team_id: string; rank: number; prize?: string }) => {
const response = await api.post('/v1/hackathon/admin/winners', data);
return response.data;
};
export const removeWinner = async (teamId: string) => {
const response = await api.delete(`/v1/hackathon/admin/winners/${teamId}`);
return response.data;
};