# `/_/NAMESPACE/COLLECTION`

Dieser Endpoint ermöglicht Interaktionen mit den Collectionen, die flexible Strukturen zur Organisation und Kategorisierung von Daten darstellen. Sie können einen Collectioneintrag abrufen, aktualisieren, erstellen und löschen. Jede Collection wird durch einen eindeutigen Namespace und Namen identifiziert.

## GET /{namespace}/{collection}

Diese Anforderung ruft alle Einträge einer bestimmten Collection ab. Sie nimmt den Namespace und den Namen der Collection sowie optionale API-Parameter für die Anpassung der Anfrage als Parameter an.

### Antwort

Die Antwort ist ein Objekt mit folgenden Eigenschaften:

-   `data`: Ein Array von CollectionEntry Objekten.

-   `count`: Die Gesamtzahl der Einträge.

```ts
interface Collection {
    name: string
    meta?: CollectionMeta
    permissions?: {
        public?: CollectionPermission
        user?: CollectionPermission
        [token: string]: CollectionPermission
    }
    projections?: {
        [projectionName: string]: {
            select: {
                [field: string]: 1 | 0
            }
        }
    }
    fields: CollectionField[]
}
```

## GET /{namespace}/{collection}/{id}

Diese Anforderung ruft einen bestimmten Eintrag in einer Collection ab. Sie nimmt den Namespace und Namen der Collection sowie die ID des abzurufenden Eintrags als Parameter an.

### Anforderungsparameter

-   `id`: Die ID des abzurufenden Eintrags.

### Antwort

Die Antwort ist das entsprechende CollectionEntry Objekt.

## PUT /{namespace}/{collection}/{id}

Diese Anforderung aktualisiert die Daten eines vorhandenen Eintrags in einer Collection. Sie nimmt den Namespace und den Namen der Collection, die ID des zu aktualisierenden Eintrags und ein Änderungssatz-Objekt, das die zu aktualisierenden Daten enthält, als Parameter an.

### Anforderungsparameter

    id: Die ID des zu aktualisierenden Eintrags.

    data: Ein Änderungssatz-Objekt, das die zu aktualisierenden Daten enthält.

### Antwort

Die Antwort ist das aktualisierte CollectionEntry Objekt.

## POST /{namespace}/{collection}

Diese Anforderung erstellt einen neuen Eintrag in einer Collection. Sie nimmt den Namespace und den Namen der Collection und ein Datenobjekt, das die Informationen des neuen Eintrags enthält, als Parameter an. Optional kann eine Funktion für den Fortschritt des Uploads übergeben werden.

### Anforderungsparameter

-   `data`: Ein Datenobjekt, das die Informationen des neuen Eintrags enthält.

### Antwort

Die Antwort ist das neu erstellte CollectionEntry Objekt.

## DELETE /{namespace}/{collection}/{id}

Diese Anforderung löscht einen vorhandenen Eintrag in einer Collection. Sie nimmt den Namespace und den Namen der Collection und die ID des zu löschenden Eintrags als Parameter an.

### Anforderungsparameter

-   `id`: Die ID des zu löschenden Eintrags.

### Antwort

Die Antwort ist ein boolean, das true zurückgibt, wenn das Löschen erfolgreich war.

Jede Collection besteht aus mehreren Feldern (CollectionField), die verschiedene Datenpunkte repräsentieren. Jedes Feld hat einen Namen, einen Typ und ggf. eine Reihe von Subfeldern. Die Metadaten eines Feldes (CollectionFieldMeta) können zusätzliche Informationen über das Feld enthalten, wie z.B. ein Label, Hilfstexte, Widget-Typen, InputProps und mehr.

Eine Collection kann auch Metadaten (CollectionMeta) enthalten, die Informationen über die Collection selbst enthalten.

```ts
interface CollectionNavigation {
    label?: I18Text
    muiIcon?: string
    defaultSort?: {
        field: string
        order?: "ASC" | "DESC" | "MANUALLY"
    }
    defaultImageFilter?: string
    views?: View[]
    filter?: { [key: string]: any }
    defaultCallback?:
        | "edit"
        | "view"
        | {
              eval: string
          }
}

interface CollectionMeta extends CollectionNavigation {
    singleton: boolean
    rowIdentTpl?:
        | string
        | {
              twig: string
          }

    subNavigation?: CollectionNavigation[]

    tablist?: {
        activeTab?: string
        tabs: CollectionMetaTab[]
    }

    [key: string]: any
}

interface CollectionMetaTab {
    name: string
    label: I18Text
    dependsOn?: DependsOn
    subFields: {
        source: string
        name?: string
    }[]
    _resolvedSubFields?: CollectionField[]
    _hide?: boolean
}

interface EntryViewTab {
    name: string
    meta: {
        [key: string]: any
    }
}

interface CollectionPermission {
    methods?: MethodPermission
    filter?: any
    validProjections?: string[]
}

interface CollectionField {
    name: string
    type?: string
    index?: ("single" | "unique")[]
    meta?: CollectionFieldMeta
    subFields?: CollectionField[]
}

type CssWithEval = string | { [key: string]: string | number } | { eval: string }

interface ContainerProps {
    class?: string
    style?: string
    layout?: {
        breakBefore: boolean
        breakAfter: boolean
        size: {
            default: string
            small: string
            large: string
        }
    }
}

interface CollectionFieldMeta {
    source?: string
    label?: I18Text
    helperText?: I18Text
    widget?: string
    valueMap?: {
        [value: "string" | number]: {
            name?: I18Text
            muiIcon?: string
            style?: string
        }
    }
    containerProps?: ContainerProps
    choices?: ArrayFieldChoice[] | EndpointOptions
    filter?: boolean | FilterConfig
    defaultValue?: DefaultValue
    addAllowed?: boolean
    props?: {
        step?: string | number
        [key: string]: string | number | boolean
    }
    inputProps?: {
        step?: string | number
        [key: string]: any
    }
    dependsOn?: DependsOn

    css?: {
        input?: {
            wrapper?: CssWithEval
            element?: CssWithEval
            foreignEntry?: CssWithEval
        }
        view?: {
            wrapper?: CssWithEval
            element?: CssWithEval
            foreignEntry?: CssWithEval
        }
        filter?: {
            wrapper?: CssWithEval
            element?: CssWithEval
            foreignEntry?: CssWithEval
        }
    }
    folding?: {
        unfolded?: boolean
        previewFolded?:
            | string
            | {
                  eval: string
                  raw?: boolean
              }
        previewUnfolded?:
            | string
            | {
                  eval: string
                  raw?: boolean
              }
    }

    [key: string]: any
}
```
