Documentation
Services applicatifs
Itinéraires d'intégration de bureau, opérations de projet suivies, notifications et enregistrements d'abonnement push.
Traduit automatiquement de l'anglais. Voir l'original en anglais
Envoyez ces demandes à votre propre sidecar en cours d’exécution. Les valeurs restent dans ce navigateur.
Comment ça marche
Le sidecar écoute sur un port de bouclage choisi au démarrage et l'imprime dans son ready doubler; utilisez cette URL et le CADCAMFUN_TOKEN ça a commencé avec. Les demandes vont directement de cette page à cette adresse.
Le sidecar envoie les en-têtes CORS uniquement aux origines Tauri et à http://localhost ou http://127.0.0.1 sur n'importe quel port. À partir des documents hébergés, le navigateur bloque la réponse, exécutez donc les documents localement (bun run dev dans packages/web) pour utiliser le terrain de jeu, ou copiez la requête sous forme curl. Pour expérimenter sans toucher aux données réelles, démarrez le sidecar avec CADCAMFUN_DATA_DIR pointé vers un répertoire jetable — voir la procédure pas à pas de l'API.
Opérations
10 endpoints dans le misc groupe, généré à partir du propre sidecar Document OpenAPI. Les opérations protégées prennent Authorization: Bearer $CADCAMFUN_TOKEN; voir authentification. Le comportement et les limites sont en place le guide du sous-système.
| poste | /api/push-subscription | misc.pushSubscribe |
| supprimer | /api/push-subscription | misc.pushUnsubscribe |
| poste | /api/app-control/notify | misc.notify |
| poste | /api/desktop/auth/signin | misc.desktopSignin |
| obtenir | /api/desktop/projects | misc.desktopProjects |
| poste | /api/desktop/projects | misc.desktopCreateProject |
| obtenir | /api/desktop/user/by-email | misc.desktopUserByEmail |
| obtenir | /api/projects/tracked/{id} | misc.trackedGet |
| mettre | /api/projects/tracked/{id} | misc.trackedUpdate |
| supprimer | /api/projects/tracked/{id} | misc.trackedRemove |
/api/push-subscription
misc.pushSubscribe Nécessite Authorization: Bearer <token>.
{ endpoint?: string | null keys?: { p256dh?: string | null auth?: string | null } | null }
200 objet application/json
{ success: true id: string }
400 BadRequestEncoded application/json
BadRequestEncoded
401 UnauthorizedEncoded application/json
UnauthorizedEncoded
500 InternalErrorEncoded application/json
InternalErrorEncoded
Exemple de SDK
import { CadCam } from "@cadcamfun/api/sdk"
const client = CadCam.make({
baseUrl: process.env.CADCAMFUN_URL!,
headers: { authorization: `Bearer ${process.env.CADCAMFUN_TOKEN}` },
})
// MiscPushSubscribeInput
const result = await client.misc.pushSubscribe({
endpoint: "",
keys: {}
}) curl
curl --request POST "${CADCAMFUN_URL}/api/push-subscription" \
--header "Authorization: Bearer ${CADCAMFUN_TOKEN}" \
--header "Content-Type: application/json" \
--data-binary @request.json Essayez-le
misc.pushUnsubscribe Nécessite Authorization: Bearer <token>.
{ endpoint?: string | null }
200 objet application/json
{ success: true }
400 BadRequestEncoded application/json
BadRequestEncoded
401 UnauthorizedEncoded application/json
UnauthorizedEncoded
500 InternalErrorEncoded application/json
InternalErrorEncoded
Exemple de SDK
import { CadCam } from "@cadcamfun/api/sdk"
const client = CadCam.make({
baseUrl: process.env.CADCAMFUN_URL!,
headers: { authorization: `Bearer ${process.env.CADCAMFUN_TOKEN}` },
})
// MiscPushUnsubscribeInput
const result = await client.misc.pushUnsubscribe({
endpoint: ""
}) curl
curl --request DELETE "${CADCAMFUN_URL}/api/push-subscription" \
--header "Authorization: Bearer ${CADCAMFUN_TOKEN}" \
--header "Content-Type: application/json" \
--data-binary @request.json Essayez-le
/api/app-control/notify
misc.notify Nécessite Authorization: Bearer <token>.
{ userId?: string | null message?: unknown | null }
200 objet application/json
{ success: true message: string }
400 NotifyBadRequestEncoded application/json
NotifyBadRequestEncoded
401 UnauthorizedEncoded application/json
UnauthorizedEncoded
500 NotifyInternalEncoded application/json
NotifyInternalEncoded
Exemple de SDK
import { CadCam } from "@cadcamfun/api/sdk"
const client = CadCam.make({
baseUrl: process.env.CADCAMFUN_URL!,
headers: { authorization: `Bearer ${process.env.CADCAMFUN_TOKEN}` },
})
// MiscNotifyInput
const result = await client.misc.notify({
userId: "",
message: null
}) curl
curl --request POST "${CADCAMFUN_URL}/api/app-control/notify" \
--header "Authorization: Bearer ${CADCAMFUN_TOKEN}" \
--header "Content-Type: application/json" \
--data-binary @request.json Essayez-le
/api/desktop/auth
misc.desktopSignin Nécessite Authorization: Bearer <token>.
{ email?: string | null password?: string | null deviceId?: string | null platform?: string | null }
200 objet application/json
{ success: true token: string user: { id: string name: string | null email: string | null image: string | null } syncData: { lastSync: string version: string } }
400 DesktopBadRequestEncoded application/json
DesktopBadRequestEncoded
401 BureauUnauthorizedEncoded | Non autoriséEncoded application/json
DesktopUnauthorizedEncoded | UnauthorizedEncoded
500 DesktopInternalEncoded application/json
DesktopInternalEncoded
Exemple de SDK
import { CadCam } from "@cadcamfun/api/sdk"
const client = CadCam.make({
baseUrl: process.env.CADCAMFUN_URL!,
headers: { authorization: `Bearer ${process.env.CADCAMFUN_TOKEN}` },
})
// MiscDesktopSigninInput
const result = await client.misc.desktopSignin({
email: "",
password: "",
deviceId: "",
platform: ""
}) curl
curl --request POST "${CADCAMFUN_URL}/api/desktop/auth/signin" \
--header "Authorization: Bearer ${CADCAMFUN_TOKEN}" \
--header "Content-Type: application/json" \
--data-binary @request.json Essayez-le
/api/desktop/projects
misc.desktopProjects Nécessite Authorization: Bearer <token>.
200 objet application/json
{ success: true data: Array<{ id: string name: string description: string | null owner_id: string organization_id: string | null is_public: boolean created_at: string updated_at: string }> message: string }
401 UnauthorizedEncoded application/json
UnauthorizedEncoded
500 DesktopInternalEncoded application/json
DesktopInternalEncoded
Exemple de réponse capturé · 200
{
"success": true,
"data": [],
"message": "Retrieved 0 projects"
} Exemple de SDK
import { CadCam } from "@cadcamfun/api/sdk"
const client = CadCam.make({
baseUrl: process.env.CADCAMFUN_URL!,
headers: { authorization: `Bearer ${process.env.CADCAMFUN_TOKEN}` },
})
// no input
const result = await client.misc.desktopProjects() curl
curl --request GET "${CADCAMFUN_URL}/api/desktop/projects" \
--header "Authorization: Bearer ${CADCAMFUN_TOKEN}" Essayez-le
misc.desktopCreateProject Nécessite Authorization: Bearer <token>.
{ name?: unknown | null description?: string | null organization_id?: string | null is_public?: boolean | null }
201 objet application/json
{ success: true data: { id: string name: string description: string | null owner_id: string organization_id: string | null is_public: boolean created_at: string updated_at: string } message: string }
400 DesktopBadRequestEncoded application/json
DesktopBadRequestEncoded
401 UnauthorizedEncoded application/json
UnauthorizedEncoded
409 DesktopConflictEncoded application/json
DesktopConflictEncoded
500 DesktopInternalEncoded application/json
DesktopInternalEncoded
Exemple de SDK
import { CadCam } from "@cadcamfun/api/sdk"
const client = CadCam.make({
baseUrl: process.env.CADCAMFUN_URL!,
headers: { authorization: `Bearer ${process.env.CADCAMFUN_TOKEN}` },
})
// MiscDesktopCreateProjectInput
const result = await client.misc.desktopCreateProject({
name: null,
description: "",
organization_id: "",
is_public: false
}) curl
curl --request POST "${CADCAMFUN_URL}/api/desktop/projects" \
--header "Authorization: Bearer ${CADCAMFUN_TOKEN}" \
--header "Content-Type: application/json" \
--data-binary @request.json Essayez-le
/api/desktop/user
misc.desktopUserByEmail Nécessite Authorization: Bearer <token>.
| Nom | Dans | Taper | Requis |
|---|---|---|---|
| requête | chaîne | null | facultatif |
200 objet application/json
{ success: true data: { id: string name: string | null email: string | null image: string | null created_at: string updated_at: string } message: string }
400 DesktopBadRequestEncoded application/json
DesktopBadRequestEncoded
401 UnauthorizedEncoded application/json
UnauthorizedEncoded
404 DesktopNotFoundEncoded application/json
DesktopNotFoundEncoded
500 DesktopInternalEncoded application/json
DesktopInternalEncoded
Exemple de réponse capturé · 400
{
"_tag": "DesktopBadRequest",
"success": false,
"error": "Email parameter is required"
} Exemple de SDK
import { CadCam } from "@cadcamfun/api/sdk"
const client = CadCam.make({
baseUrl: process.env.CADCAMFUN_URL!,
headers: { authorization: `Bearer ${process.env.CADCAMFUN_TOKEN}` },
})
// MiscDesktopUserByEmailInput
const result = await client.misc.desktopUserByEmail({}) curl
curl --request GET "${CADCAMFUN_URL}/api/desktop/user/by-email" \
--header "Authorization: Bearer ${CADCAMFUN_TOKEN}" Essayez-le
/api/projects/tracked
misc.trackedGet Nécessite Authorization: Bearer <token>.
| Nom | Dans | Taper | Requis |
|---|---|---|---|
| identifiant | chemin | chaîne | requis |
200 objet application/json
{ id: string name: string description: string | null createdAt: string updatedAt: string ownerId: string organizationId: string | null isPublic: boolean owner: { id: string name: string | null email: string | null } organization: { id: string name: string } | null _count: { drawings: number | "Infinity" | "-Infinity" | "NaN" components: number | "Infinity" | "-Infinity" | "NaN" } }
400 BadRequestEncoded application/json
BadRequestEncoded
401 UnauthorizedEncoded application/json
UnauthorizedEncoded
404 NotFoundEncoded application/json
NotFoundEncoded
500 InternalErrorEncoded application/json
InternalErrorEncoded
Exemple de SDK
import { CadCam } from "@cadcamfun/api/sdk"
const client = CadCam.make({
baseUrl: process.env.CADCAMFUN_URL!,
headers: { authorization: `Bearer ${process.env.CADCAMFUN_TOKEN}` },
})
// MiscTrackedGetInput
const result = await client.misc.trackedGet({
id: "<id>"
}) curl
curl --request GET "${CADCAMFUN_URL}/api/projects/tracked/<id>" \
--header "Authorization: Bearer ${CADCAMFUN_TOKEN}" Essayez-le
misc.trackedUpdate Nécessite Authorization: Bearer <token>.
| Nom | Dans | Taper | Requis |
|---|---|---|---|
| identifiant | chemin | chaîne | requis |
{ name?: string | null description?: string | null organizationId?: string | null }
200 objet application/json
{ id: string name: string description: string | null createdAt: string updatedAt: string ownerId: string organizationId: string | null isPublic: boolean owner: { id: string name: string | null email: string | null } organization: { id: string name: string } | null _count: { drawings: number | "Infinity" | "-Infinity" | "NaN" components: number | "Infinity" | "-Infinity" | "NaN" } }
400 BadRequestEncoded application/json
BadRequestEncoded
401 UnauthorizedEncoded application/json
UnauthorizedEncoded
403 ForbiddenEncoded application/json
ForbiddenEncoded
404 NotFoundEncoded application/json
NotFoundEncoded
500 InternalErrorEncoded application/json
InternalErrorEncoded
Exemple de SDK
import { CadCam } from "@cadcamfun/api/sdk"
const client = CadCam.make({
baseUrl: process.env.CADCAMFUN_URL!,
headers: { authorization: `Bearer ${process.env.CADCAMFUN_TOKEN}` },
})
// MiscTrackedUpdateInput
const result = await client.misc.trackedUpdate({
id: "<id>",
name: "",
description: "",
organizationId: ""
}) curl
curl --request PUT "${CADCAMFUN_URL}/api/projects/tracked/<id>" \
--header "Authorization: Bearer ${CADCAMFUN_TOKEN}" \
--header "Content-Type: application/json" \
--data-binary @request.json Essayez-le
misc.trackedRemove Nécessite Authorization: Bearer <token>.
| Nom | Dans | Taper | Requis |
|---|---|---|---|
| identifiant | chemin | chaîne | requis |
200 objet application/json
{ message: string }
400 BadRequestEncoded application/json
BadRequestEncoded
401 UnauthorizedEncoded application/json
UnauthorizedEncoded
403 ForbiddenEncoded application/json
ForbiddenEncoded
404 NotFoundEncoded application/json
NotFoundEncoded
500 InternalErrorEncoded application/json
InternalErrorEncoded
Exemple de SDK
import { CadCam } from "@cadcamfun/api/sdk"
const client = CadCam.make({
baseUrl: process.env.CADCAMFUN_URL!,
headers: { authorization: `Bearer ${process.env.CADCAMFUN_TOKEN}` },
})
// MiscTrackedRemoveInput
const result = await client.misc.trackedRemove({
id: "<id>"
}) curl
curl --request DELETE "${CADCAMFUN_URL}/api/projects/tracked/<id>" \
--header "Authorization: Bearer ${CADCAMFUN_TOKEN}" Essayez-le
Schémas
Schémas nommés accessibles à partir des paramètres, des corps et des réponses de ce groupe. UN ? marque un champ facultatif ; | null marque un champ qui peut être présent avec une valeur nulle.
BadRequestEncoded{ _tag: "BadRequest" message: string }
DesktopBadRequestEncoded{ _tag: "DesktopBadRequest" success: false error: string }
DesktopConflictEncoded{ _tag: "DesktopConflict" success: false error: string }
DesktopInternalEncoded{ _tag: "DesktopInternal" success: false error: string }
DesktopNotFoundEncoded{ _tag: "DesktopNotFound" success: false error: string }
ForbiddenEncoded{ _tag: "Forbidden" message: string }
InternalErrorEncoded{ _tag: "InternalError" message: string }
NotFoundEncoded{ _tag: "NotFound" message: string }
NotifyBadRequestEncoded{ _tag: "NotifyBadRequest" success: false error: string }
NotifyInternalEncoded{ _tag: "NotifyInternal" success: false error: string }
Appel à ce groupe
Les identifiants d'opération ont la forme misc.<name>. Le SDK Promise généré (@cadcamfun/api/sdk) expose la plupart d'entre eux comme client.<namespace>.<method>(input), où input est un objet plat composé de paramètres de chemin et de champs de corps ; L'exemple de SDK de chaque carte montre l'accesseur exact et le type d'entrée. Les téléchargements en plusieurs parties, les réponses binaires ou JavaScript et les webhooks bruts ne sont pas générés ; ces cartes montrent fetch à la place.
import { CadCam, ClientError } from "@cadcamfun/api/sdk"
const client = CadCam.make({
baseUrl: process.env.CADCAMFUN_URL!,
headers: { authorization: `Bearer ${process.env.CADCAMFUN_TOKEN}` },
})
try {
await client.projects.list()
} catch (error) {
if (error instanceof ClientError) {
// Transport | UnexpectedStatus | UnsupportedContentType | MalformedResponse | SseEventTooLarge
} else {
// a declared error body: switch on error._tag
}
} Dépannage
| Symptôme | Cause probable | Réparer |
|---|---|---|
| 401 à chaque appel | Jeton d'un lancement précédent, ou manquant Bearer préfixe | Envoyer Authorization: Bearer <token> avec le jeton avec lequel le sidecar a été démarré. |
| 400 avant que quoi que ce soit se produise | Le corps ou le paramètre ne correspond pas au schéma | Comparez la charge utile avec le schéma de demande sur la carte. |
| 403 ou 404 sur un enregistrement visible ailleurs | Le compte intérimaire diffère | Envoyez le droit x-session-token, ou utilisez le profil local propriétaire de l'enregistrement. |
| 409 | État conflictuel, tel qu'un nom en double ou un chef de succursale obsolète | Relisez la ressource et réessayez avec les données actuelles. |
| Essayez, il est écrit "bloqué par CORS" | Les documents sont servis à partir d'une origine sans bouclage | Exécutez la documentation localement ou copiez la demande en tant que curl. |
| Connexion rejetée | Le sidecar a redémarré sur un nouveau port | Lire le port du nouveau ready ligne. |