diff --git a/src/hooks/useWebsiteProjects.js b/src/hooks/useWebsiteProjects.js index 38ff879..1241fc1 100644 --- a/src/hooks/useWebsiteProjects.js +++ b/src/hooks/useWebsiteProjects.js @@ -1,5 +1,7 @@ import { useState, useCallback } from 'react' import { databases, DATABASE_ID, COLLECTIONS, Query } from '../lib/appwrite' +import { assignWebsiteProject } from '../lib/projectAdminApi' +import { assignSequentially } from '../lib/projectAssign' export function useWebsiteProjects() { const [projects, setProjects] = useState([]) @@ -37,22 +39,11 @@ export function useWebsiteProjects() { } }, []) - const assignProject = async (projectId, { customerId, ticketId }) => { - try { - const response = await databases.updateDocument( - DATABASE_ID, COLLECTIONS.WEBSITE_PROJECTS, projectId, - { customerId, ticketId, updatedAt: new Date().toISOString() } - ) - setProjects((prev) => prev.map((p) => (p.$id === projectId ? response : p))) - return { success: true } - } catch (err) { - return { success: false, error: err.message } - } - } - const assignProjects = async (projectIds, ctx) => { - const results = await Promise.all(projectIds.map((id) => assignProject(id, ctx))) - return results.find((r) => !r.success) || { success: true } + const results = await assignSequentially(projectIds, ctx, assignWebsiteProject) + const success = results.every((r) => r.ok) + const firstError = results.find((r) => !r.ok) + return { success, error: firstError?.error, results } } // Nur vom Ticket loesen: customerId bleibt, sonst verliert der Kunde die Vorschau im Portal diff --git a/src/lib/projectAdminApi.js b/src/lib/projectAdminApi.js index 5db856c..37ef772 100644 --- a/src/lib/projectAdminApi.js +++ b/src/lib/projectAdminApi.js @@ -29,6 +29,21 @@ export async function syncGiteaRepos() { return adminFetch('/api/admin/gitea/sync-repos', { method: 'POST' }) } +export async function importNewRepos() { + return adminFetch('/api/admin/gitea/import-repos', { method: 'POST' }) +} + +export async function assignWebsiteProject(id, { customerId, ticketId }) { + return adminFetch(`/api/admin/website-projects/${id}/assign`, { + method: 'POST', + body: JSON.stringify({ customerId, ticketId }), + }) +} + +export async function backfillProjectPushes(id) { + return adminFetch(`/api/admin/website-projects/${id}/pushes`, { method: 'POST' }) +} + export async function updateWebsiteProject(id, payload) { return adminFetch(`/api/admin/website-projects/${id}`, { method: 'PATCH',