veza/apps/web/src/services/groupService.ts
senke ae586f6134 Phase 2 stabilisation: code mort, Modal→Dialog, feature flags, tests, router split, Rust legacy
Bloc A - Code mort:
- Suppression Studio (components, views, features)
- Suppression gamification + services mock (projectService, storageService, gamificationService)
- Mise à jour Sidebar, Navbar, locales

Bloc B - Frontend:
- Suppression modal.tsx deprecated, Modal.stories (doublon Dialog)
- Feature flags: PLAYLIST_SEARCH, PLAYLIST_RECOMMENDATIONS, ROLE_MANAGEMENT = true
- Suppression 19 tests orphelins, retrait exclusions vitest.config

Bloc C - Backend:
- Extraction routes_auth.go depuis router.go

Bloc D - Rust:
- Suppression security_legacy.rs (code mort, patterns déjà dans security/)
2026-02-14 17:23:32 +01:00

68 lines
1.9 KiB
TypeScript

import { SocialGroup } from '../types';
import { apiClient } from './api/client';
interface ApiGroup {
id: string;
name: string;
description?: string;
avatar_url?: string;
is_public?: boolean;
member_count?: number;
}
function mapApiGroupToSocialGroup(g: ApiGroup, userRole: SocialGroup['userRole'] = 'none'): SocialGroup {
return {
id: g.id,
name: g.name,
members: g.member_count ?? 0,
isPrivate: !(g.is_public ?? true),
userRole,
description: g.description ?? '',
coverUrl: g.avatar_url ?? 'https://picsum.photos/id/10/800/400',
};
}
export const groupService = {
list: async (): Promise<{ groups: SocialGroup[] }> => {
const response = await apiClient.get<{ groups: ApiGroup[]; total?: number }>(
'/social/groups',
{ params: { limit: 50, offset: 0 } },
);
const items = response.data?.groups ?? [];
return {
groups: items.map((g) => mapApiGroupToSocialGroup(g)),
};
},
get: async (id: string) => {
const response = await apiClient.get<ApiGroup>(`/social/groups/${id}`);
const g = response.data;
if (!g) throw new Error('Group not found');
return {
group: mapApiGroupToSocialGroup(g, 'member'),
membersList: [],
events: [],
};
},
create: async (data: { name: string; description?: string; isPrivate?: boolean; coverUrl?: string }) => {
const response = await apiClient.post<ApiGroup>('/social/groups', {
name: data.name,
description: data.description ?? '',
is_public: !data.isPrivate,
});
const g = response.data;
if (!g) throw new Error('Failed to create group');
return mapApiGroupToSocialGroup(g, 'admin');
},
join: async (id: string) => {
await apiClient.post(`/social/groups/${id}/join`);
return { success: true };
},
leave: async (id: string) => {
await apiClient.delete(`/social/groups/${id}/leave`);
return { success: true };
},
};