import { supabase } from './client';
import { handleSupabaseError } from './base';
import type { ToolPack, EnhancedTool } from './types';
export const packsApi = {
/**
* Liste tous les packs actifs avec nombre d'outils
*/
async list(): Promise<Array<ToolPack & { tool_count: number }>> {
const { data, error } = await supabase
.from('tool_packs')
.select(`
*,
pack_tools(count)
`)
.eq('status', 'active')
.order('display_order');
if (error) handleSupabaseError(error);
return data.map(pack => ({
...pack,
tool_count: pack.pack_tools[0]?.count || 0,
}));
},
/**
* Récupère un pack avec ses outils
*/
async getById(id: string): Promise<ToolPack & { tools: EnhancedTool[] }> {
const { data, error } = await supabase
.from('tool_packs')
.select(`
*,
pack_tools(
display_order,
tool:tools(
*,
category:categories(name)
)
)
`)
.eq('id', id)
.single();
if (error) handleSupabaseError(error);
// Transform et trier par display_order
const tools = data.pack_tools
.sort((a, b) => a.display_order - b.display_order)
.map(pt => ({
...pt.tool,
category_name: pt.tool.category?.name || 'Non catégorisé',
}));
return {
...data,
tools,
};
},
/**
* Crée un nouveau pack
*/
async create(pack: Partial<ToolPack>): Promise<ToolPack> {
const { data, error } = await supabase
.from('tool_packs')
.insert(pack)
.select()
.single();
if (error) handleSupabaseError(error);
return data;
},
/**
* Met à jour un pack
*/
async update(id: string, updates: Partial<ToolPack>): Promise<ToolPack> {
const { data, error } = await supabase
.from('tool_packs')
.update({ ...updates, updated_at: new Date().toISOString() })
.eq('id', id)
.select()
.single();
if (error) handleSupabaseError(error);
return data;
},
/**
* Supprime un pack (cascade sur pack_tools)
*/
async delete(id: string): Promise<void> {
const { error } = await supabase
.from('tool_packs')
.delete()
.eq('id', id);
if (error) handleSupabaseError(error);
},
/**
* Ajoute un outil au pack
*/
async addTool(packId: string, toolId: string, displayOrder?: number): Promise<void> {
const { error } = await supabase
.from('pack_tools')
.insert({
pack_id: packId,
tool_id: toolId,
display_order: displayOrder || 0,
});
if (error) handleSupabaseError(error);
},
/**
* Retire un outil du pack
*/
async removeTool(packId: string, toolId: string): Promise<void> {
const { error } = await supabase
.from('pack_tools')
.delete()
.eq('pack_id', packId)
.eq('tool_id', toolId);
if (error) handleSupabaseError(error);
},
/**
* Réordonne les outils dans un pack
*/
async reorderTools(
packId: string,
toolOrders: Array<{ toolId: string; displayOrder: number }>
): Promise<void> {
for (const { toolId, displayOrder } of toolOrders) {
await supabase
.from('pack_tools')
.update({ display_order: displayOrder })
.eq('pack_id', packId)
.eq('tool_id', toolId);
}
},
};