AilianceApi.swift 150 lignes · 6798 octets
import Foundation

/// HTTP contract used by `SyncEngine`; `AilianceApiClient` implements it, fakes in tests.
protocol AilianceApi {
    func authCle(nom: String, motDePasse: String) async -> AilianceApiClient.ApiResult<AuthCleResponse>

    func syncStatus(sinceIso: String, ressourcesQuery: String?) async -> AilianceApiClient.ApiResult<SyncStatusResponse>

    func syncPull(sinceIso: String, ressourcesQuery: String?) async -> AilianceApiClient.ApiResult<SyncPullResponse>

    func createContact(jsonBody: String) async -> AilianceApiClient.ApiResult<String>

    func updateContact(id: String, jsonBody: String) async -> AilianceApiClient.ApiResult<String>

    func deleteContact(id: String) async -> AilianceApiClient.ApiResult<Void>

    func createEntreprise(jsonBody: String) async -> AilianceApiClient.ApiResult<String>

    func updateEntreprise(id: String, jsonBody: String) async -> AilianceApiClient.ApiResult<String>

    func deleteEntreprise(id: String) async -> AilianceApiClient.ApiResult<Void>

    func createProjet(jsonBody: String) async -> AilianceApiClient.ApiResult<String>

    func updateProjet(id: String, jsonBody: String) async -> AilianceApiClient.ApiResult<String>

    func deleteProjet(id: String) async -> AilianceApiClient.ApiResult<Void>

    func createTache(projetId: String, jsonBody: String) async -> AilianceApiClient.ApiResult<String>

    func updateTache(projetId: String, tacheId: String, jsonBody: String) async -> AilianceApiClient.ApiResult<String>

    func deleteTache(projetId: String, tacheId: String) async -> AilianceApiClient.ApiResult<Void>

    func moveTache(projetId: String, tacheId: String, jsonBody: String) async -> AilianceApiClient.ApiResult<String>

    /// Coche/décoche une sous-tâche. Route dédiée : le `PUT` général ne
    /// transporte que des titres et ne peut donc pas basculer l'état `fait`.
    func toggleSousTache(
        projetId: String,
        tacheId: String,
        sousTacheId: String
    ) async -> AilianceApiClient.ApiResult<String>

    func createInteraction(contactId: String, jsonBody: String) async -> AilianceApiClient.ApiResult<String>

    func listRdv() async -> AilianceApiClient.ApiResult<[RendezVousDto]>

    func createRdv(jsonBody: String) async -> AilianceApiClient.ApiResult<String>

    func getRdv(id: String) async -> AilianceApiClient.ApiResult<RendezVousDto>

    func updateRdv(id: String, jsonBody: String) async -> AilianceApiClient.ApiResult<String>

    func deleteRdv(id: String) async -> AilianceApiClient.ApiResult<Void>

    func getRessourcesCatalogue() async -> AilianceApiClient.ApiResult<RessourcesCatalogueDto>

    func listReservations(genre: String, resourceId: String) async -> AilianceApiClient.ApiResult<[ReservationDto]>

    func createReservation(genre: String, resourceId: String, jsonBody: String) async -> AilianceApiClient.ApiResult<String>

    func updateReservation(
        genre: String,
        resourceId: String,
        reservationId: String,
        jsonBody: String
    ) async -> AilianceApiClient.ApiResult<String>

    func deleteReservation(genre: String, resourceId: String, reservationId: String) async -> AilianceApiClient.ApiResult<Void>

    func listIndisponibilites(genre: String, resourceId: String) async -> AilianceApiClient.ApiResult<[IndisponibiliteDto]>

    func uploadContactCarte(
        id: String,
        bytes: Data,
        filename: String,
        contentType: String
    ) async -> AilianceApiClient.ApiResult<String>

    func uploadContactPhoto(
        id: String,
        bytes: Data,
        filename: String,
        contentType: String
    ) async -> AilianceApiClient.ApiResult<String>

    func downloadContactCarte(id: String) async -> AilianceApiClient.ApiResult<Data>

    func downloadContactPhoto(id: String) async -> AilianceApiClient.ApiResult<Data>

    /// POST /api/contacts/:contactId/interactions/:interactionId/audio (multipart, champ `file`).
    /// Retourne le corps brut (interaction mise à jour au format JSON).
    func uploadInteractionAudio(
        contactId: String,
        interactionId: String,
        bytes: Data,
        filename: String
    ) async -> AilianceApiClient.ApiResult<String>

    /// GET /api/contacts/:contactId/interactions/:interactionId/audio
    func downloadInteractionAudio(contactId: String, interactionId: String) async -> AilianceApiClient.ApiResult<Data>

    /// POST /api/projets/:projetId/notes (JSON body `CreateNoteProjetRequest`).
    func createNoteProjet(projetId: String, jsonBody: String) async -> AilianceApiClient.ApiResult<String>

    /// POST /api/projets/:projetId/notes/:noteId/audio (multipart, champ `file`).
    func uploadNoteProjetAudio(
        projetId: String,
        noteId: String,
        bytes: Data,
        filename: String
    ) async -> AilianceApiClient.ApiResult<String>

    /// GET /api/projets/:projetId/notes/:noteId/audio
    func downloadNoteProjetAudio(projetId: String, noteId: String) async -> AilianceApiClient.ApiResult<Data>

    /// DELETE /api/interactions/:interactionId
    func deleteInteraction(interactionId: String) async -> AilianceApiClient.ApiResult<Void>

    /// DELETE /api/projets/:projetId/notes/:noteId
    func deleteNoteProjet(projetId: String, noteId: String) async -> AilianceApiClient.ApiResult<Void>

    /// POST /api/contacts/:contactId/interactions/:interactionId/transcription
    /// Relance la transcription côté serveur ; retourne le corps JSON de l'entité mise à jour.
    func relancerTranscriptionInteraction(contactId: String, interactionId: String) async -> AilianceApiClient.ApiResult<String>

    /// POST /api/projets/:projetId/notes/:noteId/transcription
    /// Relance la transcription côté serveur ; retourne le corps JSON de l'entité mise à jour.
    func relancerTranscriptionNoteProjet(projetId: String, noteId: String) async -> AilianceApiClient.ApiResult<String>
}

/// Kotlin default parameter values, mirrored as overloads.
extension AilianceApi {
    func syncStatus(sinceIso: String) async -> AilianceApiClient.ApiResult<SyncStatusResponse> {
        await syncStatus(sinceIso: sinceIso, ressourcesQuery: nil)
    }

    func syncPull(sinceIso: String) async -> AilianceApiClient.ApiResult<SyncPullResponse> {
        await syncPull(sinceIso: sinceIso, ressourcesQuery: nil)
    }

    func uploadContactCarte(id: String, bytes: Data, filename: String) async -> AilianceApiClient.ApiResult<String> {
        await uploadContactCarte(id: id, bytes: bytes, filename: filename, contentType: "image/jpeg")
    }

    func uploadContactPhoto(id: String, bytes: Data, filename: String) async -> AilianceApiClient.ApiResult<String> {
        await uploadContactPhoto(id: id, bytes: bytes, filename: filename, contentType: "image/jpeg")
    }
}