# Datastore Interface Enum EventType { Create, Update, DeleteField, Delete, Restore, } Exception ModelDoesNotExist(model: Fqid); Exception ModelExist(model: Fqid); Exception ModelNotDeleted(model: Fqid); Exception ModelLocked(model: Fqid | CollectionField); Exception InvalidFormat(); // TODO: Exception MeetingIdNotSpecified(); ## Writer /** * Writes Events into the datastore * * @throws ModelDoesNotExist * @throws ModelExists * @throws ModelLocked * @throws InvalidFormat * @throws ModelNotDeleted */ write(request: WriteRequest): void publishes BulkMetadataUpdate Interface WriteRequest { events: (CreateEvent | RestoreEvent | UpdateEvent | DeleteEvent)[]; information: { : Object }; user_id: number; locked_fields: { : Position; : Position; } } Interface CreateEvent { fqid: Fqid; data: { : Value; } } Interface UpdateEvent { fqfields: { : Value; } } Interface RestoreEvent { fqid: Fqid; } Interface DeleteEvent { fqid: Fqid; } Event FieldUpdatedEvent on topic FieldUpdatedTopic { created: Fqid[]; deleted: Fqid[]; updated: Fqfield[]; } ## Reader /** Common Parameters: * - position: Optionsl, if given reads the data to this position. * - mapped_fields: List of fields, that should onl be present in the response. * TODO: * - meeting_id: Für Modelle außer Nutzer, Gremium, Veranstaltung und Config * Ist eine Angabe verpflichtend. Dies beschränkt die Nutzung * auf eine spezifische Veranstaltung. * * Alle Operationen fügen `meta:position` und `meta:deleted` an. */ /** * Returns a model. Deleted models are not returned (and handled as a ModelDiesNotExit) * * @throws ModelDoesNotExist */ get(model: Fqid, position?: Position, mapped_fields?: fields[]): Partial; /** * Analogous to `get`, but also finds deleted models (see `meta_deleted` in the model) * * @throws ModelDoesNotExist */ getWithDeleted(model: Fqid, position?: Position, mapped_fields?: Field[]): Partial; /** * Gibt mehrere Modellinstanzen aus dem Eventstore zur aktuellen Position * zurück. Gelöschte Instanzen werden nicht zurückgegeben. * * @throws ModelDoesNotExist */ getMany(collection: Collection, ids: Id[], position?: Position, mapped_fields?: Field[]): Partial[]; /** * Analog zu `getMany`, gibt jedoch auch gelöschte Instanzen zurück. * * @throws ModelDoesNotExist */ getManyWithDeleted(collection: Collection, ids: Id[], position?: Position, mapped_fields?: Field[]): Partial[]; // Shortcuts for `filter*` without a filter /** * Gibt alle Modelle einer Collection zurück. Die Veranstaltungsid ist zwingend (s.o.) * für einige Collections. Gibt keine gelöscheten Elemente aus. * * @throws MeetingIdNotSpecified() */ getAll(collection: Collection, meeting_id?: Id, position?: Position, mapped_fields?: Field[]): Partial[]; /** * Wie `getAll`, gibt gelöschte und nicht-gelöschte Modelle wieder. * * @throws MeetingIdNotSpecified() */ getAllWithDeleted(collection: Collection, meeting_id?: Id, position?: Position, mapped_fields?: Field[]): Partial[]; /** * Wie `getAll`, gibt jedoch nur gelöschte Modelle wieder. * * @throws MeetingIdNotSpecified() */ getAllOnlyDeleted(collection: Collection, meeting_id?: Id, position?: Position, mapped_fields?: Field[]): Partial[]; /** * Gibt alle Modelle einer Collection (möglicherweise Veranstaltungsspezifisch) * wieder, die dem filter-Ausdruck genügen. Für Filtermöglichkeiten: siehe unten. * * @throws MeetingIdNotSpecified() */ filter(collection: Collection, meeting_id?: Id, filter: Filter, position?: Position, mapped_fields?: Field[]): Partial[] /** * Siehe `filter`. Gibt zurück, ob mindestens ein Modell gefunden wurde. * * @throws MeetingIdNotSpecified() */ exists(collection: Collection, meeting_id?: Id, filter: Filter, position?: Position): {exists: boolean; position: Position;} /** * Siehe `filter`. Gibt die Anzahl an Modellen zurück. * * @throws MeetingIdNotSpecified() */ count(collection: Collection, meeting_id?: Id, filter: Filter, position?: Position): {count: number; position: Position;} /** * Führt einfache Min-Max-Aggregation über numerische Felder aus. * * @throws MeetingIdNotSpecified() * @throws AggregationOperationInvalid(operand, value) */ aggregate(collection: Collection, meeting_id?: Id, filter: Filter, aggregate: Aggregate, position?: Position): Value Type Filter = And | Or | Not | FilterOperator /** * Das eigentliche Filter-predikat. M[field] ist der Wert des Feldes des * betrachteten Modells. Für alle Operatoren ist das * Prädikat wahr, wenn `M[field] value` wahr ist. */ Interface FilterOperator { field: Field; value: Value | null; operator: '==' | '!=' | '<' | '>' | '>=' | '<='; } Interface Not { not: Filter; } Interface And { and: Filter[]; } Interface Or { or: Filter[]; } Interface Aggregate { field: Field; type: 'min' | 'max'; } /** * Gibt n sequentielle Ids für die gegebene Collection zurück. */ getId(collection: Collection, n: number): Id