Zum Inhalt springen
CADCAMFUN
Doku

Dokumentation

Analytik

Anwendungsmetriken, aktuelle Aktivitäten, Nutzungsabfragen und Tracking-Anfragen.

Automatisch aus dem Englischen übersetzt. Englisches Original ansehen

Playground

Senden Sie diese Anfragen an Ihren eigenen laufenden Sidecar. Werte bleiben in diesem Browser.

Nicht verbunden
Wie das funktioniert

Der Sidecar lauscht an einem beim Start ausgewählten Loopback-Port und gibt ihn dort aus ready linie; Verwenden Sie diese URL und die CADCAMFUN_TOKEN es wurde damit begonnen. Anfragen gehen direkt von dieser Seite an diese Adresse.

Der Sidecar sendet CORS-Header nur an die Tauri-Ursprünge und an http://localhost oder http://127.0.0.1 auf jedem Port. Von den gehosteten Dokumenten aus blockiert der Browser die Antwort, also führen Sie die Dokumente lokal aus (bun run dev in packages/web), um den Spielplatz zu nutzen, oder kopieren Sie die Anfrage als Curl. Um zu experimentieren, ohne echte Daten zu berühren, starten Sie den Sidecar mit CADCAMFUN_DATA_DIR zeigte auf ein Wegwerfverzeichnis – siehe die API-Komplettlösung.

Operationen

10 Endpunkte in der analytics gruppe, generiert aus der eigenen Gruppe des Sidecars OpenAPI-Dokument. Geschützte Operationen dauern Authorization: Bearer $CADCAMFUN_TOKEN; sehen authentifizierung. Verhalten und Grenzen sind in das Subsystemhandbuch.

erhalten /api/analytics/system-metrics analytics.systemMetrics
erhalten /api/analytics analytics.index
erhalten /api/analytics/dashboard-data analytics.dashboardData
post /api/analytics/log-view analytics.logView
erhalten /api/analytics/recent-activity analytics.recentActivity
erhalten /api/analytics/user-history analytics.userHistory
erhalten /api/analytics/user-metrics analytics.userMetrics
erhalten /api/analytics/user-usage analytics.userUsage
löschen /api/analytics/user-usage analytics.clearUserUsage
post /api/analytics/track analytics.track
Analysevorgänge in 3D Zum Orbit ziehen · zum Zoomen scrollen · zum Schwenken mit der rechten Maustaste ziehen
Ein Block pro Vorgang (10), gestapelt pro Ressourcenabschnitt dieser Seite und nach Methode gefärbt: grün GET, orange POST, blau PUT, violett PATCH, rot DELETE. Wird zur Erstellungszeit aus dem OpenAPI-Dokument generiert.

/api/analytics/system-metrics

erhalten /api/analytics/system-metrics # analytics.systemMetrics

Erfordert Authorization: Bearer <token>.

Antworten
200 objekt application/json
{
  cpuUsage: number | "Infinity" | "-Infinity" | "NaN"
  memoryUsage: number | "Infinity" | "-Infinity" | "NaN"
  storageUsed: number | "Infinity" | "-Infinity" | "NaN"
  networkLatency: number | "Infinity" | "-Infinity" | "NaN"
  activeConnections: number | "Infinity" | "-Infinity" | "NaN"
  cacheHitRatio: number | "Infinity" | "-Infinity" | "NaN"
  errorRate: number | "Infinity" | "-Infinity" | "NaN"
  responseTime: number | "Infinity" | "-Infinity" | "NaN"
}
401 UnauthorizedEncoded application/json
UnauthorizedEncoded
500 KeyedInternalEncoded application/json
KeyedInternalEncoded
Beispielantwort erfasst · 200
GET /api/analytics/system-metrics
{
  "cpuUsage": 6,
  "memoryUsage": 79,
  "storageUsed": 72,
  "networkLatency": 15,
  "activeConnections": 145,
  "cacheHitRatio": 98,
  "errorRate": 0.04,
  "responseTime": 52
}
SDK-Beispiel
analytics.systemMetrics
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.analytics.systemMetrics()
curl
GET /api/analytics/system-metrics
curl --request GET "${CADCAMFUN_URL}/api/analytics/system-metrics" \
  --header "Authorization: Bearer ${CADCAMFUN_TOKEN}"
Probieren Sie es aus

/api/analytics

erhalten /api/analytics # analytics.index

Erfordert Authorization: Bearer <token>.

Parameter
NameInTypErforderlich
startDate abfrage zeichenfolge | null optional
endDate abfrage zeichenfolge | null optional
itemType abfrage zeichenfolge | zeichenfolge[] | null optional
aktion abfrage zeichenfolge | zeichenfolge[] | null optional
groupBy abfrage zeichenfolge | null optional
userFilter abfrage zeichenfolge | zeichenfolge[] | null optional
Antworten
200 objekt application/json
{
  success: true
  data: {
    countByType: Array<{
      itemType: string
      _count: number | "Infinity" | "-Infinity" | "NaN"
    }>
    countByAction: Array<{
      action: string
      _count: number | "Infinity" | "-Infinity" | "NaN"
    }>
  }
  isAdmin: boolean
  filters: unknown
}
401 UnauthorizedEncoded application/json
UnauthorizedEncoded
500 AnalyticsFailureEncoded application/json
AnalyticsFailureEncoded
Beispielantwort erfasst · 200
GET /api/analytics
{
  "success": true,
  "data": {
    "countByType": [],
    "countByAction": []
  },
  "isAdmin": true,
  "filters": {
    "groupBy": "day"
  }
}
SDK-Beispiel
analytics.index
import { CadCam } from "@cadcamfun/api/sdk"

const client = CadCam.make({
  baseUrl: process.env.CADCAMFUN_URL!,
  headers: { authorization: `Bearer ${process.env.CADCAMFUN_TOKEN}` },
})

// AnalyticsIndexInput
const result = await client.analytics.index({})
curl
GET /api/analytics
curl --request GET "${CADCAMFUN_URL}/api/analytics" \
  --header "Authorization: Bearer ${CADCAMFUN_TOKEN}"
Probieren Sie es aus

/api/analytics/dashboard-data

erhalten /api/analytics/dashboard-data # analytics.dashboardData

Erfordert Authorization: Bearer <token>.

Antworten
200 objekt application/json
{
  components: {
    total: number | "Infinity" | "-Infinity" | "NaN"
    trend: number | "Infinity" | "-Infinity" | "NaN"
    recentActivity: number | "Infinity" | "-Infinity" | "NaN"
  }
  projects: {
    total: number | "Infinity" | "-Infinity" | "NaN"
    trend: number | "Infinity" | "-Infinity" | "NaN"
    activeProjects: number | "Infinity" | "-Infinity" | "NaN"
  }
  tools: {
    total: number | "Infinity" | "-Infinity" | "NaN"
    trend: number | "Infinity" | "-Infinity" | "NaN"
    mostUsed: string
  }
  materials: {
    total: number | "Infinity" | "-Infinity" | "NaN"
    trend: number | "Infinity" | "-Infinity" | "NaN"
    lowStock: number | "Infinity" | "-Infinity" | "NaN"
  }
}
401 UnauthorizedEncoded application/json
UnauthorizedEncoded
500 KeyedInternalEncoded application/json
KeyedInternalEncoded
Beispielantwort erfasst · 200
GET /api/analytics/dashboard-data
{
  "components": {
    "total": 0,
    "trend": 0,
    "recentActivity": 0
  },
  "projects": {
    "total": 0,
    "trend": 0,
    "activeProjects": 0
  },
  "tools": {
    "total": 0,
    "trend": 0,
    "mostUsed": "No tools used yet"
  },
  "materials": {
    "total": 0,
    "trend": 0,
    "lowStock": 0
  }
}
SDK-Beispiel
analytics.dashboardData
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.analytics.dashboardData()
curl
GET /api/analytics/dashboard-data
curl --request GET "${CADCAMFUN_URL}/api/analytics/dashboard-data" \
  --header "Authorization: Bearer ${CADCAMFUN_TOKEN}"
Probieren Sie es aus

/api/analytics/log-view

post /api/analytics/log-view # analytics.logView

Erfordert Authorization: Bearer <token>.

Anforderungstext · erforderlich · application/json
{
  path?: string | null
  query?: unknown | null
}
Antworten
200 objekt application/json
{
  success: true
}
401 UnauthorizedEncoded application/json
UnauthorizedEncoded
500 InternalErrorEncoded application/json
InternalErrorEncoded
SDK-Beispiel
analytics.logView
import { CadCam } from "@cadcamfun/api/sdk"

const client = CadCam.make({
  baseUrl: process.env.CADCAMFUN_URL!,
  headers: { authorization: `Bearer ${process.env.CADCAMFUN_TOKEN}` },
})

// AnalyticsLogViewInput
const result = await client.analytics.logView({
  path: "",
  query: null
})
curl
POST /api/analytics/log-view
curl --request POST "${CADCAMFUN_URL}/api/analytics/log-view" \
  --header "Authorization: Bearer ${CADCAMFUN_TOKEN}" \
  --header "Content-Type: application/json" \
  --data-binary @request.json
Probieren Sie es aus

/api/analytics/recent-activity

erhalten /api/analytics/recent-activity # analytics.recentActivity

Erfordert Authorization: Bearer <token>.

Parameter
NameInTypErforderlich
limit abfrage zeichenfolge | null optional
Antworten
200 Array<Objekt> application/json
Array<{
  id: string
  type: string
  action: string
  itemName: string
  timestamp: string
  userId: string
  userName: string
}>
401 UnauthorizedEncoded application/json
UnauthorizedEncoded
500 KeyedInternalEncoded application/json
KeyedInternalEncoded
Beispielantwort erfasst · 200
GET /api/analytics/recent-activity
[]
SDK-Beispiel
analytics.recentActivity
import { CadCam } from "@cadcamfun/api/sdk"

const client = CadCam.make({
  baseUrl: process.env.CADCAMFUN_URL!,
  headers: { authorization: `Bearer ${process.env.CADCAMFUN_TOKEN}` },
})

// AnalyticsRecentActivityInput
const result = await client.analytics.recentActivity({})
curl
GET /api/analytics/recent-activity
curl --request GET "${CADCAMFUN_URL}/api/analytics/recent-activity" \
  --header "Authorization: Bearer ${CADCAMFUN_TOKEN}"
Probieren Sie es aus

/api/analytics/user-history

erhalten /api/analytics/user-history # analytics.userHistory

Erfordert Authorization: Bearer <token>.

Parameter
NameInTypErforderlich
limit abfrage zeichenfolge | null optional
versetzt abfrage zeichenfolge | null optional
itemType abfrage zeichenfolge | zeichenfolge[] | null optional
aktion abfrage zeichenfolge | zeichenfolge[] | null optional
startDate abfrage zeichenfolge | null optional
endDate abfrage zeichenfolge | null optional
Antworten
200 objekt application/json
{
  logs: unknown[]
  total: number | "Infinity" | "-Infinity" | "NaN"
}
401 UnauthorizedEncoded application/json
UnauthorizedEncoded
500 InternalErrorEncoded application/json
InternalErrorEncoded
Beispielantwort erfasst · 200
GET /api/analytics/user-history
{
  "logs": [],
  "total": 0
}
SDK-Beispiel
analytics.userHistory
import { CadCam } from "@cadcamfun/api/sdk"

const client = CadCam.make({
  baseUrl: process.env.CADCAMFUN_URL!,
  headers: { authorization: `Bearer ${process.env.CADCAMFUN_TOKEN}` },
})

// AnalyticsUserHistoryInput
const result = await client.analytics.userHistory({})
curl
GET /api/analytics/user-history
curl --request GET "${CADCAMFUN_URL}/api/analytics/user-history" \
  --header "Authorization: Bearer ${CADCAMFUN_TOKEN}"
Probieren Sie es aus

/api/analytics/user-metrics

erhalten /api/analytics/user-metrics # analytics.userMetrics

Erfordert Authorization: Bearer <token>.

Parameter
NameInTypErforderlich
startDate abfrage zeichenfolge | null optional
endDate abfrage zeichenfolge | null optional
groupBy abfrage zeichenfolge | null optional
metrisch abfrage zeichenfolge | null optional
Antworten
200 objekt application/json
{
  summary: {
    totalAiRequests: number | "Infinity" | "-Infinity" | "NaN"
    totalCadDrawings: number | "Infinity" | "-Infinity" | "NaN"
    totalStorageUsage: number | "Infinity" | "-Infinity" | "NaN"
    totalProjects: number | "Infinity" | "-Infinity" | "NaN"
    totalComponents: number | "Infinity" | "-Infinity" | "NaN"
    totalToolpaths: number | "Infinity" | "-Infinity" | "NaN"
    totalActivityCount?: number | "Infinity" | "-Infinity" | "NaN" | null
  }
  chartData: Array<{
    [key: string]: string | number | "Infinity" | "-Infinity" | "NaN"
  }>
}
400 AnalyticsKeyedBadRequestEncoded application/json
AnalyticsKeyedBadRequestEncoded
401 UnauthorizedEncoded application/json
UnauthorizedEncoded
500 KeyedInternalEncoded application/json
KeyedInternalEncoded
Beispielantwort erfasst · 200
GET /api/analytics/user-metrics
{
  "summary": {
    "totalAiRequests": 0,
    "totalCadDrawings": 0,
    "totalStorageUsage": 0,
    "totalProjects": 0,
    "totalComponents": 0,
    "totalToolpaths": 0,
    "totalActivityCount": 0
  },
  "chartData": [
    {
      "date": "2026-09-15",
      "activityCount": 0,
      "toolpathsGenerated": 0,
      "connections": 0,
      "programRuns": 0,
      "aiRequests": 0,
      "cadDrawings": 0,
      "storageUsage": 0,
      "projects": 0,
      "components": 0,
      "toolpaths": 0
    },
    {
      "date": "2026-09-16",
      "activityCount": 0,
      "toolpathsGenerated": 0,
      "connections": 0,
      "programRuns": 0,
      "aiRequests": 0,
      "cadDrawings": 0,
      "storageUsage": 0,
      "projects": 0,
      "components": 0,
      "toolpaths": 0
    },
    {
      "date": "2026-09-17",
      "activityCount": 0,
      "toolpathsGenerated": 0,
      "connections": 0,
      "programRuns": 0,
      "aiRequests": 0,
      "cadDrawings": 0,
      "storageUsage": 0,
      "projects": 0,
      "components": 0,
      "toolpaths": 0
    },
    {
      "date": "2026-09-18",
      "activityCount": 0,
      "toolpathsGenerated": 0,
      "connections": 0,
      "programRuns": 0,
      "aiRequests": 0,
      "cadDrawings": 0,
      "storageUsage": 0,
      "projects": 0,
      "components": 0,
      "toolpaths": 0
    },
    {
      "date": "2026-09-19",
      "activityCount": 0,
      "toolpathsGenerated": 0,
      "connections": 0,
      "programRuns": 0,
      "aiRequests": 0,
      "cadDrawings": 0,
      "storageUsage": 0,
      "projects": 0,
      "components": 0,
      "toolpaths": 0
    },
    {
      "date": "2026-09-20",
      "activityCount": 0,
      "toolpathsGenerated": 0,
      "connections": 0,
      "programRuns": 0,
      "aiRequests": 0,
      "cadDrawings": 0,
      "storageUsage": 0,
      "projects": 0,
      "components": 0,
      "toolpaths": 0
    },
    {
      "date": "2026-09-21",
      "activityCount": 0,
      "toolpathsGenerated": 0,
      "connections": 0,
      "programRuns": 0,
      "aiRequests": 0,
      "cadDrawings": 0,
      "storageUsage": 0,
      "projects": 0,
      "components": 0,
      "toolpaths": 0
    },
    {
      "date": "2026-09-22",
      "activityCount": 0,
      "toolpathsGenerated": 0,
      "connections": 0,
      "programRuns": 0,
      "aiRequests": 0,
      "cadDrawings": 0,
      "storageUsage": 0,
      "projects": 0,
      "components": 0,
      "toolpaths": 0
    },
    {
      "
…
SDK-Beispiel
analytics.userMetrics
import { CadCam } from "@cadcamfun/api/sdk"

const client = CadCam.make({
  baseUrl: process.env.CADCAMFUN_URL!,
  headers: { authorization: `Bearer ${process.env.CADCAMFUN_TOKEN}` },
})

// AnalyticsUserMetricsInput
const result = await client.analytics.userMetrics({})
curl
GET /api/analytics/user-metrics
curl --request GET "${CADCAMFUN_URL}/api/analytics/user-metrics" \
  --header "Authorization: Bearer ${CADCAMFUN_TOKEN}"
Probieren Sie es aus

/api/analytics/user-usage

erhalten /api/analytics/user-usage # analytics.userUsage

Erfordert Authorization: Bearer <token>.

Parameter
NameInTypErforderlich
userId abfrage zeichenfolge | null optional
startDate abfrage zeichenfolge | null optional
endDate abfrage zeichenfolge | null optional
zeitraum abfrage zeichenfolge | null optional
Antworten
200 objekt application/json
{
  summary?: unknown | null
  breakdown?: unknown | null
  users?: unknown[] | null
  systemStats?: unknown | null
}
401 UnauthorizedEncoded application/json
UnauthorizedEncoded
403 AnalyticsKeyedForbiddenEncoded application/json
AnalyticsKeyedForbiddenEncoded
500 KeyedInternalEncoded application/json
KeyedInternalEncoded
Beispielantwort erfasst · 200
GET /api/analytics/user-usage
{
  "users": [],
  "systemStats": {
    "totalUsers": 0,
    "totalTokens": 0,
    "totalCost": 0,
    "totalRequests": 0,
    "averageCostPerUser": 0,
    "topSpendingUsers": [],
    "modelDistribution": {}
  }
}
SDK-Beispiel
analytics.userUsage
import { CadCam } from "@cadcamfun/api/sdk"

const client = CadCam.make({
  baseUrl: process.env.CADCAMFUN_URL!,
  headers: { authorization: `Bearer ${process.env.CADCAMFUN_TOKEN}` },
})

// AnalyticsUserUsageInput
const result = await client.analytics.userUsage({})
curl
GET /api/analytics/user-usage
curl --request GET "${CADCAMFUN_URL}/api/analytics/user-usage" \
  --header "Authorization: Bearer ${CADCAMFUN_TOKEN}"
Probieren Sie es aus
löschen /api/analytics/user-usage # analytics.clearUserUsage

Erfordert Authorization: Bearer <token>.

Antworten
200 objekt application/json
{
  message: string
}
401 UnauthorizedEncoded application/json
UnauthorizedEncoded
500 KeyedInternalEncoded application/json
KeyedInternalEncoded
SDK-Beispiel
analytics.clearUserUsage
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.analytics.clearUserUsage()
curl
LÖSCHEN /api/analytics/user-usage
curl --request DELETE "${CADCAMFUN_URL}/api/analytics/user-usage" \
  --header "Authorization: Bearer ${CADCAMFUN_TOKEN}"
Probieren Sie es aus

/api/analytics/track

post /api/analytics/track # analytics.track

Erfordert Authorization: Bearer <token>.

Anforderungstext · erforderlich · application/json
{
  itemId?: string | null
  itemType?: string | null
  action?: string | null
  details?: unknown | null
}
Antworten
200 objekt application/json
{
  success: true
}
400 BadRequestEncoded application/json
BadRequestEncoded
401 UnauthorizedEncoded application/json
UnauthorizedEncoded
500 InternalErrorEncoded application/json
InternalErrorEncoded
SDK-Beispiel
analytics.track
import { CadCam } from "@cadcamfun/api/sdk"

const client = CadCam.make({
  baseUrl: process.env.CADCAMFUN_URL!,
  headers: { authorization: `Bearer ${process.env.CADCAMFUN_TOKEN}` },
})

// AnalyticsTrackInput
const result = await client.analytics.track({
  itemId: "",
  itemType: "",
  action: "",
  details: null
})
curl
POST /api/analytics/track
curl --request POST "${CADCAMFUN_URL}/api/analytics/track" \
  --header "Authorization: Bearer ${CADCAMFUN_TOKEN}" \
  --header "Content-Type: application/json" \
  --data-binary @request.json
Probieren Sie es aus

Schemata

Benannte Schemata, die über die Parameter, Körper und Antworten dieser Gruppe erreichbar sind. A ? markiert ein optionales Feld; | null markiert ein Feld, das möglicherweise mit einem Nullwert vorhanden ist.

AnalyticsFailureEncoded
{
  _tag: "AnalyticsFailure"
  success: false
  message: string
}
AnalyticsKeyedBadRequestEncoded
{
  _tag: "AnalyticsKeyedBadRequest"
  error: string
}
AnalyticsKeyedForbiddenEncoded
{
  _tag: "AnalyticsKeyedForbidden"
  error: string
}
BadRequestEncoded
{
  _tag: "BadRequest"
  message: string
}
InternalErrorEncoded
{
  _tag: "InternalError"
  message: string
}
KeyedInternalEncoded
{
  _tag: "KeyedInternal"
  error: string
}
UnauthorizedEncoded
{
  _tag: "Unauthorized"
  message: string
}

Ich rufe diese Gruppe an

Vorgangs-IDs haben die Form analytics.<name>. Das generierte Promise SDK (@cadcamfun/api/sdk) entlarvt die meisten von ihnen als client.<namespace>.<method>(input), wo input ist ein flaches Objekt aus Pfadparametern und Körperfeldern; Das SDK-Beispiel jeder Karte zeigt den genauen Zugriffs- und Eingabetyp. Mehrteilige Uploads, Binär- oder JavaScript-Antworten und unformatierte Webhooks werden nicht generiert; Diese Karten zeigen fetch stattdessen.

Fehler vom Promise SDK
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
  }
}

Fehlerbehebung

SymptomWahrscheinliche UrsacheFix
401 bei jedem AufrufToken von einem früheren Start oder fehlt Bearer präfixSchicken Authorization: Bearer <token> mit dem Token wurde der Sidecar gestartet.
400 bevor etwas passiertText oder Parameter stimmen nicht mit dem Schema übereinVergleichen Sie die Nutzlast mit dem Anforderungsschema auf der Karte.
403 oder 404 bei einem Datensatz, den du woanders siehstDas amtierende Konto ist unterschiedlichSchicken Sie das Richtige x-session-token, oder verwenden Sie das lokale Profil, das Eigentümer des Datensatzes ist.
409Widersprüchlicher Status, z. B. ein doppelter Name oder ein veralteter ZweigkopfLesen Sie die Ressource erneut und versuchen Sie es erneut mit den aktuellen Daten.
Versuchen Sie es mit der Meldung „Von CORS blockiert“.Die Dokumente werden von einem Nicht-Loopback-Ursprung bereitgestelltFühren Sie die Dokumente lokal aus oder kopieren Sie die Anfrage als Curl.
Verbindung abgelehntDer Sidecar wurde an einem neuen Port neu gestartetLesen Sie den Port neu ready Zeile.