OpenSlides/docs/interfaces/datastore-service.txt
FinnStutzenstein f889985326 interface specs
2020-01-20 12:14:36 +01:00

201 lines
5.1 KiB
Plaintext

# 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: {
<fqid>: Object
};
user_id: number;
locked_fields: {
<fqid>: Position;
<CollectionField>: Position;
}
}
Interface CreateEvent {
fqid: Fqid;
data: {
<field>: Value;
}
}
Interface UpdateEvent {
fqfields: {
<fqfield>: 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<Model>;
/**
* 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<Model>;
/**
* 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<Model>[];
/**
* Analog zu `getMany`, gibt jedoch auch gelöschte Instanzen zurück.
*
* @throws ModelDoesNotExist
*/
getManyWithDeleted(collection: Collection, ids: Id[], position?: Position, mapped_fields?: Field[]): Partial<Model>[];
// 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<Model>[];
/**
* 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<Model>[];
/**
* Wie `getAll`, gibt jedoch nur gelöschte Modelle wieder.
*
* @throws MeetingIdNotSpecified()
*/
getAllOnlyDeleted(collection: Collection, meeting_id?: Id, position?: Position, mapped_fields?: Field[]): Partial<Model>[];
/**
* 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<Model>[]
/**
* 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] <op> 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