Compare commits

...

35 Commits

Author SHA1 Message Date
Karl-Philipp Wulfert
2bf65a9086 0.13.0 2019-04-02 17:14:41 +02:00
Karl-Philipp Wulfert
d9347ece05 build: remove extraneous dependency 2019-04-02 16:52:32 +02:00
Karl-Philipp Wulfert
acdca2f554 test: add test for isThing guard 2019-04-02 16:24:40 +02:00
Karl-Philipp Wulfert
67868e9eb8 fix: correct isThing guard 2019-04-02 16:24:27 +02:00
Karl-Philipp Wulfert
bc00f62117 test: appropriately rename schema spec 2019-04-02 16:24:03 +02:00
Karl-Philipp Wulfert
75e833d841 refactor: adjust type to new requirements 2019-04-02 15:47:20 +02:00
Karl-Philipp Wulfert
a97805172c ci: allow audit stage to fail 2019-04-02 15:38:59 +02:00
Karl-Philipp Wulfert
c8bda2eae7 feat: add conditional "maps" for associated types
Fixes #50
2019-04-02 15:37:10 +02:00
Karl-Philipp Wulfert
1e9f36c4be refactor: apply structure to favorites and saveable things 2019-04-02 15:36:14 +02:00
Karl-Philipp Wulfert
6da9d73477 build: update dependencies 2019-04-02 15:34:38 +02:00
Rainer Killinger
bbe4fcac42 fix: update tslint dependencies 2019-04-01 14:10:14 +02:00
Jovan Krunić
5d1e79d487 feat: provide sample JSON files with the package
Closes #46
2019-03-21 17:34:28 +01:00
Jovan Krunić
7532a9bb62 test: use different UIDs for different things 2019-03-21 16:15:10 +01:00
Jovan Krunić
a4db76ec36 docs: update changelog 2019-03-14 10:16:50 +01:00
Jovan Krunić
2ff10692d5 0.12.0 2019-03-14 10:15:50 +01:00
Sebastian Lange
7c7f2726aa refactor: remodel buckets in SCFacet 2019-03-13 09:38:31 +01:00
Rainer Killinger
0679690a18 test: add nyc coverage report 2019-03-12 10:05:18 +01:00
Rainer Killinger
186ce89b91 test: add unit test for translation 2019-03-12 10:05:14 +01:00
Rainer Killinger
62975b9ded refactor: change meta class structure to include types.
Introduce requiredness of translations via implemented interface.
2019-02-28 10:51:37 +00:00
Rainer Killinger
90e3d22399 feat: add SCThingTranslator class. move functionality accordingly 2019-02-28 10:51:37 +00:00
Michel Jonathan Schmitz
797e5ca9de refactor: moved default price into SCPriceGroup 2019-02-27 13:59:14 +01:00
Karl-Philipp Wulfert
86d9696f58 build: ensure that correct dependencies are installed 2019-02-25 15:09:03 +00:00
Karl-Philipp Wulfert
94f528bb92 docs: explain how to update related projects
Fixes #37
2019-02-25 15:09:02 +00:00
Jovan Krunić
9a49442902 fix: add todo to SCThingsWithoutDiff and SCClasses
Closes #39
2019-02-25 11:52:51 +00:00
Karl-Philipp Wulfert
21a5986e3f docs: adjust documentation generation
Fixes #25
2019-02-22 11:01:30 +00:00
Michel Jonathan Schmitz
d2eeaeffd8 refactor: move location from the dish to its offers 2019-02-22 10:02:11 +01:00
Karl-Philipp Wulfert
ac08d226e9 docs: update changelog 2019-02-21 17:08:50 +01:00
Karl-Philipp Wulfert
c7462237eb 0.11.0 2019-02-21 17:08:43 +01:00
Wieland Schöbl
b5bd09e40b feat: add maxRequestBodySize in backend configuration 2019-02-21 15:16:37 +00:00
Michel Jonathan Schmitz
8f66abbb73 refactor: use the SCMap more consistently 2019-02-20 11:04:55 +01:00
Jovan Krunić
a0ab72e597 feat: add laboratory and computer as room categories
Closes #33
2019-02-18 12:23:13 +00:00
Karl-Philipp Wulfert
b4229aac35 docs: update changelog 2019-02-18 12:47:37 +01:00
Karl-Philipp Wulfert
824e841dad 0.10.0 2019-02-18 12:47:32 +01:00
Wieland Schöbl
bc3a0f6d11 feat: add model for requestBodyTooLargeError 2019-02-18 12:21:31 +01:00
Karl-Philipp Wulfert
a09aae5d5d docs: update changelog 2019-02-14 13:21:51 +01:00
107 changed files with 5560 additions and 720 deletions

View File

@@ -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:
@@ -38,6 +48,7 @@ test:
artifacts:
paths:
- report
- coverage
pages:
stage: deploy

View File

@@ -10,3 +10,5 @@
!package-lock.json
!README.md
!src
test/*
!test/resources/

View File

@@ -1,3 +1,40 @@
# [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)
### Features
* add laboratory and computer as room categories ([a0ab72e](https://gitlab.com/openstapps/core/commit/a0ab72e)), closes [#33](https://gitlab.com/openstapps/core/issues/33)
* add maxRequestBodySize in backend configuration ([b5bd09e](https://gitlab.com/openstapps/core/commit/b5bd09e))
# [0.10.0](https://gitlab.com/openstapps/core/compare/v0.9.0...v0.10.0) (2019-02-18)
### Features
* add model for requestBodyTooLargeError ([bc3a0f6](https://gitlab.com/openstapps/core/commit/bc3a0f6))
# [0.9.0](https://gitlab.com/openstapps/core/compare/v0.8.0...v0.9.0) (2019-02-14)
# [0.8.0](https://gitlab.com/openstapps/core/compare/v0.7.0...v0.8.0) (2019-02-13)

View File

@@ -2,6 +2,32 @@
Please see the appropriate general group contributing guides in [project-management](https://gitlab.com/openstapps/projectmanagement/tree/master/project-docs/workflow).
## Updating and releasing related projects
Following semantic versioning patches to the core should not break existing usage.
### API
Every minor and major version of the core needs a corresponding version of the [API](https://openstapps.gitlab.io/api) to be used in the app and connectors.
Because the API is an integral part of the App and Node.js-based connectors this should be done for every new minor and major release of the core.
### Backend
The [backend](https://openstapps.gitlab.io/backend) uses the core to validate requests and responses. With the use of the [core tools](https://openstapps.gitlab.io/core-tools) it uses the core to set up the database according to the model.
Like for the API there should be a new release of the backend for every minor and major release of the core.
### Core tools
The [core tools](https://openstapps.gitlab.io/core-tools) are more or less not dependent on a specific core version and should normally not need adjustments for new core versions as long the structure of the code in the core stays the same.
### App and connectors
[App](https://openstapps.gitlab.io/app) and connectors use the API to communicate with the backend. To ensure compatibility the version of the used core must be the same as the one that is used in the used API.
App and connectors should be updated regularly to new releases of the core but not as important like API and backend. Since the app is just a view for the data stored in the backend it is not necessary to be up to date with the newest core immediately and the connectors are developed independently by every school and up to their responsibility.
## Additional coding style
### Extract inline type definitions

3267
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -1,6 +1,6 @@
{
"name": "@openstapps/core",
"version": "0.9.0",
"version": "0.13.0",
"description": "StAppsCore - Generalized model of data",
"keywords": [
"Model",
@@ -18,14 +18,14 @@
"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",
"documentation": "typedoc --includeDeclarations --excludeExternals --mode modules --out docs src",
"documentation": "typedoc --name \"@openstapps/core\" --includeDeclarations --mode modules --out docs --readme README.md --listInvalidSymbolLinks lib",
"pack": "openstapps-core-tools pack",
"prepublishOnly": "npm run build",
"prepublishOnly": "npm ci && npm run build",
"schema": "node --max-old-space-size=8192 --stack-size=10240 ./node_modules/.bin/openstapps-core-tools schema src/core lib/schema",
"test": "mocha --require ts-node/register --ui mocha-typescript test/*.spec.ts",
"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>",
@@ -38,27 +38,49 @@
"@types/geojson": "1.0.6",
"@types/json-patch": "0.0.30",
"json-patch": "0.7.0",
"jsonschema": "1.2.4"
"jsonschema": "1.2.4",
"ts-optchain": "0.1.3"
},
"devDependencies": {
"@openstapps/configuration": "0.6.0",
"@openstapps/configuration": "0.8.0",
"@openstapps/core-tools": "0.3.0",
"@openstapps/logger": "0.0.5",
"@types/chai": "4.1.7",
"@types/humanize-string": "1.0.0",
"@types/node": "11.9.3",
"@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",
"conventional-changelog-cli": "2.0.12",
"mocha": "6.0.2",
"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.0.3",
"tslint": "5.15.0",
"typedoc": "0.14.2",
"typescript": "3.3.3"
"typescript": "3.4.1"
},
"nyc": {
"check-coverage": true,
"per-file": true,
"lines": 95,
"statements": 95,
"functions": 95,
"branches": 95,
"include": [
"src/core/Route.ts",
"src/core/Thing.ts",
"src/core/Translator.ts"
],
"exclude": [],
"extension": [
".ts"
],
"reporter": [
"html",
"text-summary"
],
"all": true
}
}

View File

@@ -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.
@@ -12,55 +12,60 @@
* 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 {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 {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 {SCTour, SCTourMeta} from './things/Tour';
import {SCVideo, SCVideoMeta} from './things/Video';
import {SCThingType} from './Thing';
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 */
/**
* A map of things, from type to meta data
*/
export const SCClasses = {
export const SCClasses: { [K in SCThingType]: any } = {
/* tslint:enable */
'academic event': SCAcademicEventMeta,
article: SCArticleMeta,
book: SCBookMeta,
building: SCBuildingMeta,
catalog: SCCatalogMeta,
'article': SCArticleMeta,
'book': SCBookMeta,
'building': SCBuildingMeta,
'catalog': SCCatalogMeta,
'course of studies': SCCourseOfStudiesMeta,
'date series': SCDateSeriesMeta,
diff: SCDiffMeta,
dish: SCDishMeta,
favorite: SCFavoriteMeta,
floor: SCFloorMeta,
message: SCMessageMeta,
organization: SCOrganizationMeta,
person: SCPersonMeta,
'diff': SCDiffMeta,
'dish': SCDishMeta,
'favorite': SCFavoriteMeta,
'floor': SCFloorMeta,
'message': SCMessageMeta,
'organization': SCOrganizationMeta,
'person': SCPersonMeta,
'point of interest': SCPointOfInterestMeta,
room: SCRoomMeta,
'room': SCRoomMeta,
'semester': SCSemesterMeta,
setting: SCSettingMeta,
'setting': SCSettingMeta,
'sport course': SCSportCourseMeta,
ticket: SCTicketMeta,
tour: SCTourMeta,
video: SCVideoMeta,
'ticket': SCTicketMeta,
'todo': SCToDoMeta,
'tour': SCTourMeta,
'video': SCVideoMeta,
};
export type SCThingsWithoutDiff =
@@ -69,6 +74,7 @@ export type SCThingsWithoutDiff =
| SCBook
| SCBuilding
| SCCatalog
| SCCourseOfStudies
| SCDateSeries
| SCDish
| SCFavorite
@@ -82,6 +88,7 @@ export type SCThingsWithoutDiff =
| SCSetting
| SCSportCourse
| SCTicket
| SCToDo
| SCTour
| SCVideo;
@@ -96,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;

View File

@@ -12,11 +12,9 @@
* 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 {SCThingsField} from './Classes';
import {SCOrganization} from './things/Organization';
import {SCPerson} from './things/Person';
import {isThingWithTranslations} from './types/Guards';
import {SCTranslations} from './types/i18n';
import {SCMetaTranslations, SCTranslations} from './types/i18n';
import {SCISO8601Date} from './types/Time';
import {SCUuid} from './types/UUID';
@@ -189,117 +187,6 @@ export interface SCThingUserOrigin extends SCThingOrigin {
updated?: SCISO8601Date;
}
/**
* Meta information about things
*/
export class SCThingMeta {
/**
* Translations of fields
*/
static fieldTranslations: any = {
de: {
alternateNames: 'alternative Namen',
description: 'Beschreibung',
image: 'Bild',
name: 'Name',
translations: 'Übersetzungen',
type: 'Typ',
uid: 'Identifikation',
url: 'URL',
},
en: {
alternateNames: 'alternate names',
description: 'description',
uid: 'identification',
},
};
/**
* Translations of values of fields
*/
static fieldValueTranslations: any = {
de: {
type: {
AcademicTerm: 'Studienabschnitt',
Article: 'Artikel',
Book: 'Buch',
Catalog: 'Katalog',
Date: 'Termin',
Diff: 'Unterschied',
Dish: 'Essen',
Event: 'Veranstaltung',
Favorite: 'Favorit',
FloorPlan: 'Etagenplan',
Message: 'Nachricht',
Offer: 'Angebot',
Organization: 'Organisation',
Person: 'Person',
Place: 'Ort',
Setting: 'Einstellung',
Thing: 'Ding',
Ticket: 'Ticket',
Tour: 'Tour',
Video: 'Video',
},
},
};
/**
* Get field translation
*
* @param {keyof SCTranslations<T extends SCThing>} language Language to get field translation for
* @param {keyof T} field Field to get translation for
* @returns {string} Translated field or field itself
*/
static getFieldTranslation<T extends SCThing>(language: keyof SCTranslations<T>,
field: SCThingsField): string {
if (typeof this.fieldTranslations[language] !== 'undefined'
&& typeof this.fieldTranslations[language][field] !== 'undefined') {
return this.fieldTranslations[language][field];
}
return field as string;
}
/**
* Get field value translation
*
* @param {keyof SCTranslations<T>} language Language to get value translation for
* @param {string} field Field to get value translation for
* @param {T} thing SCThing to get value translation for
* @returns {string} Translated value or value itself
*/
static getFieldValueTranslation<T extends SCThing>(language: keyof SCTranslations<T>,
field: SCThingsField,
thing: T): string {
let translations: SCTranslations<SCThingTranslatableProperties>;
if (isThingWithTranslations(thing)) {
translations = thing.translations;
const languageTranslations: SCThingTranslatableProperties | undefined = translations[language];
if (typeof languageTranslations !== 'undefined') {
if (typeof (languageTranslations as any)[field] !== 'undefined') {
return (languageTranslations as any)[field];
}
}
}
// get translation from meta object
if (typeof this.fieldValueTranslations[language] !== 'undefined'
&& typeof this.fieldValueTranslations[language][field] !== 'undefined'
&& typeof (thing as any)[field] !== 'undefined'
&& typeof this.fieldValueTranslations[language][field][(thing as any)[field]]) {
return this.fieldValueTranslations[language][field][(thing as any)[field]];
}
// fallback to value itself
return (thing as any)[field];
}
}
/**
* Translatable properties of things
*/
@@ -327,3 +214,63 @@ export interface SCThingTranslatablePropertyOrigin {
*/
name: string;
}
/**
* Meta information about things
*/
export class SCThingMeta implements SCMetaTranslations<SCThing> {
/**
* Set type definiton for singleton instance
*/
protected static _instance: SCThingMeta;
/**
* Translations of fields
*/
fieldTranslations = {
de: {
alternateNames: 'alternative Namen',
description: 'Beschreibung',
image: 'Bild',
name: 'Name',
origin: 'Ursprung',
translations: 'Übersetzungen',
type: 'Typ',
uid: 'Identifikation',
url: 'URL',
},
en: {
alternateNames: 'alternate names',
description: 'description',
image: 'image',
name: 'name',
origin: 'origin',
translations: 'translations',
type: 'type',
uid: 'identification',
url: 'URL',
},
};
/**
* Translations of values of fields
*/
fieldValueTranslations = {
de: {
type: 'Ding',
},
en: {
type: 'Thing',
},
};
/**
* 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;
}
protected constructor() {}
}

303
src/core/Translator.ts Normal file
View File

@@ -0,0 +1,303 @@
/*
* 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 {SCClasses, SCThingsField} from './Classes';
import {SCThing, SCThingType} from './Thing';
import {SCTranslations} from './types/i18n';
import {Defined, OCType} from 'ts-optchain';
/**
* SCThingTranslator class
*/
export class SCThingTranslator {
/**
* Property representing the translators base language.
* This means every translation is given for this language.
*/
private baseLanguage: keyof SCTranslations<SCThing>;
/**
* Property representing the translators target language
*/
private language: keyof SCTranslations<SCThing>;
/**
* Property provinding a mapping from a SCThingType to its known own meta class.
*/
private metaClasses: typeof SCClasses;
/**
* @constructor
* @example
* // returns translator instance for german
* new SCThingTranslator('de');
*/
constructor(language: keyof SCTranslations<SCThing>, baseLanguage?: keyof SCTranslations<SCThing>) {
this.baseLanguage = baseLanguage ? baseLanguage : 'en';
this.language = language;
this.metaClasses = SCClasses;
}
/**
* Get field value translation recursively
*
* @param firstObject Top level object that gets passed through the recursion
* @param data The intermediate object / primitive returned by the Proxys get() method
* @param keyPath The keypath that (in the end) leads to the translatable property (when added to firstObject)
* @returns an OCType<T> object allowing for access to translations or a translated value(s)
*/
private deeptranslate<T, K extends SCThing>(firstObject: K, data?: T, keyPath?: string): OCType<T> {
const proxy = new Proxy(
((defaultValue?: Defined<T>) => (data == null ? defaultValue : data)) as OCType<T>,
{
get: (target, key) => {
const obj: any = target();
const extendedKeyPath = [keyPath, key.toString()].filter((e) => e != null).join('.');
let possiblePrimitive = obj[key];
// check if obj[key] is an array that contains primitive type (arrays in SCThings are not mixing types)
if (obj[key] instanceof Array && obj[key].length) {
possiblePrimitive = obj[key][0];
}
if (typeof possiblePrimitive === 'string' ||
typeof possiblePrimitive === 'number' ||
typeof possiblePrimitive === 'boolean') {
// returns final translation for primitive data types
return this.deeptranslate(firstObject,
this.getFieldValueTranslation(firstObject, extendedKeyPath),
extendedKeyPath);
}
// recursion to get more calls to the Proxy handler 'get()' (key path not complete)
return this.deeptranslate(firstObject, obj[key], extendedKeyPath);
},
},
);
return proxy;
}
/**
* Applies only known field translations of the given SCThings meta class to an instance
*
* @param thingType The type of thing that will be translated
* @param language The language the thing property values are translated to
* @returns The thing with all known meta values translated
*/
private getAllMetaFieldTranslations<T extends SCThing>(thingType: SCThingType,
language: keyof SCTranslations<T>): object | undefined {
const fieldTranslations = {};
const metaClass = this.getMetaClassInstance(thingType);
if (metaClass === undefined) {
return undefined;
}
// Assigns every property in fieldTranslations to the known base language translation
if (metaClass.fieldTranslations[this.baseLanguage] !== undefined) {
Object.keys(metaClass.fieldTranslations[this.baseLanguage]).forEach((key) => {
(fieldTranslations as any)[key] = metaClass.fieldTranslations[this.baseLanguage][key];
});
}
// Assigns every property in fieldTranslations to the known translation in given language
if (metaClass.fieldTranslations[language] !== undefined) {
Object.keys(metaClass.fieldTranslations[language]).forEach((key) => {
(fieldTranslations as any)[key] = metaClass.fieldTranslations[language][key];
});
}
return fieldTranslations;
}
/**
* Returns meta class needed for translations given a SCThingType
*
* @param thingType
* @returns An instance of the metaclass
*/
private getMetaClassInstance(thingType: SCThingType): any {
if (thingType in this.metaClasses) {
return new (this.metaClasses as any)[thingType]();
}
return undefined;
}
/**
* Returns property value at a certain (key) path of an object.
* @example
* // returns value of dish.offers[0].inPlace.categories[1]
* const dish: SCDish = {...};
* this.valueFromPath(dish, 'offers[0].inPlace.categories[1]');
* @param path Key path to evaluate
* @param obj Object to evaluate the key path upon
* @param separator Key path seperation element. Defaults to '.'
* @returns Property value at at key path
*/
private valueFromPath<T extends SCThing>(path: string, obj: T, separator = '.') {
path = path.replace(/\[/g, '.');
path = path.replace(/\]/g, '.');
path = path.replace(/\.\./g, '.');
path = path.replace(/\.$/, '');
const properties = path.split(separator);
return properties.reduce((prev: any, curr: any) => prev && prev[curr], obj);
}
/**
* Get field value translation
* @example
* // returns translation of the property (if available) in the language defined when creating the translator object
* const dish: SCDish = {...};
* translator.translate(dish, 'offers[0].inPlace.categories[1]');
* @param thing SCThing to get value translation for
* @param field Field to get value translation for (keypath allowed)
* @returns Translated value(s) or value(s) itself
*/
public getFieldValueTranslation<T extends SCThing>(thing: T,
field: SCThingsField): string | string[] {
let translationPath = 'translations.' + this.language + '.' + field;
const regexTrimProperties = /.*(?:(\..*)(\[\d+\])|(\.[^\d]*$)|(\..*)(\.[\d]*$))/;
const pathMatch = field.match(regexTrimProperties);
// when translation is given in thing
let translation = this.valueFromPath(translationPath, thing);
if (translation) {
return translation;
} else if (pathMatch && pathMatch[1] && pathMatch[2] || pathMatch && pathMatch[4] && pathMatch[5]) {
// accessing iteratable of nested thing
const keyPath = (pathMatch[1] ? pathMatch[1] : pathMatch[4]) + (pathMatch[2] ? pathMatch[2] : pathMatch[5]);
const redactedField = field.replace(keyPath, '');
// when translation is given in nested thing
translationPath = `${redactedField}.translations.${this.language}${keyPath}`;
translation = this.valueFromPath(translationPath, thing);
if (translation) {
return translation;
}
// when translation is given in nested meta thing via iterateable index
const nestedType = this.valueFromPath(field.replace(keyPath, '.type'), thing) as SCThingType;
translationPath = `fieldValueTranslations.${this.language}${keyPath}`;
translation = this.valueFromPath(translationPath.replace(
/\[(?=[^\[]*$).*|(?=[\d+]*$).*/, '[' + this.valueFromPath(field, thing) + ']'),
this.getMetaClassInstance(nestedType));
if (translation) {
return translation;
}
} else if (pathMatch && pathMatch[3]) {
// accessing meta or instance of nested thing primitive value depth > 0
const keyPath = pathMatch[3];
const redactedField = field.replace(pathMatch[3], '');
// when translation is given in nested thing
translationPath = `${redactedField}.translations.${this.language}${keyPath}`;
if (this.valueFromPath(translationPath, thing)) {
return this.valueFromPath(translationPath, thing);
}
// when translation is given in nested meta thing
const nestedType = this.valueFromPath(field.replace(keyPath, '.type'), thing) as SCThingType;
translationPath = `fieldValueTranslations.${this.language}${keyPath}`;
translation = this.valueFromPath(translationPath, this.getMetaClassInstance(nestedType));
if (translation instanceof Object) { // lookup translated keys in meta thing property
const translations: string[] = [];
this.valueFromPath(field, thing).forEach((key: string) => {
translationPath = `fieldValueTranslations.${this.language}${keyPath}.${key}`;
translations.push(this.valueFromPath(translationPath, this.getMetaClassInstance(nestedType)));
});
return translations;
}
if (!translation) { // translation not given, return as is
return this.valueFromPath(field, thing) as string;
}
return translation;
}
// accessing meta thing primitive value depth = 0
translationPath = `fieldValueTranslations.${this.language}.${field}`;
translation = this.valueFromPath(translationPath, this.getMetaClassInstance(thing.type));
if (translation) {
if (translation instanceof Object) { // lookup translated keys in meta thing property
const translations: string[] = [];
this.valueFromPath(field, thing).forEach((key: string) => {
translationPath = `fieldValueTranslations.${this.language}.${field}.${key}`;
translations.push(this.valueFromPath(translationPath, this.getMetaClassInstance(thing.type)));
});
return translations;
}
return translation;
}
// accessing meta thing primitive via iteratable index value depth = 0
translation = this.valueFromPath(translationPath.replace(
/\[(?=[^\[]*$).*|(?=[\d+]*$).*/, '[' + this.valueFromPath(field, thing) + ']'),
this.getMetaClassInstance(thing.type));
if (translation) {
return translation;
}
// last resort: return as is
return this.valueFromPath(field, thing) as string;
}
/**
* Get field value translation recursively
* @example
* const dish: SCDish = {...};
* translator.translate(dish).offers[0].inPlace.categories[1]());
* // or
* const dishTranslatedAccess = translator.translate(dish);
* dishTranslatedAccess.offers[0].inPlace.categories[1]();
* // undoing the OCType<T>
* const dishAsBefore: SCDish = dishTranslatedAccess()!;
* @param data Top level object that gets passed through the recursion
* @returns an OCType<T> object allowing for access to translations or a translated value(s)
*/
public translate<T extends SCThing>(data?: T): OCType<T> {
return new Proxy(
((defaultValue?: Defined<T>) => (data == null ? defaultValue : data)) as OCType<T>,
{
get: (target, key) => {
const obj: any = target();
let translatable = obj[key];
if (obj[key] instanceof Array && obj[key].length) {
translatable = obj[key][0];
if (typeof obj[key][0] === 'object' && !obj[key][0].origin) {
translatable = obj[key][0][Object.keys(obj[key][0])[0]];
}
}
if (typeof translatable === 'string') {
// retrieve final translation
return this.deeptranslate(data!, this.getFieldValueTranslation(data!, key.toString()), key.toString());
}
// recursion to get more calls to the Proxy handler 'get()' (key path not complete)
return this.deeptranslate(data!, obj[key], key.toString());
},
},
);
}
/**
* Given a SCThingType this function returns an object with the same basic structure as the corresponding SCThing.
* All the values will be set to the known translations of the property/key name.
* @example
* const translatedMetaDish = translator.translatedPropertyNames<SCCourseOfStudies>(SCThingType.CourseOfStudies);
* @param language The language the object is translated to
* @param thingType
* @returns An object with the properties of the SCThingType where the values are the known property tranlations
*/
public translatedPropertyNames<T extends SCThing>(thing: T,
language?: keyof SCTranslations<T>): T | undefined {
const targetLanguage = (language) ? language : this.language;
// return {...{}, ...this.getAllMetaFieldTranslations(thing.type, targetLanguage) as T};
return this.getAllMetaFieldTranslations(thing.type, targetLanguage) as T;
}
}

View File

@@ -14,6 +14,7 @@
*/
import {SCThing} from '../Thing';
import {SCThingMeta} from '../Thing';
import {SCMetaTranslations} from '../types/i18n';
/**
* An academic degree without references
@@ -40,19 +41,31 @@ export interface SCAcademicDegreeWithoutReferences extends SCThing {
export interface SCAcademicDegree extends SCAcademicDegreeWithoutReferences {
}
export class SCAcademicDegreeMeta extends SCThingMeta {
static fieldTranslations = {
...SCThingMeta.fieldTranslations,
/**
* Meta information about academic degrees
*/
export class SCAcademicDegreeMeta extends SCThingMeta implements SCMetaTranslations<SCAcademicDegree> {
/**
* Translations of fields
*/
fieldTranslations = {
de: {
...SCThingMeta.getInstance().fieldTranslations.de,
academicDegree: 'Hochschulgrad',
academicDegreewithField: 'Abschlussbezeichnungen',
academicDegreewithFieldShort: 'Abschlussbezeichnungen (kurz)',
},
en: {
...SCThingMeta.getInstance().fieldTranslations.en,
},
};
static fieldValueTranslations = {
...SCThingMeta.fieldValueTranslations,
/**
* Translations of values of fields
*/
fieldValueTranslations = {
de: {
...SCThingMeta.getInstance().fieldValueTranslations.de,
academicDegree: {
'bachelor': 'Bachelor',
'diploma': 'Diplom',
@@ -64,6 +77,9 @@ export class SCAcademicDegreeMeta extends SCThingMeta {
'state examination': 'Staatsexamen',
},
},
en: {
...SCThingMeta.getInstance().fieldValueTranslations.en,
},
};
}

View File

@@ -12,7 +12,8 @@
* 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 {SCThing} from '../Thing';
import {SCThing, SCThingMeta} from '../Thing';
import {SCMetaTranslations} from '../types/i18n';
import {SCISO8601Date} from '../types/Time';
/**
@@ -44,3 +45,32 @@ export interface SCAcademicTermWithoutReferences extends SCThing {
*/
startDate: SCISO8601Date;
}
/**
* Meta information about academic terms
*/
export class SCAcademicTermWithoutReferencesMeta extends SCThingMeta implements SCMetaTranslations<SCThing> {
/**
* Translations of fields
*/
fieldTranslations = {
de: {
... SCThingMeta.getInstance().fieldTranslations.de,
},
en: {
... SCThingMeta.getInstance().fieldTranslations.en,
},
};
/**
* Translations of values of fields
*/
fieldValueTranslations = {
de: {
... SCThingMeta.getInstance().fieldValueTranslations.de,
},
en: {
... SCThingMeta.getInstance().fieldValueTranslations.en,
},
};
}

View File

@@ -12,10 +12,10 @@
* 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 {SCThing, SCThingTranslatableProperties} from '../Thing';
import {SCThing, SCThingMeta, SCThingTranslatableProperties} from '../Thing';
import {SCOrganizationWithoutReferences} from '../things/Organization';
import {SCPersonWithoutReferences} from '../things/Person';
import {SCLanguage, SCTranslations} from '../types/i18n';
import {SCLanguage, SCMetaTranslations, SCTranslations} from '../types/i18n';
import {SCISO8601Date} from '../types/Time';
import {
SCAcademicPriceGroup,
@@ -78,3 +78,32 @@ export interface SCCreativeWorkTranslatableProperties
*/
keywords?: string[];
}
/**
* Meta information about creative works
*/
export class SCCreativeWorkMeta extends SCThingMeta implements SCMetaTranslations<SCCreativeWork> {
/**
* Translations of fields
*/
fieldTranslations = {
de: {
... SCThingMeta.getInstance().fieldTranslations.de,
},
en: {
... SCThingMeta.getInstance().fieldTranslations.en,
},
};
/**
* Translations of values of fields
*/
fieldValueTranslations = {
de: {
... SCThingMeta.getInstance().fieldValueTranslations.de,
},
en: {
... SCThingMeta.getInstance().fieldValueTranslations.en,
},
};
}

View File

@@ -12,10 +12,11 @@
* 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 {SCThing} from '../Thing';
import {SCThing, SCThingMeta} from '../Thing';
import {SCCatalogWithoutReferences} from '../things/Catalog';
import {SCPersonWithoutReferences} from '../things/Person';
import {SCSemesterWithoutReferences} from '../things/Semester';
import {SCMetaTranslations} from '../types/i18n';
import {SCCreativeWorkWithoutReferences} from './CreativeWork';
/**
@@ -68,3 +69,32 @@ export interface SCEvent extends SCEventWithoutReferences {
*/
performers?: SCPersonWithoutReferences[];
}
/**
* Meta information about events
*/
export class SCEventMeta extends SCThingMeta implements SCMetaTranslations<SCEvent> {
/**
* Translations of fields
*/
fieldTranslations = {
de: {
... SCThingMeta.getInstance().fieldTranslations.de,
},
en: {
... SCThingMeta.getInstance().fieldTranslations.en,
},
};
/**
* Translations of values of fields
*/
fieldValueTranslations = {
de: {
... SCThingMeta.getInstance().fieldValueTranslations.de,
},
en: {
... SCThingMeta.getInstance().fieldValueTranslations.en,
},
};
}

View File

@@ -12,8 +12,9 @@
* 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 {SCThing} from '../Thing';
import {SCThing, SCThingMeta, SCThingTranslatableProperties} from '../Thing';
import {SCGeoInformation} from '../types/GeoInformation';
import {SCMetaTranslations, SCTranslations} from '../types/i18n';
import {SCPostalAddress} from '../types/PostalAddress';
/**
@@ -38,4 +39,43 @@ export interface SCPlaceWithoutReferences extends SCThing {
* @see http://wiki.openstreetmap.org/wiki/Key:opening_hours/specification
*/
openingHours?: string;
/**
* Translated fields of a place
*/
translations?: SCTranslations<SCPlaceWithoutReferencesTranslatableProperties>;
}
export interface SCPlaceWithoutReferencesTranslatableProperties extends SCThingTranslatableProperties {
address?: SCPostalAddress;
}
/**
* Meta information about creative works
*/
export class SCPlaceWithoutReferencesMeta extends SCThingMeta implements SCMetaTranslations<SCPlaceWithoutReferences> {
/**
* Translations of fields
*/
fieldTranslations = {
de: {
... SCThingMeta.getInstance().fieldTranslations.de,
},
en: {
... SCThingMeta.getInstance().fieldTranslations.en,
},
};
/**
* Translations of values of fields
*/
fieldValueTranslations = {
de: {
... SCThingMeta.getInstance().fieldValueTranslations.de,
},
en: {
... SCThingMeta.getInstance().fieldValueTranslations.en,
},
};
}

View File

@@ -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;
}

View File

@@ -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.
@@ -12,20 +12,42 @@
* 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 {SCThing} from '../Thing';
import {SCBuildingWithoutReferences} from '../things/Building';
import {SCPointOfInterestWithoutReferences} from '../things/PointOfInterest';
import {SCRoomWithoutReferences} from '../things/Room';
import {SCThing, SCThingMeta} from '../Thing';
import {SCMetaTranslations} from '../types/i18n';
import {SCInPlace} from '../types/Places';
/**
* A thing that is or happens in a place
*/
export interface SCThingInPlace extends SCThing {
export interface SCThingInPlace extends SCThing, SCInPlace {}
/**
* Meta information about thing in a place
*/
export class SCThingInPlaceMeta extends SCThingMeta implements SCMetaTranslations<SCThingInPlace> {
/**
* Place the thing is or happens in
* Translations of fields
*/
inPlace?:
SCBuildingWithoutReferences
| SCPointOfInterestWithoutReferences
| SCRoomWithoutReferences;
fieldTranslations = {
de: {
... SCThingMeta.getInstance().fieldTranslations.de,
inPlace: 'Ort',
},
en: {
... SCThingMeta.getInstance().fieldTranslations.en,
inPlace: 'location',
},
};
/**
* Translations of values of fields
*/
fieldValueTranslations = {
de: {
... SCThingMeta.getInstance().fieldValueTranslations.de,
},
en: {
... SCThingMeta.getInstance().fieldValueTranslations.en,
},
};
}

View File

@@ -12,7 +12,8 @@
* 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 {SCThing} from '../Thing';
import {SCThing, SCThingMeta} from '../Thing';
import {SCMetaTranslations} from '../types/i18n';
/**
* Types of payment that are accepted at a place.
@@ -31,3 +32,33 @@ export interface SCThingThatAcceptsPaymentsWithoutReferences extends SCThing {
*/
paymentsAccepted?: SCThingThatAcceptsPaymentsAcceptedPayments[];
}
/**
* Meta information about a thing without references that accepts payments
*/
export class SCThingThatAcceptsPaymentsWithoutReferencesMeta extends SCThingMeta implements
SCMetaTranslations<SCThingThatAcceptsPaymentsWithoutReferences> {
/**
* Translations of fields
*/
fieldTranslations = {
de: {
... SCThingMeta.getInstance().fieldTranslations.de,
},
en: {
... SCThingMeta.getInstance().fieldTranslations.en,
},
};
/**
* Translations of values of fields
*/
fieldValueTranslations = {
de: {
... SCThingMeta.getInstance().fieldValueTranslations.de,
},
en: {
... SCThingMeta.getInstance().fieldValueTranslations.en,
},
};
}

View File

@@ -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,19 +13,20 @@
* this program. If not, see <https://www.gnu.org/licenses/>.
*/
import {SCThing, SCThingTranslatableProperties} from '../Thing';
import {SCBuildingWithoutReferences} from '../things/Building';
import {SCOrganizationWithoutReferences} from '../things/Organization';
import {SCPersonWithoutReferences} from '../things/Person';
import {SCPointOfInterestWithoutReferences} from '../things/PointOfInterest';
import {SCRoomWithoutReferences} from '../things/Room';
import {SCTranslations} from '../types/i18n';
import {SCISO8601Date} from '../types/Time';
import {SCInPlace} from './../types/Places';
/**
* A map from group name to price
* Default price without distinction
*/
export interface SCPriceGroup {
[s: string]: number | undefined;
/**
* Default price of the thing
*/
default: number;
}
/**
@@ -51,7 +52,8 @@ export interface SCAcademicPriceGroup extends SCPriceGroup {
/**
* A thing without references that has a price tag
*/
export interface SCThingThatCanBeOffered<T extends SCPriceGroup> extends SCThing {
export interface SCThingThatCanBeOffered<T extends SCPriceGroup>
extends SCThing {
/**
* List of offers for that thing
*/
@@ -66,7 +68,8 @@ export interface SCThingThatCanBeOffered<T extends SCPriceGroup> extends SCThing
/**
* Offer of a thing
*/
export interface SCThingThatCanBeOfferedOffer<T extends SCPriceGroup> {
export interface SCThingThatCanBeOfferedOffer<T extends SCPriceGroup>
extends SCInPlace {
/**
* Availability of an offer
*/
@@ -82,15 +85,10 @@ export interface SCThingThatCanBeOfferedOffer<T extends SCPriceGroup> {
*/
availabilityStarts?: SCISO8601Date;
/**
* Default price of the thing
*/
price: number;
/**
* List of prices that are distinct for specific groups
*/
prices?: T;
prices: T;
/**
* Provider of an offer
@@ -101,7 +99,8 @@ export interface SCThingThatCanBeOfferedOffer<T extends SCPriceGroup> {
/**
* Translatable properties of a thing that can be offered
*/
export interface SCThingThatCanBeOfferedTranslatableProperties extends SCThingTranslatableProperties {
export interface SCThingThatCanBeOfferedTranslatableProperties
extends SCThingTranslatableProperties {
/**
* Availability of an offer
*/
@@ -109,20 +108,17 @@ export interface SCThingThatCanBeOfferedTranslatableProperties extends SCThingTr
}
/**
* Possible things a provider can be
* Entity responsible for the offer
*/
export type SCThingThatCanBeOfferedProvider =
SCBuildingWithoutReferences
| SCOrganizationWithoutReferences
| SCPersonWithoutReferences
| SCPointOfInterestWithoutReferences
| SCRoomWithoutReferences;
| SCPersonWithoutReferences;
/**
* Availability of an Offer
*/
export type SCThingThatCanBeOfferedAvailability =
'in stock'
| 'in stock'
| 'out of stock'
| 'online only'
| 'limited availability';

View File

@@ -12,8 +12,8 @@
* 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 {SCThing, SCThingTranslatableProperties} from '../Thing';
import {SCTranslations} from '../types/i18n';
import {SCThing, SCThingMeta, SCThingTranslatableProperties} from '../Thing';
import {SCMetaTranslations, SCTranslations} from '../types/i18n';
import {SCMap} from '../types/Map';
/**
@@ -84,3 +84,46 @@ export interface SCThingWithCategoriesSpecificValues {
*/
url?: string;
}
/**
* Meta information about a thing without references that accepts payments
*/
export class SCThingWithCategoriesWithoutReferencesMeta<T, U> implements
SCMetaTranslations<SCThingWithCategoriesWithoutReferences<T, U>> {
protected static _instance: SCThingMeta;
/**
* Translations of fields
*/
fieldTranslations = {
de: {
... SCThingMeta.getInstance().fieldTranslations.de,
},
en: {
... SCThingMeta.getInstance().fieldTranslations.en,
},
};
/**
* Translations of values of fields
*/
fieldValueTranslations = {
de: {
... SCThingMeta.getInstance().fieldValueTranslations.de,
},
en: {
... SCThingMeta.getInstance().fieldValueTranslations.en,
},
};
/**
* Function to retrieve typed singleton instance (including generics)
*/
public static getInstance<T, U>(): SCThingWithCategoriesWithoutReferencesMeta<T, U> {
return this._instance || (this._instance = new this<T, U>());
}
protected constructor() {
}
}

View File

@@ -101,6 +101,19 @@ export class SCMethodNotAllowedErrorResponse extends SCError {
}
}
/**
* An error that is returned, when the request body is too large.
*/
export class SCRequestBodyTooLargeErrorResponse extends SCError {
/**
* Create a SCRequestBodyTooLargeErrorResponse
* @param stack Set to true if a stack trace should be created
*/
constructor(stack?: boolean) {
super('RequestBodyTooLargeError', 'The request body is too large.', 413, stack);
}
}
/**
* An error that is returned, when to many request are submitted at once
*/

View File

@@ -16,6 +16,7 @@ import {SCAbstractRoute, SCRouteHttpVerbs} from '../../../Route';
import {
SCInternalServerErrorResponse,
SCMethodNotAllowedErrorResponse,
SCRequestBodyTooLargeErrorResponse,
SCSyntaxErrorResponse,
SCUnsupportedMediaTypeErrorResponse,
SCValidationErrorResponse,
@@ -38,6 +39,7 @@ export class SCIndexRoute extends SCAbstractRoute {
this.errorNames = [
SCInternalServerErrorResponse,
SCMethodNotAllowedErrorResponse,
SCRequestBodyTooLargeErrorResponse,
SCSyntaxErrorResponse,
SCUnsupportedMediaTypeErrorResponse,
SCValidationErrorResponse,

View File

@@ -17,7 +17,9 @@ import {SCAbstractRoute, SCRouteHttpVerbs} from '../../../../Route';
import {
SCInternalServerErrorResponse,
SCMethodNotAllowedErrorResponse,
SCNotFoundErrorResponse, SCSyntaxErrorResponse,
SCNotFoundErrorResponse,
SCRequestBodyTooLargeErrorResponse,
SCSyntaxErrorResponse,
SCUnsupportedMediaTypeErrorResponse,
SCValidationErrorResponse,
} from '../../../errors/ErrorResponse';
@@ -39,6 +41,7 @@ export class SCThingUpdateRoute extends SCAbstractRoute {
SCInternalServerErrorResponse,
SCMethodNotAllowedErrorResponse,
SCNotFoundErrorResponse,
SCRequestBodyTooLargeErrorResponse,
SCSyntaxErrorResponse,
SCUnsupportedMediaTypeErrorResponse,
SCValidationErrorResponse,

View File

@@ -18,6 +18,7 @@ import {
SCInternalServerErrorResponse,
SCMethodNotAllowedErrorResponse,
SCNotFoundErrorResponse,
SCRequestBodyTooLargeErrorResponse,
SCSyntaxErrorResponse,
SCUnsupportedMediaTypeErrorResponse,
SCValidationErrorResponse,
@@ -71,6 +72,7 @@ export class SCBookAvailabilityRoute extends SCAbstractRoute {
SCInternalServerErrorResponse,
SCMethodNotAllowedErrorResponse,
SCNotFoundErrorResponse,
SCRequestBodyTooLargeErrorResponse,
SCSyntaxErrorResponse,
SCUnsupportedMediaTypeErrorResponse,
SCValidationErrorResponse,

View File

@@ -18,6 +18,7 @@ import {SCISO8601Date} from '../../../types/Time';
import {
SCInternalServerErrorResponse,
SCMethodNotAllowedErrorResponse,
SCRequestBodyTooLargeErrorResponse,
SCSyntaxErrorResponse,
SCUnsupportedMediaTypeErrorResponse,
SCValidationErrorResponse,
@@ -69,6 +70,7 @@ export class SCBulkRoute extends SCAbstractRoute {
this.errorNames = [
SCInternalServerErrorResponse,
SCMethodNotAllowedErrorResponse,
SCRequestBodyTooLargeErrorResponse,
SCSyntaxErrorResponse,
SCUnsupportedMediaTypeErrorResponse,
SCValidationErrorResponse,

View File

@@ -18,6 +18,7 @@ import {
SCInternalServerErrorResponse,
SCMethodNotAllowedErrorResponse,
SCNotFoundErrorResponse,
SCRequestBodyTooLargeErrorResponse,
SCSyntaxErrorResponse,
SCUnsupportedMediaTypeErrorResponse,
SCValidationErrorResponse,
@@ -39,6 +40,7 @@ export class SCBulkAddRoute extends SCAbstractRoute {
SCInternalServerErrorResponse,
SCMethodNotAllowedErrorResponse,
SCNotFoundErrorResponse,
SCRequestBodyTooLargeErrorResponse,
SCSyntaxErrorResponse,
SCUnsupportedMediaTypeErrorResponse,
SCValidationErrorResponse,

View File

@@ -17,6 +17,7 @@ import {
SCInternalServerErrorResponse,
SCMethodNotAllowedErrorResponse,
SCNotFoundErrorResponse,
SCRequestBodyTooLargeErrorResponse,
SCSyntaxErrorResponse,
SCUnsupportedMediaTypeErrorResponse,
SCValidationErrorResponse,
@@ -39,6 +40,7 @@ export class SCBulkDoneRoute extends SCAbstractRoute {
SCInternalServerErrorResponse,
SCMethodNotAllowedErrorResponse,
SCNotFoundErrorResponse,
SCRequestBodyTooLargeErrorResponse,
SCSyntaxErrorResponse,
SCUnsupportedMediaTypeErrorResponse,
SCValidationErrorResponse,

View File

@@ -17,6 +17,7 @@ import {SCMessage} from '../../../things/Message';
import {
SCInternalServerErrorResponse,
SCMethodNotAllowedErrorResponse,
SCRequestBodyTooLargeErrorResponse,
SCSyntaxErrorResponse,
SCUnsupportedMediaTypeErrorResponse,
SCValidationErrorResponse,
@@ -43,6 +44,7 @@ export class SCFeedbackRoute extends SCAbstractRoute {
this.errorNames = [
SCInternalServerErrorResponse,
SCMethodNotAllowedErrorResponse,
SCRequestBodyTooLargeErrorResponse,
SCSyntaxErrorResponse,
SCUnsupportedMediaTypeErrorResponse,
SCValidationErrorResponse,

View File

@@ -13,9 +13,11 @@
* this program. If not, see <https://www.gnu.org/licenses/>.
*/
import {SCAbstractRoute, SCRouteHttpVerbs} from '../../../Route';
import {SCMap} from '../../../types/Map';
import {
SCInternalServerErrorResponse,
SCMethodNotAllowedErrorResponse,
SCRequestBodyTooLargeErrorResponse,
SCSyntaxErrorResponse,
SCTooManyRequestsErrorResponse,
SCUnsupportedMediaTypeErrorResponse,
@@ -32,9 +34,7 @@ import {SCSearchQuery} from './SearchRequest';
*
* @validatable
*/
export interface SCMultiSearchRequest {
[k: string]: SCSearchQuery;
}
export type SCMultiSearchRequest = SCMap<SCSearchQuery>;
/**
* Route for submission of multiple search requests at once
@@ -45,6 +45,7 @@ export class SCMultiSearchRoute extends SCAbstractRoute {
this.errorNames = [
SCInternalServerErrorResponse,
SCMethodNotAllowedErrorResponse,
SCRequestBodyTooLargeErrorResponse,
SCSyntaxErrorResponse,
SCTooManyRequestsErrorResponse,
SCUnsupportedMediaTypeErrorResponse,

View File

@@ -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.
@@ -12,6 +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 {SCMap} from '../../../types/Map';
import {SCSearchResult} from './SearchResponse';
/**
@@ -21,6 +22,4 @@ import {SCSearchResult} from './SearchResponse';
*
* @validatable
*/
export interface SCMultiSearchResponse {
[k: string]: SCSearchResult;
}
export type SCMultiSearchResponse = SCMap<SCSearchResult>;

View File

@@ -18,6 +18,7 @@ import {SCSearchSort} from '../../../types/sorts/Abstract';
import {
SCInternalServerErrorResponse,
SCMethodNotAllowedErrorResponse,
SCRequestBodyTooLargeErrorResponse,
SCSyntaxErrorResponse,
SCUnsupportedMediaTypeErrorResponse,
SCValidationErrorResponse,
@@ -70,6 +71,7 @@ export class SCSearchRoute extends SCAbstractRoute {
this.errorNames = [
SCInternalServerErrorResponse,
SCMethodNotAllowedErrorResponse,
SCRequestBodyTooLargeErrorResponse,
SCSyntaxErrorResponse,
SCUnsupportedMediaTypeErrorResponse,
SCValidationErrorResponse,

View File

@@ -13,7 +13,6 @@
* this program. If not, see <https://www.gnu.org/licenses/>.
*/
import {SCThings, SCThingsField} from '../../../Classes';
import {SCMap} from '../../../types/Map';
/**
* A search response
@@ -53,9 +52,9 @@ export interface SCSearchResult {
*/
export interface SCFacet {
/**
* Values for the aggregation
* Buckets for the aggregation
*/
buckets: Array<SCMap<number>>;
buckets: SCFacetBucket[];
/**
* Field of the aggregation
@@ -63,6 +62,21 @@ export interface SCFacet {
field: SCThingsField;
}
/**
* A bucket of a facet
*/
export interface SCFacetBucket {
/**
* Count of matching search results
*/
count: number;
/**
* Key of a bucket
*/
key: string;
}
/**
* Stores information about Pagination
*/

View File

@@ -12,14 +12,15 @@
* 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 {SCEvent, SCEventWithoutReferences} from '../base/Event';
import {SCEvent, SCEventMeta, SCEventWithoutReferences} from '../base/Event';
import {
SCThingWithCategoriesSpecificValues,
SCThingWithCategoriesTranslatableProperties,
SCThingWithCategoriesWithoutReferences,
SCThingWithCategoriesWithoutReferencesMeta,
} from '../base/ThingWithCategories';
import {SCThingMeta, SCThingType} from '../Thing';
import {SCTranslations} from '../types/i18n';
import {SCMetaTranslations, SCTranslations} from '../types/i18n';
/**
* An academic event without references
@@ -66,18 +67,6 @@ export interface SCAcademicEvent extends SCEvent, SCAcademicEventWithoutReferenc
type: SCThingType.AcademicEvent;
}
/**
* Event meta data
*/
export class SCAcademicEventMeta extends SCThingMeta {
static fieldValueTranslations = {
...SCThingMeta.fieldValueTranslations,
de: {
type: 'Event',
},
};
}
/**
* Categories of academic events
*/
@@ -111,3 +100,42 @@ export interface SCAcademicEventTranslatableProperties
*/
originalCategory?: string;
}
/**
* Meta information about academic events
*/
export class SCAcademicEventMeta extends SCThingMeta implements SCMetaTranslations<SCAcademicEvent> {
/**
* Translations of fields
*/
fieldTranslations = {
de: {
... SCEventMeta.getInstance().fieldTranslations.de,
... SCThingWithCategoriesWithoutReferencesMeta.getInstance<SCAcademicEventCategories,
SCThingWithCategoriesSpecificValues>().fieldTranslations.de,
},
en: {
... SCEventMeta.getInstance().fieldTranslations.en,
... SCThingWithCategoriesWithoutReferencesMeta.getInstance<SCAcademicEventCategories,
SCThingWithCategoriesSpecificValues>().fieldTranslations.en,
},
};
/**
* Translations of values of fields
*/
fieldValueTranslations = {
de: {
... SCEventMeta.getInstance().fieldValueTranslations.de,
... SCThingWithCategoriesWithoutReferencesMeta.getInstance<SCAcademicEventCategories,
SCThingWithCategoriesSpecificValues>().fieldValueTranslations.de,
type: 'akademische Veranstaltung',
},
en: {
... SCEventMeta.getInstance().fieldValueTranslations.en,
... SCThingWithCategoriesWithoutReferencesMeta.getInstance<SCAcademicEventCategories,
SCThingWithCategoriesSpecificValues>().fieldValueTranslations.en,
type: SCThingType.AcademicEvent,
},
};
}

View File

@@ -14,6 +14,7 @@
*/
import {
SCCreativeWork,
SCCreativeWorkMeta,
SCCreativeWorkTranslatableProperties,
SCCreativeWorkWithoutReferences,
} from '../base/CreativeWork';
@@ -21,9 +22,10 @@ import {
SCThingWithCategoriesSpecificValues,
SCThingWithCategoriesTranslatableProperties,
SCThingWithCategoriesWithoutReferences,
SCThingWithCategoriesWithoutReferencesMeta,
} from '../base/ThingWithCategories';
import {SCThingMeta, SCThingType} from '../Thing';
import {SCTranslations} from '../types/i18n';
import {SCMetaTranslations, SCTranslations} from '../types/i18n';
/**
* An article without references
@@ -65,19 +67,6 @@ export interface SCArticle extends SCCreativeWork, SCArticleWithoutReferences {
type: SCThingType.Article;
}
/**
* Meta information about an article
*/
export class SCArticleMeta extends SCThingMeta {
static fieldTranslations = {
...SCThingMeta.fieldTranslations,
de: {
articleBody: 'Artikeltext',
categories: 'Kategorien',
},
};
}
/**
* Categories of articles
*/
@@ -93,3 +82,42 @@ export interface SCArticleTranslatableProperties
*/
articleBody?: string[];
}
/**
* Meta information about an article
*/
export class SCArticleMeta extends SCThingMeta implements SCMetaTranslations<SCArticle> {
/**
* Translations of fields
*/
fieldTranslations = {
de: {
... SCCreativeWorkMeta.getInstance().fieldTranslations.de,
... SCThingWithCategoriesWithoutReferencesMeta.getInstance<SCArticleCategories,
SCThingWithCategoriesSpecificValues>().fieldTranslations.de,
},
en: {
... SCCreativeWorkMeta.getInstance().fieldTranslations.en,
... SCThingWithCategoriesWithoutReferencesMeta.getInstance<SCArticleCategories,
SCThingWithCategoriesSpecificValues>().fieldTranslations.en,
},
};
/**
* Translations of values of fields
*/
fieldValueTranslations = {
de: {
... SCCreativeWorkMeta.getInstance().fieldValueTranslations.de,
... SCThingWithCategoriesWithoutReferencesMeta.getInstance<SCArticleCategories,
SCThingWithCategoriesSpecificValues>().fieldValueTranslations.de,
type: 'Artikel',
},
en: {
... SCCreativeWorkMeta.getInstance().fieldValueTranslations.en,
... SCThingWithCategoriesWithoutReferencesMeta.getInstance<SCArticleCategories,
SCThingWithCategoriesSpecificValues>().fieldValueTranslations.en,
type: SCThingType.Article,
},
};
}

View File

@@ -14,12 +14,13 @@
*/
import {
SCCreativeWork,
SCCreativeWorkMeta,
SCCreativeWorkTranslatableProperties,
SCCreativeWorkWithoutReferences,
} from '../base/CreativeWork';
import {SCThingWithCategoriesTranslatableProperties} from '../base/ThingWithCategories';
import {SCThingMeta, SCThingType} from '../Thing';
import {SCTranslations} from '../types/i18n';
import {SCMetaTranslations, SCTranslations} from '../types/i18n';
import {SCPersonWithoutReferences} from './Person';
/**
@@ -74,20 +75,6 @@ export interface SCBook extends SCCreativeWork, SCBookWithoutReferences {
type: SCThingType.Book;
}
/**
* Meta information about a book
*/
export class SCBookMeta extends SCThingMeta {
static fieldTranslations = {
...SCThingMeta.fieldTranslations,
de: {
bookEdition: 'Edition',
isbn: 'ISBN',
numberOfPages: 'Seitenanzahl',
},
};
}
/**
* Translatable properties of a book
*/
@@ -98,3 +85,34 @@ export interface SCBookTranslatableFields
*/
bookEdition?: string;
}
/**
* Meta information about a book
*/
export class SCBookMeta extends SCThingMeta implements SCMetaTranslations<SCBook> {
/**
* Translations of fields
*/
fieldTranslations = {
de: {
... SCCreativeWorkMeta.getInstance().fieldTranslations.de,
},
en: {
... SCCreativeWorkMeta.getInstance().fieldTranslations.en,
},
};
/**
* Translations of values of fields
*/
fieldValueTranslations = {
de: {
... SCCreativeWorkMeta.getInstance().fieldValueTranslations.de,
type: 'Buch',
},
en: {
... SCCreativeWorkMeta.getInstance().fieldValueTranslations.en,
type: SCThingType.Book,
},
};
}

View File

@@ -12,14 +12,19 @@
* 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 {SCPlaceWithoutReferences} from '../base/Place';
import {
SCPlaceWithoutReferences,
SCPlaceWithoutReferencesMeta,
SCPlaceWithoutReferencesTranslatableProperties,
} from '../base/Place';
import {
SCThingWithCategoriesSpecificValues,
SCThingWithCategoriesTranslatableProperties,
SCThingWithCategoriesWithoutReferences,
SCThingWithCategoriesWithoutReferencesMeta,
} from '../base/ThingWithCategories';
import {SCThingMeta, SCThingType} from '../Thing';
import {SCTranslations} from '../types/i18n';
import {SCMetaTranslations, SCTranslations} from '../types/i18n';
export type SCBuildingCategories =
'cafe'
@@ -48,7 +53,7 @@ export interface SCBuildingWithoutReferences
/**
* Translated fields of a building
*/
translations?: SCTranslations<SCThingWithCategoriesTranslatableProperties>;
translations?: SCTranslations<SCBuildingTranslatableProperties>;
/**
* Type of the building
@@ -62,19 +67,51 @@ export interface SCBuildingWithoutReferences
* @validatable
*/
export interface SCBuilding extends SCBuildingWithoutReferences {
/**
* Translated fields of a building
*/
translations?: SCTranslations<SCBuildingTranslatableProperties>;
/**
* Type of the building
*/
type: SCThingType.Building;
}
/**
* Meta information about a place
*/
export class SCBuildingMeta extends SCThingMeta {
static fieldValueTranslations = {
...SCThingMeta.fieldValueTranslations,
export interface SCBuildingTranslatableProperties
extends SCPlaceWithoutReferencesTranslatableProperties, SCThingWithCategoriesTranslatableProperties {
floors?: string[];
}
/**
* Meta information about a place
*/
export class SCBuildingMeta extends SCThingMeta implements SCMetaTranslations<SCBuilding> {
/**
* Translations of fields
*/
fieldTranslations = {
de: {
... SCThingWithCategoriesWithoutReferencesMeta.getInstance<SCBuildingCategories,
SCThingWithCategoriesSpecificValues>().fieldTranslations.de,
... SCPlaceWithoutReferencesMeta.getInstance().fieldTranslations.de,
floors: 'Etagen',
},
en: {
... SCThingWithCategoriesWithoutReferencesMeta.getInstance<SCBuildingCategories,
SCThingWithCategoriesSpecificValues>().fieldTranslations.en,
... SCPlaceWithoutReferencesMeta.getInstance().fieldTranslations.en,
},
};
/**
* Translations of values of fields
*/
fieldValueTranslations = {
de: {
... SCThingWithCategoriesWithoutReferencesMeta.getInstance<SCBuildingCategories,
SCThingWithCategoriesSpecificValues>().fieldValueTranslations.de,
... SCPlaceWithoutReferencesMeta.getInstance().fieldValueTranslations.de,
categories: {
'cafe': 'Café',
'canteen': 'Kantine',
@@ -85,6 +122,13 @@ export class SCBuildingMeta extends SCThingMeta {
'restroom': 'Toilette',
'student canteen': 'Mensa',
},
type: 'Gebäude',
},
en: {
... SCThingWithCategoriesWithoutReferencesMeta.getInstance<SCBuildingCategories,
SCThingWithCategoriesSpecificValues>().fieldValueTranslations.en,
... SCPlaceWithoutReferencesMeta.getInstance().fieldValueTranslations.en,
type: SCThingType.Building,
},
};
}

View File

@@ -13,8 +13,13 @@
* this program. If not, see <https://www.gnu.org/licenses/>.
*/
import {SCAcademicTermWithoutReferences} from '../base/AcademicTerm';
import {SCThingWithCategoriesSpecificValues, SCThingWithCategoriesWithoutReferences} from '../base/ThingWithCategories';
import {
SCThingWithCategoriesSpecificValues,
SCThingWithCategoriesWithoutReferences,
SCThingWithCategoriesWithoutReferencesMeta,
} from '../base/ThingWithCategories';
import {SCThingMeta, SCThingType} from '../Thing';
import {SCMetaTranslations} from '../types/i18n';
/**
* A catalog without references
@@ -62,10 +67,39 @@ export interface SCCatalog extends SCCatalogWithoutReferences {
type: SCThingType.Catalog;
}
/**
* Catalog meta data
*/
export class SCCatalogMeta extends SCThingMeta {
/**
* Catalog meta data
*/
export class SCCatalogMeta extends SCThingMeta implements SCMetaTranslations<SCCatalog> {
/**
* Translations of fields
*/
fieldTranslations = {
de: {
... SCThingWithCategoriesWithoutReferencesMeta.getInstance<SCCatalogCategories,
SCThingWithCategoriesSpecificValues>().fieldTranslations.de,
},
en: {
... SCThingWithCategoriesWithoutReferencesMeta.getInstance<SCCatalogCategories,
SCThingWithCategoriesSpecificValues>().fieldTranslations.en,
},
};
/**
* Translations of values of fields
*/
fieldValueTranslations = {
de: {
... SCThingWithCategoriesWithoutReferencesMeta.getInstance<SCCatalogCategories,
SCThingWithCategoriesSpecificValues>().fieldValueTranslations.de,
type: 'Verzeichnis',
},
en: {
... SCThingWithCategoriesWithoutReferencesMeta.getInstance<SCCatalogCategories,
SCThingWithCategoriesSpecificValues>().fieldValueTranslations.en,
type: SCThingType.Catalog,
},
};
}
/**

View File

@@ -12,12 +12,12 @@
* 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 {SCAcademicDegree} from '../base/AcademicDegree';
import {SCAcademicDegree, SCAcademicDegreeMeta} from '../base/AcademicDegree';
import {SCAcademicPriceGroup,
SCThingThatCanBeOffered,
SCThingThatCanBeOfferedTranslatableProperties} from '../base/ThingThatCanBeOffered';
import {SCThingMeta, SCThingType} from '../Thing';
import {SCLanguage, SCTranslations} from '../types/i18n';
import {SCLanguage, SCMetaTranslations, SCTranslations} from '../types/i18n';
import {SCDateSeriesWithoutReferences} from './DateSeries';
import {SCOrganization} from './Organization';
@@ -92,22 +92,27 @@ export interface SCCourseOfStudiesTranslatableProperties
}
/**
* course of studies meta data
* Meta information about a course of studies
*/
export class SCCourseOfStudiesMeta extends SCThingMeta {
static fieldTranslations = {
...SCThingMeta.fieldTranslations,
export class SCCourseOfStudiesMeta extends SCThingMeta implements SCMetaTranslations<SCCourseOfStudies> {
/**
* Translations of fields
*/
fieldTranslations = {
de: {
academicDegree: 'Hochschulabschluss',
department: 'Fachbereich',
major: 'Studienfach',
modes: 'Studiengangsarten',
secretary: 'Sekretariat',
... SCAcademicDegreeMeta.getInstance().fieldTranslations.de,
},
en: {
... SCAcademicDegreeMeta.getInstance().fieldTranslations.en,
},
};
static fieldValueTranslations = {
...SCThingMeta.fieldValueTranslations,
/**
* Translations of values of fields
*/
fieldValueTranslations = {
de: {
... SCAcademicDegreeMeta.getInstance().fieldValueTranslations.de,
modes: {
combination: 'Kombinationsstudiengang',
dual: 'Dualer Studiengang',
@@ -116,6 +121,15 @@ export class SCCourseOfStudiesMeta extends SCThingMeta {
},
type: 'Studiengang',
},
en: {
... SCAcademicDegreeMeta.getInstance().fieldValueTranslations.en,
academicDegree: 'Hochschulabschluss',
department: 'Fachbereich',
major: 'Studienfach',
modes: 'Studiengangsarten',
secretary: 'Sekretariat',
type: SCThingType.CourseOfStudies,
},
};
}

View File

@@ -12,14 +12,14 @@
* 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 {SCThingInPlace} from '../base/ThingInPlace';
import {SCThingInPlace, SCThingInPlaceMeta} from '../base/ThingInPlace';
import {
SCAcademicPriceGroup,
SCThingThatCanBeOffered,
SCThingThatCanBeOfferedTranslatableProperties,
} from '../base/ThingThatCanBeOffered';
import {SCThingMeta, SCThingType} from '../Thing';
import {SCTranslations} from '../types/i18n';
import {SCMetaTranslations, SCTranslations} from '../types/i18n';
import {SCISO8601Date, SCISO8601Duration} from '../types/Time';
import {SCAcademicEventWithoutReferences} from './AcademicEvent';
import {SCPersonWithoutReferences} from './Person';
@@ -32,7 +32,7 @@ export interface SCSportCoursePriceGroup extends SCAcademicPriceGroup {
/**
* Price for alumnis
*/
alumni: number;
alumni?: number;
}
/**
@@ -100,15 +100,35 @@ export interface SCDateSeries extends SCDateSeriesWithoutReferences, SCThingInPl
}
/**
* Date series meta data
* Meta information about a date series
*/
export class SCDateSeriesMeta extends SCThingMeta {
static fieldTranslations = {
...SCThingMeta.fieldTranslations,
export class SCDateSeriesMeta extends SCThingMeta implements SCMetaTranslations<SCDateSeries> {
/**
* Translations of fields
*/
fieldTranslations = {
de: {
... SCThingInPlaceMeta.getInstance().fieldTranslations.de,
},
en: {
... SCThingInPlaceMeta.getInstance().fieldTranslations.en,
},
};
/**
* Translations of values of fields
*/
fieldValueTranslations = {
de: {
... SCThingInPlaceMeta.getInstance().fieldValueTranslations.de,
dates: 'Einzeltermine',
duration: 'Dauer',
frequency: 'Wiederholung',
type: 'Wiederholungreihe',
},
en: {
... SCThingInPlaceMeta.getInstance().fieldValueTranslations.en,
type: SCThingType.DateSeries,
},
};
}

View File

@@ -15,6 +15,7 @@
import * as jsonpatch from 'json-patch';
import {SCThingsWithoutDiff} from '../Classes';
import {SCThing, SCThingMeta, SCThingType} from '../Thing';
import {SCMetaTranslations} from '../types/i18n';
import {SCISO8601Date} from '../types/Time';
/**
@@ -60,15 +61,40 @@ export interface SCDiff extends SCDiffWithoutReferences {
}
/**
* Diff meta data
* Meta information about a diff
*/
export class SCDiffMeta extends SCThingMeta {
static fieldTranslations = {
...SCThingMeta.fieldTranslations,
export class SCDiffMeta extends SCThingMeta implements SCMetaTranslations<SCDiff> {
/**
* Set type definiton for singleton instance
*/
protected static _instance: SCThingMeta;
/**
* Translations of fields
*/
fieldTranslations = {
de: {
... SCThingMeta.getInstance().fieldTranslations.de,
action: 'Aktion',
changes: 'Änderungen',
dateCreated: 'Erstellungsdatum',
},
en: {
... SCThingMeta.getInstance().fieldTranslations.en,
},
};
/**
* Translations of values of fields
*/
fieldValueTranslations = {
de: {
... SCThingMeta.getInstance().fieldValueTranslations.de,
type: 'Unterschied',
},
en: {
... SCThingMeta.getInstance().fieldValueTranslations.en,
type: SCThingType.Diff,
},
};
}

View File

@@ -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.
@@ -12,7 +12,6 @@
* 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 {SCThingInPlace} from '../base/ThingInPlace';
import {
SCAcademicPriceGroup,
SCThingThatCanBeOffered,
@@ -22,16 +21,19 @@ import {
SCThingWithCategoriesSpecificValues,
SCThingWithCategoriesTranslatableProperties,
SCThingWithCategoriesWithoutReferences,
SCThingWithCategoriesWithoutReferencesMeta,
} from '../base/ThingWithCategories';
import {SCThingMeta, SCThingType} from '../Thing';
import {SCTranslations} from '../types/i18n';
import {SCMetaTranslations, SCTranslations} from '../types/i18n';
/**
* A dish without references
*/
export interface SCDishWithoutReferences
extends SCThingWithCategoriesWithoutReferences<SCDishCategories,
SCThingWithCategoriesSpecificValues>,
extends SCThingWithCategoriesWithoutReferences<
SCDishCategories,
SCThingWithCategoriesSpecificValues
>,
SCThingThatCanBeOffered<SCAcademicPriceGroup> {
/**
* Additives of the dish
@@ -69,7 +71,7 @@ export interface SCDishWithoutReferences
*
* @validatable
*/
export interface SCDish extends SCDishWithoutReferences, SCThingInPlace {
export interface SCDish extends SCDishWithoutReferences {
/**
* Dishes ("Beilagen") that are served with the dish (if only certain supplement dishes can be taken with a dish)
*/
@@ -88,18 +90,10 @@ export interface SCDish extends SCDishWithoutReferences, SCThingInPlace {
export interface SCDishTranslatableProperties
extends SCThingWithCategoriesTranslatableProperties, SCThingThatCanBeOfferedTranslatableProperties {
}
/**
* Dish meta data
*/
export class SCDishMeta extends SCThingMeta {
static fieldTranslations = {
...SCThingMeta.fieldTranslations,
de: {
categories: 'Kategorien',
},
};
/**
* Characteristics of the dish
*/
characteristics?: SCDishCharacteristic[];
}
/**
@@ -121,7 +115,7 @@ export interface SCDishCharacteristic {
* A list of categories for dishes
*/
export type SCDishCategories =
'appetizer'
| 'appetizer'
| 'salad'
| 'main dish'
| 'dessert'
@@ -169,3 +163,46 @@ export interface SCNutritionInformation {
*/
sugarContent?: number;
}
/**
* Meta information about a dish
*/
export class SCDishMeta extends SCThingMeta implements SCMetaTranslations<SCDish> {
/**
* Translations of fields
*/
fieldTranslations = {
de: {
... SCThingWithCategoriesWithoutReferencesMeta.getInstance<SCDishCategories,
SCThingWithCategoriesSpecificValues>().fieldTranslations.de,
},
en: {
... SCThingWithCategoriesWithoutReferencesMeta.getInstance<SCDishCategories,
SCThingWithCategoriesSpecificValues>().fieldTranslations.en,
},
};
/**
* Translations of values of fields
*/
fieldValueTranslations = {
de: {
... SCThingWithCategoriesWithoutReferencesMeta.getInstance<SCDishCategories,
SCThingWithCategoriesSpecificValues>().fieldValueTranslations.de,
categories: {
appetizer: 'Vorspeise',
dessert: 'Nachtisch',
'main dish': 'Hauptgericht',
salad: 'Salat',
'side dish': 'Beilage',
soup: 'Suppe',
},
type: 'Essen',
},
en: {
... SCThingWithCategoriesWithoutReferencesMeta.getInstance<SCDishCategories,
SCThingWithCategoriesSpecificValues>().fieldValueTranslations.en,
type: SCThingType.Dish,
},
};
}

View File

@@ -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
*

View File

@@ -13,9 +13,9 @@
* this program. If not, see <https://www.gnu.org/licenses/>.
*/
import {Feature, FeatureCollection, GeometryObject, LineString} from 'geojson';
import {SCThingInPlace} from '../base/ThingInPlace';
import {SCThingInPlace, SCThingInPlaceMeta} from '../base/ThingInPlace';
import {SCThing, SCThingMeta, SCThingTranslatableProperties, SCThingType} from '../Thing';
import {SCTranslations} from '../types/i18n';
import {SCMetaTranslations, SCTranslations} from '../types/i18n';
import {SCPointOfInterestWithoutReferences} from './PointOfInterest';
import {SCRoomWithoutReferences} from './Room';
@@ -61,12 +61,6 @@ export interface SCFloor extends SCFloorWithoutReferences, SCThingInPlace {
type: SCThingType.Floor;
}
/**
* Meta information about a floor
*/
export class SCFloorMeta extends SCThingMeta {
}
/**
* A feature collection
*/
@@ -98,3 +92,34 @@ export interface SCFloorTranslatableProperties extends SCThingTranslatableProper
*/
floorName?: string;
}
/**
* Meta information about floors
*/
export class SCFloorMeta extends SCThingMeta implements SCMetaTranslations<SCFloor> {
/**
* Translations of fields
*/
fieldTranslations = {
de: {
... SCThingInPlaceMeta.getInstance().fieldTranslations.de,
},
en: {
... SCThingInPlaceMeta.getInstance().fieldTranslations.en,
},
};
/**
* Translations of values of fields
*/
fieldValueTranslations = {
de: {
... SCThingInPlaceMeta.getInstance().fieldValueTranslations.de,
type: 'Etage',
},
en: {
... SCThingInPlaceMeta.getInstance().fieldValueTranslations.en,
type: SCThingType.Floor,
},
};
}

View File

@@ -14,12 +14,13 @@
*/
import {
SCCreativeWork,
SCCreativeWorkMeta,
SCCreativeWorkTranslatableProperties,
SCCreativeWorkWithoutReferences,
} from '../base/CreativeWork';
import {SCThingThatCanBeOfferedTranslatableProperties} from '../base/ThingThatCanBeOffered';
import {SCThingMeta, SCThingType} from '../Thing';
import {SCTranslations} from '../types/i18n';
import {SCMetaTranslations, SCTranslations} from '../types/i18n';
import {SCISO8601Date} from '../types/Time';
/**
@@ -69,12 +70,6 @@ export interface SCMessage extends SCCreativeWork, SCMessageWithoutReferences {
type: SCThingType.Message;
}
/**
* Meta information about a message
*/
export class SCMessageMeta extends SCThingMeta {
}
/**
* Audiences for messages
*/
@@ -93,3 +88,34 @@ export interface SCMessageTranslatableProperties
*/
message?: string;
}
/**
* Meta information about messages
*/
export class SCMessageMeta extends SCThingMeta implements SCMetaTranslations<SCMessage> {
/**
* Translations of fields
*/
fieldTranslations = {
de: {
... SCCreativeWorkMeta.getInstance().fieldTranslations.de,
},
en: {
... SCCreativeWorkMeta.getInstance().fieldTranslations.en,
},
};
/**
* Translations of values of fields
*/
fieldValueTranslations = {
de: {
... SCCreativeWorkMeta.getInstance().fieldValueTranslations.de,
type: 'Nachricht',
},
en: {
... SCCreativeWorkMeta.getInstance().fieldValueTranslations.en,
type: SCThingType.Message,
},
};
}

View File

@@ -13,7 +13,7 @@
* this program. If not, see <https://www.gnu.org/licenses/>.
*/
import {SCThing, SCThingMeta, SCThingType} from '../Thing';
import {SCNationality} from '../types/i18n';
import {SCMetaTranslations, SCNationality} from '../types/i18n';
import {SCISO8601Date} from '../types/Time';
import {SCBuildingWithoutReferences} from './Building';
import {SCOrganizationWithoutReferences} from './Organization';
@@ -129,7 +129,32 @@ export interface SCPerson extends SCPersonWithoutReferences {
/**
* Meta information about a person
*/
export class SCPersonMeta extends SCThingMeta {
export class SCPersonMeta extends SCThingMeta implements SCMetaTranslations<SCPerson> {
/**
* Translations of fields
*/
fieldTranslations = {
de: {
... SCThingMeta.getInstance().fieldTranslations.de,
},
en: {
... SCThingMeta.getInstance().fieldTranslations.en,
},
};
/**
* Translations of values of fields
*/
fieldValueTranslations = {
de: {
... SCThingMeta.getInstance().fieldValueTranslations.de,
type: 'Person',
},
en: {
... SCThingMeta.getInstance().fieldValueTranslations.en,
type: SCThingType.Person,
},
};
}
/**

View File

@@ -12,15 +12,16 @@
* 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 {SCPlaceWithoutReferences} from '../base/Place';
import {SCPlaceWithoutReferences, SCPlaceWithoutReferencesMeta} from '../base/Place';
import {SCThingInPlace} from '../base/ThingInPlace';
import {
SCThingWithCategoriesSpecificValues,
SCThingWithCategoriesTranslatableProperties,
SCThingWithCategoriesWithoutReferences,
SCThingWithCategoriesWithoutReferencesMeta,
} from '../base/ThingWithCategories';
import {SCThingMeta, SCThingType} from '../Thing';
import {SCTranslations} from '../types/i18n';
import {SCMetaTranslations, SCTranslations} from '../types/i18n';
/**
* A point of interest without references
@@ -68,7 +69,42 @@ export type SCPointOfInterestCategories =
| 'disabled access';
/**
* Meta data of a point of interest
* Meta information about points of interest
*/
export class SCPointOfInterestMeta extends SCThingMeta {
export class SCPointOfInterestMeta extends SCThingMeta implements SCMetaTranslations<SCPointOfInterest> {
/**
* Translations of fields
*/
fieldTranslations = {
de: {
// tslint:disable-next-line:max-line-length
... SCThingWithCategoriesWithoutReferencesMeta.getInstance<SCPointOfInterestCategories,
SCThingWithCategoriesSpecificValues>().fieldTranslations.de,
... SCPlaceWithoutReferencesMeta.getInstance().fieldTranslations.de,
},
en: {
// tslint:disable-next-line:max-line-length
... SCThingWithCategoriesWithoutReferencesMeta.getInstance<SCPointOfInterestCategories,
SCThingWithCategoriesSpecificValues>().fieldTranslations.en,
... SCPlaceWithoutReferencesMeta.getInstance().fieldTranslations.en,
},
};
/**
* Translations of values of fields
*/
fieldValueTranslations = {
de: {
... SCThingWithCategoriesWithoutReferencesMeta.getInstance<SCPointOfInterestCategories,
SCThingWithCategoriesSpecificValues>().fieldValueTranslations.de,
... SCPlaceWithoutReferencesMeta.getInstance().fieldValueTranslations.de,
type: 'Sonderziel',
},
en: {
... SCThingWithCategoriesWithoutReferencesMeta.getInstance<SCPointOfInterestCategories,
SCThingWithCategoriesSpecificValues>().fieldValueTranslations.en,
... SCPlaceWithoutReferencesMeta.getInstance().fieldValueTranslations.en,
type: SCThingType.PointOfInterest,
},
};
}

View File

@@ -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.
@@ -12,16 +12,21 @@
* 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 {SCPlaceWithoutReferences} from '../base/Place';
import {SCThingInPlace} from '../base/ThingInPlace';
import {SCThingThatAcceptsPaymentsWithoutReferences} from '../base/ThingThatAcceptsPayments';
import {SCPlaceWithoutReferences, SCPlaceWithoutReferencesMeta} from '../base/Place';
import {SCThingInPlace, SCThingInPlaceMeta} from '../base/ThingInPlace';
import {
SCThingThatAcceptsPaymentsWithoutReferences,
SCThingThatAcceptsPaymentsWithoutReferencesMeta,
} from '../base/ThingThatAcceptsPayments';
import {
SCThingWithCategoriesSpecificValues,
SCThingWithCategoriesTranslatableProperties,
SCThingWithCategoriesWithoutReferences,
SCThingWithCategoriesWithoutReferencesMeta,
} from '../base/ThingWithCategories';
import {SCThingMeta, SCThingType} from '../Thing';
import {SCTranslations} from '../types/i18n';
import {SCMetaTranslations, SCTranslations} from '../types/i18n';
import {SCMap} from '../types/Map';
/**
@@ -29,15 +34,17 @@ import {SCMap} from '../types/Map';
*/
export type SCRoomCategories =
'cafe'
| 'canteen'
| 'computer'
| 'education'
| 'laboratory'
| 'learn'
| 'library'
| 'lounge'
| 'office'
| 'restaurant'
| 'canteen'
| 'student canteen'
| 'restroom'
| 'lounge'
| 'student canteen'
| 'student union';
/**
@@ -101,14 +108,43 @@ export interface SCRoomSpecificValues extends SCThingWithCategoriesSpecificValue
/**
* Meta information about a place
*/
export class SCRoomMeta extends SCThingMeta {
static fieldValueTranslations = {
...SCThingMeta.fieldValueTranslations,
export class SCRoomMeta extends SCThingMeta implements SCMetaTranslations<SCRoom> {
/**
* Translations of fields
*/
fieldTranslations = {
de: {
... SCPlaceWithoutReferencesMeta.getInstance().fieldTranslations.de,
... SCThingThatAcceptsPaymentsWithoutReferencesMeta.getInstance().fieldTranslations.de,
... SCThingWithCategoriesWithoutReferencesMeta.getInstance<SCRoomCategories,
SCRoomSpecificValues>().fieldTranslations.de,
... SCThingInPlaceMeta.getInstance().fieldTranslations.de,
},
en: {
... SCPlaceWithoutReferencesMeta.getInstance().fieldTranslations.en,
... SCThingThatAcceptsPaymentsWithoutReferencesMeta.getInstance().fieldTranslations.en,
... SCThingWithCategoriesWithoutReferencesMeta.getInstance<SCRoomCategories,
SCRoomSpecificValues>().fieldTranslations.en,
... SCThingInPlaceMeta.getInstance().fieldTranslations.en,
},
};
/**
* Translations of values of fields
*/
fieldValueTranslations = {
de: {
... SCPlaceWithoutReferencesMeta.getInstance().fieldValueTranslations.de,
... SCThingThatAcceptsPaymentsWithoutReferencesMeta.getInstance().fieldValueTranslations.de,
... SCThingWithCategoriesWithoutReferencesMeta.getInstance<SCRoomCategories,
SCRoomSpecificValues>().fieldValueTranslations.de,
... SCThingInPlaceMeta.getInstance().fieldValueTranslations.de,
categories: {
'cafe': 'Café',
'canteen': 'Kantine',
'computer': 'PC-Pool',
'education': 'Bildung',
'laboratory': 'Labor',
'learn': 'Lernen',
'library': 'Bibliothek',
'lounge': 'Lounge',
@@ -118,6 +154,15 @@ export class SCRoomMeta extends SCThingMeta {
'student canteen': 'Mensa',
'student union': 'Studentenvereinigung',
},
type: 'Raum',
},
en: {
... SCPlaceWithoutReferencesMeta.getInstance().fieldValueTranslations.en,
... SCThingThatAcceptsPaymentsWithoutReferencesMeta.getInstance().fieldValueTranslations.en,
... SCThingWithCategoriesWithoutReferencesMeta.getInstance<SCRoomCategories,
SCRoomSpecificValues>().fieldValueTranslations.en,
... SCThingInPlaceMeta.getInstance().fieldValueTranslations.en,
type: SCThingType.Room,
},
};
}

View File

@@ -12,8 +12,9 @@
* 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 {SCAcademicTermWithoutReferences} from '../base/AcademicTerm';
import {SCAcademicTermWithoutReferences, SCAcademicTermWithoutReferencesMeta} from '../base/AcademicTerm';
import {SCThingMeta, SCThingType} from '../Thing';
import {SCMetaTranslations} from '../types/i18n';
/**
* A semester without references
@@ -45,17 +46,37 @@ export interface SCSemester extends SCSemesterWithoutReferences {
}
/**
* Semester meta data
* Meta information about a semester
*/
export class SCSemesterMeta extends SCThingMeta {
static fieldTranslations = {
...SCThingMeta.fieldTranslations,
export class SCSemesterMeta extends SCThingMeta implements SCMetaTranslations<SCSemester> {
/**
* Translations of fields
*/
fieldTranslations = {
de: {
... SCAcademicTermWithoutReferencesMeta.getInstance().fieldTranslations.de,
acronym: 'Abkürzung',
endDate: 'Ende',
eventsEndDate: 'Vorlesungsschluss',
eventsStartDate: 'Vorlesungsbeginn',
startDate: 'Beginn',
},
en: {
... SCAcademicTermWithoutReferencesMeta.getInstance().fieldTranslations.en,
},
};
/**
* Translations of values of fields
*/
fieldValueTranslations = {
de: {
... SCAcademicTermWithoutReferencesMeta.getInstance().fieldValueTranslations.de,
type: 'Semester',
},
en: {
... SCAcademicTermWithoutReferencesMeta.getInstance().fieldValueTranslations.en,
type: SCThingType.Semester,
},
};
}

View File

@@ -16,9 +16,10 @@ import {
SCThingWithCategoriesSpecificValues,
SCThingWithCategoriesTranslatableProperties,
SCThingWithCategoriesWithoutReferences,
SCThingWithCategoriesWithoutReferencesMeta,
} from '../base/ThingWithCategories';
import {SCThingMeta, SCThingType} from '../Thing';
import {SCTranslations} from '../types/i18n';
import {SCMetaTranslations, SCTranslations} from '../types/i18n';
export type SCSettingCategories = string;
@@ -123,10 +124,40 @@ export interface SCSettingValueTranslatableProperties extends SCThingWithCategor
}
/**
* Meta information about a setting
* Meta information about settings
*/
export class SCSettingMeta extends SCThingMeta {
static fieldTranslations = {
...SCThingMeta.fieldTranslations,
export class SCSettingMeta extends SCThingMeta implements SCMetaTranslations<SCSetting> {
/**
* Translations of fields
*/
fieldTranslations = {
de: {
// tslint:disable-next-line:max-line-length
... SCThingWithCategoriesWithoutReferencesMeta.getInstance<SCSettingCategories,
SCThingWithCategoriesSpecificValues>().fieldTranslations.de,
},
en: {
// tslint:disable-next-line:max-line-length
... SCThingWithCategoriesWithoutReferencesMeta.getInstance<SCSettingCategories,
SCThingWithCategoriesSpecificValues>().fieldTranslations.en,
},
};
/**
* Translations of values of fields
*/
fieldValueTranslations = {
de: {
// tslint:disable-next-line:max-line-length
... SCThingWithCategoriesWithoutReferencesMeta.getInstance<SCSettingCategories,
SCThingWithCategoriesSpecificValues>().fieldValueTranslations.de,
type: 'Einstellung',
},
en: {
// tslint:disable-next-line:max-line-length
... SCThingWithCategoriesWithoutReferencesMeta.getInstance<SCSettingCategories,
SCThingWithCategoriesSpecificValues>().fieldValueTranslations.en,
type: SCThingType.Setting,
},
};
}

View File

@@ -12,8 +12,9 @@
* 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 {SCEvent, SCEventWithoutReferences} from '../base/Event';
import {SCEvent, SCEventMeta, SCEventWithoutReferences} from '../base/Event';
import {SCThingMeta, SCThingType} from '../Thing';
import {SCMetaTranslations} from '../types/i18n';
/**
* A sport course without references
@@ -38,13 +39,36 @@ export interface SCSportCourse extends SCEvent, SCSportCourseWithoutReferences {
}
/**
* Sport course meta data
* Meta information about a sport course
*/
export class SCSportCourseMeta extends SCThingMeta {
static fieldValueTranslations = {
...SCThingMeta.fieldValueTranslations,
export class SCSportCourseMeta extends SCThingMeta implements SCMetaTranslations<SCSportCourse> {
/**
* Translations of fields
*/
fieldTranslations = {
de: {
... SCThingMeta.getInstance().fieldTranslations.de,
... SCEventMeta.getInstance().fieldTranslations.de,
},
en: {
... SCThingMeta.getInstance().fieldTranslations.en,
... SCEventMeta.getInstance().fieldTranslations.en,
},
};
/**
* Translations of values of fields
*/
fieldValueTranslations = {
de: {
... SCThingMeta.getInstance().fieldValueTranslations.de,
... SCEventMeta.getInstance().fieldValueTranslations.de,
type: 'Sportkurs',
},
en: {
... SCThingMeta.getInstance().fieldValueTranslations.en,
... SCEventMeta.getInstance().fieldValueTranslations.en,
type: SCThingType.SportCourse,
},
};
}

View File

@@ -12,8 +12,9 @@
* 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 {SCThingInPlace} from '../base/ThingInPlace';
import {SCThingInPlace, SCThingInPlaceMeta} from '../base/ThingInPlace';
import {SCThing, SCThingMeta, SCThingType} from '../Thing';
import {SCMetaTranslations} from '../types/i18n';
import {SCISO8601Duration} from '../types/Time';
/**
@@ -56,11 +57,30 @@ export interface SCTicket extends SCTicketWithoutReferences, SCThingInPlace {
/**
* Meta information about a ticket
*/
export class SCTicketMeta extends SCThingMeta {
static fieldValueTranslations = {
...SCThingMeta.fieldValueTranslations,
export class SCTicketMeta extends SCThingMeta implements SCMetaTranslations<SCTicket> {
/**
* Translations of fields
*/
fieldTranslations = {
de: {
... SCThingInPlaceMeta.getInstance().fieldTranslations.de,
},
en: {
... SCThingInPlaceMeta.getInstance().fieldTranslations.en,
},
};
/**
* Translations of values of fields
*/
fieldValueTranslations = {
de: {
... SCThingInPlaceMeta.getInstance().fieldValueTranslations.de,
type: 'Ticket',
},
en: {
... SCThingInPlaceMeta.getInstance().fieldValueTranslations.en,
type: SCThingType.Ticket,
},
};
}

View File

@@ -12,8 +12,12 @@
* 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 {SCThingWithCategoriesSpecificValues, SCThingWithCategoriesWithoutReferences} from '../base/ThingWithCategories';
import {SCThingType} from '../Thing';
import {
SCThingWithCategoriesSpecificValues,
SCThingWithCategoriesWithoutReferences,
SCThingWithCategoriesWithoutReferencesMeta} from '../base/ThingWithCategories';
import {SCThingMeta, SCThingType} from '../Thing';
import {SCMetaTranslations} from '../types/i18n';
import {SCISO8601Date} from '../types/Time';
/**
@@ -58,3 +62,38 @@ export enum SCToDoPriority {
NORMAL = 2,
HIGH = 5,
}
/**
* Meta information about todo
*/
export class SCToDoMeta extends SCThingMeta implements SCMetaTranslations<SCToDo> {
/**
* Translations of fields
*/
fieldTranslations = {
de: {
... SCThingWithCategoriesWithoutReferencesMeta.getInstance<string,
SCThingWithCategoriesSpecificValues>().fieldTranslations.de,
},
en: {
... SCThingWithCategoriesWithoutReferencesMeta.getInstance<string,
SCThingWithCategoriesSpecificValues>().fieldTranslations.en,
},
};
/**
* Translations of values of fields
*/
fieldValueTranslations = {
de: {
... SCThingWithCategoriesWithoutReferencesMeta.getInstance<string,
SCThingWithCategoriesSpecificValues>().fieldValueTranslations.de,
type: 'ToDo',
},
en: {
... SCThingWithCategoriesWithoutReferencesMeta.getInstance<string,
SCThingWithCategoriesSpecificValues>().fieldValueTranslations.en,
type: SCThingType.ToDo,
},
};
}

View File

@@ -13,6 +13,7 @@
* this program. If not, see <https://www.gnu.org/licenses/>.
*/
import {SCThing, SCThingMeta, SCThingType} from '../Thing';
import {SCMetaTranslations} from '../types/i18n';
/**
* A tour without references
@@ -49,7 +50,7 @@ export interface SCTour extends SCTourWithoutReferences {
/**
* Meta information about a tour
*/
export class SCTourMeta extends SCThingMeta {
export class SCTourMeta extends SCThingMeta implements SCMetaTranslations<SCTour> {
}
/**

View File

@@ -12,9 +12,9 @@
* 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 {SCCreativeWork, SCCreativeWorkWithoutReferences} from '../base/CreativeWork';
import {SCCreativeWork, SCCreativeWorkMeta, SCCreativeWorkWithoutReferences} from '../base/CreativeWork';
import {SCThingMeta, SCThingType} from '../Thing';
import {SCLanguage} from '../types/i18n';
import {SCLanguage, SCMetaTranslations} from '../types/i18n';
import {SCISO8601Duration} from '../types/Time';
import {SCPersonWithoutReferences} from './Person';
@@ -114,19 +114,33 @@ export interface SCVideo extends SCCreativeWork, SCVideoWithoutReferences {
type: SCThingType.Video;
}
export class SCVideoMeta extends SCThingMeta {
static fieldValueTranslations = {
...SCThingMeta.fieldValueTranslations,
/**
* Meta information about a video
*/
export class SCVideoMeta extends SCThingMeta implements SCMetaTranslations<SCVideo> {
/**
* Translations of fields
*/
fieldTranslations = {
de: {
actors: 'Darsteller',
duration: 'Länge',
height: 'Höhe',
language: 'Sprache',
size: 'Größe',
sources: 'Quellen',
transcript: 'Abschrift',
... SCCreativeWorkMeta.getInstance().fieldTranslations.de,
},
en: {
... SCCreativeWorkMeta.getInstance().fieldTranslations.en,
},
};
/**
* Translations of values of fields
*/
fieldValueTranslations = {
de: {
... SCCreativeWorkMeta.getInstance().fieldValueTranslations.de,
type: 'Video',
width: 'Breite',
},
en: {
... SCCreativeWorkMeta.getInstance().fieldValueTranslations.en,
type: SCThingType.Video,
},
};
}

View File

@@ -16,7 +16,20 @@ import {SCThingWithTranslations} from '../base/ThingWithTranslations';
import {SCBulkResponse} from '../protocol/routes/bulk/BulkResponse';
import {SCMultiSearchResponse} from '../protocol/routes/search/MultiSearchResponse';
import {SCSearchResponse} from '../protocol/routes/search/SearchResponse';
import {SCThing} from '../Thing';
import {SCThing, SCThingType} from '../Thing';
/**
* Type guard to check if something is a SCThing
*
* @param {any} something Something to check
*/
export function isThing(something: any): something is SCThing {
return (
typeof something === 'object'
&& typeof something.type === 'string'
&& Object.values(SCThingType).indexOf(something.type) >= 0
);
}
/**
* Type guard to check if translations exist
@@ -59,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);
}

32
src/core/types/Places.ts Normal file
View File

@@ -0,0 +1,32 @@
/*
* 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 {SCBuildingWithoutReferences} from '../things/Building';
import {SCPointOfInterestWithoutReferences} from '../things/PointOfInterest';
import {SCRoomWithoutReferences} from '../things/Room';
/**
* Something that is or happens in a place
*
* !Important!
* This is not a SCThing.
*/
export interface SCInPlace {
/**
* Place the thing is or happens in
*/
inPlace?:
SCBuildingWithoutReferences
| SCPointOfInterestWithoutReferences
| SCRoomWithoutReferences;
}

View File

@@ -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.
@@ -35,6 +35,11 @@ export interface SCBackendConfiguration {
*/
maxMultiSearchRouteQueries: number;
/**
* Maximum body size for requests
*/
maxRequestBodySize: number;
/**
* Name of university
*/
@@ -79,19 +84,6 @@ export interface SCBackendConfigurationSortableField {
}
/**
* Values of a field that should be boosted by the given factors
*/
export interface SCBackendConfigurationSearchBoostingValues {
/**
* Value of the field that should be boosted by the given number
*
* For example `"SS 2019": 2`
*/
[valueOfField: string]: number;
}
/**
* A boosting configuration for one SCType
*/
@@ -103,11 +95,15 @@ export interface SCBackendConfigurationSearchBoosting {
factor: number;
/**
* 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`
*/
fields?: SCMap<SCBackendConfigurationSearchBoostingValues>;
fields?: SCMap<SCMap<number>>;
/**
* Type of things the factor should be applied to
@@ -163,14 +159,10 @@ export interface SCBackendInternalConfiguration {
/**
* Configuration of the database
*/
export interface SCBackendConfigurationDatabaseConfiguration {
export interface SCBackendConfigurationDatabaseConfiguration extends SCMap<any> {
/**
* Name of the database used by the backend
*/
name: string;
/**
* Allow additional configuration for the database
*/
[key: string]: any;
}

View File

@@ -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.
@@ -12,6 +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 {SCMap} from '../Map';
/**
* All available filter types
*/
@@ -47,9 +48,7 @@ export interface SCSearchAbstractFilter<T extends SCSearchAbstractFilterArgument
/**
* Arguments for the filter instruction
*/
export interface SCSearchAbstractFilterArguments {
[key: string]: any;
}
export type SCSearchAbstractFilterArguments = SCMap<any>;
/**
* Available filter instructions

View File

@@ -17,7 +17,7 @@
*/
export interface SCLanguage {
/**
* The Alpha-2 Code of the Language
* The two letter ISO 639-1 Code of the Language
*/
code: SCLanguageCode;
@@ -28,8 +28,8 @@ export interface SCLanguage {
}
/**
* A list of possible languages
*
* A list of possible languages in english
*
* @see https://en.wikipedia.org/wiki/ISO_639-1
*/
export type SCLanguageName =
@@ -220,7 +220,9 @@ export type SCLanguageName =
| 'zulu';
/**
* A List of all possible Languages as Alpha-2 Codes
* A List of all possible Languages as ISO 639-1 Codes
*
* @see https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes
*/
export type SCLanguageCode =
'aa'
@@ -668,7 +670,7 @@ export type SCNationality =
/**
* Translations for specific languages
*
* @see https://en.wikipedia.org/wiki/List_of_ISO_639-2_codes
* @see https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes
*/
export interface SCTranslations<T> {
/**
@@ -681,3 +683,37 @@ export interface SCTranslations<T> {
*/
en?: T;
}
/**
* Type to represent requiredness of translation properties.
* Will be changed from RecursivePartial to RecursiveRequired in the future.
* (Source: https://stackoverflow.com/a/51365037)
*/
type RecursivePartial<T> = {
[P in keyof T]?:
T[P] extends Array<infer U> ? Array<RecursivePartial<U>> :
T[P] extends object ? RecursivePartial<T[P]> :
T[P];
};
/**
* Type to recursively map keys in <T> to a string value (used for translation)
*/
type SCRequiredTranslationKeys<T> = {
[key in keyof RecursivePartial<T>]: string;
};
/**
* Type that allows mapping from available keys of SCTranslations to SCRequiredTranslationKeys
*/
type SCRequiredTranslation<T> = {
[key in keyof SCTranslations<T>]: SCRequiredTranslationKeys<T>;
};
/**
* Interface to be implemented by all Meta classes
*/
export interface SCMetaTranslations<T> {
fieldTranslations: SCRequiredTranslation<T>;
fieldValueTranslations: any;
}

View File

@@ -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,6 +13,7 @@
* this program. If not, see <https://www.gnu.org/licenses/>.
*/
import {SCThingsField} from '../../Classes';
import {SCMap} from '../Map';
import {SCDistanceSort} from './Distance';
import {SCDucetSort} from './Ducet';
import {SCPriceSort} from './Price';
@@ -40,12 +41,7 @@ export interface SCSearchAbstractSort<T extends SCSearchAbstractSortArguments> {
/**
* Map of arguments for the sort instruction
*/
export interface SCSearchAbstractSortArguments {
/**
* Index signature for additional arguments
*/
[key: string]: any;
export interface SCSearchAbstractSortArguments extends SCMap<any> {
/**
* Field to sort by
*/

57
test/Guards.spec.ts Normal file
View 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);
}
}

386
test/Translator.spec.ts Normal file
View File

@@ -0,0 +1,386 @@
/*
* 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 {expect} from 'chai';
import {slow, suite, test, timeout} from 'mocha-typescript';
import {SCThingOriginType, SCThingType} from '../src/core/Thing';
import {SCBuildingWithoutReferences} from '../src/core/things/Building';
import {SCDish, SCDishMeta} from '../src/core/things/Dish';
import {SCPerson} from '../src/core/things/Person';
import {SCThingTranslator} from '../src/core/Translator';
const building: SCBuildingWithoutReferences = {
address: {
addressCountry : 'base-address.addressCountry',
addressLocality: 'base-address.addressLocality',
postalCode: 'base-address.postalCode',
streetAddress: 'base-address.streetAddress',
},
categories: ['office', 'education'],
floors: ['base-floor0', 'base-floor1'],
geo: {
point: {
coordinates: [12.0, 13.0],
type: 'Point',
},
},
name: 'base-space-name',
origin: {
indexed: '1970-01-01T00:00:00.000Z',
name: 'building-connector',
type: SCThingOriginType.Remote,
},
translations: {
de: {
address: {
addressCountry : 'de-address.addressCountry',
addressLocality: 'de-address.addressLocality',
postalCode: 'de-address.postalCode',
streetAddress: 'de-address.streetAddress',
},
floors: ['de-floor0', 'de-floor1'],
name: 'de-space-name',
},
},
type: SCThingType.Building,
uid: '540862f3-ea30-5b8f-8678-56b4dc217140',
};
const dish: SCDish = {
categories: ['main dish', 'dessert'],
characteristics: [{name: 'base-characteristic0'}, {name: 'base-characteristic1'}],
name: 'base-dish-name',
offers: [
{
availability: 'in stock',
inPlace: building,
prices: {
default: 23.42,
},
provider: {
name: 'base-provider',
origin: {
indexed: '1970-01-01T00:00:00.000Z',
name: 'dish-connector',
type: SCThingOriginType.Remote,
},
type: SCThingType.Organization,
uid: '540862f3-ea30-5b8f-8678-56b4dc217141',
},
},
],
origin: {
indexed: '1970-01-01T00:00:00.000Z',
name: 'dish-connector',
type: SCThingOriginType.Remote,
},
translations: {
de: {
characteristics: [{name: 'de-characteristic0'}, {name: 'de-characteristic1'}],
name: 'de-dish-name',
},
},
type: SCThingType.Dish,
uid: '540862f3-ea30-5b8f-8678-56b4dc217140',
};
const person: SCPerson = {
familyName: 'base-familyName-name',
givenName: 'base-givenName-name',
homeLocations: [building, building, building],
name : 'base-person-name',
origin: {
indexed: '1970',
name: 'ding',
type: SCThingOriginType.Remote,
},
type: SCThingType.Person,
uid: '1234',
};
const translator = new SCThingTranslator('de', 'en');
// tslint:disable-next-line:no-eval
const languageNonExistant = eval("'jp'");
// this will simulate a translator always utilizing the base language translations
const translatorWithFallback = new SCThingTranslator(languageNonExistant);
// tslint:disable:member-ordering TranslationSpec
@suite(timeout(10000), slow(5000))
export class TranslationSpec {
@test
public directStringLiteralType() {
expect(translator.translate(dish).type()).to.equal('Essen');
}
@test
public directStringProperty() {
expect(translator.translate(dish).name()).to.equal('de-dish-name');
}
@test
public directArrayOfString() {
expect(translator.translate(dish).characteristics()).to.deep
.equal([{name: 'de-characteristic0'}, {name: 'de-characteristic1'}]);
}
@test
public directArrayOfStringSubscript() {
expect(translator.translate(dish).characteristics[1]()).to.deep.equal({name: 'de-characteristic1'});
}
@test
public directMetaArrayOfString() {
expect(translator.translate(dish).categories()).to.deep.equal(['Hauptgericht', 'Nachtisch']);
}
@test
public directMetaArrayOfStringSubscript() {
expect(translator.translate(dish).categories[1]()).to.equal('Nachtisch');
}
@test
public nestedStringLiteralType() {
expect(translator.translate(dish).offers[0].inPlace.type()).to.equal('Gebäude');
}
@test
public nestedStringProperty() {
expect(translator.translate(dish).offers[0].inPlace.name()).to.equal('de-space-name');
}
@test
public nestedMetaArrayOfString() {
expect(translator.translate(dish).offers[0].inPlace.categories()).to.deep.equal(['Büro', 'Bildung']);
}
@test
public nestedMetaArrayOfStringSubscript() {
expect(translator.translate(dish).offers[0].inPlace.categories[1]()).to.equal('Bildung');
}
@test
public directStringLiteralTypeFallback() {
expect(translatorWithFallback.translate(dish).type()).to.equal('dish');
}
@test
public directStringPropertyFallback() {
expect(translatorWithFallback.translate(dish).name()).to.equal('base-dish-name');
}
@test
public directArrayOfStringSubscriptFallback() {
expect(translatorWithFallback.translate(dish).characteristics[1]())
.to.deep.equal({name: 'base-characteristic1'});
}
@test
public directMetaArrayOfStringFallback() {
expect(translatorWithFallback.translate(dish).categories()).to.deep.equal(['main dish', 'dessert']);
}
@test
public directMetaArrayOfStringSubscriptFallback() {
expect(translatorWithFallback.translate(dish).categories[1]()).to.equal('dessert');
}
@test
public nestedStringLiteralTypeFallback() {
expect(translatorWithFallback.translate(dish).offers[0].inPlace.type()).to.equal('building');
}
@test
public nestedStringPropertyFallback() {
expect(translatorWithFallback.translate(dish).offers[0].inPlace.name()).to.equal('base-space-name');
}
@test
public nestedMetaArrayOfStringFallback() {
expect(translatorWithFallback.translate(dish).offers[0].inPlace.categories())
.to.deep.equal(['office', 'education']);
}
@test
public nestedMetaArrayOfStringSubscriptFallback() {
expect(translatorWithFallback.translate(dish).offers[0].inPlace.categories[1]()).to.equal('education');
}
@test
public directStringLiteralTypeUndefined() {
// tslint:disable-next-line:no-eval
const undefinedThing = eval('(x) => undefined;');
expect(translator.translate(undefinedThing())('defaultValue')).to.equal('defaultValue');
expect(translator.translate(dish).name('defaultValue')).to.not.equal('defaultValue');
}
@test
public nestedMetaArrayOfStringSubscriptUndefined() {
expect(translator.translate(dish).offers[0].inPlace.categories[1234]('printer')).to.equal('printer');
expect(translator.translate(dish).offers[0].inPlace.categories[1]('printer')).to.not.equal('printer');
}
}
// tslint:disable:member-ordering TranslationSpecByString
@suite(timeout(10000), slow(5000))
export class TranslationSpecByString {
@test
public directStringLiteralType() {
expect(translator.getFieldValueTranslation(dish, 'type')).to.equal('Essen');
}
@test
public directStringProperty() {
expect(translator.getFieldValueTranslation(dish, 'name')).to.equal('de-dish-name');
}
@test
public directArrayOfString() {
expect(translator.getFieldValueTranslation(dish, 'characteristics')).to.deep
.equal([{name: 'de-characteristic0'}, {name: 'de-characteristic1'}]);
}
@test
public directArrayOfStringSubscript() {
expect(translator.getFieldValueTranslation(dish, 'characteristics[1]'))
.to.deep.equal({name: 'de-characteristic1'});
}
@test
public directMetaArrayOfString() {
expect(translator.getFieldValueTranslation(dish, 'categories')).to.deep.equal(['Hauptgericht', 'Nachtisch']);
}
@test
public directMetaArrayOfStringSubscript() {
expect(translator.getFieldValueTranslation(dish, 'categories[1]')).to.equal('Nachtisch');
}
@test
public nestedStringLiteralType() {
expect(translator.getFieldValueTranslation(dish, 'offers[0].inPlace.type')).to.equal('Gebäude');
}
@test
public nestedStringProperty() {
expect(translator.getFieldValueTranslation(dish, 'offers[0].inPlace.name')).to.equal('de-space-name');
}
@test
public nestedMetaArrayOfString() {
expect(translator.getFieldValueTranslation(dish, 'offers[0].inPlace.categories'))
.to.deep.equal(['Büro', 'Bildung']);
}
@test
public nestedMetaArrayOfStringSubscript() {
expect(translator.getFieldValueTranslation(dish, 'offers[0].inPlace.categories[1]')).to.equal('Bildung');
}
@test
public nestedArrayOfStringSubscript() {
expect(translator.getFieldValueTranslation(dish, 'offers[0].inPlace.floors[1]')).to.equal('de-floor1');
}
@test
public directStringLiteralTypeFallback() {
expect(translatorWithFallback.getFieldValueTranslation(dish, 'type')).to.equal('dish');
}
@test
public directStringPropertyFallback() {
expect(translatorWithFallback.getFieldValueTranslation(dish, 'name')).to.equal('base-dish-name');
}
@test
public directArrayOfStringSubscriptFallback() {
expect(translatorWithFallback.getFieldValueTranslation(dish, 'characteristics[1]'))
.to.deep.equal({name: 'base-characteristic1'});
}
@test
public directMetaArrayOfStringFallback() {
expect(translatorWithFallback.getFieldValueTranslation(dish, 'categories'))
.to.deep.equal(['main dish', 'dessert']);
}
@test
public directMetaArrayOfStringSubscriptFallback() {
expect(translatorWithFallback.getFieldValueTranslation(dish, 'categories[1]')).to.equal('dessert');
}
@test
public nestedStringLiteralTypeFallback() {
expect(translatorWithFallback.getFieldValueTranslation(dish, 'offers[0].inPlace.type')).to.equal('building');
}
@test
public nestedStringPropertyFallback() {
expect(translatorWithFallback.getFieldValueTranslation(dish, 'offers[0].inPlace.name')).to.equal('base-space-name');
}
@test
public nestedMetaArrayOfStringFallback() {
expect(translatorWithFallback.getFieldValueTranslation(dish, 'offers[0].inPlace.categories'))
.to.deep.equal(['office', 'education']);
}
@test
public nestedMetaArrayOfStringSubscriptFallback() {
expect(translatorWithFallback.getFieldValueTranslation(dish, 'offers[0].inPlace.categories[1]'))
.to.equal('education');
}
@test
public nestedArrayOfStringSubscriptFallback() {
expect(translatorWithFallback.getFieldValueTranslation(dish, 'offers[0].inPlace.floors[1]'))
.to.equal('base-floor1');
}
@test
public nestedArrayOfStringSubscriptUncommonFallback() {
expect(translatorWithFallback.getFieldValueTranslation(dish, 'offers[0].inPlace.floors.1')).to.equal('base-floor1');
}
@test
public nestedNestedMetaArrayOfStringSubscriptUncommonFallback() {
expect(translatorWithFallback.getFieldValueTranslation(person, 'homeLocations.1.categories.1'))
.to.equal('education');
}
}
// tslint:disable:member-ordering no-eval no-unused-expression TranslationSpec
@suite(timeout(10000), slow(5000))
export class MetaTranslationSpec {
@test
public consistencyWithMetaClass() {
const dishMetaTranslationsDE = translator.translatedPropertyNames(dish);
const dishMetaTranslationsEN = translator.translatedPropertyNames(dish, 'en');
expect(dishMetaTranslationsDE).to.deep.equal(SCDishMeta.getInstance().fieldTranslations.de);
expect(dishMetaTranslationsEN).to.deep.equal(SCDishMeta.getInstance().fieldTranslations.en);
}
@test
public thingWithoutMetaClass() {
const dishCopy = Object.assign({}, dish);
const typeNonExistant = eval("(x) => x + 'typeNonExistant';");
// this will assign a non existant SCThingType to dishCopy
dishCopy.type = typeNonExistant();
const dishMetaTranslationsDE = translator.translatedPropertyNames(dishCopy);
expect(dishMetaTranslationsDE).to.be.undefined;
}
}

View File

@@ -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",

View File

@@ -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",

View File

@@ -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",

View File

@@ -1,7 +1,7 @@
{
"errorNames": [],
"instance": {
"uid": "540862f3-ea30-5b8f-8678-56b4dc217140",
"instance": {
"uid": "8d8bd89c-8429-5f81-b754-15a5be55e593",
"type": "article",
"categories": [
"unipedia"

View File

@@ -1,7 +1,7 @@
{
"errorNames": [],
"instance": {
"uid": "540862f3-ea30-5b8f-8678-56b4dc217140",
"instance": {
"uid": "4f772b29-0b28-53a4-a8b9-206d9b425962",
"type": "article",
"categories": [
"unipedia"

View File

@@ -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",

View File

@@ -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",

View File

@@ -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"
],

View File

@@ -1,7 +1,7 @@
{
"errorNames": [],
"instance": {
"uid": "64bb29ed-21e5-50c7-9d7c-1dc4741001b9",
"instance": {
"uid": "c8dc1f7f-9e3e-5b1f-8c38-084f46413b87",
"type": "catalog",
"level": 1,
"categories": [

View File

@@ -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.",

View File

@@ -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"
}

View File

@@ -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"

View File

@@ -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"

View File

@@ -0,0 +1,77 @@
{
"errorNames": [],
"instance": {
"type": "date series",
"uid": "e6462830-187a-50b1-bdb4-8f39e49a88b8",
"name": "Dance course for beginners",
"duration": "PT8H",
"inPlace": {
"geo": {
"point": {
"type": "Point",
"coordinates": [
13.3266207,
52.5144409
]
}
},
"type": "room",
"categories": [
"student union"
],
"uid": "b535c86a-777b-54c3-b89a-cad528d0580f",
"name": "EMH 225",
"floor": "2",
"origin": {
"indexed": "2018-09-11T12:30:00Z",
"name": "Dummy",
"type": "remote"
}
},
"frequency": "once",
"dates": [
"2016-04-12T11:00:00+00:00"
],
"event": {
"type": "academic event",
"uid": "4f86e8bb-ce73-520b-bfd9-e1ba9f754391",
"name": "Dance course for beginners",
"categories": [
"special"
],
"origin": {
"indexed": "2018-09-11T12:30:00Z",
"name": "Dummy",
"type": "remote"
}
},
"origin": {
"indexed": "2018-09-11T12:30:00Z",
"name": "Dummy",
"type": "remote"
},
"offers": [
{
"availability": "in stock",
"availabilityStarts": "2017-01-30T00:00:00.000Z",
"availabilityEnds": "2017-01-30T23:59:59.999Z",
"prices": {
"default": 6.5,
"student": 5,
"alumni": 5
},
"provider": {
"name": "Studentenwerk",
"origin": {
"indexed": "2018-09-11T12:30:00Z",
"name": "Dummy",
"type": "remote"
},
"type": "organization",
"uid": "3b9b3df6-3a7a-58cc-922f-c7335c002634"
}
}
]
},
"schema": "SCDateSeries"
}

View File

@@ -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",

View File

@@ -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",

View File

@@ -1,6 +1,6 @@
{
"errorNames": [],
"instance": {
"instance": {
"type": "dish",
"name": "Pizza mit Geflügelsalami und Champignons",
"categories": [
@@ -21,12 +21,23 @@
"availability": "in stock",
"availabilityStarts": "2017-01-30T00:00:00.000Z",
"availabilityEnds": "2017-01-30T23:59:59.999Z",
"price": 2.85,
"prices": {
"default": 4.85,
"student": 2.85,
"employee": 2.85
"employee": 3.85,
"guest": 4.85
},
"provider": {
"name": "Studentenwerk",
"origin": {
"indexed": "2018-09-11T12:30:00Z",
"name": "Dummy",
"type": "remote"
},
"type": "organization",
"uid": "3b9b3df6-3a7a-58cc-922f-c7335c002634"
},
"inPlace": {
"geo": {
"point": {
"type": "Point",
@@ -45,7 +56,7 @@
"alternateNames": [
"MensaHardenberg"
],
"uid": "540862f3-ea30-5b8f-8678-56b4dc217140",
"uid": "72fbc8a3-ebd1-58f9-9526-ad65cba2e402",
"address": {
"addressCountry": "Germany",
"addressLocality": "Berlin",
@@ -61,7 +72,7 @@
}
}
],
"uid": "540862f3-ea30-5b8f-8678-56b4dc217140",
"uid": "c9f32915-8ed5-5960-b850-3f7375a89922",
"origin": {
"indexed": "2018-09-11T12:30:00Z",
"name": "Dummy",

View File

@@ -1,6 +1,6 @@
{
"errorNames": [],
"instance": {
"instance": {
"type": "dish",
"name": "Sahne-Bärlauchsauce",
"description": "Nudelauswahl",
@@ -9,15 +9,25 @@
],
"offers": [
{
"price": 2.45,
"prices": {
"default": 3.45,
"student": 2.45,
"employee": 2.45
"employee": 3.45
},
"provider": {
"name": "Studentenwerk",
"origin": {
"indexed": "2018-09-11T12:30:00Z",
"name": "Dummy",
"type": "remote"
},
"type": "organization",
"uid": "3b9b3df6-3a7a-58cc-922f-c7335c002634"
},
"availability": "in stock",
"availabilityStarts": "2017-01-30T00:00:00.000Z",
"availabilityEnds": "2017-01-30T23:59:59.999Z",
"provider": {
"inPlace": {
"geo": {
"point": {
"type": "Point",
@@ -36,7 +46,7 @@
"alternateNames": [
"MensaHardenberg"
],
"uid": "540862f3-ea30-5b8f-8678-56b4dc217140",
"uid": "072db1e5-e479-5040-88e0-4a98d731e443",
"address": {
"addressCountry": "Germany",
"addressLocality": "Berlin",
@@ -65,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",

View File

@@ -1,6 +1,6 @@
{
"errorNames": [],
"instance": {
"instance": {
"additives": [
"1 = mit Farbstoff",
"2 = konserviert",
@@ -14,12 +14,7 @@
"availabilityEnds": "2017-03-27T23:59:59.000Z",
"availabilityStarts": "2017-03-27T00:00:00.000Z",
"availability": "in stock",
"prices": {
"student": 4.9,
"employee": 6.5
},
"price": 6.5,
"provider": {
"inPlace": {
"type": "room",
"name": "Cafeteria LEVEL",
"categories": [
@@ -44,6 +39,21 @@
"name": "Dummy",
"type": "remote"
}
},
"prices": {
"default": 6.5,
"student": 4.9,
"employee": 6.5
},
"provider": {
"name": "Studentenwerk",
"origin": {
"indexed": "2018-09-11T12:30:00Z",
"name": "Dummy",
"type": "remote"
},
"type": "organization",
"uid": "3b9b3df6-3a7a-58cc-922f-c7335c002634"
}
}
],
@@ -70,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,
@@ -103,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,
@@ -127,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,

View File

@@ -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"

View File

@@ -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": {

View File

@@ -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",

View File

@@ -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",

View File

@@ -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)*",

View File

@@ -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)*",

View File

@@ -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)*",

View File

@@ -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",

View File

@@ -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",

View File

@@ -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",

View File

@@ -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",

View File

@@ -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": [

View File

@@ -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": [

View File

@@ -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"
],

View File

@@ -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"
],

View File

@@ -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",

View File

@@ -1,10 +1,11 @@
{
"errorNames": [],
"instance": {
"uid": "d7ce5623-ad47-5976-bdd3-7cf551729516",
"instance": {
"uid": "ea9db087-240b-5b10-a65b-9684d88a3e4e",
"name": "Poolraum (HoF)",
"type": "room",
"categories": [
"computer",
"learn"
],
"description": "1. OG, Raum 1.29, 18 Plätze, rollstuhlgerecht, Montag bis Freitag von 8:00 bis 20:00 Uhr",

View File

@@ -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",

View File

@@ -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",

Some files were not shown because too many files have changed in this diff Show More