mirror of
https://gitlab.com/openstapps/openstapps.git
synced 2026-01-17 23:22:54 +00:00
Compare commits
27 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
9fb0a7c885 | ||
|
|
b5e0b76c24 | ||
|
|
a2f44762f9 | ||
|
|
d46abbe29b | ||
|
|
4986042428 | ||
|
|
3242411768 | ||
|
|
37e5f6c490 | ||
|
|
623ed613a9 | ||
|
|
fd994e2c08 | ||
|
|
8dc40dbb00 | ||
|
|
c4e30c5fdd | ||
|
|
81887315f8 | ||
|
|
55687daca9 | ||
|
|
2bf65a9086 | ||
|
|
d9347ece05 | ||
|
|
acdca2f554 | ||
|
|
67868e9eb8 | ||
|
|
bc00f62117 | ||
|
|
75e833d841 | ||
|
|
a97805172c | ||
|
|
c8bda2eae7 | ||
|
|
1e9f36c4be | ||
|
|
6da9d73477 | ||
|
|
bbe4fcac42 | ||
|
|
5d1e79d487 | ||
|
|
7532a9bb62 | ||
|
|
a4db76ec36 |
@@ -1,4 +1,3 @@
|
||||
# EditorConfig helps developers define and maintain consistent coding styles between different editors and IDEs
|
||||
# editorconfig.org
|
||||
|
||||
root = true
|
||||
@@ -7,11 +6,10 @@ root = true
|
||||
indent_style = space
|
||||
indent_size = 2
|
||||
|
||||
# We recommend you to keep these unchanged
|
||||
end_of_line = lf
|
||||
charset = utf-8
|
||||
trim_trailing_whitespace = true
|
||||
insert_final_newline = true
|
||||
|
||||
[*.md]
|
||||
trim_trailing_whitespace = false
|
||||
trim_trailing_whitespace = false
|
||||
|
||||
29
.gitignore
vendored
29
.gitignore
vendored
@@ -20,7 +20,7 @@ coverage
|
||||
# nyc test coverage
|
||||
.nyc_output
|
||||
|
||||
# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
|
||||
# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
|
||||
.grunt
|
||||
|
||||
# Bower dependency directory (https://bower.io/)
|
||||
@@ -29,14 +29,14 @@ bower_components
|
||||
# node-waf configuration
|
||||
.lock-wscript
|
||||
|
||||
# Compiled binary addons (http://nodejs.org/api/addons.html)
|
||||
# Compiled binary addons (https://nodejs.org/api/addons.html)
|
||||
build/Release
|
||||
|
||||
# Dependency directories
|
||||
node_modules/
|
||||
jspm_packages/
|
||||
|
||||
# Typescript v1 declaration files
|
||||
# TypeScript v1 declaration files
|
||||
typings/
|
||||
|
||||
# Optional npm cache directory
|
||||
@@ -57,6 +57,29 @@ typings/
|
||||
# dotenv environment variables file
|
||||
.env
|
||||
|
||||
# parcel-bundler cache (https://parceljs.org/)
|
||||
.cache
|
||||
|
||||
# next.js build output
|
||||
.next
|
||||
|
||||
# nuxt.js build output
|
||||
.nuxt
|
||||
|
||||
# vuepress build output
|
||||
.vuepress/dist
|
||||
|
||||
# Serverless directories
|
||||
.serverless/
|
||||
|
||||
# FuseBox cache
|
||||
.fusebox/
|
||||
|
||||
#DynamoDB Local files
|
||||
.dynamodb/
|
||||
|
||||
########## end of https://github.com/github/gitignore/blob/master/Node.gitignore
|
||||
|
||||
# ignore ide files
|
||||
.idea
|
||||
.vscode
|
||||
|
||||
@@ -28,6 +28,16 @@ audit:
|
||||
stage: test
|
||||
script:
|
||||
- npm audit
|
||||
allow_failure: true
|
||||
except:
|
||||
- schedules
|
||||
|
||||
scheduled-audit:
|
||||
stage: test
|
||||
script:
|
||||
- npm audit
|
||||
only:
|
||||
- schedules
|
||||
|
||||
test:
|
||||
dependencies:
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
# Ignore all files/folders by default
|
||||
# See https://stackoverflow.com/a/29932318
|
||||
/*
|
||||
|
||||
# Execept this files/folders
|
||||
!docs
|
||||
# Except these files/folders
|
||||
!lib
|
||||
lib/tsconfig.tsbuildinfo
|
||||
!LICENSE
|
||||
!package.json
|
||||
!package-lock.json
|
||||
!README.md
|
||||
!src
|
||||
!test/resources/
|
||||
|
||||
54
CHANGELOG.md
54
CHANGELOG.md
@@ -1,3 +1,57 @@
|
||||
# [0.15.0](https://gitlab.com/openstapps/core/compare/v0.14.0...v0.15.0) (2019-04-09)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* change SCThingMeta getInstance() return value ([4986042](https://gitlab.com/openstapps/core/commit/4986042))
|
||||
* resolve issues with things that can be offered ([623ed61](https://gitlab.com/openstapps/core/commit/623ed61)), closes [#41](https://gitlab.com/openstapps/core/issues/41)
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* provide context based search ([3242411](https://gitlab.com/openstapps/core/commit/3242411))
|
||||
|
||||
|
||||
|
||||
# [0.14.0](https://gitlab.com/openstapps/core/compare/v0.13.0...v0.14.0) (2019-04-03)
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* add model for plugin register route ([8188731](https://gitlab.com/openstapps/core/commit/8188731))
|
||||
|
||||
|
||||
|
||||
# [0.13.0](https://gitlab.com/openstapps/core/compare/v0.12.0...v0.13.0) (2019-04-02)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* correct isThing guard ([67868e9](https://gitlab.com/openstapps/core/commit/67868e9))
|
||||
* update tslint dependencies ([bbe4fca](https://gitlab.com/openstapps/core/commit/bbe4fca))
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* add conditional "maps" for associated types ([c8bda2e](https://gitlab.com/openstapps/core/commit/c8bda2e)), closes [#50](https://gitlab.com/openstapps/core/issues/50)
|
||||
* provide sample JSON files with the package ([5d1e79d](https://gitlab.com/openstapps/core/commit/5d1e79d)), closes [#46](https://gitlab.com/openstapps/core/issues/46)
|
||||
|
||||
|
||||
|
||||
# [0.12.0](https://gitlab.com/openstapps/core/compare/v0.11.0...v0.12.0) (2019-03-14)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* add todo to SCThingsWithoutDiff and SCClasses ([9a49442](https://gitlab.com/openstapps/core/commit/9a49442)), closes [#39](https://gitlab.com/openstapps/core/issues/39)
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* add SCThingTranslator class. move functionality accordingly ([90e3d22](https://gitlab.com/openstapps/core/commit/90e3d22))
|
||||
|
||||
|
||||
|
||||
# [0.11.0](https://gitlab.com/openstapps/core/compare/v0.10.0...v0.11.0) (2019-02-21)
|
||||
|
||||
|
||||
|
||||
1806
package-lock.json
generated
1806
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
30
package.json
30
package.json
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openstapps/core",
|
||||
"version": "0.12.0",
|
||||
"version": "0.16.0",
|
||||
"description": "StAppsCore - Generalized model of data",
|
||||
"keywords": [
|
||||
"Model",
|
||||
@@ -17,7 +17,7 @@
|
||||
"build": "npm run tslint && npm run compile && npm run pack && npm run schema && npm run documentation",
|
||||
"changelog": "conventional-changelog -p angular -i CHANGELOG.md -s -r 0 && git add CHANGELOG.md && git commit -m 'docs: update changelog'",
|
||||
"check-configuration": "openstapps-configuration",
|
||||
"compile": "tsc",
|
||||
"compile": "rimraf lib && tsc",
|
||||
"documentation": "typedoc --name \"@openstapps/core\" --includeDeclarations --mode modules --out docs --readme README.md --listInvalidSymbolLinks lib",
|
||||
"pack": "openstapps-core-tools pack",
|
||||
"prepublishOnly": "npm ci && npm run build",
|
||||
@@ -25,7 +25,7 @@
|
||||
"test": "nyc mocha --require ts-node/register --ui mocha-typescript test/*.spec.ts",
|
||||
"tslint": "tslint 'src/**/*.ts'"
|
||||
},
|
||||
"author": "Karl-Philipp Wulfert <krlwlfrt@gmail.com",
|
||||
"author": "Karl-Philipp Wulfert <krlwlfrt@gmail.com>",
|
||||
"contributors": [
|
||||
"Anselm Stordeur <anselmstordeur@gmail.com>",
|
||||
"Jovan Krunic <jovan.krunic@gmail.com>",
|
||||
@@ -39,29 +39,27 @@
|
||||
"@types/json-patch": "0.0.30",
|
||||
"json-patch": "0.7.0",
|
||||
"jsonschema": "1.2.4",
|
||||
"ts-optchain": "0.1.2"
|
||||
"ts-optchain": "0.1.3"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@openstapps/configuration": "0.7.0",
|
||||
"@openstapps/core-tools": "0.2.1",
|
||||
"@openstapps/logger": "0.0.3",
|
||||
"@openstapps/configuration": "0.11.0",
|
||||
"@openstapps/core-tools": "0.5.1",
|
||||
"@openstapps/logger": "0.0.5",
|
||||
"@types/chai": "4.1.7",
|
||||
"@types/humanize-string": "1.0.0",
|
||||
"@types/node": "11.9.4",
|
||||
"@types/node": "10.14.4",
|
||||
"@types/rimraf": "2.0.2",
|
||||
"async-pool-native": "0.1.0",
|
||||
"chai": "4.2.0",
|
||||
"commander": "2.19.0",
|
||||
"conventional-changelog-cli": "2.0.11",
|
||||
"humanize-string": "1.0.2",
|
||||
"mocha": "5.2.0",
|
||||
"commander": "2.20.0",
|
||||
"conventional-changelog-cli": "2.0.12",
|
||||
"mocha": "6.1.3",
|
||||
"mocha-typescript": "1.1.17",
|
||||
"nyc": "13.3.0",
|
||||
"rimraf": "2.6.3",
|
||||
"ts-node": "8.0.2",
|
||||
"tslint": "5.12.1",
|
||||
"ts-node": "8.1.0",
|
||||
"tslint": "5.15.0",
|
||||
"typedoc": "0.14.2",
|
||||
"typescript": "3.3.3"
|
||||
"typescript": "3.4.3"
|
||||
},
|
||||
"nyc": {
|
||||
"check-coverage": true,
|
||||
|
||||
@@ -13,29 +13,29 @@
|
||||
* this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
import {SCThingType} from './Thing';
|
||||
import {SCAcademicEvent, SCAcademicEventMeta} from './things/AcademicEvent';
|
||||
import {SCArticle, SCArticleMeta} from './things/Article';
|
||||
import {SCBook, SCBookMeta} from './things/Book';
|
||||
import {SCBuilding, SCBuildingMeta} from './things/Building';
|
||||
import {SCCatalog, SCCatalogMeta} from './things/Catalog';
|
||||
import {SCCourseOfStudies, SCCourseOfStudiesMeta} from './things/CourseOfStudies';
|
||||
import {SCDateSeries, SCDateSeriesMeta} from './things/DateSeries';
|
||||
import {SCDiff, SCDiffMeta} from './things/Diff';
|
||||
import {SCDish, SCDishMeta} from './things/Dish';
|
||||
import {SCFavorite, SCFavoriteMeta} from './things/Favorite';
|
||||
import {SCFloor, SCFloorMeta} from './things/Floor';
|
||||
import {SCMessage, SCMessageMeta} from './things/Message';
|
||||
import {SCOrganization, SCOrganizationMeta} from './things/Organization';
|
||||
import {SCPerson, SCPersonMeta} from './things/Person';
|
||||
import {SCPointOfInterest, SCPointOfInterestMeta} from './things/PointOfInterest';
|
||||
import {SCRoom, SCRoomMeta} from './things/Room';
|
||||
import {SCSemester, SCSemesterMeta} from './things/Semester';
|
||||
import {SCSetting, SCSettingMeta} from './things/Setting';
|
||||
import {SCSportCourse, SCSportCourseMeta} from './things/SportCourse';
|
||||
import {SCTicket, SCTicketMeta} from './things/Ticket';
|
||||
import {SCToDo, SCToDoMeta} from './things/ToDo';
|
||||
import {SCTour, SCTourMeta} from './things/Tour';
|
||||
import {SCVideo, SCVideoMeta} from './things/Video';
|
||||
import {SCAcademicEvent, SCAcademicEventMeta, SCAcademicEventWithoutReferences} from './things/AcademicEvent';
|
||||
import {SCArticle, SCArticleMeta, SCArticleWithoutReferences} from './things/Article';
|
||||
import {SCBook, SCBookMeta, SCBookWithoutReferences} from './things/Book';
|
||||
import {SCBuilding, SCBuildingMeta, SCBuildingWithoutReferences} from './things/Building';
|
||||
import {SCCatalog, SCCatalogMeta, SCCatalogWithoutReferences} from './things/Catalog';
|
||||
import {SCCourseOfStudies, SCCourseOfStudiesMeta, SCCourseOfStudiesWithoutReferences} from './things/CourseOfStudies';
|
||||
import {SCDateSeries, SCDateSeriesMeta, SCDateSeriesWithoutReferences} from './things/DateSeries';
|
||||
import {SCDiff, SCDiffMeta, SCDiffWithoutReferences} from './things/Diff';
|
||||
import {SCDish, SCDishMeta, SCDishWithoutReferences} from './things/Dish';
|
||||
import {SCFavorite, SCFavoriteMeta, SCFavoriteWithoutReferences} from './things/Favorite';
|
||||
import {SCFloor, SCFloorMeta, SCFloorWithoutReferences} from './things/Floor';
|
||||
import {SCMessage, SCMessageMeta, SCMessageWithoutReferences} from './things/Message';
|
||||
import {SCOrganization, SCOrganizationMeta, SCOrganizationWithoutReferences} from './things/Organization';
|
||||
import {SCPerson, SCPersonMeta, SCPersonWithoutReferences} from './things/Person';
|
||||
import {SCPointOfInterest, SCPointOfInterestMeta, SCPointOfInterestWithoutReferences} from './things/PointOfInterest';
|
||||
import {SCRoom, SCRoomMeta, SCRoomWithoutReferences} from './things/Room';
|
||||
import {SCSemester, SCSemesterMeta, SCSemesterWithoutReferences} from './things/Semester';
|
||||
import {SCSetting, SCSettingMeta, SCSettingWithoutReferences} from './things/Setting';
|
||||
import {SCSportCourse, SCSportCourseMeta, SCSportCourseWithoutReferences} from './things/SportCourse';
|
||||
import {SCTicket, SCTicketMeta, SCTicketWithoutReferences} from './things/Ticket';
|
||||
import {SCToDo, SCToDoMeta, SCToDoWithoutReferences} from './things/ToDo';
|
||||
import {SCTour, SCTourMeta, SCTourWithoutReferences} from './things/Tour';
|
||||
import {SCVideo, SCVideoMeta, SCVideoWithoutReferences} from './things/Video';
|
||||
|
||||
/* tslint:disable:variable-name */
|
||||
/**
|
||||
@@ -103,3 +103,61 @@ export type SCThings =
|
||||
* A field of a thing
|
||||
*/
|
||||
export type SCThingsField = keyof SCThings | string;
|
||||
|
||||
/**
|
||||
* Thing without references for a thing
|
||||
*/
|
||||
export type SCAssociatedThingWithoutReferences<THING extends SCThings> =
|
||||
THING extends SCAcademicEvent ? SCAcademicEventWithoutReferences :
|
||||
THING extends SCArticle ? SCArticleWithoutReferences :
|
||||
THING extends SCBook ? SCBookWithoutReferences :
|
||||
THING extends SCBuilding ? SCBuildingWithoutReferences :
|
||||
THING extends SCCatalog ? SCCatalogWithoutReferences :
|
||||
THING extends SCCourseOfStudies ? SCCourseOfStudiesWithoutReferences :
|
||||
THING extends SCDateSeries ? SCDateSeriesWithoutReferences :
|
||||
THING extends SCDiff ? SCDiffWithoutReferences :
|
||||
THING extends SCDish ? SCDishWithoutReferences :
|
||||
THING extends SCFavorite ? SCFavoriteWithoutReferences :
|
||||
THING extends SCFloor ? SCFloorWithoutReferences :
|
||||
THING extends SCMessage ? SCMessageWithoutReferences :
|
||||
THING extends SCOrganization ? SCOrganizationWithoutReferences :
|
||||
THING extends SCPerson ? SCPersonWithoutReferences :
|
||||
THING extends SCPointOfInterest ? SCPointOfInterestWithoutReferences :
|
||||
THING extends SCRoom ? SCRoomWithoutReferences :
|
||||
THING extends SCSemester ? SCSemesterWithoutReferences :
|
||||
THING extends SCSetting ? SCSettingWithoutReferences :
|
||||
THING extends SCSportCourse ? SCSportCourseWithoutReferences :
|
||||
THING extends SCTicket ? SCTicketWithoutReferences :
|
||||
THING extends SCToDo ? SCToDoWithoutReferences :
|
||||
THING extends SCTour ? SCTourWithoutReferences :
|
||||
THING extends SCVideo ? SCVideoWithoutReferences :
|
||||
never;
|
||||
|
||||
/**
|
||||
* Thing for a thing without references
|
||||
*/
|
||||
export type SCAssociatedThing<THING extends SCThings> =
|
||||
THING extends SCAcademicEventWithoutReferences ? SCAcademicEvent :
|
||||
THING extends SCArticleWithoutReferences ? SCArticle :
|
||||
THING extends SCBookWithoutReferences ? SCBook :
|
||||
THING extends SCBuildingWithoutReferences ? SCBuilding :
|
||||
THING extends SCCatalogWithoutReferences ? SCCatalog :
|
||||
THING extends SCCourseOfStudiesWithoutReferences ? SCCourseOfStudies :
|
||||
THING extends SCDateSeriesWithoutReferences ? SCDateSeries :
|
||||
THING extends SCDiffWithoutReferences ? SCDiff :
|
||||
THING extends SCDishWithoutReferences ? SCDish :
|
||||
THING extends SCFavoriteWithoutReferences ? SCFavorite :
|
||||
THING extends SCFloorWithoutReferences ? SCFloor :
|
||||
THING extends SCMessageWithoutReferences ? SCMessage :
|
||||
THING extends SCOrganizationWithoutReferences ? SCOrganization :
|
||||
THING extends SCPersonWithoutReferences ? SCPerson :
|
||||
THING extends SCPointOfInterestWithoutReferences ? SCPointOfInterest :
|
||||
THING extends SCRoomWithoutReferences ? SCRoom :
|
||||
THING extends SCSemesterWithoutReferences ? SCSemester :
|
||||
THING extends SCSettingWithoutReferences ? SCSetting :
|
||||
THING extends SCSportCourseWithoutReferences ? SCSportCourse :
|
||||
THING extends SCTicketWithoutReferences ? SCTicket :
|
||||
THING extends SCToDoWithoutReferences ? SCToDo :
|
||||
THING extends SCTourWithoutReferences ? SCTour :
|
||||
THING extends SCVideoWithoutReferences ? SCVideo :
|
||||
never;
|
||||
|
||||
@@ -222,7 +222,7 @@ export class SCThingMeta implements SCMetaTranslations<SCThing> {
|
||||
/**
|
||||
* Set type definiton for singleton instance
|
||||
*/
|
||||
protected static _instance: SCThingMeta;
|
||||
protected static _instance = new Map<string, unknown>();
|
||||
|
||||
/**
|
||||
* Translations of fields
|
||||
@@ -268,8 +268,10 @@ export class SCThingMeta implements SCMetaTranslations<SCThing> {
|
||||
* Function to retrieve typed singleton instance
|
||||
*/
|
||||
public static getInstance<T extends SCThingMeta>(): T {
|
||||
const typedThis = this as any as typeof SCThingMeta;
|
||||
return (typedThis._instance || (typedThis._instance = new this())) as T;
|
||||
if (!this._instance.has(this.name)) {
|
||||
this._instance.set(this.name, new this());
|
||||
}
|
||||
return this._instance.get(this.name) as T;
|
||||
}
|
||||
|
||||
protected constructor() {}
|
||||
|
||||
@@ -17,14 +17,19 @@ import {SCThing, SCThingUserOrigin} from '../Thing';
|
||||
/**
|
||||
* An encapsulation of the data (e.g. a thing) that is saved, which provides additional information.
|
||||
*/
|
||||
export interface SCSaveableThing<T extends SCThing> extends SCThing {
|
||||
/**
|
||||
* The contained data
|
||||
*/
|
||||
data: T;
|
||||
|
||||
export interface SCSaveableThingWithoutReferences extends SCThing {
|
||||
/**
|
||||
* Type of the origin
|
||||
*/
|
||||
origin: SCThingUserOrigin;
|
||||
}
|
||||
|
||||
/**
|
||||
* An encapsulation of the data (e.g. a thing) that is saved, which provides additional information.
|
||||
*/
|
||||
export interface SCSaveableThing<T extends SCThing> extends SCSaveableThingWithoutReferences {
|
||||
/**
|
||||
* The contained data
|
||||
*/
|
||||
data: T;
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 2018-2019 StApps
|
||||
* Copyright (C) 2018, 2019 StApps
|
||||
* This program is free software: you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the Free
|
||||
* Software Foundation, version 3.
|
||||
@@ -16,8 +16,8 @@ import {SCThing, SCThingTranslatableProperties} from '../Thing';
|
||||
import {SCOrganizationWithoutReferences} from '../things/Organization';
|
||||
import {SCPersonWithoutReferences} from '../things/Person';
|
||||
import {SCTranslations} from '../types/i18n';
|
||||
import {SCInPlace} from '../types/Places';
|
||||
import {SCISO8601Date} from '../types/Time';
|
||||
import {SCInPlace} from './../types/Places';
|
||||
|
||||
/**
|
||||
* Default price without distinction
|
||||
@@ -50,7 +50,17 @@ export interface SCAcademicPriceGroup extends SCPriceGroup {
|
||||
}
|
||||
|
||||
/**
|
||||
* A thing without references that has a price tag
|
||||
* A thing without references that can be offered
|
||||
*/
|
||||
export interface SCThingThatCanBeOfferedWithoutReferences extends SCThing {
|
||||
/**
|
||||
* Translations of a thing that can be offered
|
||||
*/
|
||||
translations?: SCTranslations<SCThingThatCanBeOfferedTranslatableProperties>;
|
||||
}
|
||||
|
||||
/**
|
||||
* A thing that can be offered
|
||||
*/
|
||||
export interface SCThingThatCanBeOffered<T extends SCPriceGroup>
|
||||
extends SCThing {
|
||||
@@ -58,11 +68,6 @@ export interface SCThingThatCanBeOffered<T extends SCPriceGroup>
|
||||
* List of offers for that thing
|
||||
*/
|
||||
offers?: Array<SCThingThatCanBeOfferedOffer<T>>;
|
||||
|
||||
/**
|
||||
* Translations of a thing that can be offered
|
||||
*/
|
||||
translations?: SCTranslations<SCThingThatCanBeOfferedTranslatableProperties>;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -42,6 +42,7 @@ export abstract class SCError implements SCErrorResponse {
|
||||
|
||||
/**
|
||||
* Instatiate an SCError
|
||||
*
|
||||
* @param name Name of the error
|
||||
* @param message Message of the error
|
||||
* @param statusCode HTTP status code to return this error with
|
||||
@@ -66,6 +67,7 @@ export class SCValidationErrorResponse extends SCError {
|
||||
|
||||
/**
|
||||
* Create a SCValidationErrorResponse
|
||||
*
|
||||
* @param errors List of validation errors
|
||||
* @param stack Set to true if a stack trace should be created
|
||||
*/
|
||||
@@ -81,6 +83,7 @@ export class SCValidationErrorResponse extends SCError {
|
||||
export class SCUnsupportedMediaTypeErrorResponse extends SCError {
|
||||
/**
|
||||
* Create a SCUnsupportedMediaTypeErrorResponse
|
||||
*
|
||||
* @param stack Set to true if a stack trace should be created
|
||||
*/
|
||||
constructor(stack?: boolean) {
|
||||
@@ -94,6 +97,7 @@ export class SCUnsupportedMediaTypeErrorResponse extends SCError {
|
||||
export class SCMethodNotAllowedErrorResponse extends SCError {
|
||||
/**
|
||||
* Create a SCMethodNotAllowedErrorResponse
|
||||
*
|
||||
* @param stack Set to true if a stack trace should be created
|
||||
*/
|
||||
constructor(stack?: boolean) {
|
||||
@@ -120,6 +124,7 @@ export class SCRequestBodyTooLargeErrorResponse extends SCError {
|
||||
export class SCTooManyRequestsErrorResponse extends SCError {
|
||||
/**
|
||||
* Create a SCTooManyRequestsErrorResponse
|
||||
*
|
||||
* @param stack Set to true if a stack trace should be created
|
||||
*/
|
||||
constructor(stack?: boolean) {
|
||||
@@ -133,6 +138,7 @@ export class SCTooManyRequestsErrorResponse extends SCError {
|
||||
export class SCNotFoundErrorResponse extends SCError {
|
||||
/**
|
||||
* Create a SCNotFoundErrorResponse
|
||||
*
|
||||
* @param stack Set to true if a stack trace should be created
|
||||
*/
|
||||
constructor(stack?: boolean) {
|
||||
@@ -140,12 +146,80 @@ export class SCNotFoundErrorResponse extends SCError {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* An error that is returned when the request is in the right format, but contains parameters that are invalid or not
|
||||
* acceptable.
|
||||
*/
|
||||
export class SCParametersNotAcceptable extends SCError {
|
||||
/**
|
||||
* Create a ParametersNotAcceptable
|
||||
*
|
||||
* @param message contains more details to what you did wrong
|
||||
* @param stack Set to true if a stack trace should be created
|
||||
*/
|
||||
constructor(message: string, stack?: boolean) {
|
||||
super('ParametersNotAcceptable', message, 406, stack);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* An error that is returned when a plugin with the same name is already registered, to prevent two copies of a plugin
|
||||
* running at the same time.
|
||||
* This usually indicates that there is more than one instance a plugin running.
|
||||
*/
|
||||
export class SCPluginAlreadyRegisteredErrorResponse extends SCError {
|
||||
/**
|
||||
* Create a PluginAlreadyRegisteredError
|
||||
*
|
||||
* @param message contains potential differences in other parameters outside of the name
|
||||
* @param stack Set to true if a stack trace should be created
|
||||
*/
|
||||
constructor(message: string, stack?: boolean) {
|
||||
super('PluginRegisteringFailedError', message, 409, stack);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* An error that is returned whenever there is an unexpected error while creating a plugin
|
||||
*/
|
||||
export class SCPluginRegisteringFailedErrorResponse extends SCError {
|
||||
/**
|
||||
* Create a PluginRegisteringFailedError
|
||||
*
|
||||
* @param message Describes what went wrong wile registering the plugin
|
||||
* @param stack Set to true if a stack trace should be created
|
||||
*/
|
||||
constructor(message: string, stack?: boolean) {
|
||||
super('PluginRegisteringFailedError', message, 500, stack);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* An error that is returned whenever there is a plugin request that is supposed to register a route, that is already
|
||||
* registered
|
||||
* This usually indicates that two **different** plugins use the same route.
|
||||
*/
|
||||
export class SCPluginRouteAlreadyRegisteredErrorResponse extends SCError {
|
||||
/**
|
||||
* Create a PluginRouteAlreadyRegisteredError
|
||||
*
|
||||
* @param registeredName The name by the plugin that has already registered the route previously
|
||||
* @param registeredUrl The URL by the plugin that has already registered the route previously
|
||||
* @param stack Set to true if a stack trace should be created
|
||||
*/
|
||||
constructor(registeredName: string, registeredUrl: string, stack?: boolean) {
|
||||
super('PluginRouteAlreadyRegisteredError',
|
||||
`Already registered by "${registeredName}" under URL "${registeredUrl}".`, 409, stack);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* An error that is returned whenever there is a syntax error
|
||||
*/
|
||||
export class SCSyntaxErrorResponse extends SCError {
|
||||
/**
|
||||
* Create a SyntaxError
|
||||
*
|
||||
* @param message Describes the syntax error
|
||||
* @param stack Set to true if a stack trace should be created
|
||||
*/
|
||||
@@ -165,6 +239,7 @@ export class SCInternalServerErrorResponse extends SCError {
|
||||
|
||||
/**
|
||||
* Create a SCInternalServerErrorResponse
|
||||
*
|
||||
* @param err Internal server error
|
||||
* @param stack Set to true if a stack trace should be created
|
||||
* and the internal server error should be displayed to the client
|
||||
|
||||
100
src/core/protocol/routes/plugin/PluginRegisterRequest.ts
Normal file
100
src/core/protocol/routes/plugin/PluginRegisterRequest.ts
Normal file
@@ -0,0 +1,100 @@
|
||||
/*
|
||||
* Copyright (C) 2019 StApps
|
||||
* This program is free software: you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the Free
|
||||
* Software Foundation, version 3.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
* more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
import {Schema} from 'jsonschema';
|
||||
import {SCAbstractRoute, SCRouteHttpVerbs} from '../../../Route';
|
||||
import {
|
||||
SCInternalServerErrorResponse,
|
||||
SCMethodNotAllowedErrorResponse, SCParametersNotAcceptable,
|
||||
SCPluginAlreadyRegisteredErrorResponse,
|
||||
SCPluginRegisteringFailedErrorResponse,
|
||||
SCPluginRouteAlreadyRegisteredErrorResponse,
|
||||
SCRequestBodyTooLargeErrorResponse,
|
||||
SCSyntaxErrorResponse,
|
||||
} from '../../errors/ErrorResponse';
|
||||
|
||||
/**
|
||||
* Plugin register request
|
||||
*
|
||||
* @validatable
|
||||
*/
|
||||
export type SCPluginRegisterRequest = AddPlugin | RemovePlugin;
|
||||
interface AddPlugin {
|
||||
/**
|
||||
* The desired action, so whether the plugin should be added or removed
|
||||
*/
|
||||
action: 'add';
|
||||
|
||||
/**
|
||||
* The address of the plugin
|
||||
*/
|
||||
address: string;
|
||||
|
||||
/**
|
||||
* The name of the plugin
|
||||
* Just for debugging purposes, to more easily identify conflicts.
|
||||
*/
|
||||
name: string;
|
||||
|
||||
/**
|
||||
* How the requests of the plugin looks like, a JSON schema for validation
|
||||
*/
|
||||
pluginRequestSchema: Schema;
|
||||
|
||||
/**
|
||||
* How the responses of the plugin looks like, a JSON schema for validation
|
||||
*/
|
||||
pluginResponseSchema: Schema;
|
||||
|
||||
/**
|
||||
* The desired route, for example /feedback.
|
||||
*/
|
||||
route: string;
|
||||
}
|
||||
interface RemovePlugin {
|
||||
/**
|
||||
* The desired action, so whether the plugin should be added or removed
|
||||
*/
|
||||
action: 'remove';
|
||||
|
||||
/**
|
||||
* The route of the plugin you want to remove
|
||||
*/
|
||||
route: string;
|
||||
}
|
||||
|
||||
/**
|
||||
* Route to register plugins
|
||||
*/
|
||||
export class SCPluginRegisterRoute extends SCAbstractRoute {
|
||||
constructor() {
|
||||
super();
|
||||
this.errorNames = [
|
||||
SCInternalServerErrorResponse,
|
||||
SCMethodNotAllowedErrorResponse,
|
||||
SCParametersNotAcceptable,
|
||||
SCPluginAlreadyRegisteredErrorResponse,
|
||||
SCPluginRouteAlreadyRegisteredErrorResponse,
|
||||
SCPluginRegisteringFailedErrorResponse,
|
||||
SCPluginRouteAlreadyRegisteredErrorResponse,
|
||||
SCRequestBodyTooLargeErrorResponse,
|
||||
SCSyntaxErrorResponse,
|
||||
];
|
||||
this.method = SCRouteHttpVerbs.POST;
|
||||
this.requestBodyName = 'SCPluginRegisterRequest';
|
||||
this.responseBodyName = 'SCPluginRegisterResponse';
|
||||
this.statusCodeSuccess = 200;
|
||||
this.urlFragment = '/plugin/register';
|
||||
}
|
||||
}
|
||||
26
src/core/protocol/routes/plugin/PluginRegisterResponse.ts
Normal file
26
src/core/protocol/routes/plugin/PluginRegisterResponse.ts
Normal file
@@ -0,0 +1,26 @@
|
||||
/*
|
||||
* Copyright (C) 2019 StApps
|
||||
* This program is free software: you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the Free
|
||||
* Software Foundation, version 3.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
* more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Plugin register response
|
||||
*
|
||||
* @validatable
|
||||
*/
|
||||
export interface SCPluginRegisterResponse {
|
||||
/**
|
||||
* Whether the desired action succeeded or failed (true for success, false if an error occurred)
|
||||
*/
|
||||
success: boolean;
|
||||
}
|
||||
@@ -13,6 +13,7 @@
|
||||
* this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
import {SCAbstractRoute, SCRouteHttpVerbs} from '../../../Route';
|
||||
import {SCSearchContext} from '../../../types/config/Backend';
|
||||
import {SCSearchFilter} from '../../../types/filters/Abstract';
|
||||
import {SCSearchSort} from '../../../types/sorts/Abstract';
|
||||
import {
|
||||
@@ -37,7 +38,12 @@ export interface SCSearchRequest extends SCSearchQuery {
|
||||
*/
|
||||
export interface SCSearchQuery {
|
||||
/**
|
||||
* A filter structure that combines any number of filters with boolean methods ('AND', 'OR', 'NOT')
|
||||
* The context name from where the search query was initiated
|
||||
*/
|
||||
context?: SCSearchContext;
|
||||
|
||||
/**
|
||||
* A filter structure that combines any number of filters with boolean methods ('AND', 'OR', 'NOT')
|
||||
*/
|
||||
filter?: SCSearchFilter;
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 2018 StApps
|
||||
* Copyright (C) 2018, 2019 StApps
|
||||
* This program is free software: you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the Free
|
||||
* Software Foundation, version 3.
|
||||
@@ -13,9 +13,12 @@
|
||||
* this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
import {SCAcademicDegree, SCAcademicDegreeMeta} from '../base/AcademicDegree';
|
||||
import {SCAcademicPriceGroup,
|
||||
SCThingThatCanBeOffered,
|
||||
SCThingThatCanBeOfferedTranslatableProperties} from '../base/ThingThatCanBeOffered';
|
||||
import {
|
||||
SCAcademicPriceGroup,
|
||||
SCThingThatCanBeOffered,
|
||||
SCThingThatCanBeOfferedTranslatableProperties,
|
||||
SCThingThatCanBeOfferedWithoutReferences,
|
||||
} from '../base/ThingThatCanBeOffered';
|
||||
import {SCThingMeta, SCThingType} from '../Thing';
|
||||
import {SCLanguage, SCMetaTranslations, SCTranslations} from '../types/i18n';
|
||||
import {SCDateSeriesWithoutReferences} from './DateSeries';
|
||||
@@ -24,9 +27,8 @@ import {SCOrganization} from './Organization';
|
||||
/**
|
||||
* A course of studies without references
|
||||
*/
|
||||
export interface SCCourseOfStudiesWithoutReferences extends
|
||||
SCAcademicDegree,
|
||||
SCThingThatCanBeOffered<SCAcademicPriceGroup> {
|
||||
export interface SCCourseOfStudiesWithoutReferences extends SCAcademicDegree,
|
||||
SCThingThatCanBeOfferedWithoutReferences {
|
||||
/**
|
||||
* The main language in which the course of studies
|
||||
* is beeing offered
|
||||
@@ -64,14 +66,15 @@ export interface SCCourseOfStudiesWithoutReferences extends
|
||||
*
|
||||
* @validatable
|
||||
*/
|
||||
export interface SCCourseOfStudies extends SCCourseOfStudiesWithoutReferences {
|
||||
export interface SCCourseOfStudies extends SCCourseOfStudiesWithoutReferences,
|
||||
SCThingThatCanBeOffered<SCAcademicPriceGroup> {
|
||||
/**
|
||||
* The department that manages the course of studies
|
||||
*/
|
||||
department: SCOrganization;
|
||||
|
||||
/**
|
||||
* The secretary that administers requests and
|
||||
* The secretary that administers requests and
|
||||
* questions concerning the course of studies
|
||||
*/
|
||||
secretary: SCOrganization;
|
||||
@@ -81,6 +84,11 @@ export interface SCCourseOfStudies extends SCCourseOfStudiesWithoutReferences {
|
||||
*/
|
||||
startDates?: SCDateSeriesWithoutReferences[];
|
||||
|
||||
/**
|
||||
* Translated fields of a dish
|
||||
*/
|
||||
translations?: SCTranslations<SCCourseOfStudiesTranslatableProperties>;
|
||||
|
||||
/**
|
||||
* Type of the course of studies
|
||||
*/
|
||||
@@ -88,7 +96,7 @@ export interface SCCourseOfStudies extends SCCourseOfStudiesWithoutReferences {
|
||||
}
|
||||
|
||||
export interface SCCourseOfStudiesTranslatableProperties
|
||||
extends SCThingThatCanBeOfferedTranslatableProperties {
|
||||
extends SCThingThatCanBeOfferedTranslatableProperties {
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -100,19 +108,19 @@ export class SCCourseOfStudiesMeta extends SCThingMeta implements SCMetaTranslat
|
||||
*/
|
||||
fieldTranslations = {
|
||||
de: {
|
||||
... SCAcademicDegreeMeta.getInstance().fieldTranslations.de,
|
||||
...SCAcademicDegreeMeta.getInstance().fieldTranslations.de,
|
||||
},
|
||||
en: {
|
||||
... SCAcademicDegreeMeta.getInstance().fieldTranslations.en,
|
||||
...SCAcademicDegreeMeta.getInstance().fieldTranslations.en,
|
||||
},
|
||||
};
|
||||
|
||||
/**
|
||||
* Translations of values of fields
|
||||
*/
|
||||
fieldValueTranslations = {
|
||||
fieldValueTranslations = {
|
||||
de: {
|
||||
... SCAcademicDegreeMeta.getInstance().fieldValueTranslations.de,
|
||||
...SCAcademicDegreeMeta.getInstance().fieldValueTranslations.de,
|
||||
modes: {
|
||||
combination: 'Kombinationsstudiengang',
|
||||
dual: 'Dualer Studiengang',
|
||||
@@ -122,7 +130,7 @@ export class SCCourseOfStudiesMeta extends SCThingMeta implements SCMetaTranslat
|
||||
type: 'Studiengang',
|
||||
},
|
||||
en: {
|
||||
... SCAcademicDegreeMeta.getInstance().fieldValueTranslations.en,
|
||||
...SCAcademicDegreeMeta.getInstance().fieldValueTranslations.en,
|
||||
academicDegree: 'Hochschulabschluss',
|
||||
department: 'Fachbereich',
|
||||
major: 'Studienfach',
|
||||
@@ -136,13 +144,13 @@ export class SCCourseOfStudiesMeta extends SCThingMeta implements SCMetaTranslat
|
||||
/**
|
||||
* Types of (german) course of studies modes
|
||||
*/
|
||||
export type SCCourseOfStudiesMode = 'combination' |
|
||||
'dual' |
|
||||
'double-degree' |
|
||||
'standard' ;
|
||||
export type SCCourseOfStudiesMode = 'combination'
|
||||
| 'dual'
|
||||
| 'double-degree'
|
||||
| 'standard' ;
|
||||
|
||||
/**
|
||||
* Types of (german) course of studies time modes
|
||||
*/
|
||||
export type SCCourseOfStudiesTimeMode = 'fulltime' |
|
||||
'parttime' ;
|
||||
export type SCCourseOfStudiesTimeMode = 'fulltime'
|
||||
| 'parttime' ;
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 2018 StApps
|
||||
* Copyright (C) 2018, 2019 StApps
|
||||
* This program is free software: you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the Free
|
||||
* Software Foundation, version 3.
|
||||
@@ -17,6 +17,7 @@ import {
|
||||
SCAcademicPriceGroup,
|
||||
SCThingThatCanBeOffered,
|
||||
SCThingThatCanBeOfferedTranslatableProperties,
|
||||
SCThingThatCanBeOfferedWithoutReferences,
|
||||
} from '../base/ThingThatCanBeOffered';
|
||||
import {SCThingMeta, SCThingType} from '../Thing';
|
||||
import {SCMetaTranslations, SCTranslations} from '../types/i18n';
|
||||
@@ -38,8 +39,7 @@ export interface SCSportCoursePriceGroup extends SCAcademicPriceGroup {
|
||||
/**
|
||||
* A date without references
|
||||
*/
|
||||
export interface SCDateSeriesWithoutReferences
|
||||
extends SCThingThatCanBeOffered<SCSportCoursePriceGroup> {
|
||||
export interface SCDateSeriesWithoutReferences extends SCThingThatCanBeOfferedWithoutReferences {
|
||||
/**
|
||||
* Dates of the date series that are initially planned to be held
|
||||
*/
|
||||
@@ -76,7 +76,9 @@ export interface SCDateSeriesWithoutReferences
|
||||
*
|
||||
* @validatable
|
||||
*/
|
||||
export interface SCDateSeries extends SCDateSeriesWithoutReferences, SCThingInPlace {
|
||||
export interface SCDateSeries extends SCDateSeriesWithoutReferences,
|
||||
SCThingInPlace,
|
||||
SCThingThatCanBeOffered<SCSportCoursePriceGroup> {
|
||||
/**
|
||||
* Event to which the date series belongs
|
||||
*/
|
||||
@@ -108,26 +110,26 @@ export class SCDateSeriesMeta extends SCThingMeta implements SCMetaTranslations<
|
||||
*/
|
||||
fieldTranslations = {
|
||||
de: {
|
||||
... SCThingInPlaceMeta.getInstance().fieldTranslations.de,
|
||||
...SCThingInPlaceMeta.getInstance().fieldTranslations.de,
|
||||
},
|
||||
en: {
|
||||
... SCThingInPlaceMeta.getInstance().fieldTranslations.en,
|
||||
...SCThingInPlaceMeta.getInstance().fieldTranslations.en,
|
||||
},
|
||||
};
|
||||
|
||||
/**
|
||||
* Translations of values of fields
|
||||
*/
|
||||
fieldValueTranslations = {
|
||||
fieldValueTranslations = {
|
||||
de: {
|
||||
... SCThingInPlaceMeta.getInstance().fieldValueTranslations.de,
|
||||
...SCThingInPlaceMeta.getInstance().fieldValueTranslations.de,
|
||||
dates: 'Einzeltermine',
|
||||
duration: 'Dauer',
|
||||
frequency: 'Wiederholung',
|
||||
type: 'Wiederholungreihe',
|
||||
},
|
||||
en: {
|
||||
... SCThingInPlaceMeta.getInstance().fieldValueTranslations.en,
|
||||
...SCThingInPlaceMeta.getInstance().fieldValueTranslations.en,
|
||||
type: SCThingType.DateSeries,
|
||||
},
|
||||
};
|
||||
|
||||
@@ -64,11 +64,6 @@ export interface SCDiff extends SCDiffWithoutReferences {
|
||||
* Meta information about a diff
|
||||
*/
|
||||
export class SCDiffMeta extends SCThingMeta implements SCMetaTranslations<SCDiff> {
|
||||
/**
|
||||
* Set type definiton for singleton instance
|
||||
*/
|
||||
protected static _instance: SCThingMeta;
|
||||
|
||||
/**
|
||||
* Translations of fields
|
||||
*/
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 2018-2019 StApps
|
||||
* Copyright (C) 2018, 2019 StApps
|
||||
* This program is free software: you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the Free
|
||||
* Software Foundation, version 3.
|
||||
@@ -16,6 +16,7 @@ import {
|
||||
SCAcademicPriceGroup,
|
||||
SCThingThatCanBeOffered,
|
||||
SCThingThatCanBeOfferedTranslatableProperties,
|
||||
SCThingThatCanBeOfferedWithoutReferences,
|
||||
} from '../base/ThingThatCanBeOffered';
|
||||
import {
|
||||
SCThingWithCategoriesSpecificValues,
|
||||
@@ -29,12 +30,8 @@ import {SCMetaTranslations, SCTranslations} from '../types/i18n';
|
||||
/**
|
||||
* A dish without references
|
||||
*/
|
||||
export interface SCDishWithoutReferences
|
||||
extends SCThingWithCategoriesWithoutReferences<
|
||||
SCDishCategories,
|
||||
SCThingWithCategoriesSpecificValues
|
||||
>,
|
||||
SCThingThatCanBeOffered<SCAcademicPriceGroup> {
|
||||
export interface SCDishWithoutReferences extends SCThingThatCanBeOfferedWithoutReferences,
|
||||
SCThingWithCategoriesWithoutReferences<SCDishCategories, SCThingWithCategoriesSpecificValues> {
|
||||
/**
|
||||
* Additives of the dish
|
||||
*/
|
||||
@@ -71,7 +68,8 @@ export interface SCDishWithoutReferences
|
||||
*
|
||||
* @validatable
|
||||
*/
|
||||
export interface SCDish extends SCDishWithoutReferences {
|
||||
export interface SCDish extends SCDishWithoutReferences,
|
||||
SCThingThatCanBeOffered<SCAcademicPriceGroup> {
|
||||
/**
|
||||
* Dishes ("Beilagen") that are served with the dish (if only certain supplement dishes can be taken with a dish)
|
||||
*/
|
||||
@@ -173,22 +171,22 @@ export class SCDishMeta extends SCThingMeta implements SCMetaTranslations<SCDish
|
||||
*/
|
||||
fieldTranslations = {
|
||||
de: {
|
||||
... SCThingWithCategoriesWithoutReferencesMeta.getInstance<SCDishCategories,
|
||||
SCThingWithCategoriesSpecificValues>().fieldTranslations.de,
|
||||
...SCThingWithCategoriesWithoutReferencesMeta.getInstance<SCDishCategories,
|
||||
SCThingWithCategoriesSpecificValues>().fieldTranslations.de,
|
||||
},
|
||||
en: {
|
||||
... SCThingWithCategoriesWithoutReferencesMeta.getInstance<SCDishCategories,
|
||||
SCThingWithCategoriesSpecificValues>().fieldTranslations.en,
|
||||
...SCThingWithCategoriesWithoutReferencesMeta.getInstance<SCDishCategories,
|
||||
SCThingWithCategoriesSpecificValues>().fieldTranslations.en,
|
||||
},
|
||||
};
|
||||
|
||||
/**
|
||||
* Translations of values of fields
|
||||
*/
|
||||
fieldValueTranslations = {
|
||||
fieldValueTranslations = {
|
||||
de: {
|
||||
... SCThingWithCategoriesWithoutReferencesMeta.getInstance<SCDishCategories,
|
||||
SCThingWithCategoriesSpecificValues>().fieldValueTranslations.de,
|
||||
...SCThingWithCategoriesWithoutReferencesMeta.getInstance<SCDishCategories,
|
||||
SCThingWithCategoriesSpecificValues>().fieldValueTranslations.de,
|
||||
categories: {
|
||||
appetizer: 'Vorspeise',
|
||||
dessert: 'Nachtisch',
|
||||
@@ -200,8 +198,8 @@ export class SCDishMeta extends SCThingMeta implements SCMetaTranslations<SCDish
|
||||
type: 'Essen',
|
||||
},
|
||||
en: {
|
||||
... SCThingWithCategoriesWithoutReferencesMeta.getInstance<SCDishCategories,
|
||||
SCThingWithCategoriesSpecificValues>().fieldValueTranslations.en,
|
||||
...SCThingWithCategoriesWithoutReferencesMeta.getInstance<SCDishCategories,
|
||||
SCThingWithCategoriesSpecificValues>().fieldValueTranslations.en,
|
||||
type: SCThingType.Dish,
|
||||
},
|
||||
};
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
import {SCSaveableThing} from '../base/SaveableThing';
|
||||
import {SCSaveableThing, SCSaveableThingWithoutReferences} from '../base/SaveableThing';
|
||||
import {SCThingMeta, SCThingType} from '../Thing';
|
||||
import {SCAcademicEventWithoutReferences} from './AcademicEvent';
|
||||
import {SCArticleWithoutReferences} from './Article';
|
||||
@@ -37,6 +37,13 @@ export type SCFavoriteDataTypes = SCAcademicEventWithoutReferences
|
||||
| SCSportCourseWithoutReferences
|
||||
| SCToDoWithoutReferences;
|
||||
|
||||
/**
|
||||
* A favorite without references
|
||||
*/
|
||||
export interface SCFavoriteWithoutReferences extends SCSaveableThingWithoutReferences {
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* A favorite
|
||||
*
|
||||
|
||||
@@ -24,7 +24,11 @@ import {SCThing, SCThingType} from '../Thing';
|
||||
* @param {any} something Something to check
|
||||
*/
|
||||
export function isThing(something: any): something is SCThing {
|
||||
return (something.type && something.type in SCThingType);
|
||||
return (
|
||||
typeof something === 'object'
|
||||
&& typeof something.type === 'string'
|
||||
&& Object.values(SCThingType).indexOf(something.type) >= 0
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -68,11 +72,10 @@ export function isSearchResponse(something: any): something is SCSearchResponse
|
||||
/**
|
||||
* Type guard to check if something is a multi search response
|
||||
*
|
||||
*
|
||||
* @param something Something to check
|
||||
*/
|
||||
export function isMultiSearchResponse(something: any): something is SCMultiSearchResponse {
|
||||
return Object.keys(something).reduce((previousOnesAreSearchResponses, key) => {
|
||||
return previousOnesAreSearchResponses && isSearchResponse(something[key]);
|
||||
}, true);
|
||||
}, true as boolean);
|
||||
}
|
||||
|
||||
@@ -15,10 +15,10 @@
|
||||
|
||||
/**
|
||||
* Capsulation for a map with a string as key with values of type `T`
|
||||
*
|
||||
*
|
||||
* !!! BEWARE !!!
|
||||
* Can't be refactored to a `Map<K, V>`, because it can't be serialized via JSON.stringify(map)
|
||||
*
|
||||
*
|
||||
* @typeparam T Can be any type.
|
||||
*/
|
||||
export interface SCMap<T> {
|
||||
@@ -27,3 +27,20 @@ export interface SCMap<T> {
|
||||
*/
|
||||
[key: string]: T;
|
||||
}
|
||||
|
||||
/**
|
||||
* Restricted map with keys, limited to values of `U`, and corresponding values of type `T`
|
||||
*
|
||||
* !!! BEWARE !!!
|
||||
* Can't be refactored to a `Map<K, V>`, because it can't be serialized via JSON.stringify(map)
|
||||
* Also note, that this is a type not an interface
|
||||
*
|
||||
* @typeparam U Must be a type the `in` operator can be applied to and contains only strings or numbers
|
||||
* @typeparam T Can be any type
|
||||
*/
|
||||
export type SCRestrictedMap<U extends string | number, T> = {
|
||||
/**
|
||||
* One value for each key
|
||||
*/
|
||||
[key in U]: T
|
||||
};
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
import {SCThingType} from '../../Thing';
|
||||
import {SCSearchSortType} from '../sorts/Abstract';
|
||||
import {SCUuid} from '../UUID';
|
||||
import {SCMap} from './../Map';
|
||||
import {SCMap, SCRestrictedMap} from './../Map';
|
||||
import {SCMonitoringConfiguration} from './Monitoring';
|
||||
|
||||
/**
|
||||
@@ -72,7 +72,7 @@ export interface SCBackendConfigurationSortableField {
|
||||
|
||||
/**
|
||||
* A list of SC types on which this field exists
|
||||
*
|
||||
*
|
||||
* If no type is given it is assumed it exists on every type
|
||||
*/
|
||||
onlyOnTypes?: SCThingType[];
|
||||
@@ -84,10 +84,27 @@ export interface SCBackendConfigurationSortableField {
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Possible context names to be used by the search request
|
||||
*/
|
||||
export type SCSearchContext =
|
||||
| 'default'
|
||||
| 'dining'
|
||||
| 'place';
|
||||
|
||||
/**
|
||||
* A boosting configuration for one context
|
||||
*/
|
||||
export type SCBackendConfigurationSearchBoostingContext =
|
||||
SCRestrictedMap<
|
||||
SCSearchContext,
|
||||
SCBackendConfigurationSearchBoostingType[]
|
||||
>;
|
||||
|
||||
/**
|
||||
* A boosting configuration for one SCType
|
||||
*/
|
||||
export interface SCBackendConfigurationSearchBoosting {
|
||||
export interface SCBackendConfigurationSearchBoostingType {
|
||||
|
||||
/**
|
||||
* The factor of which the scores matching this type should be multiplied by
|
||||
@@ -98,7 +115,7 @@ export interface SCBackendConfigurationSearchBoosting {
|
||||
* Outer-Map:
|
||||
* Fields of this type that should be boosted if they match a given value
|
||||
* For nest fields you can use the `.` as a separator. For example `academicTerms.acronym`
|
||||
*
|
||||
*
|
||||
* Inner-map:
|
||||
* Value of the field that should be boosted by the given number
|
||||
* For example `"SS 2019": 2`
|
||||
@@ -143,7 +160,7 @@ export interface SCBackendInternalConfiguration {
|
||||
* The resulting scores of matching objects can be boosted (multiplied by a number) to change the order in the
|
||||
* set of results
|
||||
*/
|
||||
boostings: SCBackendConfigurationSearchBoosting[];
|
||||
boostings: SCBackendConfigurationSearchBoostingContext;
|
||||
|
||||
/**
|
||||
* Configuration of the database
|
||||
|
||||
57
test/Guards.spec.ts
Normal file
57
test/Guards.spec.ts
Normal file
@@ -0,0 +1,57 @@
|
||||
/*
|
||||
* Copyright (C) 2018, 2019 StApps
|
||||
* This program is free software: you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the Free
|
||||
* Software Foundation, version 3.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
* more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
import {expect} from 'chai';
|
||||
import {slow, suite, test, timeout} from 'mocha-typescript';
|
||||
import {SCThingOriginType, SCThingType} from '../src/core/Thing';
|
||||
import {SCDish} from '../src/core/things/Dish';
|
||||
import {isThing} from '../src/core/types/Guards';
|
||||
|
||||
@suite(timeout(10000), slow(5000))
|
||||
export class GuardsSpec {
|
||||
@test
|
||||
public isThing() {
|
||||
const notADish = {
|
||||
categories: [
|
||||
'appetizer',
|
||||
],
|
||||
name: 'foo',
|
||||
origin: {
|
||||
created: '',
|
||||
type: SCThingOriginType.User,
|
||||
},
|
||||
type: 'foobar',
|
||||
uid: 'bar',
|
||||
};
|
||||
|
||||
const dish: SCDish = {
|
||||
categories: [
|
||||
'appetizer',
|
||||
],
|
||||
name: 'foo',
|
||||
origin: {
|
||||
created: '',
|
||||
type: SCThingOriginType.User,
|
||||
},
|
||||
type: SCThingType.Dish,
|
||||
uid: 'bar',
|
||||
};
|
||||
|
||||
expect(isThing('foo')).to.be.equal(false);
|
||||
|
||||
expect(isThing(notADish)).to.be.equal(false);
|
||||
|
||||
expect(isThing(dish)).to.be.equal(true);
|
||||
}
|
||||
}
|
||||
@@ -3,7 +3,7 @@
|
||||
"instance": {
|
||||
"type": "academic event",
|
||||
"description": "Fortsetzung der Algebra I: Galoistheorie mit Anwendungen, ausgewählte Spezialthemen.",
|
||||
"uid": "540862f3-ea30-5b8f-8678-56b4dc217140",
|
||||
"uid": "681a59a1-23c2-5d78-861a-8c86a3abf2b9",
|
||||
"name": "Algebra II",
|
||||
"categories": [
|
||||
"lecture"
|
||||
@@ -31,7 +31,7 @@
|
||||
"performers": [
|
||||
{
|
||||
"type": "person",
|
||||
"uid": "540862f3-ea30-5b8f-8678-56b4dc217140",
|
||||
"uid": "7f8ce700-2679-51a5-86b5-3dfba85a33ff",
|
||||
"givenName": "Peter",
|
||||
"familyName": "Bürgisser",
|
||||
"gender": "male",
|
||||
@@ -59,7 +59,7 @@
|
||||
"maintainer": {
|
||||
"type": "organization",
|
||||
"name": "tubIT",
|
||||
"uid": "540862f3-ea30-5b8f-8678-56b4dc217140",
|
||||
"uid": "25f76840-db89-5da2-a8a2-75992f637613",
|
||||
"origin": {
|
||||
"indexed": "2018-09-11T12:30:00Z",
|
||||
"name": "Dummy",
|
||||
@@ -70,7 +70,7 @@
|
||||
"originalId": "foo bar",
|
||||
"responsibleEntity": {
|
||||
"type": "person",
|
||||
"uid": "540862f3-ea30-5b8f-8678-56b4dc217140",
|
||||
"uid": "7f8ce700-2679-51a5-86b5-3dfba85a33ff",
|
||||
"givenName": "Peter",
|
||||
"familyName": "Bürgisser",
|
||||
"gender": "male",
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
"instance": {
|
||||
"type": "academic event",
|
||||
"description": "Grundlagen, algebraische Grundbegriffe, Vektorräume, lineare Abbildungen und Gleichungen, Determinanten",
|
||||
"uid": "540862f3-ea30-5b8f-8678-56b4dc217140",
|
||||
"uid": "b17eb963-42b5-5861-adce-2b7b2607ef0a",
|
||||
"name": "Lineare Algebra I für Mathematiker",
|
||||
"categories": [
|
||||
"lecture"
|
||||
@@ -31,7 +31,7 @@
|
||||
"performers": [
|
||||
{
|
||||
"type": "person",
|
||||
"uid": "540862f3-ea30-5b8f-8678-56b4dc217140",
|
||||
"uid": "fc8b10cf-10c0-5b92-b16e-92ff734676da",
|
||||
"givenName": "Jörg",
|
||||
"familyName": "Liesen",
|
||||
"gender": "male",
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
{
|
||||
"errorNames": [],
|
||||
"instance": {
|
||||
"instance": {
|
||||
"type": "academic event",
|
||||
"description": "Die Übung hat 2 SWS und wird auf 2 Gruppen verteilt.",
|
||||
"uid": "540862f3-ea30-5b8f-8678-56b4dc217140",
|
||||
"uid": "7e2b64b0-925d-5f63-b464-a6e3e9492411",
|
||||
"name": "Algebra II",
|
||||
"categories": [
|
||||
"tutorial"
|
||||
@@ -31,7 +31,7 @@
|
||||
"performers": [
|
||||
{
|
||||
"type": "person",
|
||||
"uid": "540862f3-ea30-5b8f-8678-56b4dc217140",
|
||||
"uid": "97be73c0-5319-579a-a393-c4eeeacae58b",
|
||||
"givenName": "Paul",
|
||||
"familyName": "Breiding",
|
||||
"gender": "male",
|
||||
@@ -44,7 +44,7 @@
|
||||
},
|
||||
{
|
||||
"type": "person",
|
||||
"uid": "540862f3-ea30-5b8f-8678-56b4dc217140",
|
||||
"uid": "0db9b55a-4c27-5faf-9bf0-4b564be45a08",
|
||||
"givenName": "Pierre",
|
||||
"familyName": "Lairez",
|
||||
"gender": "male",
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"errorNames": [],
|
||||
"instance": {
|
||||
"uid": "540862f3-ea30-5b8f-8678-56b4dc217140",
|
||||
"instance": {
|
||||
"uid": "8d8bd89c-8429-5f81-b754-15a5be55e593",
|
||||
"type": "article",
|
||||
"categories": [
|
||||
"unipedia"
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"errorNames": [],
|
||||
"instance": {
|
||||
"uid": "540862f3-ea30-5b8f-8678-56b4dc217140",
|
||||
"instance": {
|
||||
"uid": "4f772b29-0b28-53a4-a8b9-206d9b425962",
|
||||
"type": "article",
|
||||
"categories": [
|
||||
"unipedia"
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
{
|
||||
"errorNames": [],
|
||||
"instance": {
|
||||
"instance": {
|
||||
"type": "book",
|
||||
"uid": "540862f3-ea30-5b8f-8678-56b4dc217140",
|
||||
"uid": "a0520263-29ae-5357-a3ce-ba1902d121e0",
|
||||
"name": "Kundenorientierung durch Quality Function Deployment: Systematisches Entwickeln von Produkten und Dienstleistungen",
|
||||
"authors": [
|
||||
{
|
||||
"type": "person",
|
||||
"uid": "540862f3-ea30-5b8f-8678-56b4dc217140",
|
||||
"uid": "10dfe386-71b4-554a-beb1-2d38561e42f8",
|
||||
"name": "Jutta Saatweber",
|
||||
"givenName": "Jutta",
|
||||
"familyName": "Saatweber",
|
||||
@@ -22,7 +22,7 @@
|
||||
"publishers": [
|
||||
{
|
||||
"type": "organization",
|
||||
"uid": "540862f3-ea30-5b8f-8678-56b4dc217140",
|
||||
"uid": "28df2bb9-c854-5898-b9d5-1abbd3524804",
|
||||
"name": "Symposion Publishing",
|
||||
"origin": {
|
||||
"indexed": "2018-09-11T12:30:00Z",
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
{
|
||||
"errorNames": [],
|
||||
"instance": {
|
||||
"instance": {
|
||||
"type": "book",
|
||||
"uid": "540862f3-ea30-5b8f-8678-56b4dc217140",
|
||||
"uid": "db47f7f4-7699-5a37-afcc-24beaa998d36",
|
||||
"name": "Minimal Book",
|
||||
"authors": [
|
||||
{
|
||||
"type": "person",
|
||||
"uid": "540862f3-ea30-5b8f-8678-56b4dc217140",
|
||||
"uid": "10dfe386-71b4-554a-beb1-2d38561e42f8",
|
||||
"name": "Jutta Saatweber",
|
||||
"givenName": "Jutta",
|
||||
"familyName": "Saatweber",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"errorNames": [],
|
||||
"instance": {
|
||||
"instance": {
|
||||
"geo": {
|
||||
"point": {
|
||||
"type": "Point",
|
||||
@@ -150,7 +150,7 @@
|
||||
"alternateNames": [
|
||||
"MA"
|
||||
],
|
||||
"uid": "540862f3-ea30-5b8f-8678-56b4dc217140",
|
||||
"uid": "edfaba58-254f-5da0-82d6-3b46a76c48ce",
|
||||
"categories": [
|
||||
"education"
|
||||
],
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"errorNames": [],
|
||||
"instance": {
|
||||
"uid": "64bb29ed-21e5-50c7-9d7c-1dc4741001b9",
|
||||
"instance": {
|
||||
"uid": "c8dc1f7f-9e3e-5b1f-8c38-084f46413b87",
|
||||
"type": "catalog",
|
||||
"level": 1,
|
||||
"categories": [
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"errorNames": [],
|
||||
"instance": {
|
||||
"uid": "5a1f4f51-2498-5af1-91cb-c939673cc69c",
|
||||
"instance": {
|
||||
"uid": "5a8bc725-8658-528f-b515-5f7cd6987169",
|
||||
"type": "catalog",
|
||||
"level": 3,
|
||||
"description": "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua.",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"errorNames": [],
|
||||
"instance": {
|
||||
"instance": {
|
||||
"academicDegree": "bachelor",
|
||||
"academicDegreewithField": "Bachelor of Arts",
|
||||
"academicDegreewithFieldShort": "B.A.",
|
||||
@@ -12,7 +12,7 @@
|
||||
"type": "remote"
|
||||
},
|
||||
"type": "organization",
|
||||
"uid": "540862f3-ea30-5b8f-8678-56b4dc217140"
|
||||
"uid": "b0f878fd-8fda-53b8-b065-a8d854c3d0d2"
|
||||
},
|
||||
"mainLanguage": {
|
||||
"code": "de",
|
||||
@@ -34,11 +34,11 @@
|
||||
"type": "remote"
|
||||
},
|
||||
"type": "organization",
|
||||
"uid": "540862f3-ea30-5b8f-8678-56b4dc217140"
|
||||
"uid": "b0f878fd-8fda-53b8-b065-a8d854c3d0d2"
|
||||
},
|
||||
"timeMode": "parttime",
|
||||
"type": "course of studies",
|
||||
"uid": "540862f3-ea30-5b8f-8678-56b4dc217140"
|
||||
"uid": "4c6f0a18-343d-5175-9fb1-62d28545c2aa"
|
||||
},
|
||||
"schema": "SCCourseOfStudies"
|
||||
}
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
{
|
||||
"errorNames": [],
|
||||
"instance": {
|
||||
"instance": {
|
||||
"type": "date series",
|
||||
"uid": "540862f3-ea30-5b8f-8678-56b4dc217140",
|
||||
"uid": "1b421872-1b4c-579b-ba03-688f943d59ad",
|
||||
"name": "Einführung in die Wirtschaftspolitik",
|
||||
"duration": "PT2H",
|
||||
"inPlace": {
|
||||
@@ -10,7 +10,7 @@
|
||||
"categories": [
|
||||
"education"
|
||||
],
|
||||
"uid": "540862f3-ea30-5b8f-8678-56b4dc217140",
|
||||
"uid": "5a4bbced-8e1f-5f29-a1d1-336e455ce7f9",
|
||||
"name": "H 0105",
|
||||
"geo": {
|
||||
"point": {
|
||||
@@ -33,7 +33,7 @@
|
||||
],
|
||||
"event": {
|
||||
"type": "academic event",
|
||||
"uid": "540862f3-ea30-5b8f-8678-56b4dc217140",
|
||||
"uid": "dbb4e5e1-0789-59c1-9970-877430af56b3",
|
||||
"name": "Einführung in die Wirtschaftspolitik",
|
||||
"categories": [
|
||||
"written exam"
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
{
|
||||
"errorNames": [],
|
||||
"instance": {
|
||||
"instance": {
|
||||
"type": "date series",
|
||||
"uid": "540862f3-ea30-5b8f-8678-56b4dc217140",
|
||||
"uid": "4ce41895-4b54-52db-b86f-7e6920b975c8",
|
||||
"name": "Distributed Algorithms",
|
||||
"duration": "PT4H",
|
||||
"inPlace": {
|
||||
@@ -19,7 +19,7 @@
|
||||
"categories": [
|
||||
"education"
|
||||
],
|
||||
"uid": "540862f3-ea30-5b8f-8678-56b4dc217140",
|
||||
"uid": "b535c86a-777b-54c3-b89a-cad528d0580f",
|
||||
"name": "EMH 225",
|
||||
"floor": "2",
|
||||
"origin": {
|
||||
@@ -34,7 +34,7 @@
|
||||
],
|
||||
"event": {
|
||||
"type": "academic event",
|
||||
"uid": "540862f3-ea30-5b8f-8678-56b4dc217140",
|
||||
"uid": "e6fb74d4-c6d9-59bb-930f-e47eb6e39432",
|
||||
"name": "Distributed Algorithms",
|
||||
"categories": [
|
||||
"written exam"
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
{
|
||||
"errorNames": [],
|
||||
"instance": {
|
||||
"instance": {
|
||||
"type": "date series",
|
||||
"uid": "540862f3-ea30-5b8f-8678-56b4dc217140",
|
||||
"uid": "e6462830-187a-50b1-bdb4-8f39e49a88b8",
|
||||
"name": "Dance course for beginners",
|
||||
"duration": "PT8H",
|
||||
"inPlace": {
|
||||
@@ -19,7 +19,7 @@
|
||||
"categories": [
|
||||
"student union"
|
||||
],
|
||||
"uid": "540862f3-ea30-5b8f-8678-56b4dc217140",
|
||||
"uid": "b535c86a-777b-54c3-b89a-cad528d0580f",
|
||||
"name": "EMH 225",
|
||||
"floor": "2",
|
||||
"origin": {
|
||||
@@ -34,7 +34,7 @@
|
||||
],
|
||||
"event": {
|
||||
"type": "academic event",
|
||||
"uid": "540862f3-ea30-5b8f-8678-56b4dc217140",
|
||||
"uid": "4f86e8bb-ce73-520b-bfd9-e1ba9f754391",
|
||||
"name": "Dance course for beginners",
|
||||
"categories": [
|
||||
"special"
|
||||
@@ -50,7 +50,7 @@
|
||||
"name": "Dummy",
|
||||
"type": "remote"
|
||||
},
|
||||
"offers": [
|
||||
"offers": [
|
||||
{
|
||||
"availability": "in stock",
|
||||
"availabilityStarts": "2017-01-30T00:00:00.000Z",
|
||||
@@ -66,7 +66,7 @@
|
||||
"indexed": "2018-09-11T12:30:00Z",
|
||||
"name": "Dummy",
|
||||
"type": "remote"
|
||||
},
|
||||
},
|
||||
"type": "organization",
|
||||
"uid": "3b9b3df6-3a7a-58cc-922f-c7335c002634"
|
||||
}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"errorNames": [],
|
||||
"instance": {
|
||||
"uid": "540862f3-ea30-5b8f-8678-56b4dc217140",
|
||||
"instance": {
|
||||
"uid": "a5acde0d-18c4-5511-9f86-aabf2a530f91",
|
||||
"dateCreated": "2017-02-07T09:26:35.957Z",
|
||||
"name": "changed_testuid",
|
||||
"changes": [
|
||||
@@ -14,7 +14,7 @@
|
||||
"action": "changed",
|
||||
"type": "diff",
|
||||
"object": {
|
||||
"uid": "540862f3-ea30-5b8f-8678-56b4dc217140",
|
||||
"uid": "072db1e5-e479-5040-88e0-4a98d731e443",
|
||||
"name": "Name One",
|
||||
"type": "message",
|
||||
"message": "Message",
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"errorNames": [],
|
||||
"instance": {
|
||||
"uid": "540862f3-ea30-5b8f-8678-56b4dc217140",
|
||||
"instance": {
|
||||
"uid": "f71cc2c8-fef2-59ee-af0a-511cc75e7471",
|
||||
"dateCreated": "2017-03-07T09:26:35.957Z",
|
||||
"name": "changed_testuid",
|
||||
"changes": [
|
||||
@@ -14,7 +14,7 @@
|
||||
"action": "changed",
|
||||
"type": "diff",
|
||||
"object": {
|
||||
"uid": "540862f3-ea30-5b8f-8678-56b4dc217140",
|
||||
"uid": "072db1e5-e479-5040-88e0-4a98d731e443",
|
||||
"name": "Name One",
|
||||
"type": "message",
|
||||
"message": "Message",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"errorNames": [],
|
||||
"instance": {
|
||||
"instance": {
|
||||
"type": "dish",
|
||||
"name": "Pizza mit Geflügelsalami und Champignons",
|
||||
"categories": [
|
||||
@@ -33,7 +33,7 @@
|
||||
"indexed": "2018-09-11T12:30:00Z",
|
||||
"name": "Dummy",
|
||||
"type": "remote"
|
||||
},
|
||||
},
|
||||
"type": "organization",
|
||||
"uid": "3b9b3df6-3a7a-58cc-922f-c7335c002634"
|
||||
},
|
||||
@@ -56,7 +56,7 @@
|
||||
"alternateNames": [
|
||||
"MensaHardenberg"
|
||||
],
|
||||
"uid": "540862f3-ea30-5b8f-8678-56b4dc217140",
|
||||
"uid": "72fbc8a3-ebd1-58f9-9526-ad65cba2e402",
|
||||
"address": {
|
||||
"addressCountry": "Germany",
|
||||
"addressLocality": "Berlin",
|
||||
@@ -72,7 +72,7 @@
|
||||
}
|
||||
}
|
||||
],
|
||||
"uid": "540862f3-ea30-5b8f-8678-56b4dc217140",
|
||||
"uid": "c9f32915-8ed5-5960-b850-3f7375a89922",
|
||||
"origin": {
|
||||
"indexed": "2018-09-11T12:30:00Z",
|
||||
"name": "Dummy",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"errorNames": [],
|
||||
"instance": {
|
||||
"instance": {
|
||||
"type": "dish",
|
||||
"name": "Sahne-Bärlauchsauce",
|
||||
"description": "Nudelauswahl",
|
||||
@@ -20,7 +20,7 @@
|
||||
"indexed": "2018-09-11T12:30:00Z",
|
||||
"name": "Dummy",
|
||||
"type": "remote"
|
||||
},
|
||||
},
|
||||
"type": "organization",
|
||||
"uid": "3b9b3df6-3a7a-58cc-922f-c7335c002634"
|
||||
},
|
||||
@@ -46,7 +46,7 @@
|
||||
"alternateNames": [
|
||||
"MensaHardenberg"
|
||||
],
|
||||
"uid": "540862f3-ea30-5b8f-8678-56b4dc217140",
|
||||
"uid": "072db1e5-e479-5040-88e0-4a98d731e443",
|
||||
"address": {
|
||||
"addressCountry": "Germany",
|
||||
"addressLocality": "Berlin",
|
||||
@@ -75,7 +75,7 @@
|
||||
"Weizen",
|
||||
"Milch(Laktose; Milcheiweiß)"
|
||||
],
|
||||
"uid": "540862f3-ea30-5b8f-8678-56b4dc217140",
|
||||
"uid": "3222631f-82b3-5faf-a8e8-9c10719cc95b",
|
||||
"origin": {
|
||||
"indexed": "2018-09-11T12:30:00Z",
|
||||
"name": "Dummy",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"errorNames": [],
|
||||
"instance": {
|
||||
"instance": {
|
||||
"additives": [
|
||||
"1 = mit Farbstoff",
|
||||
"2 = konserviert",
|
||||
@@ -51,7 +51,7 @@
|
||||
"indexed": "2018-09-11T12:30:00Z",
|
||||
"name": "Dummy",
|
||||
"type": "remote"
|
||||
},
|
||||
},
|
||||
"type": "organization",
|
||||
"uid": "3b9b3df6-3a7a-58cc-922f-c7335c002634"
|
||||
}
|
||||
@@ -80,7 +80,7 @@
|
||||
"type": "dish",
|
||||
"uid": "db0caac1-062c-5333-9fcb-cfaf0ff7d799",
|
||||
"nutrition": {
|
||||
"calories": 106.00,
|
||||
"calories": 106,
|
||||
"fatContent": 5.4,
|
||||
"saturatedFatContent": 1.8,
|
||||
"carbohydrateContent": 6.8,
|
||||
@@ -113,7 +113,7 @@
|
||||
"type": "dish",
|
||||
"uid": "f702fd43-1551-53b2-b35a-b5916e1cf9a1",
|
||||
"nutrition": {
|
||||
"calories": 106.00,
|
||||
"calories": 106,
|
||||
"fatContent": 5.4,
|
||||
"saturatedFatContent": 1.8,
|
||||
"carbohydrateContent": 6.8,
|
||||
@@ -137,9 +137,9 @@
|
||||
}
|
||||
],
|
||||
"type": "dish",
|
||||
"uid": "3b9b3df6-3a7a-58cc-922f-c7335c002634",
|
||||
"uid": "1c99689c-c6ec-551f-8ad8-f13c5fa812c2",
|
||||
"nutrition": {
|
||||
"calories": 600.00,
|
||||
"calories": 600,
|
||||
"fatContent": 30.5,
|
||||
"saturatedFatContent": 9.9,
|
||||
"carbohydrateContent": 42.2,
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
{
|
||||
"errorNames": [],
|
||||
"instance": {
|
||||
"instance": {
|
||||
"type": "favorite",
|
||||
"name": "Favorite #1",
|
||||
"uid": "540862f3-ea30-5b8f-8678-56b4dc217140",
|
||||
"uid": "3af3ccaa-f066-5eff-9a3d-a70567f3d70d",
|
||||
"data": {
|
||||
"type": "academic event",
|
||||
"description": "Grundlagen, algebraische Grundbegriffe, Vektorräume, lineare Abbildungen und Gleichungen, Determinanten",
|
||||
"uid": "540862f3-ea30-5b8f-8678-56b4dc217140",
|
||||
"uid": "b17eb963-42b5-5861-adce-2b7b2607ef0a",
|
||||
"name": "Lineare Algebra I für Mathematiker",
|
||||
"categories": [
|
||||
"lecture"
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"errorNames": [],
|
||||
"instance": {
|
||||
"uid": "540862f3-ea30-5b8f-8678-56b4dc217140",
|
||||
"instance": {
|
||||
"uid": "0effdc13-d4af-5a63-a538-c4b2c080e253",
|
||||
"name": "MA E:0",
|
||||
"type": "floor",
|
||||
"inPlace": {
|
||||
@@ -157,7 +157,7 @@
|
||||
"alternateNames": [
|
||||
"MA"
|
||||
],
|
||||
"uid": "540862f3-ea30-5b8f-8678-56b4dc217140",
|
||||
"uid": "edfaba58-254f-5da0-82d6-3b46a76c48ce",
|
||||
"address": {
|
||||
"addressCountry": "Germany",
|
||||
"addressLocality": "Berlin",
|
||||
@@ -3386,7 +3386,7 @@
|
||||
"categories": [
|
||||
"education"
|
||||
],
|
||||
"uid": "540862f3-ea30-5b8f-8678-56b4dc217140",
|
||||
"uid": "593655b5-0fc9-59de-a82f-b8f5f908deef",
|
||||
"name": "MA 043",
|
||||
"floor": "0",
|
||||
"origin": {
|
||||
@@ -5534,7 +5534,7 @@
|
||||
"categories": [
|
||||
"learn"
|
||||
],
|
||||
"uid": "540862f3-ea30-5b8f-8678-56b4dc217140",
|
||||
"uid": "31b1ab4c-1803-51ed-8c66-59bfc97cd350",
|
||||
"name": "MA Foyer",
|
||||
"floor": "0",
|
||||
"origin": {
|
||||
@@ -6353,7 +6353,7 @@
|
||||
"categories": [
|
||||
"education"
|
||||
],
|
||||
"uid": "540862f3-ea30-5b8f-8678-56b4dc217140",
|
||||
"uid": "56ce0744-ae39-5209-b18f-d3a6edcb8f0a",
|
||||
"name": "MA 042",
|
||||
"floor": "0",
|
||||
"origin": {
|
||||
@@ -6468,7 +6468,7 @@
|
||||
"categories": [
|
||||
"education"
|
||||
],
|
||||
"uid": "540862f3-ea30-5b8f-8678-56b4dc217140",
|
||||
"uid": "96b7e555-1214-5ca8-8294-e8209ac04f5a",
|
||||
"name": "MA 041",
|
||||
"floor": "0",
|
||||
"origin": {
|
||||
@@ -6703,7 +6703,7 @@
|
||||
"categories": [
|
||||
"education"
|
||||
],
|
||||
"uid": "540862f3-ea30-5b8f-8678-56b4dc217140",
|
||||
"uid": "ed50a94d-eb06-5d07-8058-dfbdeb6c3a0b",
|
||||
"name": "MA 001",
|
||||
"floor": "0",
|
||||
"origin": {
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"errorNames": [],
|
||||
"instance": {
|
||||
"uid": "540862f3-ea30-5b8f-8678-56b4dc217140",
|
||||
"instance": {
|
||||
"uid": "3c56f5c4-006f-580e-8aff-9a9315f3fd81",
|
||||
"name": "H_4",
|
||||
"type": "floor",
|
||||
"inPlace": {
|
||||
@@ -97,7 +97,7 @@
|
||||
"alternateNames": [
|
||||
"H"
|
||||
],
|
||||
"uid": "540862f3-ea30-5b8f-8678-56b4dc217140",
|
||||
"uid": "ebe95e80-f826-5a70-a844-436b561d5181",
|
||||
"address": {
|
||||
"addressCountry": "Germany",
|
||||
"addressLocality": "Berlin",
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"errorNames": [],
|
||||
"instance": {
|
||||
"uid": "540862f3-ea30-5b8f-8678-56b4dc217140",
|
||||
"instance": {
|
||||
"uid": "d6152601-0154-581a-8bb5-0d1643972a21",
|
||||
"name": "H_5",
|
||||
"type": "floor",
|
||||
"inPlace": {
|
||||
@@ -97,7 +97,7 @@
|
||||
"alternateNames": [
|
||||
"H"
|
||||
],
|
||||
"uid": "540862f3-ea30-5b8f-8678-56b4dc217140",
|
||||
"uid": "ebe95e80-f826-5a70-a844-436b561d5181",
|
||||
"address": {
|
||||
"addressCountry": "Germany",
|
||||
"addressLocality": "Berlin",
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
{
|
||||
"errorNames": [],
|
||||
"instance": {
|
||||
"instance": {
|
||||
"type": "message",
|
||||
"uid": "540862f3-ea30-5b8f-8678-56b4dc217140",
|
||||
"uid": "4706ef24-b631-5c20-91d1-3c627decca5a",
|
||||
"image": "icon ion-android-hand stapps-color-red-dark",
|
||||
"name": "Lösung für das Problem des Zurücksetzens der StApps-App gefunden",
|
||||
"message": "Wie bereits berichtet, klagten User über das Löschen ihres Stundenplans beim Update von Version 0.8.0 auf 0.8.1. Wir haben eine Lösung für das Problem gefunden und testen diese ausführlich bis zum Ende dieser Woche. Wenn alles glatt verläuft, dann kommt am Wochenende die fehlerbereinige Version 0.8.2 heraus.\n\n*(25.Okt 2016)*",
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
],
|
||||
"instance": {
|
||||
"type": "invalid-value-in-schema",
|
||||
"uid": "540862f3-ea30-5b8f-8678-56b4dc217140",
|
||||
"uid": "cdb7059c-a1a2-5229-821d-434c345e2917",
|
||||
"image": "icon ion-android-hand stapps-color-red-dark",
|
||||
"name": "Lösung für das Problem des Zurücksetzens der StApps-App gefunden",
|
||||
"message": "Wie bereits berichtet, klagten User über das Löschen ihres Stundenplans beim Update von Version 0.8.0 auf 0.8.1. Wir haben eine Lösung für das Problem gefunden und testen diese ausführlich bis zum Ende dieser Woche. Wenn alles glatt verläuft, dann kommt am Wochenende die fehlerbereinige Version 0.8.2 heraus.\n\n*(25.Okt 2016)*",
|
||||
|
||||
@@ -1,9 +1,11 @@
|
||||
{
|
||||
"errorNames": ["additionalProperties"],
|
||||
"instance": {
|
||||
"errorNames": [
|
||||
"additionalProperties"
|
||||
],
|
||||
"instance": {
|
||||
"type": "message",
|
||||
"invalid-non-existing-key-in-schema": 1,
|
||||
"uid": "540862f3-ea30-5b8f-8678-56b4dc217140",
|
||||
"uid": "4706ef24-b631-5c20-91d1-3c627decca5a",
|
||||
"image": "icon ion-android-hand stapps-color-red-dark",
|
||||
"name": "Lösung für das Problem des Zurücksetzens der StApps-App gefunden",
|
||||
"message": "Wie bereits berichtet, klagten User über das Löschen ihres Stundenplans beim Update von Version 0.8.0 auf 0.8.1. Wir haben eine Lösung für das Problem gefunden und testen diese ausführlich bis zum Ende dieser Woche. Wenn alles glatt verläuft, dann kommt am Wochenende die fehlerbereinige Version 0.8.2 heraus.\n\n*(25.Okt 2016)*",
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
{
|
||||
"errorNames": [],
|
||||
"instance": {
|
||||
"instance": {
|
||||
"type": "organization",
|
||||
"uid": "540862f3-ea30-5b8f-8678-56b4dc217140",
|
||||
"uid": "20e48393-0d2b-5bdc-9d92-5e0dc1e2860e",
|
||||
"name": "Technische Universität Berlin",
|
||||
"origin": {
|
||||
"indexed": "2018-09-11T12:30:00Z",
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
{
|
||||
"errorNames": [],
|
||||
"instance": {
|
||||
"instance": {
|
||||
"type": "person",
|
||||
"uid": "540862f3-ea30-5b8f-8678-56b4dc217140",
|
||||
"uid": "97044080-fdf3-5ec0-8734-c412ac2dde03",
|
||||
"givenName": "Michael",
|
||||
"familyName": "Joswig",
|
||||
"gender": "male",
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
{
|
||||
"errorNames": [],
|
||||
"instance": {
|
||||
"instance": {
|
||||
"type": "person",
|
||||
"uid": "540862f3-ea30-5b8f-8678-56b4dc217140",
|
||||
"uid": "eb516021-3b37-5358-baef-345a0e10da5b",
|
||||
"givenName": "Michael",
|
||||
"familyName": "Gradzielski",
|
||||
"gender": "male",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"errorNames": [],
|
||||
"instance": {
|
||||
"instance": {
|
||||
"type": "person",
|
||||
"familyName": "Mustermann",
|
||||
"givenName": "Erika",
|
||||
@@ -14,7 +14,7 @@
|
||||
"Leitung, Projektkoordination - Abteilung Lehre und Qualitätssicherung"
|
||||
],
|
||||
"name": "Univ.-Prof'in Dr. Erika Mustermann",
|
||||
"uid": "b22306bf-cbf3-54df-91a1-c08d8fd42e13",
|
||||
"uid": "be34a419-e9e8-5de0-b998-dd1b19e7f451",
|
||||
"workLocations": [
|
||||
{
|
||||
"url": "http://www.fb03.uni-frankfurt.de/1234567",
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"errorNames": [],
|
||||
"instance": {
|
||||
"uid": "2e925b84-3c99-5df2-a289-62be7a4ae512",
|
||||
"instance": {
|
||||
"uid": "f5fe4d13-d56a-5770-b16e-78782841bf02",
|
||||
"name": "Validierer (UB)",
|
||||
"type": "point of interest",
|
||||
"categories": [
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"errorNames": [],
|
||||
"instance": {
|
||||
"uid": "1cf75fa0-86dc-5704-8cb4-bd80cf02e640",
|
||||
"instance": {
|
||||
"uid": "5a5ca30a-1494-5707-9692-ff902e104c12",
|
||||
"name": "Drucker 1 (IG)",
|
||||
"type": "point of interest",
|
||||
"categories": [
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"errorNames": [],
|
||||
"instance": {
|
||||
"instance": {
|
||||
"geo": {
|
||||
"point": {
|
||||
"type": "Point",
|
||||
@@ -14,7 +14,7 @@
|
||||
"categories": [
|
||||
"cafe"
|
||||
],
|
||||
"uid": "540862f3-ea30-5b8f-8678-56b4dc217140",
|
||||
"uid": "b7206fb5-bd77-5572-928f-16aa70910f64",
|
||||
"alternateNames": [
|
||||
"MA Mathe Cafeteria"
|
||||
],
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"errorNames": [],
|
||||
"instance": {
|
||||
"instance": {
|
||||
"geo": {
|
||||
"point": {
|
||||
"type": "Point",
|
||||
@@ -14,7 +14,7 @@
|
||||
"categories": [
|
||||
"library"
|
||||
],
|
||||
"uid": "540862f3-ea30-5b8f-8678-56b4dc217140",
|
||||
"uid": "6e5abbff-d995-507b-982b-e0d094da6606",
|
||||
"alternateNames": [
|
||||
"BIB"
|
||||
],
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"errorNames": [],
|
||||
"instance": {
|
||||
"instance": {
|
||||
"geo": {
|
||||
"point": {
|
||||
"type": "Point",
|
||||
@@ -15,7 +15,7 @@
|
||||
"categories": [
|
||||
"learn"
|
||||
],
|
||||
"uid": "540862f3-ea30-5b8f-8678-56b4dc217140",
|
||||
"uid": "d33fa478-7e5d-5197-9f0e-091f7f8105df",
|
||||
"name": "MA Foyer",
|
||||
"inPlace": {
|
||||
"geo": {
|
||||
@@ -170,7 +170,7 @@
|
||||
"alternateNames": [
|
||||
"MA"
|
||||
],
|
||||
"uid": "540862f3-ea30-5b8f-8678-56b4dc217140",
|
||||
"uid": "edfaba58-254f-5da0-82d6-3b46a76c48ce",
|
||||
"address": {
|
||||
"addressCountry": "Germany",
|
||||
"addressLocality": "Berlin",
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"errorNames": [],
|
||||
"instance": {
|
||||
"uid": "d7ce5623-ad47-5976-bdd3-7cf551729516",
|
||||
"instance": {
|
||||
"uid": "ea9db087-240b-5b10-a65b-9684d88a3e4e",
|
||||
"name": "Poolraum (HoF)",
|
||||
"type": "room",
|
||||
"categories": [
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
"errorNames": [],
|
||||
"instance": {
|
||||
"query": "*",
|
||||
"context": "default",
|
||||
"filter": {
|
||||
"arguments": {
|
||||
"filters": [
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"errorNames": [],
|
||||
"instance": {
|
||||
"uid": "b621f5b5-dd5d-5730-9e2e-e4ba52011388",
|
||||
"instance": {
|
||||
"uid": "622b950b-a29c-593b-9059-aece622228a0",
|
||||
"type": "semester",
|
||||
"name": "Wintersemester 2017/2018",
|
||||
"acronym": "WS 2017/18",
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"errorNames": [],
|
||||
"instance": {
|
||||
"uid": "aacd5611-b5be-54ce-b39f-c52f7e9a631d",
|
||||
"instance": {
|
||||
"uid": "7cebbc3e-0a21-5371-ab0d-f7ba12f53dbd",
|
||||
"type": "semester",
|
||||
"name": "Sommersemester 2018",
|
||||
"acronym": "SS 2018",
|
||||
|
||||
@@ -27,7 +27,7 @@
|
||||
}
|
||||
},
|
||||
"type": "setting",
|
||||
"uid": "540862f3-ea30-5b8f-8678-56b4dc217642"
|
||||
"uid": "c4ff2b08-be18-528e-9b09-cb8c1d18487b"
|
||||
},
|
||||
"schema": "SCSetting"
|
||||
}
|
||||
|
||||
@@ -37,7 +37,7 @@
|
||||
}
|
||||
},
|
||||
"type": "setting",
|
||||
"uid": "540862f3-ea30-5b8f-8678-56b4dc217642"
|
||||
"uid": "9f0c362e-0b41-532f-9e8b-a0ac373fbede"
|
||||
},
|
||||
"schema": "SCSetting"
|
||||
}
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
{
|
||||
"errorNames": [],
|
||||
"instance": {
|
||||
"instance": {
|
||||
"type": "ticket",
|
||||
"name": "Ticket",
|
||||
"uid": "7257a1d7-47ac-4acc-a8cc-3f9ac6442e5d",
|
||||
"uid": "34fc6cd9-5bd1-5779-a75d-a25d01ad4dae",
|
||||
"currentTicketNumber": "250",
|
||||
"approxWaitingTime": "PT43S",
|
||||
"inPlace": {
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"errorNames": [],
|
||||
"instance": {
|
||||
"uid": "7257a1d7-47ac-4acc-a8cc-3f9ac6442e5d",
|
||||
"instance": {
|
||||
"uid": "4f1c1810-1a9f-52cb-bfe9-65dcab5e889a",
|
||||
"type": "tour",
|
||||
"name": "Stundenplan erstellen",
|
||||
"description": "Veranstaltung suchen und zum Stundenplan hinzufügen",
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"errorNames": [],
|
||||
"instance": {
|
||||
"uid": "7257a1d7-47ac-4acc-a8cc-3f9ac6442e5d",
|
||||
"instance": {
|
||||
"uid": "665d834d-594a-5d72-be94-ff2892a6003c",
|
||||
"type": "tour",
|
||||
"name": "Favorisierte Essensorte",
|
||||
"description": "Essensorte favorisieren, um ihre Speisepläne als Widget auf der Startseite zu sehen",
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
{
|
||||
"errorNames": [],
|
||||
"instance": {
|
||||
"instance": {
|
||||
"type": "video",
|
||||
"uid": "540862f3-ea30-5b8f-8678-56b4dc217642",
|
||||
"uid": "e274cc82-f51c-566b-b8da-85763ff375e8",
|
||||
"url": "https://vimeo.com/1084537",
|
||||
"name": "Big Buck Bunny",
|
||||
"origin": {
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
{
|
||||
"errorNames": [],
|
||||
"instance": {
|
||||
"instance": {
|
||||
"type": "video",
|
||||
"uid": "540862f3-ea30-5b8f-8678-56b4dc217642",
|
||||
"uid": "2def52c8-f901-5b30-96fc-ba570a038508",
|
||||
"url": "https://vimeo.com/1084537",
|
||||
"name": "Big Buck Bunny",
|
||||
"sources": [
|
||||
|
||||
Reference in New Issue
Block a user