mirror of
https://gitlab.com/openstapps/openstapps.git
synced 2025-12-13 17:56:20 +00:00
Compare commits
65 Commits
@openstapp
...
@openstapp
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b8faae5988 | ||
| 67ab1fd613 | |||
|
|
142079bf0e | ||
|
|
5050ac90eb | ||
|
|
688bc5f2e7 | ||
|
|
ad174dd7d7 | ||
|
|
26e654f5b8 | ||
|
|
5439484a90 | ||
|
|
68f3366a27 | ||
|
|
dea9a82105 | ||
|
39d2801114
|
|||
|
|
341b209092 | ||
|
|
a6b88d3534 | ||
|
|
be863daaef | ||
| 2f64d69693 | |||
| 964516d3cf | |||
| 71ff9fd960 | |||
| abf9999461 | |||
| 53c3d0ba0c | |||
|
|
622481a3c9 | ||
|
|
1ab5c0c355 | ||
|
|
b0f6ffb21c | ||
|
|
e658cff9d2 | ||
|
|
e71355a2fb | ||
| 100607740b | |||
|
|
10c4466b37 | ||
|
|
09faa66e98 | ||
|
|
7c5687111f | ||
|
|
c066028e49 | ||
| 0858a26dc1 | |||
| 8667603bd6 | |||
| 65bc9a76b6 | |||
| 912ae42270 | |||
| c4a5d6e73b | |||
| deed376c24 | |||
| a4cc23e9a8 | |||
| e8d72683ef | |||
|
|
e3d068f8d4 | ||
|
|
b346d216a3 | ||
| dbb558508f | |||
|
|
754d99c1b4 | ||
|
|
689ac68be3 | ||
|
|
d36d9596fc | ||
|
|
8d50f669e7 | ||
|
|
dce08d9c03 | ||
|
|
296054c8e0 | ||
|
859763367e
|
|||
|
|
848fde4660 | ||
|
|
bd1046a19a | ||
|
|
3b9068197c | ||
|
|
d2c8120255 | ||
|
d44204cf8d
|
|||
|
9d5dd05bb6
|
|||
|
288a49113f
|
|||
| 791b5c895d | |||
| d7a85b7fae | |||
|
|
bff2d985aa | ||
|
|
655efc9d29 | ||
|
|
66712bdd24 | ||
| 8b5b4c765b | |||
|
|
31a6ebfd3f | ||
|
|
991ed1cb1f | ||
|
|
1efe5c1449 | ||
|
|
4dbeb9936c | ||
|
|
29e6128141 |
1
.gitignore
vendored
1
.gitignore
vendored
@@ -24,6 +24,7 @@ report-junit.xml
|
||||
# NixOS flake
|
||||
result
|
||||
hsperfdata_root
|
||||
.direnv/
|
||||
|
||||
# Directory for instrumented libs generated by jscoverage/JSCover
|
||||
lib-cov
|
||||
|
||||
1
.prettierignore
Normal file
1
.prettierignore
Normal file
@@ -0,0 +1 @@
|
||||
pnpm-lock.yaml
|
||||
@@ -2,7 +2,13 @@
|
||||
|
||||
/** @type {import('syncpack').RcFile} */
|
||||
const config = {
|
||||
semverRange: '',
|
||||
semverGroups: [
|
||||
{
|
||||
range: '',
|
||||
dependencies: ['**'],
|
||||
packages: ['**'],
|
||||
}
|
||||
],
|
||||
source: ['package.json', '**/package.json'],
|
||||
indent: ' ',
|
||||
sortFirst: [
|
||||
@@ -49,7 +55,7 @@ const config = {
|
||||
{
|
||||
label: 'Packages should use workspace version',
|
||||
dependencies: ['@openstapps/**'],
|
||||
dependencyTypes: ['prod', 'dev'],
|
||||
dependencyTypes: ['prod', 'dev', 'peer'],
|
||||
packages: ['**'],
|
||||
pinVersion: 'workspace:*',
|
||||
},
|
||||
|
||||
3
.tool-versions
Normal file
3
.tool-versions
Normal file
@@ -0,0 +1,3 @@
|
||||
nodejs 18.19.1
|
||||
pnpm 8.15.4
|
||||
python 3.11.5
|
||||
@@ -1,5 +1,54 @@
|
||||
# @openstapps/backend
|
||||
|
||||
## 3.3.1
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- 67ab1fd6: fix for geo.point mapping
|
||||
|
||||
## 3.3.0
|
||||
|
||||
### Minor Changes
|
||||
|
||||
- 688bc5f2: v3.3.0 changes
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [688bc5f2]
|
||||
- @openstapps/core@3.3.0
|
||||
- @openstapps/core-tools@3.3.0
|
||||
- @openstapps/logger@3.0.0
|
||||
|
||||
## 3.2.0
|
||||
|
||||
### Minor Changes
|
||||
|
||||
- 912ae422: Add the ability to filter by existence of a field
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- 689ac68b: pin alpine version to 3.18 and add healthchecks
|
||||
- e8d72683: Backend unit tests break every year
|
||||
- Updated dependencies [912ae422]
|
||||
- @openstapps/core@4.0.0
|
||||
- @openstapps/core-tools@3.0.0
|
||||
- @openstapps/logger@3.0.0
|
||||
|
||||
## 3.1.2
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Fix backend rejecting plugins
|
||||
- Fix backend sliently falling back to default configs
|
||||
|
||||
## 3.1.1
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Fix version history offered by backend
|
||||
- Updated dependencies
|
||||
- @openstapps/core@3.1.1
|
||||
|
||||
## 3.1.0
|
||||
|
||||
### Minor Changes
|
||||
|
||||
@@ -9,4 +9,6 @@ ENV NODE_ENV=production
|
||||
WORKDIR /app
|
||||
|
||||
EXPOSE 3000
|
||||
HEALTHCHECK --interval=10s --timeout=10s --start-period=10s --retries=12 CMD curl -s --fail --request POST --data '{}' --header 'Content-Type: application/json' http://localhost:3000/ >/dev/null || exit 1
|
||||
|
||||
ENTRYPOINT ["node", "app.js"]
|
||||
|
||||
@@ -1,5 +1,3 @@
|
||||
// @ts-check
|
||||
|
||||
/**
|
||||
* This is the database configuration for the technical university of berlin
|
||||
*
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
// @ts-check
|
||||
import {SCSettingInputType, SCThingOriginType, SCThingType} from '@openstapps/core';
|
||||
|
||||
/** @type {import('@openstapps/core').SCLanguageSetting} */
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
// @ts-check
|
||||
/** @type {import('@openstapps/core').SCAppConfigurationMenuCategory[]} */
|
||||
const menus = [
|
||||
{
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
// @ts-check
|
||||
import {SCSettingInputType, SCThingOriginType, SCThingType} from '@openstapps/core';
|
||||
|
||||
/** @type {import('@openstapps/core').SCUserGroupSetting} */
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
// @ts-check
|
||||
import {SCThingType} from '@openstapps/core';
|
||||
|
||||
/** @type {import('@openstapps/core').SCBackendAggregationConfiguration[]} */
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
// @ts-check
|
||||
import {
|
||||
month,
|
||||
sommerRange,
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
// @ts-check
|
||||
import {SCThingType} from '@openstapps/core';
|
||||
import aggregations from './aggregations.js';
|
||||
import boostings from './boostings.js';
|
||||
@@ -17,7 +16,7 @@ export const backend = {
|
||||
hiddenTypes: [SCThingType.DateSeries, SCThingType.Diff, SCThingType.Floor],
|
||||
mappingIgnoredTags: ['minlength', 'pattern', 'see', 'tjs-format'],
|
||||
maxMultiSearchRouteQueries: 5,
|
||||
maxRequestBodySize: 512 * 1024,
|
||||
maxRequestBodySize: 2e6,
|
||||
name: 'Goethe-Universität Frankfurt am Main',
|
||||
namespace: '909a8cbc-8520-456c-b474-ef1525f14209',
|
||||
sortableFields: [
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
// @ts-check
|
||||
import app from './app/index.js';
|
||||
import {backend, internal} from './backend/index.js';
|
||||
|
||||
|
||||
@@ -1,5 +1,3 @@
|
||||
// @ts-check
|
||||
|
||||
/**
|
||||
* This is the default configuration for elasticsearch (a database)
|
||||
*
|
||||
@@ -11,13 +9,13 @@
|
||||
*
|
||||
* To get more information about the meaning of specific fields, please use your IDE to read the TSDoc documentation.
|
||||
*
|
||||
* @type {import('../../src/storage/elasticsearch/types/elasticsearch-config.js')}
|
||||
* @type {import('../../src/storage/elasticsearch/types/elasticsearch-config.js').ElasticsearchConfigFile}
|
||||
*/
|
||||
const config = {
|
||||
internal: {
|
||||
database: {
|
||||
name: 'elasticsearch',
|
||||
version: '5.6',
|
||||
version: '8.4.2',
|
||||
query: {
|
||||
minMatch: '75%',
|
||||
queryType: 'dis_max',
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
// @ts-check
|
||||
import {readFile} from 'fs/promises';
|
||||
import {SCAboutPageContentType} from '@openstapps/core';
|
||||
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
// @ts-check
|
||||
/**
|
||||
* Generates a range of numbers that represent consecutive calendar months
|
||||
*
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
// @ts-check
|
||||
import {readFile} from 'fs/promises';
|
||||
import {readFile, readdir} from 'fs/promises';
|
||||
import url from 'url';
|
||||
import path from 'path';
|
||||
|
||||
/**
|
||||
* @example version(1, import.meta.url)
|
||||
@@ -23,20 +24,14 @@ export async function version(options, base) {
|
||||
}
|
||||
|
||||
/**
|
||||
* @param infos {Record<string, import('@openstapps/core').SCAppVersionInfo['published']>}
|
||||
* @param base {string} Base path of the file as `import.meta.url`
|
||||
* @returns {Promise<import('@openstapps/core').SCAppVersionInfo[]>}
|
||||
*/
|
||||
export async function versions(infos, base) {
|
||||
return Promise.all(
|
||||
Object.entries(infos).map(([versionName, published]) =>
|
||||
version(
|
||||
{
|
||||
published,
|
||||
version: versionName,
|
||||
},
|
||||
base,
|
||||
),
|
||||
),
|
||||
).then(it => it.sort(({version: a}, {version: b}) => -a.localeCompare(b, undefined, {numeric: true})));
|
||||
export async function versions(base) {
|
||||
const directory = await readdir(path.dirname(url.fileURLToPath(base)));
|
||||
const versions = [
|
||||
...new Set(directory.filter(it => it.endsWith('.md')).map(it => it.replace(/\.\w+\.md$/, ''))),
|
||||
].sort((a, b) => -a.localeCompare(b, undefined, {numeric: true}));
|
||||
|
||||
return Promise.all(versions.map(versionName => version({version: versionName}, base)));
|
||||
}
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
// @ts-check
|
||||
import {SCAboutPageContentType} from '@openstapps/core';
|
||||
import {markdown} from '../../default/tools/markdown.js';
|
||||
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
// @ts-check
|
||||
import {SCAboutPageContentType} from '@openstapps/core';
|
||||
|
||||
/** @type {import('@openstapps/core').SCAboutPage} */
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
// @ts-check
|
||||
import about from './about.js';
|
||||
import imprint from './imprint.js';
|
||||
import privacy from './privacy.js';
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
// @ts-check
|
||||
import {markdown} from '../../default/tools/markdown.js';
|
||||
|
||||
/** @type {import('@openstapps/core').SCAboutPage} */
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
// @ts-check
|
||||
import aboutPages from './about-pages/index.js';
|
||||
import defaultApp from '../default/app/index.js';
|
||||
import {backend as defaultBackend, internal as defaultInternal} from '../default/backend/index.js';
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# Goethe-Uni App 3.1
|
||||
# Goethe-Uni App 2.4
|
||||
|
||||
Wir freuen uns euch mehr in der Goethe-Uni App
|
||||
bieten zu können.
|
||||
@@ -1,4 +1,4 @@
|
||||
# Goethe-Uni App 3.1
|
||||
# Goethe-Uni App 2.4
|
||||
|
||||
The Goethe-Uni App got even better!
|
||||
|
||||
15
backend/backend/config/f-u/version-history/2.5.0.de.md
Normal file
15
backend/backend/config/f-u/version-history/2.5.0.de.md
Normal file
@@ -0,0 +1,15 @@
|
||||
# Goethe-Uni App 2.5
|
||||
|
||||
Die Goethe-Uni App ist noch besser geworden!
|
||||
|
||||
## Komplett neue Kartenansicht
|
||||
|
||||
Wir haben die Karte überarbeitet, um eine klarere und schnellere Übersicht zu bieten.
|
||||
|
||||
## Deutschlandticket mit an Bord
|
||||
|
||||
Wenn du das Upgrade des Semesterticket zum Deutschlandticket gemacht hast und eingeloggt bist, findet es sich jetzt auch in der App.
|
||||
|
||||
## Bibliotheksdienste sind wieder voll funktionsfähig
|
||||
|
||||
Aufgrund einiger Adhoc-Änderungen im Bibliothekssystem haben wir die App so angepasst, dass sie damit umgehen kann.
|
||||
15
backend/backend/config/f-u/version-history/2.5.0.en.md
Normal file
15
backend/backend/config/f-u/version-history/2.5.0.en.md
Normal file
@@ -0,0 +1,15 @@
|
||||
# Goethe-Uni App 2.5
|
||||
|
||||
The Goethe-Uni App got even better!
|
||||
|
||||
## Completely new map view
|
||||
|
||||
We overhauled the map to offer you a clearer and faster and overview.
|
||||
|
||||
## Deutschlandticket included
|
||||
|
||||
If you upgraded your Semesterticket to a Deutschlandticket it will now reside in the App if you are logged in.
|
||||
|
||||
## Library services are fully functional again
|
||||
|
||||
Due to some adhoc changes in the library system we adjusted the app to handle them properly.
|
||||
@@ -1,12 +1,6 @@
|
||||
// @ts-check
|
||||
import {versions} from '../../default/tools/version.js';
|
||||
|
||||
/** @type {import('@openstapps/core').SCAppVersionInfo[]} */
|
||||
const versionHistory = await versions(
|
||||
{
|
||||
'3.1.0': {},
|
||||
},
|
||||
import.meta.url,
|
||||
);
|
||||
const versionHistory = await versions(import.meta.url);
|
||||
|
||||
export default versionHistory;
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "@openstapps/backend",
|
||||
"description": "A reference implementation for a StApps backend",
|
||||
"version": "3.1.0",
|
||||
"version": "3.3.1",
|
||||
"private": true,
|
||||
"type": "module",
|
||||
"license": "AGPL-3.0-only",
|
||||
@@ -64,7 +64,7 @@
|
||||
"express-prom-bundle": "6.6.0",
|
||||
"express-promise-router": "4.1.1",
|
||||
"got": "12.6.0",
|
||||
"moment": "2.29.4",
|
||||
"moment": "2.30.1",
|
||||
"morgan": "1.10.0",
|
||||
"nock": "13.3.1",
|
||||
"node-cache": "5.1.2",
|
||||
@@ -98,9 +98,9 @@
|
||||
"sinon": "15.0.4",
|
||||
"sinon-express-mock": "2.2.1",
|
||||
"supertest": "6.3.3",
|
||||
"ts-node": "10.9.1",
|
||||
"ts-node": "10.9.2",
|
||||
"tsup": "6.7.0",
|
||||
"typescript": "5.1.6"
|
||||
"typescript": "5.4.2"
|
||||
},
|
||||
"tsup": {
|
||||
"entry": [
|
||||
|
||||
@@ -2,6 +2,7 @@ import {cosmiconfig, PublicExplorer} from 'cosmiconfig';
|
||||
import {SCConfigFile} from '@openstapps/core';
|
||||
import path from 'path';
|
||||
import deepmerge from 'deepmerge';
|
||||
import {Logger} from '@openstapps/logger';
|
||||
|
||||
const fallbackNamespace = 'default';
|
||||
const configPath = 'config';
|
||||
@@ -23,31 +24,25 @@ function configLoader(moduleName: string): PublicExplorer {
|
||||
* Find and load a config file
|
||||
*/
|
||||
async function findConfig<T>(moduleName: string, namespace = fallbackNamespace): Promise<T> {
|
||||
return configLoader(moduleName)
|
||||
.search(path.posix.join('.', configPath, namespace))
|
||||
.then(it => it!.config as T)
|
||||
.catch(() =>
|
||||
configLoader(moduleName)
|
||||
.search(path.posix.join('.', configPath, fallbackNamespace))
|
||||
.then(it => it!.config),
|
||||
);
|
||||
}
|
||||
const config = await configLoader(moduleName).search(path.posix.join('.', configPath, namespace));
|
||||
|
||||
/**
|
||||
* Loads a config file
|
||||
*/
|
||||
async function loadConfig<T>(moduleName: string): Promise<T> {
|
||||
const namespace = process.env.NODE_APP_INSTANCE;
|
||||
const database = process.env.NODE_CONFIG_ENV;
|
||||
|
||||
const config = await findConfig<T>(moduleName, namespace);
|
||||
if (database) {
|
||||
const databaseConfig = await findConfig<T>(database, namespace);
|
||||
return deepmerge(config, databaseConfig);
|
||||
if (config) {
|
||||
Logger.info(`Using ${namespace} config for ${moduleName}`);
|
||||
return config.config;
|
||||
} else {
|
||||
Logger.info(`Using ${fallbackNamespace} config for ${moduleName}`);
|
||||
return configLoader(moduleName)
|
||||
.search(path.posix.join('.', configPath, fallbackNamespace))
|
||||
.then(it => it!.config);
|
||||
}
|
||||
|
||||
return config;
|
||||
}
|
||||
|
||||
export const backendConfig = await loadConfig<SCConfigFile>('backend');
|
||||
export const prometheusConfig = await loadConfig<unknown>('prometheus');
|
||||
const namespace = process.env.NODE_APP_INSTANCE;
|
||||
const database = process.env.NODE_CONFIG_ENV;
|
||||
|
||||
export const prometheusConfig = await findConfig<unknown>('prometheus', namespace);
|
||||
|
||||
const backendConfigWithoutDatabase = await findConfig<SCConfigFile>('backend', namespace);
|
||||
export const backendConfig = database
|
||||
? deepmerge(backendConfigWithoutDatabase, await findConfig<never>(database, namespace))
|
||||
: backendConfigWithoutDatabase;
|
||||
|
||||
@@ -13,15 +13,34 @@
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
import {SCConfigFile, SCSearchQuery, SCSearchResponse, SCThings, SCUuid} from '@openstapps/core';
|
||||
import {
|
||||
SCConfigFile,
|
||||
SCPlace,
|
||||
SCPlaceWithoutReferences,
|
||||
SCSearchQuery,
|
||||
SCSearchResponse,
|
||||
SCThingWithCategoriesWithoutReferences,
|
||||
SCThings,
|
||||
SCUuid,
|
||||
} from '@openstapps/core';
|
||||
import {MailQueue} from '../notification/mail-queue.js';
|
||||
import {Bulk} from './bulk-storage.js';
|
||||
import {FeatureCollection, Point, Polygon} from 'geojson';
|
||||
|
||||
/**
|
||||
* Creates an instance of a database
|
||||
*/
|
||||
export type DatabaseConstructor = new (config: SCConfigFile, mailQueue?: MailQueue) => Database;
|
||||
|
||||
export type SupplementaryGeoJSON = FeatureCollection<Point | Polygon, SupplementaryGeoJSONThing>;
|
||||
export type SupplementaryGeoJSONThing = Pick<
|
||||
Extract<SCThings, SCPlace>,
|
||||
Exclude<
|
||||
keyof SCPlaceWithoutReferences | keyof SCThingWithCategoriesWithoutReferences<never, never>,
|
||||
'geo' | 'origin' | 'translations'
|
||||
>
|
||||
>;
|
||||
|
||||
/**
|
||||
* Defines what one database class needs to have defined
|
||||
*/
|
||||
@@ -82,4 +101,9 @@ export interface Database {
|
||||
* @param params Parameters which form a search query to search the backend data
|
||||
*/
|
||||
search(parameters: SCSearchQuery): Promise<SCSearchResponse>;
|
||||
|
||||
/**
|
||||
* Get geo info for display on a map
|
||||
*/
|
||||
geo(): Promise<SupplementaryGeoJSON>;
|
||||
}
|
||||
|
||||
@@ -26,7 +26,7 @@ import {Logger} from '@openstapps/logger';
|
||||
import moment from 'moment';
|
||||
import {MailQueue} from '../../notification/mail-queue.js';
|
||||
import {Bulk} from '../bulk-storage.js';
|
||||
import {Database} from '../database.js';
|
||||
import {Database, SupplementaryGeoJSON, SupplementaryGeoJSONThing} from '../database.js';
|
||||
import {parseAggregations} from './aggregations.js';
|
||||
import * as Monitoring from './monitoring.js';
|
||||
import {buildQuery} from './query/query.js';
|
||||
@@ -46,6 +46,7 @@ import {
|
||||
} from './util/index.js';
|
||||
import {noUndefined} from './util/no-undefined.js';
|
||||
import {retryCatch, RetryOptions} from './util/retry.js';
|
||||
import {Feature, Point, Polygon} from 'geojson';
|
||||
|
||||
/**
|
||||
* A database interface for elasticsearch
|
||||
@@ -84,7 +85,10 @@ export class Elasticsearch implements Database {
|
||||
* @param config an assembled config file
|
||||
* @param mailQueue a mail queue for monitoring
|
||||
*/
|
||||
constructor(private readonly config: SCConfigFile, mailQueue?: MailQueue) {
|
||||
constructor(
|
||||
private readonly config: SCConfigFile,
|
||||
mailQueue?: MailQueue,
|
||||
) {
|
||||
if (config.internal.database === undefined || typeof config.internal.database.version !== 'string') {
|
||||
throw new TypeError('Database version is undefined. Check your config file');
|
||||
}
|
||||
@@ -402,4 +406,49 @@ export class Elasticsearch implements Database {
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
async geo(): Promise<SupplementaryGeoJSON> {
|
||||
const searchResponse = await this.client.search<Extract<SCThings, {geo: unknown}>>({
|
||||
body: {
|
||||
query: {
|
||||
exists: {
|
||||
field: 'geo',
|
||||
},
|
||||
},
|
||||
},
|
||||
from: 0,
|
||||
allow_no_indices: true,
|
||||
index: ACTIVE_INDICES_ALIAS,
|
||||
size: 1,
|
||||
});
|
||||
|
||||
return {
|
||||
type: 'FeatureCollection',
|
||||
features: searchResponse.hits.hits
|
||||
.map(thing => {
|
||||
return thing._source?.geo
|
||||
? ({
|
||||
id: Number(thing._source.identifiers?.['OSM']) || undefined,
|
||||
type: 'Feature',
|
||||
geometry: thing._source.geo.polygon ?? thing._source.geo.point,
|
||||
properties: {
|
||||
name: thing._source.name,
|
||||
sameAs: thing._source.sameAs,
|
||||
image: thing._source.image,
|
||||
alternateNames: thing._source.alternateNames,
|
||||
description: thing._source.description,
|
||||
identifiers: thing._source.identifiers,
|
||||
categories: thing._source.categories,
|
||||
categorySpecificValues: thing._source.categorySpecificValues,
|
||||
openingHours: thing._source.openingHours,
|
||||
address: thing._source.address,
|
||||
uid: thing._source.uid,
|
||||
type: thing._source.type,
|
||||
},
|
||||
} satisfies Feature<Polygon | Point, SupplementaryGeoJSONThing>)
|
||||
: undefined;
|
||||
})
|
||||
.filter(noUndefined),
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
@@ -25,7 +25,7 @@ export function buildDistanceFilter(
|
||||
): QueryDslSpecificQueryContainer<'geo_distance'> {
|
||||
const geoObject: QueryDslGeoDistanceQuery = {
|
||||
distance: `${filter.arguments.distance}m`,
|
||||
[`${filter.arguments.field}.point.coordinates`]: {
|
||||
[`${filter.arguments.field}.point`]: {
|
||||
lat: filter.arguments.position[1],
|
||||
lon: filter.arguments.position[0],
|
||||
},
|
||||
|
||||
@@ -19,14 +19,29 @@ import {QueryDslSpecificQueryContainer} from '../../types/util.js';
|
||||
* Converts a geo filter to elasticsearch syntax
|
||||
* @param filter A search filter for the retrieval of the data
|
||||
*/
|
||||
export function buildGeoFilter(filter: SCGeoFilter): QueryDslSpecificQueryContainer<'geo_shape'> {
|
||||
export function buildGeoFilter(filter: SCGeoFilter): QueryDslSpecificQueryContainer<'bool'> {
|
||||
return {
|
||||
geo_shape: {
|
||||
ignore_unmapped: true,
|
||||
[`${filter.arguments.field}.polygon`]: {
|
||||
shape: filter.arguments.shape,
|
||||
relation: filter.arguments.spatialRelation,
|
||||
},
|
||||
bool: {
|
||||
should: [
|
||||
{
|
||||
geo_shape: {
|
||||
ignore_unmapped: true,
|
||||
[`${filter.arguments.field}.polygon`]: {
|
||||
shape: filter.arguments.shape,
|
||||
relation: filter.arguments.spatialRelation,
|
||||
},
|
||||
},
|
||||
} satisfies QueryDslSpecificQueryContainer<'geo_shape'>,
|
||||
{
|
||||
geo_shape: {
|
||||
ignore_unmapped: true,
|
||||
[`${filter.arguments.field}.point`]: {
|
||||
shape: filter.arguments.shape,
|
||||
relation: filter.arguments.spatialRelation,
|
||||
},
|
||||
},
|
||||
} satisfies QueryDslSpecificQueryContainer<'geo_shape'>,
|
||||
],
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
@@ -21,16 +21,31 @@ import {QueryDslSpecificQueryContainer} from '../../types/util.js';
|
||||
*/
|
||||
export function buildValueFilter(
|
||||
filter: SCSearchValueFilter,
|
||||
): QueryDslSpecificQueryContainer<'term'> | QueryDslSpecificQueryContainer<'terms'> {
|
||||
return Array.isArray(filter.arguments.value)
|
||||
? {
|
||||
terms: {
|
||||
[`${filter.arguments.field}.raw`]: filter.arguments.value,
|
||||
):
|
||||
| QueryDslSpecificQueryContainer<'exists'>
|
||||
| QueryDslSpecificQueryContainer<'term'>
|
||||
| QueryDslSpecificQueryContainer<'terms'> {
|
||||
switch (typeof filter.arguments.value) {
|
||||
case 'undefined': {
|
||||
return {
|
||||
exists: {
|
||||
field: filter.arguments.field,
|
||||
},
|
||||
}
|
||||
: {
|
||||
};
|
||||
}
|
||||
case 'string': {
|
||||
return {
|
||||
term: {
|
||||
[`${filter.arguments.field}.raw`]: filter.arguments.value,
|
||||
},
|
||||
};
|
||||
}
|
||||
case 'object': {
|
||||
return {
|
||||
terms: {
|
||||
[`${filter.arguments.field}.raw`]: filter.arguments.value,
|
||||
},
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -25,7 +25,7 @@ export function buildDistanceSort(sort: SCDistanceSort): SortOptions {
|
||||
mode: 'avg',
|
||||
order: sort.order,
|
||||
unit: 'm',
|
||||
[`${sort.arguments.field}.point.coordinates`]: {
|
||||
[`${sort.arguments.field}.point`]: {
|
||||
lat: sort.arguments.position[1],
|
||||
lon: sort.arguments.position[0],
|
||||
},
|
||||
|
||||
@@ -22,7 +22,7 @@ import http from 'http';
|
||||
import {MailQueue} from '../src/notification/mail-queue.js';
|
||||
import {Bulk, BulkStorage} from '../src/storage/bulk-storage.js';
|
||||
import getPort from 'get-port';
|
||||
import {Database} from '../src/storage/database.js';
|
||||
import {Database, SupplementaryGeoJSON} from '../src/storage/database.js';
|
||||
import {v4} from 'uuid';
|
||||
import {backendConfig} from '../src/config.js';
|
||||
import {getIndexUID} from '../src/storage/elasticsearch/util/index.js';
|
||||
@@ -58,7 +58,6 @@ export async function startApp(): Promise<Express> {
|
||||
* An elasticsearch mock
|
||||
*/
|
||||
export class ElasticsearchMock implements Database {
|
||||
// @ts-expect-error never read
|
||||
private bulk: Bulk | undefined;
|
||||
|
||||
private storageMock = new Map<string, SCThings>();
|
||||
@@ -67,6 +66,10 @@ export class ElasticsearchMock implements Database {
|
||||
// Nothing to do here
|
||||
}
|
||||
|
||||
geo(): Promise<SupplementaryGeoJSON> {
|
||||
throw new Error('Method not implemented.');
|
||||
}
|
||||
|
||||
bulkCreated(bulk: Bulk): Promise<void> {
|
||||
this.bulk = bulk;
|
||||
return Promise.resolve(undefined);
|
||||
|
||||
@@ -14,6 +14,7 @@
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
import {
|
||||
SCBook,
|
||||
SCBulkAddRoute,
|
||||
SCBulkDoneRoute,
|
||||
SCBulkRequest,
|
||||
@@ -23,29 +24,30 @@ import {
|
||||
import {expect} from 'chai';
|
||||
import {bulk, DEFAULT_TEST_TIMEOUT} from '../common.js';
|
||||
import {testApp} from '../tests-setup.js';
|
||||
import {readFile} from 'fs/promises';
|
||||
import {v4} from 'uuid';
|
||||
import bookFile from '@openstapps/core/test/resources/indexable/Book.2.json' assert {type: 'json'};
|
||||
|
||||
const book = JSON.parse(
|
||||
await readFile('node_modules/@openstapps/core/test/resources/indexable/Book.2.json', 'utf8'),
|
||||
).instance;
|
||||
const book = bookFile.instance as SCBook;
|
||||
|
||||
describe('Bulk routes', async function () {
|
||||
// increase timeout for the suite
|
||||
this.timeout(DEFAULT_TEST_TIMEOUT);
|
||||
|
||||
const request: SCBulkRequest = {
|
||||
expiration: bulk.expiration,
|
||||
source: bulk.source,
|
||||
type: bulk.type,
|
||||
};
|
||||
const bulkRoute = new SCBulkRoute();
|
||||
const bulkAddRoute = new SCBulkAddRoute();
|
||||
const bulkDoneRoute = new SCBulkDoneRoute();
|
||||
let request: SCBulkRequest;
|
||||
let bulkRoute: SCBulkRoute;
|
||||
let bulkAddRoute: SCBulkAddRoute;
|
||||
let bulkDoneRoute: SCBulkDoneRoute;
|
||||
|
||||
// afterEach(async function() {
|
||||
// TODO: Delete saved bulks
|
||||
// });
|
||||
before(function () {
|
||||
request = {
|
||||
expiration: bulk.expiration,
|
||||
source: bulk.source,
|
||||
type: bulk.type,
|
||||
};
|
||||
bulkRoute = new SCBulkRoute();
|
||||
bulkAddRoute = new SCBulkAddRoute();
|
||||
bulkDoneRoute = new SCBulkDoneRoute();
|
||||
});
|
||||
|
||||
it('should create bulk', async function () {
|
||||
const {status, body, error} = await testApp
|
||||
|
||||
@@ -21,7 +21,12 @@ import {expect} from 'chai';
|
||||
describe('Index route', async function () {
|
||||
// increase timeout for the suite
|
||||
this.timeout(DEFAULT_TEST_TIMEOUT);
|
||||
const indexRoute = new SCIndexRoute();
|
||||
|
||||
let indexRoute: SCIndexRoute;
|
||||
|
||||
before(function () {
|
||||
indexRoute = new SCIndexRoute();
|
||||
});
|
||||
|
||||
it('should respond with both app and backend configuration', async function () {
|
||||
const request: SCIndexRequest = {};
|
||||
|
||||
@@ -30,15 +30,11 @@ import chaiAsPromised from 'chai-as-promised';
|
||||
import {DEFAULT_TEST_TIMEOUT} from '../common.js';
|
||||
import {testApp} from '../tests-setup.js';
|
||||
import {backendConfig} from '../../src/config.js';
|
||||
import {readFile} from 'fs/promises';
|
||||
import registerRequest from '@openstapps/core/test/resources/PluginRegisterRequest.1.json' assert {type: 'json'};
|
||||
|
||||
// for using promises in expectations (to.eventually.be...)
|
||||
use(chaiAsPromised);
|
||||
|
||||
const registerRequest = JSON.parse(
|
||||
await readFile('node_modules/@openstapps/core/test/resources/PluginRegisterRequest.1.json', 'utf8'),
|
||||
);
|
||||
|
||||
// cast it because of "TS2322: Type 'string' is not assignable to type '"add"'"
|
||||
export const registerAddRequest: SCPluginAdd = registerRequest.instance as SCPluginAdd;
|
||||
|
||||
|
||||
@@ -47,8 +47,8 @@ describe('Create route', async function () {
|
||||
const statusCodeSuccess = 222;
|
||||
const bodySuccess = {foo: true};
|
||||
const sandbox = sinon.createSandbox();
|
||||
const validationError = new SCValidationErrorResponse([]);
|
||||
const internalServerError = new SCInternalServerErrorResponse();
|
||||
let validationError: SCValidationErrorResponse;
|
||||
let internalServerError: SCInternalServerErrorResponse;
|
||||
|
||||
beforeEach(function () {
|
||||
app = express();
|
||||
@@ -64,6 +64,9 @@ describe('Create route', async function () {
|
||||
handler = (_request, _app) => {
|
||||
return Promise.resolve(bodySuccess);
|
||||
};
|
||||
|
||||
validationError = new SCValidationErrorResponse([]);
|
||||
internalServerError = new SCInternalServerErrorResponse();
|
||||
});
|
||||
|
||||
afterEach(function () {
|
||||
|
||||
@@ -29,14 +29,21 @@ import {backendConfig} from '../../src/config.js';
|
||||
describe('Search route', async function () {
|
||||
// increase timeout for the suite
|
||||
this.timeout(DEFAULT_TEST_TIMEOUT);
|
||||
const searchRoute = new SCSearchRoute();
|
||||
const multiSearchRoute = new SCMultiSearchRoute();
|
||||
const syntaxError = new SCSyntaxErrorResponse('Foo Message');
|
||||
const methodNotAllowedError = new SCMethodNotAllowedErrorResponse();
|
||||
const tooManyRequestsError = new SCTooManyRequestsErrorResponse();
|
||||
let searchRoute: SCSearchRoute;
|
||||
let multiSearchRoute: SCMultiSearchRoute;
|
||||
let syntaxError: SCSyntaxErrorResponse;
|
||||
let methodNotAllowedError: SCMethodNotAllowedErrorResponse;
|
||||
let tooManyRequestsError: SCTooManyRequestsErrorResponse;
|
||||
|
||||
before(function () {
|
||||
searchRoute = new SCSearchRoute();
|
||||
multiSearchRoute = new SCMultiSearchRoute();
|
||||
syntaxError = new SCSyntaxErrorResponse('Foo Message');
|
||||
methodNotAllowedError = new SCMethodNotAllowedErrorResponse();
|
||||
tooManyRequestsError = new SCTooManyRequestsErrorResponse();
|
||||
});
|
||||
|
||||
it('should reject GET, PUT with a valid search query', async function () {
|
||||
// const expectedParams = JSON.parse(JSON.stringify(defaultParams));
|
||||
const {status} = await testApp.get('/search').set('Accept', 'application/json').send({
|
||||
query: 'Some search terms',
|
||||
});
|
||||
|
||||
@@ -13,23 +13,25 @@
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
import {SCThingUpdateRoute} from '@openstapps/core';
|
||||
import {SCBook, SCThingUpdateRoute} from '@openstapps/core';
|
||||
import chaiAsPromised from 'chai-as-promised';
|
||||
import {bulkStorageMock, DEFAULT_TEST_TIMEOUT} from '../common.js';
|
||||
import {expect, use} from 'chai';
|
||||
import {testApp} from '../tests-setup.js';
|
||||
import {readFile} from 'fs/promises';
|
||||
import bookFile from '@openstapps/core/test/resources/indexable/Book.1.json' assert {type: 'json'};
|
||||
|
||||
use(chaiAsPromised);
|
||||
|
||||
const book = JSON.parse(
|
||||
await readFile('node_modules/@openstapps/core/test/resources/indexable/Book.1.json', 'utf8'),
|
||||
).instance;
|
||||
const book = bookFile.instance as SCBook;
|
||||
|
||||
describe('Thing update route', async function () {
|
||||
// increase timeout for the suite
|
||||
this.timeout(DEFAULT_TEST_TIMEOUT);
|
||||
const thingUpdateRoute = new SCThingUpdateRoute();
|
||||
let thingUpdateRoute: SCThingUpdateRoute;
|
||||
|
||||
before(function () {
|
||||
thingUpdateRoute = new SCThingUpdateRoute();
|
||||
});
|
||||
|
||||
it('should update a thing', async function () {
|
||||
const thingUpdateRouteurlPath = thingUpdateRoute.urlPath
|
||||
|
||||
@@ -39,7 +39,6 @@ import {Elasticsearch} from '../../../src/storage/elasticsearch/elasticsearch.js
|
||||
import {bulk, DEFAULT_TEST_TIMEOUT, getTransport, getIndex} from '../../common.js';
|
||||
import fs from 'fs';
|
||||
import {backendConfig} from '../../../src/config.js';
|
||||
import {readFile} from 'fs/promises';
|
||||
import {
|
||||
ACTIVE_INDICES_ALIAS,
|
||||
getIndexUID,
|
||||
@@ -50,6 +49,11 @@ import {
|
||||
} from '../../../src/storage/elasticsearch/util/index.js';
|
||||
import cron from 'node-cron';
|
||||
import {query} from './query.js';
|
||||
import messageFile from '@openstapps/core/test/resources/indexable/Message.1.json' assert {type: 'json'};
|
||||
import bookFile from '@openstapps/core/test/resources/indexable/Book.1.json' assert {type: 'json'};
|
||||
|
||||
const message = messageFile.instance as SCMessage;
|
||||
const book = bookFile.instance as SCBook;
|
||||
|
||||
use(chaiAsPromised);
|
||||
|
||||
@@ -60,13 +64,6 @@ function searchResponse<T>(...hits: SearchHit<T>[]): SearchResponse<T> {
|
||||
return {hits: {hits}, took: 0, timed_out: false, _shards: {total: 1, failed: 0, successful: 1}};
|
||||
}
|
||||
|
||||
const message = JSON.parse(
|
||||
await readFile('node_modules/@openstapps/core/test/resources/indexable/Message.1.json', 'utf8'),
|
||||
);
|
||||
const book = JSON.parse(
|
||||
await readFile('node_modules/@openstapps/core/test/resources/indexable/Book.1.json', 'utf8'),
|
||||
);
|
||||
|
||||
describe('Elasticsearch', function () {
|
||||
// increase timeout for the suite
|
||||
this.timeout(DEFAULT_TEST_TIMEOUT);
|
||||
@@ -74,8 +71,15 @@ describe('Elasticsearch', function () {
|
||||
|
||||
before(function () {
|
||||
// eslint-disable-next-line no-console
|
||||
console.log('before');
|
||||
sandbox.stub(fs, 'readFileSync').returns('{}');
|
||||
sandbox.stub(backendConfig.internal.boostings.default[0], 'fields').value({
|
||||
'academicTerms.acronym': {
|
||||
'SS 2023': 1.05,
|
||||
'WS 2023/24': 1.1,
|
||||
'SoSe 2023': 1.05,
|
||||
'WiSe 2023/24': 1.1,
|
||||
},
|
||||
});
|
||||
});
|
||||
after(function () {
|
||||
sandbox.restore();
|
||||
@@ -445,7 +449,7 @@ describe('Elasticsearch', function () {
|
||||
_id: '',
|
||||
_index: '',
|
||||
_score: 0,
|
||||
_source: message as SCMessage,
|
||||
_source: message,
|
||||
};
|
||||
sandbox.stub(es.client, 'search').resolves(searchResponse(foundObject));
|
||||
|
||||
@@ -475,7 +479,7 @@ describe('Elasticsearch', function () {
|
||||
const object: SearchHit<SCMessage> = {
|
||||
_id: '',
|
||||
_index: oldIndex,
|
||||
_source: message as SCMessage,
|
||||
_source: message,
|
||||
};
|
||||
sandbox.stub(es.client, 'search').resolves(searchResponse<SCMessage>(object));
|
||||
sandbox.stub(es, 'prepareBulkWrite').resolves(index);
|
||||
@@ -489,7 +493,7 @@ describe('Elasticsearch', function () {
|
||||
sandbox.stub(es.client, 'create').resolves({result: 'not_found'} as CreateResponse);
|
||||
|
||||
await es.init();
|
||||
return expect(es.post(message as SCMessage, bulk)).to.rejectedWith('creation');
|
||||
return expect(es.post(message, bulk)).to.rejectedWith('creation');
|
||||
});
|
||||
|
||||
it('should create a new object', async function () {
|
||||
@@ -502,7 +506,7 @@ describe('Elasticsearch', function () {
|
||||
});
|
||||
|
||||
await es.init();
|
||||
await es.post(message as SCMessage, bulk);
|
||||
await es.post(message, bulk);
|
||||
|
||||
expect(createStub.called).to.be.true;
|
||||
expect(caughtParameter.document).to.be.eql({
|
||||
@@ -527,7 +531,7 @@ describe('Elasticsearch', function () {
|
||||
_id: '',
|
||||
_index: getIndex(),
|
||||
_score: 0,
|
||||
_source: message as SCMessage,
|
||||
_source: message,
|
||||
};
|
||||
sandbox.stub(es.client, 'search').resolves(searchResponse());
|
||||
|
||||
@@ -541,7 +545,7 @@ describe('Elasticsearch', function () {
|
||||
_id: '',
|
||||
_index: getIndex(),
|
||||
_score: 0,
|
||||
_source: message as SCMessage,
|
||||
_source: message,
|
||||
};
|
||||
sandbox.stub(es.client, 'search').resolves(searchResponse(object));
|
||||
// @ts-expect-error unused
|
||||
@@ -564,13 +568,13 @@ describe('Elasticsearch', function () {
|
||||
_id: '123',
|
||||
_index: getIndex(),
|
||||
_score: 0,
|
||||
_source: message as SCMessage,
|
||||
_source: message,
|
||||
};
|
||||
const objectBook: SearchHit<SCBook> = {
|
||||
_id: '321',
|
||||
_index: getIndex(),
|
||||
_score: 0,
|
||||
_source: book as SCBook,
|
||||
_source: book,
|
||||
};
|
||||
const fakeEsAggregations = {
|
||||
'@all': {
|
||||
|
||||
@@ -466,7 +466,7 @@ describe('Query', function () {
|
||||
const expectedFilter: QueryDslSpecificQueryContainer<'geo_distance'> = {
|
||||
geo_distance: {
|
||||
'distance': '1000m',
|
||||
'geo.point.coordinates': {
|
||||
'geo.point': {
|
||||
lat: 8.123,
|
||||
lon: 50.123,
|
||||
},
|
||||
@@ -479,18 +479,39 @@ describe('Query', function () {
|
||||
it('should build geo filter for shapes and points', function () {
|
||||
const filter = buildFilter(searchFilters.geoPoint);
|
||||
const expectedFilter = {
|
||||
geo_shape: {
|
||||
'geo.polygon': {
|
||||
relation: undefined,
|
||||
shape: {
|
||||
type: 'envelope',
|
||||
coordinates: [
|
||||
[50.123, 8.123],
|
||||
[50.123, 8.123],
|
||||
],
|
||||
bool: {
|
||||
should: [
|
||||
{
|
||||
geo_shape: {
|
||||
'geo.polygon': {
|
||||
relation: undefined,
|
||||
shape: {
|
||||
coordinates: [
|
||||
[50.123, 8.123],
|
||||
[50.123, 8.123],
|
||||
],
|
||||
type: 'envelope',
|
||||
},
|
||||
},
|
||||
'ignore_unmapped': true,
|
||||
},
|
||||
},
|
||||
},
|
||||
'ignore_unmapped': true,
|
||||
{
|
||||
geo_shape: {
|
||||
'geo.point': {
|
||||
relation: undefined,
|
||||
shape: {
|
||||
coordinates: [
|
||||
[50.123, 8.123],
|
||||
[50.123, 8.123],
|
||||
],
|
||||
type: 'envelope',
|
||||
},
|
||||
},
|
||||
'ignore_unmapped': true,
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
};
|
||||
|
||||
@@ -500,18 +521,39 @@ describe('Query', function () {
|
||||
it('should build geo filter for shapes only', function () {
|
||||
const filter = buildFilter(searchFilters.geoShape);
|
||||
const expectedFilter = {
|
||||
geo_shape: {
|
||||
'geo.polygon': {
|
||||
relation: 'contains',
|
||||
shape: {
|
||||
type: 'envelope',
|
||||
coordinates: [
|
||||
[50.123, 8.123],
|
||||
[50.123, 8.123],
|
||||
],
|
||||
bool: {
|
||||
should: [
|
||||
{
|
||||
geo_shape: {
|
||||
'geo.polygon': {
|
||||
relation: 'contains',
|
||||
shape: {
|
||||
coordinates: [
|
||||
[50.123, 8.123],
|
||||
[50.123, 8.123],
|
||||
],
|
||||
type: 'envelope',
|
||||
},
|
||||
},
|
||||
'ignore_unmapped': true,
|
||||
},
|
||||
},
|
||||
},
|
||||
'ignore_unmapped': true,
|
||||
{
|
||||
geo_shape: {
|
||||
'geo.point': {
|
||||
relation: 'contains',
|
||||
shape: {
|
||||
coordinates: [
|
||||
[50.123, 8.123],
|
||||
[50.123, 8.123],
|
||||
],
|
||||
type: 'envelope',
|
||||
},
|
||||
},
|
||||
'ignore_unmapped': true,
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
};
|
||||
|
||||
@@ -594,7 +636,7 @@ describe('Query', function () {
|
||||
'mode': 'avg',
|
||||
'order': 'desc',
|
||||
'unit': 'm',
|
||||
'geo.point.coordinates': {
|
||||
'geo.point': {
|
||||
lat: 50.123,
|
||||
lon: 8.123,
|
||||
},
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
"extends": "@openstapps/tsconfig",
|
||||
"compilerOptions": {
|
||||
"resolveJsonModule": true,
|
||||
"useUnknownInCatchVariables": false,
|
||||
"allowJs": true
|
||||
}
|
||||
"useUnknownInCatchVariables": false
|
||||
},
|
||||
"exclude": ["lib", "app.js"]
|
||||
}
|
||||
|
||||
@@ -1,5 +1,11 @@
|
||||
# @openstapps/database
|
||||
|
||||
## 3.2.0
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- 689ac68b: pin alpine version to 3.18 and add healthchecks
|
||||
|
||||
## 3.0.0
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -14,4 +14,6 @@ RUN chown elasticsearch:elasticsearch config/elasticsearch.yml
|
||||
|
||||
USER elasticsearch
|
||||
|
||||
HEALTHCHECK --interval=10s --timeout=10s --start-period=60s --retries=12 CMD curl --fail -s http://localhost:9200/ >/dev/null || exit 1
|
||||
|
||||
CMD ["/usr/share/elasticsearch/bin/elasticsearch"]
|
||||
|
||||
@@ -3,3 +3,4 @@ discovery.type: "single-node"
|
||||
cluster.routing.allocation.disk.threshold_enabled: false
|
||||
network.bind_host: 0.0.0.0
|
||||
xpack.security.enabled: false
|
||||
ingest.geoip.downloader.enabled: false
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openstapps/database",
|
||||
"version": "3.0.0",
|
||||
"version": "3.2.0",
|
||||
"private": true,
|
||||
"files": [
|
||||
"config",
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
|
||||
// ESM is not supported, and cts is not detected, so we use type-checked cjs instead.
|
||||
/** @type {import('../src/common').ConfigFile} */
|
||||
const configFile = {
|
||||
module.exports = {
|
||||
activeVersions: ['1\\.0\\.\\d+', '2\\.0\\.\\d+'],
|
||||
hiddenRoutes: ['/bulk'],
|
||||
logFormat: 'default',
|
||||
@@ -31,5 +31,3 @@ const configFile = {
|
||||
dhparam: '/etc/nginx/certs/dhparam.pem',
|
||||
},
|
||||
};
|
||||
|
||||
export default configFile;
|
||||
|
||||
@@ -50,8 +50,8 @@
|
||||
"dockerode": "3.3.5",
|
||||
"is-cidr": "4.0.2",
|
||||
"mustache": "4.2.0",
|
||||
"semver": "7.3.8",
|
||||
"typescript": "5.1.6"
|
||||
"semver": "7.6.0",
|
||||
"typescript": "5.4.2"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@openstapps/api-cli": "workspace:*",
|
||||
@@ -65,7 +65,7 @@
|
||||
"@types/mustache": "4.2.2",
|
||||
"@types/node": "18.15.3",
|
||||
"@types/proxyquire": "1.3.28",
|
||||
"@types/semver": "7.3.13",
|
||||
"@types/semver": "7.5.8",
|
||||
"@types/sha1": "1.1.3",
|
||||
"@types/sinon": "10.0.14",
|
||||
"@types/sinon-chai": "3.2.9",
|
||||
@@ -75,7 +75,7 @@
|
||||
"mocha-junit-reporter": "2.2.0",
|
||||
"sinon": "15.0.4",
|
||||
"sinon-chai": "3.7.0",
|
||||
"ts-node": "10.9.1",
|
||||
"ts-node": "10.9.2",
|
||||
"tsup": "6.7.0"
|
||||
},
|
||||
"tsup": {
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
{
|
||||
"extends": "@openstapps/tsconfig",
|
||||
"exclude": ["./config/", "./lib/"]
|
||||
"exclude": ["config", "lib", "app.js"]
|
||||
}
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
// @ts-check
|
||||
const fs = require("fs");
|
||||
const path = require("node:path");
|
||||
const child_process = require("child_process");
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
// @ts-check
|
||||
"use strict"
|
||||
|
||||
const rule = require('./copyright-header-rule')
|
||||
|
||||
@@ -1,5 +1,3 @@
|
||||
// @ts-check
|
||||
|
||||
/** @type {import('eslint').Linter.Config} */
|
||||
const config = {
|
||||
root: true,
|
||||
|
||||
@@ -18,16 +18,15 @@
|
||||
"devDependencies": {
|
||||
"@openstapps/tsconfig": "workspace:*",
|
||||
"@types/node": "18.15.3",
|
||||
"eslint": "8.43.0",
|
||||
"typescript": "5.1.6"
|
||||
"eslint": "8.57.0",
|
||||
"typescript": "5.4.2"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"@typescript-eslint/eslint-plugin": "5.60.1",
|
||||
"@typescript-eslint/parser": "5.60.1",
|
||||
"eslint": "8.43.0",
|
||||
"eslint-config-prettier": "8.8.0",
|
||||
"eslint-plugin-jsdoc": "46.4.2",
|
||||
"eslint-plugin-prettier": "4.2.1",
|
||||
"eslint-plugin-unicorn": "47.0.0"
|
||||
"@typescript-eslint/eslint-plugin": "7.2.0",
|
||||
"@typescript-eslint/parser": "7.2.0",
|
||||
"eslint": "8.57.0",
|
||||
"eslint-config-prettier": "9.1.0",
|
||||
"eslint-plugin-jsdoc": "48.2.1",
|
||||
"eslint-plugin-unicorn": "51.0.1"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,11 @@
|
||||
# @openstapps/prettier-config
|
||||
|
||||
## 3.2.0
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- dbb55850: Update Prettier to 3.1.1
|
||||
|
||||
## 3.0.0
|
||||
|
||||
### Major Changes
|
||||
@@ -30,7 +36,7 @@
|
||||
|
||||
```js
|
||||
#!/usr/bin/env node
|
||||
import './lib/app.js';
|
||||
import "./lib/app.js";
|
||||
```
|
||||
|
||||
- 64caebaf: Migrate to ESM
|
||||
@@ -69,11 +75,14 @@
|
||||
- 64caebaf: Migrated changelogs to changeset format
|
||||
|
||||
```js
|
||||
import fs from 'fs';
|
||||
import fs from "fs";
|
||||
|
||||
const path = 'packages/logger/CHANGELOG.md';
|
||||
const path = "packages/logger/CHANGELOG.md";
|
||||
|
||||
fs.writeFileSync(path, fs.readFileSync(path, 'utf8').replace(/^#+\s+\[/gm, '## ['));
|
||||
fs.writeFileSync(
|
||||
path,
|
||||
fs.readFileSync(path, "utf8").replace(/^#+\s+\[/gm, "## ["),
|
||||
);
|
||||
```
|
||||
|
||||
- 98546a97: Migrate away from @openstapps/configuration
|
||||
@@ -115,7 +124,7 @@
|
||||
|
||||
```js
|
||||
#!/usr/bin/env node
|
||||
import './lib/app.js';
|
||||
import "./lib/app.js";
|
||||
```
|
||||
|
||||
- 64caebaf: Migrate to ESM
|
||||
@@ -154,11 +163,14 @@
|
||||
- 64caebaf: Migrated changelogs to changeset format
|
||||
|
||||
```js
|
||||
import fs from 'fs';
|
||||
import fs from "fs";
|
||||
|
||||
const path = 'packages/logger/CHANGELOG.md';
|
||||
const path = "packages/logger/CHANGELOG.md";
|
||||
|
||||
fs.writeFileSync(path, fs.readFileSync(path, 'utf8').replace(/^#+\s+\[/gm, '## ['));
|
||||
fs.writeFileSync(
|
||||
path,
|
||||
fs.readFileSync(path, "utf8").replace(/^#+\s+\[/gm, "## ["),
|
||||
);
|
||||
```
|
||||
|
||||
- 98546a97: Migrate away from @openstapps/configuration
|
||||
|
||||
15
configuration/prettier-config/index.js
Normal file
15
configuration/prettier-config/index.js
Normal file
@@ -0,0 +1,15 @@
|
||||
/** @type {import('prettier').Config} */
|
||||
const config = {
|
||||
tabWidth: 2,
|
||||
printWidth: 110,
|
||||
useTabs: false,
|
||||
semi: true,
|
||||
singleQuote: true,
|
||||
quoteProps: 'consistent',
|
||||
trailingComma: 'all',
|
||||
bracketSpacing: false,
|
||||
arrowParens: 'avoid',
|
||||
endOfLine: 'lf'
|
||||
}
|
||||
|
||||
export default config;
|
||||
@@ -1,13 +0,0 @@
|
||||
{
|
||||
"$schema": "http://json.schemastore.org/prettierrc",
|
||||
"tabWidth": 2,
|
||||
"printWidth": 110,
|
||||
"useTabs": false,
|
||||
"semi": true,
|
||||
"singleQuote": true,
|
||||
"quoteProps": "consistent",
|
||||
"trailingComma": "all",
|
||||
"bracketSpacing": false,
|
||||
"arrowParens": "avoid",
|
||||
"endOfLine": "lf"
|
||||
}
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "@openstapps/prettier-config",
|
||||
"description": "StApps Prettier Config",
|
||||
"version": "3.0.0",
|
||||
"version": "3.2.0",
|
||||
"type": "module",
|
||||
"license": "GPL-3.0-only",
|
||||
"repository": "git@gitlab.com:openstapps/prettier-config.git",
|
||||
@@ -9,16 +9,19 @@
|
||||
"contributors": [
|
||||
"Rainer Killinger <mail-openstapps@killinger.co>"
|
||||
],
|
||||
"main": "index.json",
|
||||
"main": "index.js",
|
||||
"files": [
|
||||
"index.json",
|
||||
"index.js",
|
||||
"CHANGELOG.md",
|
||||
"README.md"
|
||||
],
|
||||
"scripts": {
|
||||
"test": "npx prettier --config index.json --check \"test/*.js\""
|
||||
"test": "prettier --config index.js --check \"test/*.js\""
|
||||
},
|
||||
"devDependencies": {
|
||||
"prettier": "3.1.1"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"prettier": "2.8.6"
|
||||
"prettier": "3.1.1"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -43,8 +43,8 @@
|
||||
"@openstapps/logger": "workspace:*",
|
||||
"@slack/web-api": "6.8.1",
|
||||
"commander": "10.0.0",
|
||||
"date-fns": "2.30.0",
|
||||
"glob": "10.2.7",
|
||||
"date-fns": "3.6.0",
|
||||
"glob": "10.3.10",
|
||||
"mustache": "4.2.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
@@ -53,7 +53,7 @@
|
||||
"@openstapps/tsconfig": "workspace:*",
|
||||
"@types/chai": "4.3.5",
|
||||
"@types/chai-as-promised": "7.1.5",
|
||||
"@types/glob": "8.0.1",
|
||||
"@types/glob": "8.1.0",
|
||||
"@types/mocha": "10.0.1",
|
||||
"@types/mustache": "4.2.2",
|
||||
"@types/node": "18.15.3",
|
||||
@@ -63,9 +63,9 @@
|
||||
"chai-as-promised": "7.1.1",
|
||||
"mocha": "10.2.0",
|
||||
"mocha-junit-reporter": "2.2.0",
|
||||
"ts-node": "10.9.1",
|
||||
"ts-node": "10.9.2",
|
||||
"tsup": "6.7.0",
|
||||
"typescript": "5.1.6"
|
||||
"typescript": "5.4.2"
|
||||
},
|
||||
"tsup": {
|
||||
"entry": [
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
{
|
||||
"extends": "@openstapps/tsconfig"
|
||||
"extends": "@openstapps/tsconfig",
|
||||
"exclude": ["lib", "app.js"]
|
||||
}
|
||||
|
||||
@@ -1,5 +1,11 @@
|
||||
# @openstapps/tsconfig
|
||||
|
||||
## 3.3.0
|
||||
|
||||
### Minor Changes
|
||||
|
||||
- 688bc5f2: v3.3.0 changes
|
||||
|
||||
## 3.0.0
|
||||
|
||||
### Major Changes
|
||||
@@ -30,7 +36,7 @@
|
||||
|
||||
```js
|
||||
#!/usr/bin/env node
|
||||
import './lib/app.js';
|
||||
import "./lib/app.js";
|
||||
```
|
||||
|
||||
- 64caebaf: Migrate to ESM
|
||||
@@ -105,7 +111,7 @@
|
||||
|
||||
```js
|
||||
#!/usr/bin/env node
|
||||
import './lib/app.js';
|
||||
import "./lib/app.js";
|
||||
```
|
||||
|
||||
- 64caebaf: Migrate to ESM
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "@openstapps/tsconfig",
|
||||
"description": "The tsconfig for the openstapps project",
|
||||
"version": "3.0.0",
|
||||
"version": "3.3.0",
|
||||
"type": "commonjs",
|
||||
"license": "GPL-3.0-only",
|
||||
"repository": "git@gitlab.com:openstapps/eslint-config.git",
|
||||
|
||||
@@ -14,19 +14,26 @@
|
||||
"noFallthroughCasesInSwitch": true,
|
||||
"isolatedModules": true,
|
||||
"allowJs": true,
|
||||
"checkJs": true,
|
||||
"resolveJsonModule": true,
|
||||
"allowSyntheticDefaultImports": true,
|
||||
"noImplicitAny": true,
|
||||
"noImplicitReturns": true,
|
||||
"noUnusedLocals": true,
|
||||
"noUnusedParameters": true,
|
||||
"noUnusedLocals": false,
|
||||
"noUnusedParameters": false,
|
||||
"outDir": "../../../lib/",
|
||||
"lib": ["ES2022", "DOM"],
|
||||
"lib": [
|
||||
"ES2022",
|
||||
"DOM"
|
||||
],
|
||||
"strict": true,
|
||||
"target": "ES2022"
|
||||
},
|
||||
"ts-node": {
|
||||
"transpileOnly": true
|
||||
},
|
||||
"exclude": ["../../../app.js", "../../../lib/"]
|
||||
"exclude": [
|
||||
"../../../app.js",
|
||||
"../../../lib/"
|
||||
]
|
||||
}
|
||||
|
||||
@@ -1,5 +1,31 @@
|
||||
# @openstapps/minimal-connector
|
||||
|
||||
## 3.3.0
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [688bc5f2]
|
||||
- @openstapps/api@3.3.0
|
||||
- @openstapps/core@3.3.0
|
||||
- @openstapps/logger@3.0.0
|
||||
|
||||
## 3.2.0
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [912ae422]
|
||||
- @openstapps/core@3.2.0
|
||||
- @openstapps/api@3.2.0
|
||||
- @openstapps/logger@3.0.0
|
||||
|
||||
## 3.1.1
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies
|
||||
- @openstapps/api@3.1.1
|
||||
- @openstapps/core@3.1.1
|
||||
|
||||
## 3.1.0
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "@openstapps/minimal-connector",
|
||||
"description": "This is a minimal connector which serves as an example",
|
||||
"version": "3.1.0",
|
||||
"version": "3.3.0",
|
||||
"private": true,
|
||||
"type": "module",
|
||||
"license": "GPL-3.0-only",
|
||||
@@ -53,9 +53,9 @@
|
||||
"mocha": "10.2.0",
|
||||
"mocha-junit-reporter": "2.2.0",
|
||||
"nock": "13.3.1",
|
||||
"ts-node": "10.9.1",
|
||||
"ts-node": "10.9.2",
|
||||
"tsup": "6.7.0",
|
||||
"typescript": "5.1.6"
|
||||
"typescript": "5.4.2"
|
||||
},
|
||||
"tsup": {
|
||||
"entry": [
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
{
|
||||
"extends": "@openstapps/tsconfig"
|
||||
"extends": "@openstapps/tsconfig",
|
||||
"exclude": ["lib", "app.js"]
|
||||
}
|
||||
|
||||
@@ -1,44 +1,62 @@
|
||||
version: '3.7'
|
||||
|
||||
x-development-variables: &development-variables
|
||||
NODE_ENV: "development"
|
||||
ALLOW_NO_TRANSPORT: "true"
|
||||
|
||||
services:
|
||||
database:
|
||||
image: registry.gitlab.com/openstapps/openstapps/database:2.0.0
|
||||
volumes:
|
||||
- ./database:/usr/share/elasticsearch/data
|
||||
image: registry.gitlab.com/openstapps/openstapps/database:3.0.0
|
||||
# If you need persistence for debugging purposes uncomment the following lines
|
||||
#volumes:
|
||||
# - ./database:/usr/share/elasticsearch/data
|
||||
expose:
|
||||
- "9200"
|
||||
- 9200
|
||||
ports:
|
||||
- 127.0.0.1:9200:9200
|
||||
environment:
|
||||
- bootstrap.memory_lock=true
|
||||
- "ES_JAVA_OPTS=-Xms2g -Xmx2g"
|
||||
- discovery.type=single-node
|
||||
ulimits:
|
||||
memlock:
|
||||
soft: -1
|
||||
hard: -1
|
||||
restart: unless-stopped
|
||||
|
||||
backend:
|
||||
image: registry.gitlab.com/openstapps/openstapps/backend:3.0.0-next.0
|
||||
image: registry.gitlab.com/openstapps/openstapps/backend:3.1.0
|
||||
environment:
|
||||
<<: *development-variables
|
||||
ES_ADDR: "http://database:9200"
|
||||
NODE_CONFIG_ENV: "elasticsearch"
|
||||
ALLOW_NO_TRANSPORT: "true"
|
||||
NODE_APP_INSTANCE: "f-u"
|
||||
PROMETHEUS_MIDDLEWARE: "false"
|
||||
expose:
|
||||
- 3000
|
||||
ports:
|
||||
- 3000:3000
|
||||
links:
|
||||
- "database"
|
||||
- 127.0.0.1:3000:3000
|
||||
labels:
|
||||
- stapps.version=1.0.0
|
||||
- stapps.version=4.1.0
|
||||
restart: unless-stopped
|
||||
depends_on:
|
||||
- database
|
||||
|
||||
api:
|
||||
image: registry.gitlab.com/openstapps/openstapps/api:3.0.0-next.0
|
||||
links:
|
||||
- "backend"
|
||||
- database
|
||||
|
||||
minimal-connector:
|
||||
image: registry.gitlab.com/openstapps/minimal-connector:core-0.23
|
||||
container_name: minimal-connector-0.23
|
||||
command: ["http://backend:3000", "minimal-connector", "f-u"]
|
||||
# api:
|
||||
# image: registry.gitlab.com/openstapps/openstapps/api:3.0.0
|
||||
# links:
|
||||
# - backend
|
||||
|
||||
app:
|
||||
image: registry.gitlab.com/openstapps/app/executable:core-0.23
|
||||
expose:
|
||||
- 8100
|
||||
ports:
|
||||
- 8100:8100
|
||||
# minimal-connector:
|
||||
# image: registry.gitlab.com/openstapps/minimal-connector:core-0.23
|
||||
# container_name: minimal-connector-0.23
|
||||
# command: ["http://backend:3000", "minimal-connector", "f-u"]
|
||||
|
||||
# app:
|
||||
# image: registry.gitlab.com/openstapps/app/executable:core-0.23
|
||||
# expose:
|
||||
# - 8100
|
||||
# ports:
|
||||
# - 8100:8100
|
||||
|
||||
@@ -1,5 +1,36 @@
|
||||
# @openstapps/minimal-plugin
|
||||
|
||||
## 3.3.0
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [688bc5f2]
|
||||
- @openstapps/api@3.3.0
|
||||
- @openstapps/core@3.3.0
|
||||
- @openstapps/api-plugin@3.3.0
|
||||
- @openstapps/core-tools@3.3.0
|
||||
- @openstapps/logger@3.0.0
|
||||
|
||||
## 3.2.0
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [912ae422]
|
||||
- @openstapps/core@3.2.0
|
||||
- @openstapps/api@3.2.0
|
||||
- @openstapps/api-plugin@3.2.0
|
||||
- @openstapps/core-tools@3.0.0
|
||||
- @openstapps/logger@3.0.0
|
||||
|
||||
## 3.1.1
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies
|
||||
- @openstapps/api@3.1.1
|
||||
- @openstapps/api-plugin@3.1.1
|
||||
- @openstapps/core@3.1.1
|
||||
|
||||
## 3.1.0
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "@openstapps/minimal-plugin",
|
||||
"description": "Minimal Plugin",
|
||||
"version": "3.1.0",
|
||||
"version": "3.3.0",
|
||||
"private": true,
|
||||
"type": "module",
|
||||
"license": "GPL-3.0-only",
|
||||
@@ -35,7 +35,7 @@
|
||||
"@openstapps/logger": "workspace:*",
|
||||
"commander": "10.0.0",
|
||||
"express": "4.18.2",
|
||||
"ts-node": "10.9.1"
|
||||
"ts-node": "10.9.2"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@openstapps/eslint-config": "workspace:*",
|
||||
@@ -44,7 +44,7 @@
|
||||
"@types/express": "4.17.17",
|
||||
"@types/node": "18.15.3",
|
||||
"tsup": "6.7.0",
|
||||
"typescript": "5.1.6"
|
||||
"typescript": "5.4.2"
|
||||
},
|
||||
"tsup": {
|
||||
"entry": [
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
{
|
||||
"extends": "@openstapps/tsconfig"
|
||||
"extends": "@openstapps/tsconfig",
|
||||
"exclude": ["lib", "app.js"]
|
||||
}
|
||||
|
||||
40
flake.lock
generated
40
flake.lock
generated
@@ -1,12 +1,30 @@
|
||||
{
|
||||
"nodes": {
|
||||
"flake-utils": {
|
||||
"inputs": {
|
||||
"systems": "systems"
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1709126324,
|
||||
"narHash": "sha256-q6EQdSeUZOG26WelxqkmR7kArjgWCdw5sfJVHPH/7j8=",
|
||||
"owner": "numtide",
|
||||
"repo": "flake-utils",
|
||||
"rev": "d465f4819400de7c8d874d50b982301f28a84605",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "numtide",
|
||||
"repo": "flake-utils",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"nixpkgs": {
|
||||
"locked": {
|
||||
"lastModified": 1701336116,
|
||||
"narHash": "sha256-kEmpezCR/FpITc6yMbAh4WrOCiT2zg5pSjnKrq51h5Y=",
|
||||
"lastModified": 1709747860,
|
||||
"narHash": "sha256-RT4zuBy579m+l8VyIQFOR66WXfcs4g1jntZUHjh6eoI=",
|
||||
"owner": "NixOS",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "f5c27c6136db4d76c30e533c20517df6864c46ee",
|
||||
"rev": "58ae79ea707579c40102ddf62d84b902a987c58b",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@@ -18,8 +36,24 @@
|
||||
},
|
||||
"root": {
|
||||
"inputs": {
|
||||
"flake-utils": "flake-utils",
|
||||
"nixpkgs": "nixpkgs"
|
||||
}
|
||||
},
|
||||
"systems": {
|
||||
"locked": {
|
||||
"lastModified": 1681028828,
|
||||
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
|
||||
"owner": "nix-systems",
|
||||
"repo": "default",
|
||||
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "nix-systems",
|
||||
"repo": "default",
|
||||
"type": "github"
|
||||
}
|
||||
}
|
||||
},
|
||||
"root": "root",
|
||||
|
||||
138
flake.nix
138
flake.nix
@@ -1,77 +1,71 @@
|
||||
{
|
||||
description = "A Nix-flake-based development environment for OpenStApps";
|
||||
inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
|
||||
outputs = { self, nixpkgs }:
|
||||
let
|
||||
buildToolsVersion = "30.0.3";
|
||||
overlays = [
|
||||
(final: prev: rec {
|
||||
nodejs = prev.nodejs-18_x;
|
||||
pnpm = prev.nodePackages.pnpm;
|
||||
chrome = prev.google-chrome;
|
||||
firefox = prev.firefox;
|
||||
webkit = prev.epiphany; # Safari-ish browser
|
||||
android = prev.androidenv.composeAndroidPackages {
|
||||
buildToolsVersions = [ "${buildToolsVersion}" ];
|
||||
platformVersions = [ "33" ];
|
||||
};
|
||||
cypress = prev.cypress.overrideAttrs(cyPrev: rec {
|
||||
version = "13.2.0";
|
||||
src = prev.fetchzip {
|
||||
url = "https://cdn.cypress.io/desktop/${version}/linux-x64/cypress.zip";
|
||||
hash = "sha256-9o0nprGcJhudS1LNm+T7Vf0Dwd1RBauYKI+w1FBQ3ZM=";
|
||||
inputs = {
|
||||
nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
|
||||
flake-utils.url = "github:numtide/flake-utils";
|
||||
};
|
||||
outputs = {
|
||||
self,
|
||||
nixpkgs,
|
||||
flake-utils,
|
||||
}: let
|
||||
aapt2buildToolsVersion = "33.0.2";
|
||||
in
|
||||
flake-utils.lib.eachDefaultSystem (system: let
|
||||
pkgs = import nixpkgs {
|
||||
inherit system;
|
||||
overlays = [
|
||||
(final: prev: rec {
|
||||
fontMin = prev.python311.withPackages (ps: with ps; [brotli fonttools] ++ (with fonttools.optional-dependencies; [woff]));
|
||||
android = prev.androidenv.composeAndroidPackages {
|
||||
buildToolsVersions = ["30.0.3" aapt2buildToolsVersion];
|
||||
platformVersions = ["33"];
|
||||
};
|
||||
});
|
||||
})
|
||||
];
|
||||
# TODO: aarch64-linux, x68_64-darwin, aarch64-darwin
|
||||
supportedSystems = [ "x86_64-linux" ];
|
||||
forEachSupportedSystem = f: nixpkgs.lib.genAttrs supportedSystems (system: f {
|
||||
pkgs = import nixpkgs {
|
||||
inherit overlays system;
|
||||
config = {
|
||||
allowUnfree = true;
|
||||
android_sdk.accept_license = true;
|
||||
};
|
||||
cypress = prev.cypress.overrideAttrs (cyPrev: rec {
|
||||
version = "13.2.0";
|
||||
src = prev.fetchzip {
|
||||
url = "https://cdn.cypress.io/desktop/${version}/linux-x64/cypress.zip";
|
||||
hash = "sha256-9o0nprGcJhudS1LNm+T7Vf0Dwd1RBauYKI+w1FBQ3ZM=";
|
||||
};
|
||||
});
|
||||
nodejs = prev.nodejs_18;
|
||||
})
|
||||
];
|
||||
config = {
|
||||
allowUnfree = true;
|
||||
android_sdk.accept_license = true;
|
||||
};
|
||||
});
|
||||
in
|
||||
{
|
||||
devShells = forEachSupportedSystem ({ pkgs }:
|
||||
let
|
||||
python = (pkgs.python311.withPackages(ps: with ps; [ brotli fonttools ] ++ (with fonttools.optional-dependencies; [ ufo lxml unicode woff ])));
|
||||
in
|
||||
{
|
||||
default = (pkgs.buildFHSUserEnv {
|
||||
name = "StApps Dev";
|
||||
targetPkgs = pkgs: with pkgs; [
|
||||
nodejs
|
||||
pnpm
|
||||
python
|
||||
docker
|
||||
# tools
|
||||
curl
|
||||
jq
|
||||
# browsers
|
||||
firefox
|
||||
chrome
|
||||
webkit
|
||||
cypress
|
||||
# android
|
||||
jdk17
|
||||
android.androidsdk
|
||||
musl
|
||||
];
|
||||
runScript = "bash";
|
||||
profile = ''
|
||||
export CYPRESS_INSTALL_BINARY=0
|
||||
export CYPRESS_RUN_BINARY=${pkgs.cypress}/bin/Cypress
|
||||
export ANDROID_SDK_ROOT=${pkgs.android.androidsdk}/libexec/android-sdk
|
||||
export ANDROID_JAVA_HOME=${pkgs.jdk.home}
|
||||
export DOCKER_HOST=unix:///run/user/1000/docker.sock
|
||||
{ dockerd-rootless & } 2>/dev/null
|
||||
'';
|
||||
}).env;
|
||||
});
|
||||
};
|
||||
};
|
||||
androidFhs = pkgs.buildFHSUserEnv {
|
||||
name = "android-env";
|
||||
targetPkgs = pkgs: with pkgs; [];
|
||||
runScript = "bash";
|
||||
profile = ''
|
||||
export ALLOW_NINJA_ENV=true
|
||||
export USE_CCACHE=1
|
||||
export LD_LIBRARY_PATH=/usr/lib:/usr/lib32
|
||||
'';
|
||||
};
|
||||
in {
|
||||
devShell = pkgs.mkShell rec {
|
||||
nativeBuildInputs = [androidFhs];
|
||||
buildInputs = with pkgs; [
|
||||
nodejs
|
||||
corepack
|
||||
# tools
|
||||
curl
|
||||
jq
|
||||
fontMin
|
||||
cypress
|
||||
# android
|
||||
jdk17
|
||||
android.androidsdk
|
||||
];
|
||||
ANDROID_JAVA_HOME = "${pkgs.jdk.home}";
|
||||
ANDROID_SDK_ROOT = "${pkgs.android.androidsdk}/libexec/android-sdk";
|
||||
GRADLE_OPTS = "-Dorg.gradle.project.android.aapt2FromMavenOverride=${ANDROID_SDK_ROOT}/build-tools/${aapt2buildToolsVersion}/aapt2";
|
||||
CYPRESS_INSTALL_BINARY = "0";
|
||||
CYPRESS_RUN_BINARY = "${pkgs.cypress}/bin/Cypress";
|
||||
};
|
||||
});
|
||||
}
|
||||
|
||||
@@ -5,10 +5,4 @@
|
||||
# You can see what browsers were selected by your queries by running:
|
||||
# npx browserslist
|
||||
|
||||
> 0.5%
|
||||
last 2 versions
|
||||
Firefox ESR
|
||||
not dead
|
||||
not kaios 2.5
|
||||
not op_mini all
|
||||
not IE 9-11
|
||||
> 0.5% in DE and last 2 major versions and supports es6 and not dead
|
||||
|
||||
@@ -1,5 +1,49 @@
|
||||
# @openstapps/app
|
||||
|
||||
## 3.3.0
|
||||
|
||||
### Minor Changes
|
||||
|
||||
- 688bc5f2: v3.3.0 changes
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [688bc5f2]
|
||||
- @openstapps/api@3.2.0
|
||||
- @openstapps/core@3.2.0
|
||||
- @openstapps/collection-utils@3.0.0
|
||||
|
||||
## 3.2.0
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- 689ac68b: pin alpine version to 3.18 and add healthchecks
|
||||
- Updated dependencies [912ae422]
|
||||
- @openstapps/core@4.0.0
|
||||
- @openstapps/api@4.0.0
|
||||
- @openstapps/collection-utils@3.0.0
|
||||
|
||||
## 3.1.2
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Fix for Android users not being able to log in
|
||||
|
||||
## 3.1.1
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Fix version history offered by backend
|
||||
- Updated dependencies
|
||||
- @openstapps/api@3.1.1
|
||||
- @openstapps/core@3.1.1
|
||||
|
||||
## 3.1.1
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- last minute deployment changes
|
||||
|
||||
## 3.1.0
|
||||
|
||||
### Minor Changes
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
# Creates a docker image with only the app as an executable unit
|
||||
# Dependencies need to be installed beforehand
|
||||
# Needs to be build beforehand
|
||||
FROM node:18-alpine
|
||||
FROM node:18-alpine3.18
|
||||
|
||||
WORKDIR /app
|
||||
COPY www/ /app/www
|
||||
|
||||
@@ -50,11 +50,11 @@ the config file.
|
||||
Icon font minification is done automatically, but requires you to
|
||||
follow a few simple rules:
|
||||
|
||||
1. Use the tagged template literal for referencing icon names in
|
||||
1. Use the type-safe proxy for referencing icon names in
|
||||
TypeScript files and code
|
||||
|
||||
```ts
|
||||
SCIcon`icon_name`;
|
||||
SCIcon.icon_name;
|
||||
```
|
||||
|
||||
2. When using `ion-icon` in HTML, reference either icons that went through
|
||||
|
||||
@@ -13,25 +13,25 @@ The StApps 1.x.x (legacy app, but current app in stores) is written using Ionic
|
||||
|
||||
There are (`npm`) scripts defined to get the app running as quickly as possible. Those scripts (shortcuts for docker commands) are called using the syntax `npm run + <script-name>`. So we have the following commands available:
|
||||
|
||||
```
|
||||
```sh
|
||||
npm run docker:pull
|
||||
```
|
||||
|
||||
which pulls the up-to-date image ([Dockerfile](Dockerfile)) which contains all the tools needed for building, serving and deploying the app.
|
||||
|
||||
```
|
||||
```sh
|
||||
npm run docker:enter
|
||||
```
|
||||
|
||||
which enters the container on docker builder image, where we can run `npm install` (to install the required npm packages) and `npm build` (to build the app: convert into executable files), but also any other arbitrary commands with the tools available in the docker image.
|
||||
|
||||
```
|
||||
```sh
|
||||
npm run docker:build
|
||||
```
|
||||
|
||||
which runs `npm install` (to install the required npm packages) and `npm build` (to build the app: convert into executable files) in the docker container which runs on the docker builder image.
|
||||
|
||||
```
|
||||
```sh
|
||||
npm run docker:serve
|
||||
```
|
||||
|
||||
@@ -39,7 +39,7 @@ which serves the app for running it in the browser. It basically runs `ionic ser
|
||||
|
||||
## How to build and start the app using the default backend?
|
||||
|
||||
```
|
||||
```sh
|
||||
npm run build
|
||||
npm run start
|
||||
```
|
||||
@@ -86,52 +86,98 @@ addToIonicDB(
|
||||
|
||||
You'll need to run _Chromium_ using
|
||||
|
||||
```shell
|
||||
```sh
|
||||
pnpm chromium:no-cors
|
||||
```
|
||||
|
||||
### Help, I can't log in!
|
||||
|
||||
Login services will often block hosts not coming from the production
|
||||
server. You can circumvent this locally by using the `:virtual-host`
|
||||
scripts:
|
||||
server.
|
||||
|
||||
```shell
|
||||
#### Web
|
||||
|
||||
On the web you can circumvent this locally by using the `:virtual-host` scripts:
|
||||
|
||||
```sh
|
||||
# Start the dev server on mobile.app.uni-frankfurt.de
|
||||
pnpm start:virtual-host
|
||||
# Run chromium with flags that redirect mobile.app.uni-frankfurt.de to localhost:8100
|
||||
pnpm chromium:virtual-host
|
||||
```
|
||||
|
||||
#### Android
|
||||
|
||||
On Android you will need to change the `custom_url_scheme` values
|
||||
to `de.unifrankfurt.app` in the following files:
|
||||
|
||||
- `android/app/src/main/res/values/strings.xml`
|
||||
- `src/environment/environment.ts`
|
||||
|
||||
Then start the app normally as you would
|
||||
|
||||
```sh
|
||||
pnpm run:android
|
||||
```
|
||||
|
||||
**This alone will not make auth work**, only the login flow.
|
||||
|
||||
If you need to test login, you have to disable live reload:
|
||||
|
||||
```sh
|
||||
pnpm ionic capacitor run android
|
||||
```
|
||||
|
||||
_**CAUTION:** a remote chrome debugging session can in some
|
||||
cases hijack the device's ADB connection. If the connection
|
||||
fails for no obvious reason, close chrome and uninstall the
|
||||
app, then try again._
|
||||
|
||||
#### iOS
|
||||
|
||||
On Android you will need to change the `custom_url_scheme` value in
|
||||
`src/environment/environment.ts` as well as the `CFBundleURLTypes`
|
||||
in `ios/App/App/Info.plist`.
|
||||
|
||||
- make sure to remove any `Info.plist.orig` as capacitor might override
|
||||
the modified `Info.plist` with that.
|
||||
- make sure you have a valid device in XCode (Simulator or real device).
|
||||
|
||||
After that, run
|
||||
|
||||
```sh
|
||||
pnpm run:ios
|
||||
```
|
||||
|
||||
### Running the app
|
||||
|
||||
Install the npm packages needed for running the app (as for any other node project which uses npm):
|
||||
|
||||
```
|
||||
```sh
|
||||
npm install
|
||||
```
|
||||
|
||||
Check the code for linter issues:
|
||||
|
||||
```
|
||||
```sh
|
||||
npm run lint
|
||||
```
|
||||
|
||||
Automatically fix linter issues (those where autofix is possible):
|
||||
|
||||
```
|
||||
```sh
|
||||
npm run lint:fix
|
||||
```
|
||||
|
||||
Build the app (transpile etc.):
|
||||
|
||||
```
|
||||
```sh
|
||||
npm run build
|
||||
```
|
||||
|
||||
Open the app in the browser:
|
||||
|
||||
```
|
||||
```sh
|
||||
ionic serve
|
||||
```
|
||||
|
||||
@@ -139,7 +185,7 @@ ionic serve
|
||||
|
||||
Run the app for testing on an android device (with live reload in the webview / device, when files are changed):
|
||||
|
||||
```
|
||||
```sh
|
||||
npm run build # if needed
|
||||
npm run resources:android # generate needed resources (icons and splashscreens)
|
||||
npm run docker:run:android # runs "ionic capacitor run android --livereload --external" on a selected device
|
||||
@@ -159,7 +205,7 @@ Besides that, it is possible to monitor processes (and so the processes related
|
||||
|
||||
Build the (debug) app for testing on an android device (creates an APK file in the android's build outputs path):
|
||||
|
||||
```
|
||||
```sh
|
||||
npm run docker:build:android
|
||||
```
|
||||
|
||||
@@ -169,13 +215,13 @@ The mentioned `docker:*:android` npm commands are executed in a docker container
|
||||
|
||||
Execute unit tests:
|
||||
|
||||
```
|
||||
```sh
|
||||
npm test
|
||||
```
|
||||
|
||||
Execute e2e tests:
|
||||
|
||||
```
|
||||
```sh
|
||||
npm run e2e
|
||||
```
|
||||
|
||||
|
||||
@@ -9,6 +9,7 @@ android {
|
||||
|
||||
apply from: "../capacitor-cordova-android-plugins/cordova.variables.gradle"
|
||||
dependencies {
|
||||
implementation project(':capacitor-community-screen-brightness')
|
||||
implementation project(':capacitor-app')
|
||||
implementation project(':capacitor-browser')
|
||||
implementation project(':capacitor-clipboard')
|
||||
@@ -21,6 +22,7 @@ dependencies {
|
||||
implementation project(':capacitor-local-notifications')
|
||||
implementation project(':capacitor-network')
|
||||
implementation project(':capacitor-preferences')
|
||||
implementation project(':capacitor-screen-orientation')
|
||||
implementation project(':capacitor-share')
|
||||
implementation project(':capacitor-splash-screen')
|
||||
implementation project(':transistorsoft-capacitor-background-fetch')
|
||||
|
||||
@@ -1,4 +1,8 @@
|
||||
[
|
||||
{
|
||||
"pkg": "@capacitor-community/screen-brightness",
|
||||
"classpath": "com.elylucas.capscreenbrightness.ScreenBrightnessPlugin"
|
||||
},
|
||||
{
|
||||
"pkg": "@capacitor/app",
|
||||
"classpath": "com.capacitorjs.plugins.app.AppPlugin"
|
||||
@@ -47,6 +51,10 @@
|
||||
"pkg": "@capacitor/preferences",
|
||||
"classpath": "com.capacitorjs.plugins.preferences.PreferencesPlugin"
|
||||
},
|
||||
{
|
||||
"pkg": "@capacitor/screen-orientation",
|
||||
"classpath": "com.capacitorjs.plugins.screenorientation.ScreenOrientationPlugin"
|
||||
},
|
||||
{
|
||||
"pkg": "@capacitor/share",
|
||||
"classpath": "com.capacitorjs.plugins.share.SharePlugin"
|
||||
|
||||
@@ -1,51 +1,57 @@
|
||||
// DO NOT EDIT THIS FILE! IT IS GENERATED EACH TIME "capacitor update" IS RUN
|
||||
include ':capacitor-android'
|
||||
project(':capacitor-android').projectDir = new File('../../../node_modules/.pnpm/@capacitor+android@5.5.0_@capacitor+core@5.5.0/node_modules/@capacitor/android/capacitor')
|
||||
project(':capacitor-android').projectDir = new File('../../../node_modules/.pnpm/@capacitor+android@5.7.3_@capacitor+core@5.7.3/node_modules/@capacitor/android/capacitor')
|
||||
|
||||
include ':capacitor-community-screen-brightness'
|
||||
project(':capacitor-community-screen-brightness').projectDir = new File('../../../node_modules/.pnpm/@capacitor-community+screen-brightness@6.0.0_@capacitor+core@5.7.3/node_modules/@capacitor-community/screen-brightness/android')
|
||||
|
||||
include ':capacitor-app'
|
||||
project(':capacitor-app').projectDir = new File('../../../node_modules/.pnpm/@capacitor+app@5.0.6_@capacitor+core@5.5.0/node_modules/@capacitor/app/android')
|
||||
project(':capacitor-app').projectDir = new File('../../../node_modules/.pnpm/@capacitor+app@5.0.7_@capacitor+core@5.7.3/node_modules/@capacitor/app/android')
|
||||
|
||||
include ':capacitor-browser'
|
||||
project(':capacitor-browser').projectDir = new File('../../../node_modules/.pnpm/@capacitor+browser@5.1.0_@capacitor+core@5.5.0/node_modules/@capacitor/browser/android')
|
||||
project(':capacitor-browser').projectDir = new File('../../../node_modules/.pnpm/@capacitor+browser@5.2.0_@capacitor+core@5.7.3/node_modules/@capacitor/browser/android')
|
||||
|
||||
include ':capacitor-clipboard'
|
||||
project(':capacitor-clipboard').projectDir = new File('../../../node_modules/.pnpm/@capacitor+clipboard@5.0.6_@capacitor+core@5.5.0/node_modules/@capacitor/clipboard/android')
|
||||
project(':capacitor-clipboard').projectDir = new File('../../../node_modules/.pnpm/@capacitor+clipboard@5.0.7_@capacitor+core@5.7.3/node_modules/@capacitor/clipboard/android')
|
||||
|
||||
include ':capacitor-device'
|
||||
project(':capacitor-device').projectDir = new File('../../../node_modules/.pnpm/@capacitor+device@5.0.6_@capacitor+core@5.5.0/node_modules/@capacitor/device/android')
|
||||
project(':capacitor-device').projectDir = new File('../../../node_modules/.pnpm/@capacitor+device@5.0.7_@capacitor+core@5.7.3/node_modules/@capacitor/device/android')
|
||||
|
||||
include ':capacitor-dialog'
|
||||
project(':capacitor-dialog').projectDir = new File('../../../node_modules/.pnpm/@capacitor+dialog@5.0.6_@capacitor+core@5.5.0/node_modules/@capacitor/dialog/android')
|
||||
project(':capacitor-dialog').projectDir = new File('../../../node_modules/.pnpm/@capacitor+dialog@5.0.7_@capacitor+core@5.7.3/node_modules/@capacitor/dialog/android')
|
||||
|
||||
include ':capacitor-filesystem'
|
||||
project(':capacitor-filesystem').projectDir = new File('../../../node_modules/.pnpm/@capacitor+filesystem@5.1.4_@capacitor+core@5.5.0/node_modules/@capacitor/filesystem/android')
|
||||
project(':capacitor-filesystem').projectDir = new File('../../../node_modules/.pnpm/@capacitor+filesystem@5.2.1_@capacitor+core@5.7.3/node_modules/@capacitor/filesystem/android')
|
||||
|
||||
include ':capacitor-geolocation'
|
||||
project(':capacitor-geolocation').projectDir = new File('../../../node_modules/.pnpm/@capacitor+geolocation@5.0.6_@capacitor+core@5.5.0/node_modules/@capacitor/geolocation/android')
|
||||
project(':capacitor-geolocation').projectDir = new File('../../../node_modules/.pnpm/@capacitor+geolocation@5.0.7_@capacitor+core@5.7.3/node_modules/@capacitor/geolocation/android')
|
||||
|
||||
include ':capacitor-haptics'
|
||||
project(':capacitor-haptics').projectDir = new File('../../../node_modules/.pnpm/@capacitor+haptics@5.0.6_@capacitor+core@5.5.0/node_modules/@capacitor/haptics/android')
|
||||
project(':capacitor-haptics').projectDir = new File('../../../node_modules/.pnpm/@capacitor+haptics@5.0.7_@capacitor+core@5.7.3/node_modules/@capacitor/haptics/android')
|
||||
|
||||
include ':capacitor-keyboard'
|
||||
project(':capacitor-keyboard').projectDir = new File('../../../node_modules/.pnpm/@capacitor+keyboard@5.0.6_@capacitor+core@5.5.0/node_modules/@capacitor/keyboard/android')
|
||||
project(':capacitor-keyboard').projectDir = new File('../../../node_modules/.pnpm/@capacitor+keyboard@5.0.8_@capacitor+core@5.7.3/node_modules/@capacitor/keyboard/android')
|
||||
|
||||
include ':capacitor-local-notifications'
|
||||
project(':capacitor-local-notifications').projectDir = new File('../../../node_modules/.pnpm/@capacitor+local-notifications@5.0.6_@capacitor+core@5.5.0/node_modules/@capacitor/local-notifications/android')
|
||||
project(':capacitor-local-notifications').projectDir = new File('../../../node_modules/.pnpm/@capacitor+local-notifications@5.0.7_@capacitor+core@5.7.3/node_modules/@capacitor/local-notifications/android')
|
||||
|
||||
include ':capacitor-network'
|
||||
project(':capacitor-network').projectDir = new File('../../../node_modules/.pnpm/@capacitor+network@5.0.6_@capacitor+core@5.5.0/node_modules/@capacitor/network/android')
|
||||
project(':capacitor-network').projectDir = new File('../../../node_modules/.pnpm/@capacitor+network@5.0.7_@capacitor+core@5.7.3/node_modules/@capacitor/network/android')
|
||||
|
||||
include ':capacitor-preferences'
|
||||
project(':capacitor-preferences').projectDir = new File('../../../node_modules/.pnpm/@capacitor+preferences@5.0.6_@capacitor+core@5.5.0/node_modules/@capacitor/preferences/android')
|
||||
project(':capacitor-preferences').projectDir = new File('../../../node_modules/.pnpm/@capacitor+preferences@5.0.7_@capacitor+core@5.7.3/node_modules/@capacitor/preferences/android')
|
||||
|
||||
include ':capacitor-screen-orientation'
|
||||
project(':capacitor-screen-orientation').projectDir = new File('../../../node_modules/.pnpm/@capacitor+screen-orientation@6.0.0_@capacitor+core@5.7.3/node_modules/@capacitor/screen-orientation/android')
|
||||
|
||||
include ':capacitor-share'
|
||||
project(':capacitor-share').projectDir = new File('../../../node_modules/.pnpm/@capacitor+share@5.0.6_@capacitor+core@5.5.0/node_modules/@capacitor/share/android')
|
||||
project(':capacitor-share').projectDir = new File('../../../node_modules/.pnpm/@capacitor+share@5.0.7_@capacitor+core@5.7.3/node_modules/@capacitor/share/android')
|
||||
|
||||
include ':capacitor-splash-screen'
|
||||
project(':capacitor-splash-screen').projectDir = new File('../../../node_modules/.pnpm/@capacitor+splash-screen@5.0.6_@capacitor+core@5.5.0/node_modules/@capacitor/splash-screen/android')
|
||||
project(':capacitor-splash-screen').projectDir = new File('../../../node_modules/.pnpm/@capacitor+splash-screen@5.0.7_@capacitor+core@5.7.3/node_modules/@capacitor/splash-screen/android')
|
||||
|
||||
include ':transistorsoft-capacitor-background-fetch'
|
||||
project(':transistorsoft-capacitor-background-fetch').projectDir = new File('../../../node_modules/.pnpm/@transistorsoft+capacitor-background-fetch@1.0.2_@capacitor+core@5.5.0/node_modules/@transistorsoft/capacitor-background-fetch/android')
|
||||
project(':transistorsoft-capacitor-background-fetch').projectDir = new File('../../../node_modules/.pnpm/@transistorsoft+capacitor-background-fetch@5.2.0_@capacitor+core@5.7.3/node_modules/@transistorsoft/capacitor-background-fetch/android')
|
||||
|
||||
include ':capacitor-secure-storage-plugin'
|
||||
project(':capacitor-secure-storage-plugin').projectDir = new File('../../../node_modules/.pnpm/capacitor-secure-storage-plugin@0.8.1_@capacitor+core@5.5.0/node_modules/capacitor-secure-storage-plugin/android')
|
||||
project(':capacitor-secure-storage-plugin').projectDir = new File('../../../node_modules/.pnpm/capacitor-secure-storage-plugin@0.9.0_@capacitor+core@5.7.3/node_modules/capacitor-secure-storage-plugin/android')
|
||||
|
||||
@@ -21,10 +21,13 @@
|
||||
"allowedCommonJsDependencies": [
|
||||
"moment",
|
||||
"opening_hours",
|
||||
"leaflet",
|
||||
"leaflet.markercluster",
|
||||
"localforge",
|
||||
"guid-typescript"
|
||||
"localforage",
|
||||
"i18next",
|
||||
"semver",
|
||||
"suncalc",
|
||||
"guid-typescript",
|
||||
"fast-deep-equal",
|
||||
"maplibre-gl"
|
||||
],
|
||||
"aot": true,
|
||||
"assets": [
|
||||
@@ -32,24 +35,13 @@
|
||||
"glob": "**/*",
|
||||
"input": "src/assets",
|
||||
"output": "assets"
|
||||
},
|
||||
{
|
||||
"glob": "**/*",
|
||||
"input": "./node_modules/leaflet/dist/images",
|
||||
"output": "assets/"
|
||||
}
|
||||
],
|
||||
"styles": [
|
||||
{
|
||||
"input": "src/theme/variables.scss",
|
||||
"inject": true
|
||||
},
|
||||
{
|
||||
"input": "src/global.scss",
|
||||
"inject": true
|
||||
},
|
||||
"./node_modules/leaflet/dist/leaflet.css",
|
||||
"./node_modules/leaflet.markercluster/dist/MarkerCluster.Default.css"
|
||||
}
|
||||
]
|
||||
},
|
||||
"configurations": {
|
||||
@@ -97,20 +89,20 @@
|
||||
"serve": {
|
||||
"builder": "@angular-devkit/build-angular:dev-server",
|
||||
"options": {
|
||||
"browserTarget": "app:build"
|
||||
"buildTarget": "app:build"
|
||||
},
|
||||
"configurations": {
|
||||
"production": {
|
||||
"browserTarget": "app:build:production"
|
||||
"buildTarget": "app:build:production"
|
||||
},
|
||||
"development": {
|
||||
"browserTarget": "app:build:development"
|
||||
"buildTarget": "app:build:development"
|
||||
},
|
||||
"ci": {
|
||||
"browserTarget": "app:build"
|
||||
"buildTarget": "app:build"
|
||||
},
|
||||
"fake": {
|
||||
"browserTarget": "app:build:fake"
|
||||
"buildTarget": "app:build:fake"
|
||||
}
|
||||
},
|
||||
"defaultConfiguration": "development"
|
||||
@@ -132,11 +124,6 @@
|
||||
"glob": "**/*",
|
||||
"input": "src/assets",
|
||||
"output": "/assets"
|
||||
},
|
||||
{
|
||||
"glob": "**/*",
|
||||
"input": "./node_modules/leaflet/dist/images",
|
||||
"output": "assets/"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
@@ -28,6 +28,7 @@ export default defineConfig({
|
||||
fixturesFolder: 'cypress/fixtures',
|
||||
defaultCommandTimeout: 20_000,
|
||||
specPattern: 'cypress/integration/**/*.spec.ts',
|
||||
blockHosts: ['mobile.server.uni-frankfurt.de'],
|
||||
/*setupNodeEvents(on, config) {
|
||||
on('task', {
|
||||
log(message) {
|
||||
|
||||
20
frontend/app/cypress/BACKEND.md
Normal file
20
frontend/app/cypress/BACKEND.md
Normal file
@@ -0,0 +1,20 @@
|
||||
# Backend Mocking
|
||||
|
||||
The backend _must_ be mocked using fixtures or other methods.
|
||||
|
||||
You can use
|
||||
|
||||
```typescript
|
||||
cy.interceptMultiSearch(...)
|
||||
cy.interceptSearch({extend: 'fixture', fixture: 'fixture', alias: 'alias'})
|
||||
cy.interceptGet({uid})
|
||||
```
|
||||
|
||||
For mocking the responses based on a request.
|
||||
|
||||
Paths in the commands will be relative to those, so
|
||||
`cy.interceptSearch({extend: 'request', fixture: 'response'})`
|
||||
will actually pull the fixtures from `request.search.req.json`
|
||||
and `response.search.res.json` respectively.
|
||||
|
||||
If `fixture` is omitted, an empty response will be returned.
|
||||
29
frontend/app/cypress/PITFALLS.md
Normal file
29
frontend/app/cypress/PITFALLS.md
Normal file
@@ -0,0 +1,29 @@
|
||||
# A list of (possibly) common pitfalls
|
||||
|
||||
## The component is not updating
|
||||
|
||||
### Calling Cypress invoke will not trigger change detection
|
||||
|
||||
Rewrite
|
||||
|
||||
```typescript
|
||||
cy.get('component-selector').component().invoke('someFunction');
|
||||
```
|
||||
|
||||
Into
|
||||
|
||||
```typescript
|
||||
cy.get('component-selector')
|
||||
.component()
|
||||
.runInsideAngular(component => component.someFunction());
|
||||
```
|
||||
|
||||
## The backend is unreachable
|
||||
|
||||
See `BACKEND.md`, direct calls to backend are prohibited.
|
||||
|
||||
## The search page doesn't work
|
||||
|
||||
Run `cy.patchSearchPage()` after visiting the search page.
|
||||
It set the due time to zero so that the component
|
||||
won't wait for someone to type more.
|
||||
46
frontend/app/cypress/fixtures/canteen/all.search.req.json
Normal file
46
frontend/app/cypress/fixtures/canteen/all.search.req.json
Normal file
@@ -0,0 +1,46 @@
|
||||
{
|
||||
"filter": {
|
||||
"arguments": {
|
||||
"filters": [
|
||||
{
|
||||
"arguments": {
|
||||
"filters": [
|
||||
{
|
||||
"arguments": {
|
||||
"field": "categories",
|
||||
"value": "canteen"
|
||||
},
|
||||
"type": "value"
|
||||
},
|
||||
{
|
||||
"arguments": {
|
||||
"field": "categories",
|
||||
"value": "student canteen"
|
||||
},
|
||||
"type": "value"
|
||||
},
|
||||
{
|
||||
"arguments": {
|
||||
"field": "categories",
|
||||
"value": "cafe"
|
||||
},
|
||||
"type": "value"
|
||||
},
|
||||
{
|
||||
"arguments": {
|
||||
"field": "categories",
|
||||
"value": "restaurant"
|
||||
},
|
||||
"type": "value"
|
||||
}
|
||||
],
|
||||
"operation": "or"
|
||||
},
|
||||
"type": "boolean"
|
||||
}
|
||||
],
|
||||
"operation": "and"
|
||||
},
|
||||
"type": "boolean"
|
||||
}
|
||||
}
|
||||
31
frontend/app/cypress/fixtures/canteen/dishes.multi.req.json
Normal file
31
frontend/app/cypress/fixtures/canteen/dishes.multi.req.json
Normal file
@@ -0,0 +1,31 @@
|
||||
{
|
||||
"*": {
|
||||
"filter": {
|
||||
"arguments": {
|
||||
"filters": [
|
||||
{
|
||||
"arguments": {
|
||||
"field": "offers.inPlace.uid"
|
||||
},
|
||||
"type": "value"
|
||||
},
|
||||
{
|
||||
"arguments": {
|
||||
"field": "type",
|
||||
"value": "dish"
|
||||
},
|
||||
"type": "value"
|
||||
},
|
||||
{
|
||||
"arguments": {
|
||||
"field": "offers.availabilityRange"
|
||||
},
|
||||
"type": "availability"
|
||||
}
|
||||
],
|
||||
"operation": "and"
|
||||
},
|
||||
"type": "boolean"
|
||||
}
|
||||
}
|
||||
}
|
||||
889
frontend/app/cypress/fixtures/canteen/dishes.multi.res.json
Normal file
889
frontend/app/cypress/fixtures/canteen/dishes.multi.res.json
Normal file
@@ -0,0 +1,889 @@
|
||||
{
|
||||
"2020-01-01T12:00:00.000Z": {
|
||||
"data": [
|
||||
{
|
||||
"offers": [
|
||||
{
|
||||
"availability": "in stock",
|
||||
"availabilityRange": {
|
||||
"gte": "2023-02-24T09:00:00.000Z",
|
||||
"lte": "2023-02-24T20:00:00.000Z"
|
||||
},
|
||||
"inPlace": {
|
||||
"address": {
|
||||
"addressCountry": "Deutschland",
|
||||
"addressLocality": "Frankfurt am Main",
|
||||
"addressRegion": "Hessen",
|
||||
"postalCode": "60323",
|
||||
"streetAddress": "Kaffeebar Alfredo/Cocktailbar Theodor-W.-Adorno-Platz 2"
|
||||
},
|
||||
"alternateNames": ["Alfredo Anbau Casino"],
|
||||
"categories": ["cafe"],
|
||||
"geo": {
|
||||
"point": {
|
||||
"coordinates": [8.666987121105194, 50.12725203226799],
|
||||
"type": "Point"
|
||||
}
|
||||
},
|
||||
"name": "Alfredo Anbau Casino",
|
||||
"openingHours": "Mo-Fr 08:30-21:00; Sa-Su off; 2023 Feb 13 - 2023 Apr 06 Mo-Fr 10:00-21:00; 2023 Feb 13 - 2023 Apr 06 Sa-Su off",
|
||||
"type": "room",
|
||||
"uid": "86464b64-da1e-5578-a5c4-eec23457f596"
|
||||
},
|
||||
"prices": {
|
||||
"default": 4.4,
|
||||
"employee": 2.2,
|
||||
"guest": 1.1,
|
||||
"student": 3.3
|
||||
},
|
||||
"provider": {
|
||||
"name": "Studierendenwerk Frankfurt am Main",
|
||||
"type": "organization",
|
||||
"uid": "0405339e-f1f3-54a6-9ac1-a230e2bda5c0"
|
||||
}
|
||||
}
|
||||
],
|
||||
"uid": "db0c03b1-b7cc-5513-b3e6-71d6020520ab",
|
||||
"characteristics": [
|
||||
{
|
||||
"image": "https://mobile.server.uni-frankfurt.de/_static/canteen/vegetarian.svg",
|
||||
"name": "vegetarian"
|
||||
}
|
||||
],
|
||||
"nutrition": {
|
||||
"calories": 835,
|
||||
"carbohydrateContent": 99.2,
|
||||
"fatContent": 33,
|
||||
"proteinContent": 33.4,
|
||||
"saltContent": 3.7,
|
||||
"saturatedFatContent": 9.1,
|
||||
"sugarContent": 7.3
|
||||
},
|
||||
"additives": ["gluten (A)", "milk (G)"],
|
||||
"translations": {
|
||||
"de": {
|
||||
"additives": ["Glutenhaltige Getreide (A)", "Milch u. Milcherzeugnisse (G)"],
|
||||
"characteristics": [
|
||||
{
|
||||
"image": "https://mobile.server.uni-frankfurt.de/_static/canteen/vegetarian.svg",
|
||||
"name": "vegetarisch"
|
||||
}
|
||||
],
|
||||
"name": "Pizza alla Pugliese (A,G)"
|
||||
}
|
||||
},
|
||||
"origin": {
|
||||
"indexed": "2023-02-24T17:00:07.829Z",
|
||||
"name": "Studierendenwerk Frankfurt am Main",
|
||||
"type": "remote"
|
||||
},
|
||||
"name": "Pugliese pizza (A,G)",
|
||||
"categories": ["main dish"],
|
||||
"type": "dish"
|
||||
},
|
||||
{
|
||||
"offers": [
|
||||
{
|
||||
"availability": "in stock",
|
||||
"availabilityRange": {
|
||||
"gte": "2023-02-24T09:00:00.000Z",
|
||||
"lte": "2023-02-24T20:00:00.000Z"
|
||||
},
|
||||
"inPlace": {
|
||||
"address": {
|
||||
"addressCountry": "Deutschland",
|
||||
"addressLocality": "Frankfurt am Main",
|
||||
"addressRegion": "Hessen",
|
||||
"postalCode": "60323",
|
||||
"streetAddress": "Kaffeebar Alfredo/Cocktailbar Theodor-W.-Adorno-Platz 2"
|
||||
},
|
||||
"alternateNames": ["Alfredo Anbau Casino"],
|
||||
"categories": ["cafe"],
|
||||
"geo": {
|
||||
"point": {
|
||||
"coordinates": [8.666987121105194, 50.12725203226799],
|
||||
"type": "Point"
|
||||
}
|
||||
},
|
||||
"name": "Alfredo Anbau Casino",
|
||||
"openingHours": "Mo-Fr 08:30-21:00; Sa-Su off; 2023 Feb 13 - 2023 Apr 06 Mo-Fr 10:00-21:00; 2023 Feb 13 - 2023 Apr 06 Sa-Su off",
|
||||
"type": "room",
|
||||
"uid": "86464b64-da1e-5578-a5c4-eec23457f596"
|
||||
},
|
||||
"prices": {
|
||||
"default": 4.4,
|
||||
"employee": 2.2,
|
||||
"guest": 1.1,
|
||||
"student": 3.3
|
||||
},
|
||||
"provider": {
|
||||
"name": "Studierendenwerk Frankfurt am Main",
|
||||
"type": "organization",
|
||||
"uid": "0405339e-f1f3-54a6-9ac1-a230e2bda5c0"
|
||||
}
|
||||
}
|
||||
],
|
||||
"uid": "b798cc94-ab0a-5fdd-b9d8-127ae8940f47",
|
||||
"characteristics": [
|
||||
{
|
||||
"image": "https://mobile.server.uni-frankfurt.de/_static/canteen/pork.svg",
|
||||
"name": "pork"
|
||||
}
|
||||
],
|
||||
"nutrition": {
|
||||
"calories": 876,
|
||||
"carbohydrateContent": 100.4,
|
||||
"fatContent": 32.7,
|
||||
"proteinContent": 42.6,
|
||||
"saltContent": 4,
|
||||
"saturatedFatContent": 6.3,
|
||||
"sugarContent": 8.6
|
||||
},
|
||||
"additives": ["preserved (2)", "with antioxidants (3)", "gluten (A)", "milk (G)"],
|
||||
"translations": {
|
||||
"de": {
|
||||
"additives": [
|
||||
"konserviert (2)",
|
||||
"mit Antioxidationsmittel (3)",
|
||||
"Glutenhaltige Getreide (A)",
|
||||
"Milch u. Milcherzeugnisse (G)"
|
||||
],
|
||||
"characteristics": [
|
||||
{
|
||||
"image": "https://mobile.server.uni-frankfurt.de/_static/canteen/pork.svg",
|
||||
"name": "Schwein"
|
||||
}
|
||||
],
|
||||
"name": "Pizza Carciofi e Prosciutto (2,3,A,G)"
|
||||
}
|
||||
},
|
||||
"origin": {
|
||||
"indexed": "2023-02-24T17:00:07.830Z",
|
||||
"name": "Studierendenwerk Frankfurt am Main",
|
||||
"type": "remote"
|
||||
},
|
||||
"name": "Artichoke-ham pizza (2,3,A,G)",
|
||||
"categories": ["main dish"],
|
||||
"type": "dish"
|
||||
},
|
||||
{
|
||||
"offers": [
|
||||
{
|
||||
"availability": "in stock",
|
||||
"availabilityRange": {
|
||||
"gte": "2023-02-24T09:00:00.000Z",
|
||||
"lte": "2023-02-24T20:00:00.000Z"
|
||||
},
|
||||
"inPlace": {
|
||||
"address": {
|
||||
"addressCountry": "Deutschland",
|
||||
"addressLocality": "Frankfurt am Main",
|
||||
"addressRegion": "Hessen",
|
||||
"postalCode": "60323",
|
||||
"streetAddress": "Kaffeebar Alfredo/Cocktailbar Theodor-W.-Adorno-Platz 2"
|
||||
},
|
||||
"alternateNames": ["Alfredo Anbau Casino"],
|
||||
"categories": ["cafe"],
|
||||
"geo": {
|
||||
"point": {
|
||||
"coordinates": [8.666987121105194, 50.12725203226799],
|
||||
"type": "Point"
|
||||
}
|
||||
},
|
||||
"name": "Alfredo Anbau Casino",
|
||||
"openingHours": "Mo-Fr 08:30-21:00; Sa-Su off; 2023 Feb 13 - 2023 Apr 06 Mo-Fr 10:00-21:00; 2023 Feb 13 - 2023 Apr 06 Sa-Su off",
|
||||
"type": "room",
|
||||
"uid": "86464b64-da1e-5578-a5c4-eec23457f596"
|
||||
},
|
||||
"prices": {
|
||||
"default": 4.4,
|
||||
"employee": 2.2,
|
||||
"guest": 1.1,
|
||||
"student": 3.3
|
||||
},
|
||||
"provider": {
|
||||
"name": "Studierendenwerk Frankfurt am Main",
|
||||
"type": "organization",
|
||||
"uid": "0405339e-f1f3-54a6-9ac1-a230e2bda5c0"
|
||||
}
|
||||
}
|
||||
],
|
||||
"uid": "e5e40978-119b-5537-a3c6-87725f797990",
|
||||
"nutrition": {
|
||||
"calories": 899,
|
||||
"carbohydrateContent": 98.2,
|
||||
"fatContent": 36.7,
|
||||
"proteinContent": 42.4,
|
||||
"saltContent": 4.7,
|
||||
"saturatedFatContent": 6.8,
|
||||
"sugarContent": 8.1
|
||||
},
|
||||
"additives": ["gluten (A)", "fish (D)", "milk (G)"],
|
||||
"translations": {
|
||||
"de": {
|
||||
"additives": [
|
||||
"Glutenhaltige Getreide (A)",
|
||||
"Fisch u. Fischerzeugnisse (D)",
|
||||
"Milch u. Milcherzeugnisse (G)"
|
||||
],
|
||||
"name": "Pizza Salmone e Spinaci (A,D,G)"
|
||||
}
|
||||
},
|
||||
"origin": {
|
||||
"indexed": "2023-02-24T17:00:07.830Z",
|
||||
"name": "Studierendenwerk Frankfurt am Main",
|
||||
"type": "remote"
|
||||
},
|
||||
"name": "Salami-spinach pizza (A,D,G)",
|
||||
"categories": ["main dish"],
|
||||
"type": "dish"
|
||||
},
|
||||
{
|
||||
"offers": [
|
||||
{
|
||||
"availability": "in stock",
|
||||
"availabilityRange": {
|
||||
"gte": "2023-02-24T09:00:00.000Z",
|
||||
"lte": "2023-02-24T20:00:00.000Z"
|
||||
},
|
||||
"inPlace": {
|
||||
"address": {
|
||||
"addressCountry": "Deutschland",
|
||||
"addressLocality": "Frankfurt am Main",
|
||||
"addressRegion": "Hessen",
|
||||
"postalCode": "60323",
|
||||
"streetAddress": "Kaffeebar Alfredo/Cocktailbar Theodor-W.-Adorno-Platz 2"
|
||||
},
|
||||
"alternateNames": ["Alfredo Anbau Casino"],
|
||||
"categories": ["cafe"],
|
||||
"geo": {
|
||||
"point": {
|
||||
"coordinates": [8.666987121105194, 50.12725203226799],
|
||||
"type": "Point"
|
||||
}
|
||||
},
|
||||
"name": "Alfredo Anbau Casino",
|
||||
"openingHours": "Mo-Fr 08:30-21:00; Sa-Su off; 2023 Feb 13 - 2023 Apr 06 Mo-Fr 10:00-21:00; 2023 Feb 13 - 2023 Apr 06 Sa-Su off",
|
||||
"type": "room",
|
||||
"uid": "86464b64-da1e-5578-a5c4-eec23457f596"
|
||||
},
|
||||
"prices": {
|
||||
"default": 4.4,
|
||||
"employee": 2.2,
|
||||
"guest": 1.1,
|
||||
"student": 3.3
|
||||
},
|
||||
"provider": {
|
||||
"name": "Studierendenwerk Frankfurt am Main",
|
||||
"type": "organization",
|
||||
"uid": "0405339e-f1f3-54a6-9ac1-a230e2bda5c0"
|
||||
}
|
||||
}
|
||||
],
|
||||
"uid": "94629b59-e0a7-538e-b057-018e268297ca",
|
||||
"characteristics": [
|
||||
{
|
||||
"image": "https://mobile.server.uni-frankfurt.de/_static/canteen/vegetarian.svg",
|
||||
"name": "vegetarian"
|
||||
}
|
||||
],
|
||||
"nutrition": {
|
||||
"calories": 1399,
|
||||
"carbohydrateContent": 148.8,
|
||||
"fatContent": 69.2,
|
||||
"proteinContent": 40.2,
|
||||
"saltContent": 1,
|
||||
"saturatedFatContent": 16.3,
|
||||
"sugarContent": 7.7
|
||||
},
|
||||
"additives": ["gluten (A)", "egg (C)", "milk (G)"],
|
||||
"translations": {
|
||||
"de": {
|
||||
"additives": [
|
||||
"Glutenhaltige Getreide (A)",
|
||||
"Eier u. Eiererzeugnisse (C)",
|
||||
"Milch u. Milcherzeugnisse (G)"
|
||||
],
|
||||
"characteristics": [
|
||||
{
|
||||
"image": "https://mobile.server.uni-frankfurt.de/_static/canteen/vegetarian.svg",
|
||||
"name": "vegetarisch"
|
||||
}
|
||||
],
|
||||
"name": "Tagliatelle Pesto verde de Francoforte (A,C,G)"
|
||||
}
|
||||
},
|
||||
"origin": {
|
||||
"indexed": "2023-02-24T17:00:07.834Z",
|
||||
"name": "Studierendenwerk Frankfurt am Main",
|
||||
"type": "remote"
|
||||
},
|
||||
"name": "Tagliatelle w/ Frankfurt-style green pesto (A,C,G)",
|
||||
"categories": ["main dish"],
|
||||
"type": "dish"
|
||||
},
|
||||
{
|
||||
"offers": [
|
||||
{
|
||||
"availability": "in stock",
|
||||
"availabilityRange": {
|
||||
"gte": "2023-02-24T09:00:00.000Z",
|
||||
"lte": "2023-02-24T20:00:00.000Z"
|
||||
},
|
||||
"inPlace": {
|
||||
"address": {
|
||||
"addressCountry": "Deutschland",
|
||||
"addressLocality": "Frankfurt am Main",
|
||||
"addressRegion": "Hessen",
|
||||
"postalCode": "60323",
|
||||
"streetAddress": "Kaffeebar Alfredo/Cocktailbar Theodor-W.-Adorno-Platz 2"
|
||||
},
|
||||
"alternateNames": ["Alfredo Anbau Casino"],
|
||||
"categories": ["cafe"],
|
||||
"geo": {
|
||||
"point": {
|
||||
"coordinates": [8.666987121105194, 50.12725203226799],
|
||||
"type": "Point"
|
||||
}
|
||||
},
|
||||
"name": "Alfredo Anbau Casino",
|
||||
"openingHours": "Mo-Fr 08:30-21:00; Sa-Su off; 2023 Feb 13 - 2023 Apr 06 Mo-Fr 10:00-21:00; 2023 Feb 13 - 2023 Apr 06 Sa-Su off",
|
||||
"type": "room",
|
||||
"uid": "86464b64-da1e-5578-a5c4-eec23457f596"
|
||||
},
|
||||
"prices": {
|
||||
"default": 4.4,
|
||||
"employee": 2.2,
|
||||
"guest": 1.1,
|
||||
"student": 3.3
|
||||
},
|
||||
"provider": {
|
||||
"name": "Studierendenwerk Frankfurt am Main",
|
||||
"type": "organization",
|
||||
"uid": "0405339e-f1f3-54a6-9ac1-a230e2bda5c0"
|
||||
}
|
||||
}
|
||||
],
|
||||
"uid": "34d08548-07fa-51b7-ad88-cfdb6c6ed62b",
|
||||
"characteristics": [
|
||||
{
|
||||
"image": "https://mobile.server.uni-frankfurt.de/_static/canteen/vegetarian.svg",
|
||||
"name": "vegetarian"
|
||||
}
|
||||
],
|
||||
"nutrition": {
|
||||
"calories": 849,
|
||||
"carbohydrateContent": 103.3,
|
||||
"fatContent": 37.4,
|
||||
"proteinContent": 33.5,
|
||||
"saltContent": 4.7,
|
||||
"saturatedFatContent": 2.6,
|
||||
"sugarContent": 11.6
|
||||
},
|
||||
"additives": [
|
||||
"preserved (2)",
|
||||
"with antioxidants (3)",
|
||||
"gluten (A)",
|
||||
"milk (G)",
|
||||
"sulphur dioxide / sulphite (L)"
|
||||
],
|
||||
"translations": {
|
||||
"de": {
|
||||
"additives": [
|
||||
"konserviert (2)",
|
||||
"mit Antioxidationsmittel (3)",
|
||||
"Glutenhaltige Getreide (A)",
|
||||
"Milch u. Milcherzeugnisse (G)",
|
||||
"Schwefeldioxid / Sulfit (L)"
|
||||
],
|
||||
"characteristics": [
|
||||
{
|
||||
"image": "https://mobile.server.uni-frankfurt.de/_static/canteen/vegetarian.svg",
|
||||
"name": "vegetarisch"
|
||||
}
|
||||
],
|
||||
"name": "Pizza Antipasti (2,3,A,G,L)"
|
||||
}
|
||||
},
|
||||
"origin": {
|
||||
"indexed": "2023-02-24T17:00:07.828Z",
|
||||
"name": "Studierendenwerk Frankfurt am Main",
|
||||
"type": "remote"
|
||||
},
|
||||
"name": "Antipasti pizza (2,3,A,G,L)",
|
||||
"categories": ["main dish"],
|
||||
"type": "dish"
|
||||
},
|
||||
{
|
||||
"offers": [
|
||||
{
|
||||
"availability": "in stock",
|
||||
"availabilityRange": {
|
||||
"gte": "2023-02-24T09:00:00.000Z",
|
||||
"lte": "2023-02-24T20:00:00.000Z"
|
||||
},
|
||||
"inPlace": {
|
||||
"address": {
|
||||
"addressCountry": "Deutschland",
|
||||
"addressLocality": "Frankfurt am Main",
|
||||
"addressRegion": "Hessen",
|
||||
"postalCode": "60323",
|
||||
"streetAddress": "Kaffeebar Alfredo/Cocktailbar Theodor-W.-Adorno-Platz 2"
|
||||
},
|
||||
"alternateNames": ["Alfredo Anbau Casino"],
|
||||
"categories": ["cafe"],
|
||||
"geo": {
|
||||
"point": {
|
||||
"coordinates": [8.666987121105194, 50.12725203226799],
|
||||
"type": "Point"
|
||||
}
|
||||
},
|
||||
"name": "Alfredo Anbau Casino",
|
||||
"openingHours": "Mo-Fr 08:30-21:00; Sa-Su off; 2023 Feb 13 - 2023 Apr 06 Mo-Fr 10:00-21:00; 2023 Feb 13 - 2023 Apr 06 Sa-Su off",
|
||||
"type": "room",
|
||||
"uid": "86464b64-da1e-5578-a5c4-eec23457f596"
|
||||
},
|
||||
"prices": {
|
||||
"default": 4.4,
|
||||
"employee": 2.2,
|
||||
"guest": 1.1,
|
||||
"student": 3.3
|
||||
},
|
||||
"provider": {
|
||||
"name": "Studierendenwerk Frankfurt am Main",
|
||||
"type": "organization",
|
||||
"uid": "0405339e-f1f3-54a6-9ac1-a230e2bda5c0"
|
||||
}
|
||||
}
|
||||
],
|
||||
"uid": "b58db64e-47bc-565a-abd7-6ca79211217d",
|
||||
"characteristics": [
|
||||
{
|
||||
"image": "https://mobile.server.uni-frankfurt.de/_static/canteen/pork.svg",
|
||||
"name": "pork"
|
||||
}
|
||||
],
|
||||
"nutrition": {
|
||||
"calories": 930,
|
||||
"carbohydrateContent": 100.5,
|
||||
"fatContent": 41.4,
|
||||
"proteinContent": 35.9,
|
||||
"saltContent": 4.7,
|
||||
"saturatedFatContent": 6.6,
|
||||
"sugarContent": 9
|
||||
},
|
||||
"additives": [
|
||||
"with artificial colouring (1)",
|
||||
"preserved (2)",
|
||||
"with antioxidants (3)",
|
||||
"blackened (6)",
|
||||
"gluten (A)",
|
||||
"milk (G)"
|
||||
],
|
||||
"translations": {
|
||||
"de": {
|
||||
"additives": [
|
||||
"mit Farbstoff (1)",
|
||||
"konserviert (2)",
|
||||
"mit Antioxidationsmittel (3)",
|
||||
"geschwärzt (6)",
|
||||
"Glutenhaltige Getreide (A)",
|
||||
"Milch u. Milcherzeugnisse (G)"
|
||||
],
|
||||
"characteristics": [
|
||||
{
|
||||
"image": "https://mobile.server.uni-frankfurt.de/_static/canteen/pork.svg",
|
||||
"name": "Schwein"
|
||||
}
|
||||
],
|
||||
"name": "Pizza alla Diavola (1,2,3,6,A,G)"
|
||||
}
|
||||
},
|
||||
"origin": {
|
||||
"indexed": "2023-02-24T17:00:07.827Z",
|
||||
"name": "Studierendenwerk Frankfurt am Main",
|
||||
"type": "remote"
|
||||
},
|
||||
"name": "Diavola pizza (1,2,3,6,A,G)",
|
||||
"categories": ["main dish"],
|
||||
"type": "dish"
|
||||
},
|
||||
{
|
||||
"offers": [
|
||||
{
|
||||
"availability": "in stock",
|
||||
"availabilityRange": {
|
||||
"gte": "2023-02-24T09:00:00.000Z",
|
||||
"lte": "2023-02-24T20:00:00.000Z"
|
||||
},
|
||||
"inPlace": {
|
||||
"address": {
|
||||
"addressCountry": "Deutschland",
|
||||
"addressLocality": "Frankfurt am Main",
|
||||
"addressRegion": "Hessen",
|
||||
"postalCode": "60323",
|
||||
"streetAddress": "Kaffeebar Alfredo/Cocktailbar Theodor-W.-Adorno-Platz 2"
|
||||
},
|
||||
"alternateNames": ["Alfredo Anbau Casino"],
|
||||
"categories": ["cafe"],
|
||||
"geo": {
|
||||
"point": {
|
||||
"coordinates": [8.666987121105194, 50.12725203226799],
|
||||
"type": "Point"
|
||||
}
|
||||
},
|
||||
"name": "Alfredo Anbau Casino",
|
||||
"openingHours": "Mo-Fr 08:30-21:00; Sa-Su off; 2023 Feb 13 - 2023 Apr 06 Mo-Fr 10:00-21:00; 2023 Feb 13 - 2023 Apr 06 Sa-Su off",
|
||||
"type": "room",
|
||||
"uid": "86464b64-da1e-5578-a5c4-eec23457f596"
|
||||
},
|
||||
"prices": {
|
||||
"default": 4.4,
|
||||
"employee": 2.2,
|
||||
"guest": 1.1,
|
||||
"student": 3.3
|
||||
},
|
||||
"provider": {
|
||||
"name": "Studierendenwerk Frankfurt am Main",
|
||||
"type": "organization",
|
||||
"uid": "0405339e-f1f3-54a6-9ac1-a230e2bda5c0"
|
||||
}
|
||||
}
|
||||
],
|
||||
"uid": "734fc8f9-0f4d-54aa-bd8b-87431c7997bb",
|
||||
"characteristics": [
|
||||
{
|
||||
"image": "https://mobile.server.uni-frankfurt.de/_static/canteen/vegetarian.svg",
|
||||
"name": "vegetarian"
|
||||
}
|
||||
],
|
||||
"nutrition": {
|
||||
"calories": 581,
|
||||
"carbohydrateContent": 79.9,
|
||||
"fatContent": 16.5,
|
||||
"proteinContent": 28.3,
|
||||
"saltContent": 3.8,
|
||||
"saturatedFatContent": 4.4,
|
||||
"sugarContent": 13.8
|
||||
},
|
||||
"additives": ["gluten (A)", "egg (C)", "milk (G)"],
|
||||
"translations": {
|
||||
"de": {
|
||||
"additives": [
|
||||
"Glutenhaltige Getreide (A)",
|
||||
"Eier u. Eiererzeugnisse (C)",
|
||||
"Milch u. Milcherzeugnisse (G)"
|
||||
],
|
||||
"characteristics": [
|
||||
{
|
||||
"image": "https://mobile.server.uni-frankfurt.de/_static/canteen/vegetarian.svg",
|
||||
"name": "vegetarisch"
|
||||
}
|
||||
],
|
||||
"name": "Cannelloni Ricotta-Spinat (A,C,G)"
|
||||
}
|
||||
},
|
||||
"origin": {
|
||||
"indexed": "2023-02-24T17:00:07.832Z",
|
||||
"name": "Studierendenwerk Frankfurt am Main",
|
||||
"type": "remote"
|
||||
},
|
||||
"name": "Ricotta-spinach cannelloni (A,C,G)",
|
||||
"categories": ["main dish"],
|
||||
"type": "dish"
|
||||
},
|
||||
{
|
||||
"offers": [
|
||||
{
|
||||
"availability": "in stock",
|
||||
"availabilityRange": {
|
||||
"gte": "2023-02-24T09:00:00.000Z",
|
||||
"lte": "2023-02-24T20:00:00.000Z"
|
||||
},
|
||||
"inPlace": {
|
||||
"address": {
|
||||
"addressCountry": "Deutschland",
|
||||
"addressLocality": "Frankfurt am Main",
|
||||
"addressRegion": "Hessen",
|
||||
"postalCode": "60323",
|
||||
"streetAddress": "Kaffeebar Alfredo/Cocktailbar Theodor-W.-Adorno-Platz 2"
|
||||
},
|
||||
"alternateNames": ["Alfredo Anbau Casino"],
|
||||
"categories": ["cafe"],
|
||||
"geo": {
|
||||
"point": {
|
||||
"coordinates": [8.666987121105194, 50.12725203226799],
|
||||
"type": "Point"
|
||||
}
|
||||
},
|
||||
"name": "Alfredo Anbau Casino",
|
||||
"openingHours": "Mo-Fr 08:30-21:00; Sa-Su off; 2023 Feb 13 - 2023 Apr 06 Mo-Fr 10:00-21:00; 2023 Feb 13 - 2023 Apr 06 Sa-Su off",
|
||||
"type": "room",
|
||||
"uid": "86464b64-da1e-5578-a5c4-eec23457f596"
|
||||
},
|
||||
"prices": {
|
||||
"default": 4.4,
|
||||
"employee": 2.2,
|
||||
"guest": 1.1,
|
||||
"student": 3.3
|
||||
},
|
||||
"provider": {
|
||||
"name": "Studierendenwerk Frankfurt am Main",
|
||||
"type": "organization",
|
||||
"uid": "0405339e-f1f3-54a6-9ac1-a230e2bda5c0"
|
||||
}
|
||||
}
|
||||
],
|
||||
"uid": "738be5ff-6b35-5249-8f0d-b5e5830f9f4d",
|
||||
"characteristics": [
|
||||
{
|
||||
"image": "https://mobile.server.uni-frankfurt.de/_static/canteen/beef.svg",
|
||||
"name": "beef"
|
||||
}
|
||||
],
|
||||
"nutrition": {
|
||||
"calories": 880,
|
||||
"carbohydrateContent": 94.3,
|
||||
"fatContent": 36.9,
|
||||
"proteinContent": 39.9,
|
||||
"saltContent": 0.8,
|
||||
"saturatedFatContent": 9.9,
|
||||
"sugarContent": 10.2
|
||||
},
|
||||
"additives": ["gluten (A)", "egg (C)", "milk (G)"],
|
||||
"translations": {
|
||||
"de": {
|
||||
"additives": [
|
||||
"Glutenhaltige Getreide (A)",
|
||||
"Eier u. Eiererzeugnisse (C)",
|
||||
"Milch u. Milcherzeugnisse (G)"
|
||||
],
|
||||
"characteristics": [
|
||||
{
|
||||
"image": "https://mobile.server.uni-frankfurt.de/_static/canteen/beef.svg",
|
||||
"name": "Rind"
|
||||
}
|
||||
],
|
||||
"name": "Spaghetti Bolognese (A,C,G)"
|
||||
}
|
||||
},
|
||||
"origin": {
|
||||
"indexed": "2023-02-24T17:00:07.833Z",
|
||||
"name": "Studierendenwerk Frankfurt am Main",
|
||||
"type": "remote"
|
||||
},
|
||||
"name": "Spaghetti bolognese (A,C,G)",
|
||||
"categories": ["main dish"],
|
||||
"type": "dish"
|
||||
},
|
||||
{
|
||||
"offers": [
|
||||
{
|
||||
"availability": "in stock",
|
||||
"availabilityRange": {
|
||||
"gte": "2023-02-24T09:00:00.000Z",
|
||||
"lte": "2023-02-24T20:00:00.000Z"
|
||||
},
|
||||
"inPlace": {
|
||||
"address": {
|
||||
"addressCountry": "Deutschland",
|
||||
"addressLocality": "Frankfurt am Main",
|
||||
"addressRegion": "Hessen",
|
||||
"postalCode": "60323",
|
||||
"streetAddress": "Kaffeebar Alfredo/Cocktailbar Theodor-W.-Adorno-Platz 2"
|
||||
},
|
||||
"alternateNames": ["Alfredo Anbau Casino"],
|
||||
"categories": ["cafe"],
|
||||
"geo": {
|
||||
"point": {
|
||||
"coordinates": [8.666987121105194, 50.12725203226799],
|
||||
"type": "Point"
|
||||
}
|
||||
},
|
||||
"name": "Alfredo Anbau Casino",
|
||||
"openingHours": "Mo-Fr 08:30-21:00; Sa-Su off; 2023 Feb 13 - 2023 Apr 06 Mo-Fr 10:00-21:00; 2023 Feb 13 - 2023 Apr 06 Sa-Su off",
|
||||
"type": "room",
|
||||
"uid": "86464b64-da1e-5578-a5c4-eec23457f596"
|
||||
},
|
||||
"prices": {
|
||||
"default": 4.4,
|
||||
"employee": 2.2,
|
||||
"guest": 1.1,
|
||||
"student": 3.3
|
||||
},
|
||||
"provider": {
|
||||
"name": "Studierendenwerk Frankfurt am Main",
|
||||
"type": "organization",
|
||||
"uid": "0405339e-f1f3-54a6-9ac1-a230e2bda5c0"
|
||||
}
|
||||
}
|
||||
],
|
||||
"uid": "7a95dd93-83d3-560c-8069-038b51d1b46b",
|
||||
"characteristics": [
|
||||
{
|
||||
"image": "https://mobile.server.uni-frankfurt.de/_static/canteen/vegetarian.svg",
|
||||
"name": "vegetarian"
|
||||
}
|
||||
],
|
||||
"nutrition": {
|
||||
"calories": 349,
|
||||
"carbohydrateContent": 5.3,
|
||||
"fatContent": 29.9,
|
||||
"proteinContent": 10.6,
|
||||
"saltContent": 0.3,
|
||||
"saturatedFatContent": 18.9,
|
||||
"sugarContent": 3.6
|
||||
},
|
||||
"additives": ["gluten (A)", "milk (G)", "celery (I)"],
|
||||
"translations": {
|
||||
"de": {
|
||||
"additives": [
|
||||
"Glutenhaltige Getreide (A)",
|
||||
"Milch u. Milcherzeugnisse (G)",
|
||||
"Sellerie u. Sellerieerzeugnisse (I)"
|
||||
],
|
||||
"characteristics": [
|
||||
{
|
||||
"image": "https://mobile.server.uni-frankfurt.de/_static/canteen/vegetarian.svg",
|
||||
"name": "vegetarisch"
|
||||
}
|
||||
],
|
||||
"name": "Flammkuchen mit Spinat und Mozzarella (A,G,I)"
|
||||
}
|
||||
},
|
||||
"origin": {
|
||||
"indexed": "2023-02-24T17:00:07.832Z",
|
||||
"name": "Studierendenwerk Frankfurt am Main",
|
||||
"type": "remote"
|
||||
},
|
||||
"name": "Spinach-mozzarella tarte flambée (A,G,I)",
|
||||
"categories": ["main dish"],
|
||||
"type": "dish"
|
||||
},
|
||||
{
|
||||
"offers": [
|
||||
{
|
||||
"availability": "in stock",
|
||||
"availabilityRange": {
|
||||
"gte": "2023-02-24T09:00:00.000Z",
|
||||
"lte": "2023-02-24T20:00:00.000Z"
|
||||
},
|
||||
"inPlace": {
|
||||
"address": {
|
||||
"addressCountry": "Deutschland",
|
||||
"addressLocality": "Frankfurt am Main",
|
||||
"addressRegion": "Hessen",
|
||||
"postalCode": "60323",
|
||||
"streetAddress": "Kaffeebar Alfredo/Cocktailbar Theodor-W.-Adorno-Platz 2"
|
||||
},
|
||||
"alternateNames": ["Alfredo Anbau Casino"],
|
||||
"categories": ["cafe"],
|
||||
"geo": {
|
||||
"point": {
|
||||
"coordinates": [8.666987121105194, 50.12725203226799],
|
||||
"type": "Point"
|
||||
}
|
||||
},
|
||||
"name": "Alfredo Anbau Casino",
|
||||
"openingHours": "Mo-Fr 08:30-21:00; Sa-Su off; 2023 Feb 13 - 2023 Apr 06 Mo-Fr 10:00-21:00; 2023 Feb 13 - 2023 Apr 06 Sa-Su off",
|
||||
"type": "room",
|
||||
"uid": "86464b64-da1e-5578-a5c4-eec23457f596"
|
||||
},
|
||||
"prices": {
|
||||
"default": 4.4,
|
||||
"employee": 2.2,
|
||||
"guest": 1.1,
|
||||
"student": 3.3
|
||||
},
|
||||
"provider": {
|
||||
"name": "Studierendenwerk Frankfurt am Main",
|
||||
"type": "organization",
|
||||
"uid": "0405339e-f1f3-54a6-9ac1-a230e2bda5c0"
|
||||
}
|
||||
}
|
||||
],
|
||||
"uid": "f430dde2-e17e-5406-84ae-484e1f095966",
|
||||
"characteristics": [
|
||||
{
|
||||
"image": "https://mobile.server.uni-frankfurt.de/_static/canteen/pork.svg",
|
||||
"name": "pork"
|
||||
}
|
||||
],
|
||||
"nutrition": {
|
||||
"calories": 325,
|
||||
"carbohydrateContent": 5.2,
|
||||
"fatContent": 27.2,
|
||||
"proteinContent": 11.3,
|
||||
"saltContent": 0.9,
|
||||
"saturatedFatContent": 16.4,
|
||||
"sugarContent": 4.1
|
||||
},
|
||||
"additives": ["preserved (2)", "gluten (A)", "milk (G)", "celery (I)"],
|
||||
"translations": {
|
||||
"de": {
|
||||
"additives": [
|
||||
"konserviert (2)",
|
||||
"Glutenhaltige Getreide (A)",
|
||||
"Milch u. Milcherzeugnisse (G)",
|
||||
"Sellerie u. Sellerieerzeugnisse (I)"
|
||||
],
|
||||
"characteristics": [
|
||||
{
|
||||
"image": "https://mobile.server.uni-frankfurt.de/_static/canteen/pork.svg",
|
||||
"name": "Schwein"
|
||||
}
|
||||
],
|
||||
"name": "Flammkuchen mit Speck und Zwiebeln (2,A,G,I)"
|
||||
}
|
||||
},
|
||||
"origin": {
|
||||
"indexed": "2023-02-24T17:00:07.831Z",
|
||||
"name": "Studierendenwerk Frankfurt am Main",
|
||||
"type": "remote"
|
||||
},
|
||||
"name": "Bacon-onion tart flambée (2,A,G,I)",
|
||||
"categories": ["main dish"],
|
||||
"type": "dish"
|
||||
}
|
||||
],
|
||||
"facets": [
|
||||
{
|
||||
"buckets": [
|
||||
{
|
||||
"count": 10,
|
||||
"key": "dish"
|
||||
}
|
||||
],
|
||||
"field": "type"
|
||||
},
|
||||
{
|
||||
"buckets": [
|
||||
{
|
||||
"count": 10,
|
||||
"key": "main dish"
|
||||
}
|
||||
],
|
||||
"field": "categories",
|
||||
"onlyOnType": "dish"
|
||||
},
|
||||
{
|
||||
"buckets": [
|
||||
{
|
||||
"count": 10,
|
||||
"key": "cafe"
|
||||
}
|
||||
],
|
||||
"field": "offers.inPlace.categories",
|
||||
"onlyOnType": "dish"
|
||||
}
|
||||
],
|
||||
"pagination": {
|
||||
"count": 10,
|
||||
"offset": 0,
|
||||
"total": 10
|
||||
},
|
||||
"stats": {
|
||||
"time": 2
|
||||
}
|
||||
}
|
||||
}
|
||||
30
frontend/app/cypress/fixtures/catalog/all.search.req.json
Normal file
30
frontend/app/cypress/fixtures/catalog/all.search.req.json
Normal file
@@ -0,0 +1,30 @@
|
||||
{
|
||||
"filter": {
|
||||
"arguments": {
|
||||
"operation": "and",
|
||||
"filters": [
|
||||
{
|
||||
"type": "value",
|
||||
"arguments": {
|
||||
"field": "type",
|
||||
"value": "catalog"
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "value",
|
||||
"arguments": {
|
||||
"field": "academicTerm.uid"
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "value",
|
||||
"arguments": {
|
||||
"field": "level",
|
||||
"value": "0"
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"type": "boolean"
|
||||
}
|
||||
}
|
||||
519
frontend/app/cypress/fixtures/catalog/all.search.res.json
Normal file
519
frontend/app/cypress/fixtures/catalog/all.search.res.json
Normal file
@@ -0,0 +1,519 @@
|
||||
{
|
||||
"data": [
|
||||
{
|
||||
"uid": "3553954b-f551-5326-a4bd-38bedffb3e37",
|
||||
"level": 0,
|
||||
"academicTerm": {
|
||||
"acronym": "WiSe 2022/23",
|
||||
"alternateNames": ["Winter 2022/23"],
|
||||
"endDate": "2023-03-31T21:59:59.999Z",
|
||||
"eventsEndDate": "2023-02-10T22:59:59.999Z",
|
||||
"eventsStartDate": "2022-10-16T22:00:00.000Z",
|
||||
"name": "Wintersemester 2022/23",
|
||||
"startDate": "2022-09-30T22:00:00.000Z",
|
||||
"type": "semester",
|
||||
"uid": "d8045576-799a-5bec-85be-bc0026a76509"
|
||||
},
|
||||
"identifiers": {
|
||||
"LSF": "91602"
|
||||
},
|
||||
"origin": {
|
||||
"indexed": "2023-02-24T23:14:57.998Z",
|
||||
"name": "Goethe-Uni QIS / LSF",
|
||||
"type": "remote"
|
||||
},
|
||||
"name": "FB 1 - Rechtswissenschaft",
|
||||
"description": "Das stets aktuelle Vorlesungsverzeichnis des Fachbereichs Rechtswissenschaft finden Sie hier! Ein Ausdruck mit allen aktuellen Änderungen hängt außerdem vor dem Dekanat des Fachbereichs (1. OG, Gebäude RuW) aus. Nähere Informationen über den Aufbau des Studiums der Rechtswissenschaft erhalten Sie über unsere Studien- und Prüfungsordnung, die Sie im Dekanat bekommen. Das gedruckte VORLESUNGSVERZEICHNIS kann zudem während der Öffnungszeiten im Hörsaalgebäude am Verkaufsstand der Buchhandlung Hector erworben werden.\n\nDas Veranstaltungsangebot orientiert sich am Studienplan des Fachbereichs Rechtswissenschaft. Die Lehrveranstaltungen beginnen in der ersten Vorlesungswoche. Die Pflichtveranstaltungen enden an unserem Fachbereich\neine Woche vor Vorlesungsende\n, anschließend beginnt die zweiwöchige Klausurenphase.\n\nDie wöchentlichen Veranstaltungen im Schwerpunktbereichsstudium enden bereits zwei Wochen vor dem allgemeinen Vorlesungsende der Universität. Anschließend werden Blockveranstaltungen angeboten.\n\nAchtung:\nIm Schwerpunktbereichsstudium dürfen insgesamt nur maximal zwei rechtsmedizinische und arztrechtliche Veranstaltungen des Insituts für Rechtsmedizin zur Erbringung des Pflichtprogramms gem. § 25 Abs. 3 genutzt werden!\n\n \n\n\nFür Studienanfänger wird eine spezielle dreitägige Orientierungsveranstaltung in der Woche vor Vorlesungsbeginn angeboten; Einzelheiten hierzu werden brieflich mitgeteilt. Für Fragen und Sorgen steht die Studienberatung des Fachbereichs für Studierende aller Semester zur Verfügung.\nZur Zeit findet die Studienberatung telefonisch unter: 069 / 798 – 34211 von Mo - Do von 10:00 Uhr - 12:00 Uhr und Mi von 14.00 Uhr - 17.00 Uhr oder per Mail:\nstudienberatung@jura.uni-frankfurt.de\nstatt.\n\n\n \nDer Fachbereich bietet einen Aufbaustudiengang für im Ausland graduierte Juristinnen und Juristen (LL.M.), einen Aufbaustudiengang \"Europäisches und Internationales Wirtschaftsrecht\" (LL.M. Eur.), einen Weiterbildungsstudiengang \"Law and Finance\" (LL.M. Finance) sowie ein Masterprogramm \"LL.M. Legal Theory\" an. Veranstaltungen zu den Studiengängen siehe Vorlesungsverzeichnis und Aushänge.",
|
||||
"categories": ["university events"],
|
||||
"type": "catalog"
|
||||
},
|
||||
{
|
||||
"uid": "c9d881de-b04e-5775-a36f-58bd7d9a6416",
|
||||
"level": 0,
|
||||
"academicTerm": {
|
||||
"acronym": "WiSe 2022/23",
|
||||
"alternateNames": ["Winter 2022/23"],
|
||||
"endDate": "2023-03-31T21:59:59.999Z",
|
||||
"eventsEndDate": "2023-02-10T22:59:59.999Z",
|
||||
"eventsStartDate": "2022-10-16T22:00:00.000Z",
|
||||
"name": "Wintersemester 2022/23",
|
||||
"startDate": "2022-09-30T22:00:00.000Z",
|
||||
"type": "semester",
|
||||
"uid": "d8045576-799a-5bec-85be-bc0026a76509"
|
||||
},
|
||||
"identifiers": {
|
||||
"LSF": "94670"
|
||||
},
|
||||
"origin": {
|
||||
"indexed": "2023-02-24T23:14:58.125Z",
|
||||
"name": "Goethe-Uni QIS / LSF",
|
||||
"type": "remote"
|
||||
},
|
||||
"name": "FB 10 - Neuere Philologien",
|
||||
"categories": ["university events"],
|
||||
"type": "catalog"
|
||||
},
|
||||
{
|
||||
"uid": "47622795-c4bd-5f3a-80b0-dcb18335314e",
|
||||
"level": 0,
|
||||
"academicTerm": {
|
||||
"acronym": "WiSe 2022/23",
|
||||
"alternateNames": ["Winter 2022/23"],
|
||||
"endDate": "2023-03-31T21:59:59.999Z",
|
||||
"eventsEndDate": "2023-02-10T22:59:59.999Z",
|
||||
"eventsStartDate": "2022-10-16T22:00:00.000Z",
|
||||
"name": "Wintersemester 2022/23",
|
||||
"startDate": "2022-09-30T22:00:00.000Z",
|
||||
"type": "semester",
|
||||
"uid": "d8045576-799a-5bec-85be-bc0026a76509"
|
||||
},
|
||||
"identifiers": {
|
||||
"LSF": "93430"
|
||||
},
|
||||
"origin": {
|
||||
"indexed": "2023-02-24T23:14:58.172Z",
|
||||
"name": "Goethe-Uni QIS / LSF",
|
||||
"type": "remote"
|
||||
},
|
||||
"name": "FB 11 - Geowissenschaften / Geographie",
|
||||
"description": "Fachstudienberatung\n\n\n \n\n\nBachelor/Master/Lehramt Geographie\n\n\n\n\nTeilbereich Humangeographie\n\n\n\n\n\n\n\n\n\n\nJens Schreiber, Sprechstunde siehe geostud (\nhttp://www.geostud.de/mein-studium/beratungpruefungsaemter/studienberatung/\n), Campus Westend, PEG-Gebäude, Theodor-W.-Adorno-Platz 6, Raum PEG 2.G 053\n\n \n\n\nTeilbereich Physische Geographie\n\n\n\n\n\n\nAkad. ORätin Dr. Irene Marzolff, Sprechstunde Do 09.00-10.00, Altenhöferallee 1, Zi 2.222, Tel. 798-40173;\n\nVertr.: Dr. Christiane Berger, Sprechstunde Mi 10-10:45, Altenhöferallee 1, Zi. 2.111, Tel. 798-40157 \n\n\n\n\n\n\n\n\n\n\n \n\n\n\n \n\nBSc-Nebenfachbereich\n\n\n\n\n\n\n\n\n Dr. Christiane Berger, Sprechstunde Mi 10-10:45, Altenhöferallee 1, Zi. 2.111, Tel. 798-40157\n\n\n\n\n\n\n\n \n\nBachelor/Master Geowissenschaften\n\n\nDr. Frederik Kirst, Altenhöferallee 1, Zi 2.317, Tel. 798-40199\n\nAkad. ORat\nDr. Rainer Petschick\n, Sprechstunde n.V., Altenhöferallee 1, Zi 2.325, Tel. 798-40192\n\nProf. Dr. Jens O. Herrle, Sprechstunde n.V., Altenhöferallee 1, Zi 2.227, Tel. 798-40180\n\nAkad. Rat PD Dr. Eiken Haussühl, Sprechstunde n.V., Altenhöferallee 1, Zi 1.217, Tel. 798-40105\n\nProf. Dr. Björn Winkler, Sprechstunde n.V., Altenhöferallee 1, Zi 1.219, Tel. 798-40107\n\nProf. Dr. Andreas Junge, Sprechstunde n.V., Altenhöferallee 1, Zi. 1.319, Tel. 798-40144\n\nProf. Dr. Georg Rümpker, Sprechstunde n.V., Altenhöferallee 1, Zi. 1.320, Tel. 798-40142\n\n\n \n\n\nBachelor/Master Meteorologie\n\n\nAkad. ORat Dr. Andreas Kürten, Sprechstunde n.V., Altenhöferallee 1, Zi 3.318, Tel. 798-40256\n\nAkad. Rat Dr. Stamen Dolaptchiev, Sprechstunde n.V., Altenhöferallee 1, Zi 3.336, Tel. 798-40233\n\n\n \n\n\nMaster Umweltwissenschaften\n\n\nProf. Dr. Jörg Oehlmann, Sprechstunde n.V., Max-von-Laue-Str. 7, Tel. 798-42142",
|
||||
"categories": ["university events"],
|
||||
"type": "catalog"
|
||||
},
|
||||
{
|
||||
"uid": "1dc1df6b-31c6-5ce5-a1b5-18098b07c23a",
|
||||
"level": 0,
|
||||
"academicTerm": {
|
||||
"acronym": "WiSe 2022/23",
|
||||
"alternateNames": ["Winter 2022/23"],
|
||||
"endDate": "2023-03-31T21:59:59.999Z",
|
||||
"eventsEndDate": "2023-02-10T22:59:59.999Z",
|
||||
"eventsStartDate": "2022-10-16T22:00:00.000Z",
|
||||
"name": "Wintersemester 2022/23",
|
||||
"startDate": "2022-09-30T22:00:00.000Z",
|
||||
"type": "semester",
|
||||
"uid": "d8045576-799a-5bec-85be-bc0026a76509"
|
||||
},
|
||||
"identifiers": {
|
||||
"LSF": "91471"
|
||||
},
|
||||
"origin": {
|
||||
"indexed": "2023-02-24T23:14:58.180Z",
|
||||
"name": "Goethe-Uni QIS / LSF",
|
||||
"type": "remote"
|
||||
},
|
||||
"name": "FB 12 - Informatik und Mathematik",
|
||||
"categories": ["university events"],
|
||||
"type": "catalog"
|
||||
},
|
||||
{
|
||||
"uid": "57dde85a-5d8b-5fbd-b72e-3ec2f9dec83e",
|
||||
"level": 0,
|
||||
"academicTerm": {
|
||||
"acronym": "WiSe 2022/23",
|
||||
"alternateNames": ["Winter 2022/23"],
|
||||
"endDate": "2023-03-31T21:59:59.999Z",
|
||||
"eventsEndDate": "2023-02-10T22:59:59.999Z",
|
||||
"eventsStartDate": "2022-10-16T22:00:00.000Z",
|
||||
"name": "Wintersemester 2022/23",
|
||||
"startDate": "2022-09-30T22:00:00.000Z",
|
||||
"type": "semester",
|
||||
"uid": "d8045576-799a-5bec-85be-bc0026a76509"
|
||||
},
|
||||
"identifiers": {
|
||||
"LSF": "93223"
|
||||
},
|
||||
"origin": {
|
||||
"indexed": "2023-02-24T23:14:58.185Z",
|
||||
"name": "Goethe-Uni QIS / LSF",
|
||||
"type": "remote"
|
||||
},
|
||||
"name": "FB 13 - Physik",
|
||||
"description": "Dekanat\n:\nhttp://www.uni-frankfurt.de/60506908/\n\n \n\nPrüfungsamt\n: \nGoethe-Universität — Examination office (uni-frankfurt.de)\n\n \n\nFachstudienberatung:\nhttps://www.uni-frankfurt.de/60655696/Studienberatung\n \n\n \n\nFachschaft Physik: \nhttps://fachschaftphysik.uni-frankfurt.de/\n \n\n \n\nVirtuelle und Präsenzlehre:\n\nNach derzeitiger Planung werden im Wintersemester 2022/23 Lehrveranstaltungen in der Regel als Präsenzveranstaltungen angeboten (mit voller Belegung von Hörsälen bzw. Seminarräumen). Ausnahmen davon finden Sie im Vorlesungsverzeichnis bei den jeweiligen Veranstaltungen.\nAngesichts der noch nicht absehbaren Situation im April sind die Einträge im elektronischen Vorlesungsverzeichnis LSF aber derzeit noch als vorläufig zu betrachten. Bitte informieren Sie sich zu einem späteren Zeitpunkt noch einmal im LSF, ob sich bei den Sie interessierenden Veranstaltungen Änderungen ergeben haben.\n \n\nAnfänger-Praktika:\n Die Online-Anmeldung für alle Anfänger-Praktika für das\nWintersemester 2022/23\nist in der Zeit\n\n vom\n15.08.2022, 8.00 Uhr bis 04.09.2022, 22.00\n \n\n \nunter\n\n\nhttps://www.uni-frankfurt.de/60589452/Anfaengerpraktikum\n frei geschaltet.\n\n \n\nFortgeschrittenen-Praktikum für Studierende der Physik: \nDie Online-Anmeldung für alle Fortgeschrittenen-Praktika für das\nWintersemester 2022/23\n\n\nist in der Zeit vom\n12.09.2022 bis zum 09.10.2022\nunter \n\nhttp://goethe.link/FuLPraktikum\n \n\nfrei geschaltet.\n\n \nBitte beachten Sie: Melden Sie sich bitte für den Studiengang (BA, MA) an, in den Sie das Praktikum einbringen wollen.\n \n\nDie virtuelle Einführungsveranstaltung für die Fortgeschrittenen-Praktika finden Sie in OLAT unter dem link: \nhttps://olat-ce.server.uni-frankfurt.de/olat/auth/RepositoryEntry/16096034818\n \n\n \nDetails werden nach der erfolgreichen Anmeldung bekannt gegeben.",
|
||||
"categories": ["university events"],
|
||||
"type": "catalog"
|
||||
},
|
||||
{
|
||||
"uid": "8b6802d7-6365-54c3-ae09-992d42f89430",
|
||||
"level": 0,
|
||||
"academicTerm": {
|
||||
"acronym": "WiSe 2022/23",
|
||||
"alternateNames": ["Winter 2022/23"],
|
||||
"endDate": "2023-03-31T21:59:59.999Z",
|
||||
"eventsEndDate": "2023-02-10T22:59:59.999Z",
|
||||
"eventsStartDate": "2022-10-16T22:00:00.000Z",
|
||||
"name": "Wintersemester 2022/23",
|
||||
"startDate": "2022-09-30T22:00:00.000Z",
|
||||
"type": "semester",
|
||||
"uid": "d8045576-799a-5bec-85be-bc0026a76509"
|
||||
},
|
||||
"identifiers": {
|
||||
"LSF": "91658"
|
||||
},
|
||||
"origin": {
|
||||
"indexed": "2023-02-24T23:14:58.188Z",
|
||||
"name": "Goethe-Uni QIS / LSF",
|
||||
"type": "remote"
|
||||
},
|
||||
"name": "FB 14 - Biochemie, Chemie und Pharmazie",
|
||||
"description": "Anschrift des Dekanats:\nMax-von-Laue-Str. 9 (Geb. N101, Rm. 1.12), 60438 Frankfurt am Main, Tel.: 798-29545, mailto:dekanatFB14@uni-frankfurt.de, Öffnungszeiten: Mo, Di, Do, Fr 9-13 Uhr.\n\n\nAuskünfte zu Promotionsangelegenheiten\nerteilt das Dekanat, Tel.: 798-29545;\n\nGeschäftsführende Vorsitzende: Prof. Dr. J. Dressman Tel.: 798-29680.\n\nPromotionsbüro der Naturwissenschaftlichen Fachbereiche:\nRobert-Mayer-Str. 6-8 (Rm. 304), Tel.: 798-23504, mailto:promotionsbuero@math.uni-frankfurt.de.\n\nPrüfungsamt Chemie (Bachelorstudiengang):\nMax-von-Laue-Str. 9 (Geb. N101, Rm. 1.13), 60438 Frankfurt, Tel.: 798-29212, mailto:PruefungsamtFB14@uni-frankfurt.de.\n\nPrüfungsamt Studiengang Biochemie (Bachelor, Master und Diplom) und Chemie (Master):\nMax-von-Laue-Str. 9 (Geb.: N101, Rm. 1.08), 60438 Frankfurt, Tel.: 798-29362, mailto:PruefungsamtFB14@uni-frankfurt.de. \n\n\nStudienfachberatung\n\nBiochemie:\nAllgem. Beratung in Studienangelegenheiten: Prof. Dr. V. Dötsch, Tel.: 798-29631, Prof. Dr. C. Glaubitz, Tel.: 798-29927, Prof. Dr. M. Pos, Tel.: 798-29251, Prof. Dr. R. Tampé, Tel.: 798-29476.\n\nChemie (Bachelor und Master):\n\nJeden Freitag um 11 Uhr bietet Herr Dr. Lill eine Studienberatung in den Räumen des Dekanats an.\n\n- Termine\ndafür und Termine für die Studienfachberatung erhalten Sie über Frau Schreiber im Termine können über das Prüfungsamt (Tel.: 798-29212) vereinbart werden.\n\nProf. Göbel, Tel.: 798-29222, Prof. Schmidt, Tel.: 798-29171, Prof. Dr. A. Terfort, Tel.: 798-29181.\n\n\n\nLehrämter\n\nLehramt an Gymnasien (L3):\nDidaktik der Chemie: Prof. Dr. A. Lühken, Tel.: 798-29446; Anorganische und Analytische Chemie: Dr. L. Fink, Tel.: 798-29123; Physikalische und Theoretische Chemie: Prof. Dr. J. Wachtveitl, Tel.: 798-29351; Organische Chemie und Chemische Biologie: Prof. Dr. M. Göbel, Tel.: 798-29222. \n\nLehramt an Haupt- und Realschulen (L2) sowie an Förderschulen (L5):\nDidaktik der Chemie: Prof. Dr. A. Lühken, Tel.: 798-29446; Anorganische und Analytische Chemie: Dr. L. Fink, Tel.: 798-29123; Physikalische und Theoretische Chemie: Dr. H-D. Barth, Tel.: 798-29428; Organische Chemie und Chemische Biologie: Dr. T. Russ, Tel.: 798-29121.\n\nLehramt an Grundschulen (L1):\nDidaktik der Chemie: Dr. Jens Salzner, Tel.: 798-29454 \n\nChemie für Mediziner:\nDie Veranstaltungen werden im Klinikum Haus 75, Sandhofstr. angeboten. Dr. B. Patzke und Dr. Th. Russ, Tel.: 6301-7624; Internet: http://www.chemed.de/\n\nChemie für Studierende im Nebenfach:\nDr. Buchsbaum, Tel: 798-29171\n\n\n\nPharmazie:\nAllgemeine Studienberatung für Studierende der Pharmazie und Bewerber/-innen zum Pharmaziestudium: Prof. Dr. R. Schmidtko, Tel.: 798-29376.\n\nHess. Landesprüfungsamt für Heilberufe (Hauptstelle):\nLurgiallee 10, 60439 Frankfurt/Main, Frau Manuela Wiegand, Tel.: 069 580013-211.",
|
||||
"categories": ["university events"],
|
||||
"type": "catalog"
|
||||
},
|
||||
{
|
||||
"uid": "977e0f94-bfdd-5c55-adee-e7adc12d9ff0",
|
||||
"level": 0,
|
||||
"academicTerm": {
|
||||
"acronym": "WiSe 2022/23",
|
||||
"alternateNames": ["Winter 2022/23"],
|
||||
"endDate": "2023-03-31T21:59:59.999Z",
|
||||
"eventsEndDate": "2023-02-10T22:59:59.999Z",
|
||||
"eventsStartDate": "2022-10-16T22:00:00.000Z",
|
||||
"name": "Wintersemester 2022/23",
|
||||
"startDate": "2022-09-30T22:00:00.000Z",
|
||||
"type": "semester",
|
||||
"uid": "d8045576-799a-5bec-85be-bc0026a76509"
|
||||
},
|
||||
"identifiers": {
|
||||
"LSF": "94462"
|
||||
},
|
||||
"origin": {
|
||||
"indexed": "2023-02-24T23:14:58.219Z",
|
||||
"name": "Goethe-Uni QIS / LSF",
|
||||
"type": "remote"
|
||||
},
|
||||
"name": "FB 15 - Biowissenschaften",
|
||||
"categories": ["university events"],
|
||||
"type": "catalog"
|
||||
},
|
||||
{
|
||||
"uid": "3fc1561b-f38a-573d-817c-d5bb93506f61",
|
||||
"level": 0,
|
||||
"academicTerm": {
|
||||
"acronym": "WiSe 2022/23",
|
||||
"alternateNames": ["Winter 2022/23"],
|
||||
"endDate": "2023-03-31T21:59:59.999Z",
|
||||
"eventsEndDate": "2023-02-10T22:59:59.999Z",
|
||||
"eventsStartDate": "2022-10-16T22:00:00.000Z",
|
||||
"name": "Wintersemester 2022/23",
|
||||
"startDate": "2022-09-30T22:00:00.000Z",
|
||||
"type": "semester",
|
||||
"uid": "d8045576-799a-5bec-85be-bc0026a76509"
|
||||
},
|
||||
"identifiers": {
|
||||
"LSF": "93289"
|
||||
},
|
||||
"origin": {
|
||||
"indexed": "2023-02-24T23:14:58.240Z",
|
||||
"name": "Goethe-Uni QIS / LSF",
|
||||
"type": "remote"
|
||||
},
|
||||
"name": "FB 16 - Medizin",
|
||||
"description": "Sehr geehrte Studierende,\nSehr geehrte Damen und Herren,\n \ndie Angaben im Vorlesungsverzeichnis werden regelmäßig aktualisiert.\nWir bitten Sie daher, sich unmittelbar vor dem Besuch Ihrer Veranstaltung\nüber die aktuellen Angaben zu Zeit und Ort zu informieren.\n\nAlle Detailangaben zu\nvorklinischen\nund\nklinischen\nWahlfächern\n\nfinden Sie auf den Webseiten des Fachbereichs Medizin.",
|
||||
"categories": ["university events"],
|
||||
"type": "catalog"
|
||||
},
|
||||
{
|
||||
"uid": "ed67e49a-927e-5051-aa03-140385553945",
|
||||
"level": 0,
|
||||
"academicTerm": {
|
||||
"acronym": "WiSe 2022/23",
|
||||
"alternateNames": ["Winter 2022/23"],
|
||||
"endDate": "2023-03-31T21:59:59.999Z",
|
||||
"eventsEndDate": "2023-02-10T22:59:59.999Z",
|
||||
"eventsStartDate": "2022-10-16T22:00:00.000Z",
|
||||
"name": "Wintersemester 2022/23",
|
||||
"startDate": "2022-09-30T22:00:00.000Z",
|
||||
"type": "semester",
|
||||
"uid": "d8045576-799a-5bec-85be-bc0026a76509"
|
||||
},
|
||||
"identifiers": {
|
||||
"LSF": "92339"
|
||||
},
|
||||
"origin": {
|
||||
"indexed": "2023-02-24T23:14:58.000Z",
|
||||
"name": "Goethe-Uni QIS / LSF",
|
||||
"type": "remote"
|
||||
},
|
||||
"name": "FB 2 - Wirtschaftswissenschaften",
|
||||
"description": "Alle Veranstaltungen beginnen grundsätzlich in der ersten Vorlesungswoche, es sei denn, es ist im Folgenden anders vermerkt.\nBis zum Semesterbeginn haben alle Angaben nur vorläufigen Charakter.\n\nBeratung zu allen Fragen erhalten Sie bei der Studienfachberatung Wirtschaftswissenschaften: \nSprechzeiten und Kontaktmöglichkeiten\n\n\nWeitere Informationen finden Sie auch auf der Website: \nhttps://www.wiwi.uni-frankfurt.de/",
|
||||
"categories": ["university events"],
|
||||
"type": "catalog"
|
||||
},
|
||||
{
|
||||
"uid": "04dd801e-3986-529a-bb67-b4d7c86fc624",
|
||||
"level": 0,
|
||||
"academicTerm": {
|
||||
"acronym": "WiSe 2022/23",
|
||||
"alternateNames": ["Winter 2022/23"],
|
||||
"endDate": "2023-03-31T21:59:59.999Z",
|
||||
"eventsEndDate": "2023-02-10T22:59:59.999Z",
|
||||
"eventsStartDate": "2022-10-16T22:00:00.000Z",
|
||||
"name": "Wintersemester 2022/23",
|
||||
"startDate": "2022-09-30T22:00:00.000Z",
|
||||
"type": "semester",
|
||||
"uid": "d8045576-799a-5bec-85be-bc0026a76509"
|
||||
},
|
||||
"identifiers": {
|
||||
"LSF": "94757"
|
||||
},
|
||||
"origin": {
|
||||
"indexed": "2023-02-24T23:14:58.030Z",
|
||||
"name": "Goethe-Uni QIS / LSF",
|
||||
"type": "remote"
|
||||
},
|
||||
"name": "FB 3 - Gesellschaftswissenschaften",
|
||||
"description": "Ab dem 18.07.2022 finden Sie hier das Veranstaltungsangebot für das Wintersemester 2022/23.\nBitte beachten Sie, dass es bis zu Beginn der Anmeldephase noch zu Änderungen in geringem Umfang kommen kann.\n\n \n\nErstsemester\nwerden in die jeweils neusten Prüfungsordnungen (PO 2022 bzw. PO 2019) eingeschrieben.\n\n \n\nVerbindliches Anmeldesystem:\nDie Anmeldung zu allen Lehrveranstaltungen des Fachbereich Gesellschaftswissenschaften erfolgt über QIS-LSF. Weitere Informationen dazu finden Sie auf den Seiten der Fachbereichs im Bereich Studium -> Anmeldeverfahren \nhttps://www.fb03.uni-frankfurt.de/58614228/Anmeldung_zu_Lehrveranstaltungen\n(hier informieren wir Sie auch über die aktuellen Fristen und ggfls. zu Änderungen im Verfahren)!",
|
||||
"categories": ["university events"],
|
||||
"type": "catalog"
|
||||
},
|
||||
{
|
||||
"uid": "573d7374-fdb2-54e4-846e-231395bc7a21",
|
||||
"level": 0,
|
||||
"academicTerm": {
|
||||
"acronym": "WiSe 2022/23",
|
||||
"alternateNames": ["Winter 2022/23"],
|
||||
"endDate": "2023-03-31T21:59:59.999Z",
|
||||
"eventsEndDate": "2023-02-10T22:59:59.999Z",
|
||||
"eventsStartDate": "2022-10-16T22:00:00.000Z",
|
||||
"name": "Wintersemester 2022/23",
|
||||
"startDate": "2022-09-30T22:00:00.000Z",
|
||||
"type": "semester",
|
||||
"uid": "d8045576-799a-5bec-85be-bc0026a76509"
|
||||
},
|
||||
"identifiers": {
|
||||
"LSF": "93734"
|
||||
},
|
||||
"origin": {
|
||||
"indexed": "2023-02-24T23:14:58.049Z",
|
||||
"name": "Goethe-Uni QIS / LSF",
|
||||
"type": "remote"
|
||||
},
|
||||
"name": "FB 4 - Erziehungswissenschaften",
|
||||
"categories": ["university events"],
|
||||
"type": "catalog"
|
||||
},
|
||||
{
|
||||
"uid": "21bc5d2b-c4e2-5df4-abca-fd120805b8e0",
|
||||
"level": 0,
|
||||
"academicTerm": {
|
||||
"acronym": "WiSe 2022/23",
|
||||
"alternateNames": ["Winter 2022/23"],
|
||||
"endDate": "2023-03-31T21:59:59.999Z",
|
||||
"eventsEndDate": "2023-02-10T22:59:59.999Z",
|
||||
"eventsStartDate": "2022-10-16T22:00:00.000Z",
|
||||
"name": "Wintersemester 2022/23",
|
||||
"startDate": "2022-09-30T22:00:00.000Z",
|
||||
"type": "semester",
|
||||
"uid": "d8045576-799a-5bec-85be-bc0026a76509"
|
||||
},
|
||||
"identifiers": {
|
||||
"LSF": "94521"
|
||||
},
|
||||
"origin": {
|
||||
"indexed": "2023-02-24T23:14:58.053Z",
|
||||
"name": "Goethe-Uni QIS / LSF",
|
||||
"type": "remote"
|
||||
},
|
||||
"name": "FB 5 - Psychologie und Sportwissenschaften",
|
||||
"categories": ["university events"],
|
||||
"type": "catalog"
|
||||
},
|
||||
{
|
||||
"uid": "5f45ed02-171b-5d55-8863-9a878005a5d8",
|
||||
"level": 0,
|
||||
"academicTerm": {
|
||||
"acronym": "WiSe 2022/23",
|
||||
"alternateNames": ["Winter 2022/23"],
|
||||
"endDate": "2023-03-31T21:59:59.999Z",
|
||||
"eventsEndDate": "2023-02-10T22:59:59.999Z",
|
||||
"eventsStartDate": "2022-10-16T22:00:00.000Z",
|
||||
"name": "Wintersemester 2022/23",
|
||||
"startDate": "2022-09-30T22:00:00.000Z",
|
||||
"type": "semester",
|
||||
"uid": "d8045576-799a-5bec-85be-bc0026a76509"
|
||||
},
|
||||
"identifiers": {
|
||||
"LSF": "94505"
|
||||
},
|
||||
"origin": {
|
||||
"indexed": "2023-02-24T23:14:58.058Z",
|
||||
"name": "Goethe-Uni QIS / LSF",
|
||||
"type": "remote"
|
||||
},
|
||||
"name": "FB 6 - Evangelische Theologie",
|
||||
"description": "Sehr geehrte Studentinnen und Studenten,\ndas Wintersemester 2021/22 wird aller Voraussicht nach in weiten Teilen wieder im Präsenzbetrieb stattfinden. Bitte beachten Sie zu den hier aufgeführten Lehrveranstaltungen folgende Hinweise:\n\n\nAlle im Vorlesungsverzeichnis aufgeführten\nVeranstaltungen finden statt\n- ggf. wird kurzfristig eine Rückkehr in den Online-Modus notwendig. Darüber informieren wir dann an dieser Stelle.\n\n\nAktuell sind (insbesondere für die Studiengänge Religionswissenschaft) noch nicht alle\nModulangaben\neingetragen. Eine Orientierung bietet - wie stets - die Zuordnung zu Fachgebieten/Professuren sowie die eigenständige Lektüre der Studien- und Prüfungsordnungen. Die Modulangaben werden spätestens bis 15. Juli verbindlich in LSF ersichtlich sein. Fragen zur Modulzuordnung beantworten ebenfalls die zuständigen Fachstudienberater*innen. Wir bitten darum, von Nachfragen bis zur vollständigen Eintragung der Module möglichst abzusehen.\n\n\nBitte informieren Sie sich auch selbst über folgende Seiten:\n\n\nwww.uni-frankfurt.de/corona\n(Informationsseite der Universität)\n\n\nwww.evtheol.uni-frankfurt.de\n(Fachbereichsseite Evangelische Theologie)\n\n\nwww.facebook.com/evtheol.ffm\n(Facebook-Auftritt des Fachbereichs Evangelische Theologie)\n\n\n \n\nIn Forschung und Lehre kooperiert der Fachbereich Evangelische Theologie mit dem Institut für Evangelische Theologie der Justus-Liebig-Universität in Gießen. Dies bedeutet, dass einerseits Gießener Professoren/innen Lehrveranstaltungen in Frankfurt anbieten und umgekehrt, andererseits, dass die Studierenden beider Universitäten die Möglichkeit haben, Lehrveranstaltungen der jeweils anderen Universität in Evangelischer Theologie zu belegen.\n\n\nAlle Veranstaltungen beginnen - soweit nicht anders vermerkt - in der ersten Vorlesungswoche.",
|
||||
"categories": ["university events"],
|
||||
"type": "catalog"
|
||||
},
|
||||
{
|
||||
"uid": "5711d338-0111-5352-991c-11210649f7c8",
|
||||
"level": 0,
|
||||
"academicTerm": {
|
||||
"acronym": "WiSe 2022/23",
|
||||
"alternateNames": ["Winter 2022/23"],
|
||||
"endDate": "2023-03-31T21:59:59.999Z",
|
||||
"eventsEndDate": "2023-02-10T22:59:59.999Z",
|
||||
"eventsStartDate": "2022-10-16T22:00:00.000Z",
|
||||
"name": "Wintersemester 2022/23",
|
||||
"startDate": "2022-09-30T22:00:00.000Z",
|
||||
"type": "semester",
|
||||
"uid": "d8045576-799a-5bec-85be-bc0026a76509"
|
||||
},
|
||||
"identifiers": {
|
||||
"LSF": "94716"
|
||||
},
|
||||
"origin": {
|
||||
"indexed": "2023-02-24T23:14:58.066Z",
|
||||
"name": "Goethe-Uni QIS / LSF",
|
||||
"type": "remote"
|
||||
},
|
||||
"name": "FB 7 - Katholische Theologie",
|
||||
"categories": ["university events"],
|
||||
"type": "catalog"
|
||||
},
|
||||
{
|
||||
"uid": "7e5c2463-c0ab-585a-ad97-b6cf178dd8c4",
|
||||
"level": 0,
|
||||
"academicTerm": {
|
||||
"acronym": "WiSe 2022/23",
|
||||
"alternateNames": ["Winter 2022/23"],
|
||||
"endDate": "2023-03-31T21:59:59.999Z",
|
||||
"eventsEndDate": "2023-02-10T22:59:59.999Z",
|
||||
"eventsStartDate": "2022-10-16T22:00:00.000Z",
|
||||
"name": "Wintersemester 2022/23",
|
||||
"startDate": "2022-09-30T22:00:00.000Z",
|
||||
"type": "semester",
|
||||
"uid": "d8045576-799a-5bec-85be-bc0026a76509"
|
||||
},
|
||||
"identifiers": {
|
||||
"LSF": "92555"
|
||||
},
|
||||
"origin": {
|
||||
"indexed": "2023-02-24T23:14:58.073Z",
|
||||
"name": "Goethe-Uni QIS / LSF",
|
||||
"type": "remote"
|
||||
},
|
||||
"name": "FB 8 - Philosophie und Geschichtswissenschaften",
|
||||
"categories": ["university events"],
|
||||
"type": "catalog"
|
||||
},
|
||||
{
|
||||
"uid": "d65f83e8-5f69-5dfe-b23e-f0abb327cac4",
|
||||
"level": 0,
|
||||
"academicTerm": {
|
||||
"acronym": "WiSe 2022/23",
|
||||
"alternateNames": ["Winter 2022/23"],
|
||||
"endDate": "2023-03-31T21:59:59.999Z",
|
||||
"eventsEndDate": "2023-02-10T22:59:59.999Z",
|
||||
"eventsStartDate": "2022-10-16T22:00:00.000Z",
|
||||
"name": "Wintersemester 2022/23",
|
||||
"startDate": "2022-09-30T22:00:00.000Z",
|
||||
"type": "semester",
|
||||
"uid": "d8045576-799a-5bec-85be-bc0026a76509"
|
||||
},
|
||||
"identifiers": {
|
||||
"LSF": "91668"
|
||||
},
|
||||
"origin": {
|
||||
"indexed": "2023-02-24T23:14:58.091Z",
|
||||
"name": "Goethe-Uni QIS / LSF",
|
||||
"type": "remote"
|
||||
},
|
||||
"name": "FB 9 - Sprach- und Kulturwissenschaften",
|
||||
"categories": ["university events"],
|
||||
"type": "catalog"
|
||||
},
|
||||
{
|
||||
"uid": "ac329244-cfbe-535d-ae60-88afe09cf7eb",
|
||||
"level": 0,
|
||||
"academicTerm": {
|
||||
"acronym": "WiSe 2022/23",
|
||||
"alternateNames": ["Winter 2022/23"],
|
||||
"endDate": "2023-03-31T21:59:59.999Z",
|
||||
"eventsEndDate": "2023-02-10T22:59:59.999Z",
|
||||
"eventsStartDate": "2022-10-16T22:00:00.000Z",
|
||||
"name": "Wintersemester 2022/23",
|
||||
"startDate": "2022-09-30T22:00:00.000Z",
|
||||
"type": "semester",
|
||||
"uid": "d8045576-799a-5bec-85be-bc0026a76509"
|
||||
},
|
||||
"identifiers": {
|
||||
"LSF": "92184"
|
||||
},
|
||||
"origin": {
|
||||
"indexed": "2023-02-24T23:14:58.252Z",
|
||||
"name": "Goethe-Uni QIS / LSF",
|
||||
"type": "remote"
|
||||
},
|
||||
"name": "Lehrveranstaltungen für Lehramtsstudiengänge (Modulstruktur)",
|
||||
"categories": ["university events"],
|
||||
"type": "catalog"
|
||||
},
|
||||
{
|
||||
"uid": "80e6cc59-7894-5204-8b3a-b1fdb49e7a72",
|
||||
"level": 0,
|
||||
"academicTerm": {
|
||||
"acronym": "WiSe 2022/23",
|
||||
"alternateNames": ["Winter 2022/23"],
|
||||
"endDate": "2023-03-31T21:59:59.999Z",
|
||||
"eventsEndDate": "2023-02-10T22:59:59.999Z",
|
||||
"eventsStartDate": "2022-10-16T22:00:00.000Z",
|
||||
"name": "Wintersemester 2022/23",
|
||||
"startDate": "2022-09-30T22:00:00.000Z",
|
||||
"type": "semester",
|
||||
"uid": "d8045576-799a-5bec-85be-bc0026a76509"
|
||||
},
|
||||
"identifiers": {
|
||||
"LSF": "92603"
|
||||
},
|
||||
"origin": {
|
||||
"indexed": "2023-02-24T23:14:58.324Z",
|
||||
"name": "Goethe-Uni QIS / LSF",
|
||||
"type": "remote"
|
||||
},
|
||||
"name": "Weitere Studienangebote",
|
||||
"categories": ["university events"],
|
||||
"type": "catalog"
|
||||
}
|
||||
],
|
||||
"facets": [
|
||||
{
|
||||
"buckets": [
|
||||
{
|
||||
"count": 18,
|
||||
"key": "catalog"
|
||||
}
|
||||
],
|
||||
"field": "type"
|
||||
},
|
||||
{
|
||||
"buckets": [
|
||||
{
|
||||
"count": 18,
|
||||
"key": "WiSe 2022/23"
|
||||
}
|
||||
],
|
||||
"field": "academicTerm.acronym",
|
||||
"onlyOnType": "catalog"
|
||||
},
|
||||
{
|
||||
"buckets": [
|
||||
{
|
||||
"count": 18,
|
||||
"key": "university events"
|
||||
}
|
||||
],
|
||||
"field": "categories",
|
||||
"onlyOnType": "catalog"
|
||||
}
|
||||
],
|
||||
"pagination": {
|
||||
"count": 18,
|
||||
"offset": 0,
|
||||
"total": 18
|
||||
},
|
||||
"stats": {
|
||||
"time": 3
|
||||
}
|
||||
}
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"data": [
|
||||
{
|
||||
"uid": "ae3cf884-4dc4-526b-9213-6850135591ab",
|
||||
"uid": "catalog",
|
||||
"superCatalogs": [
|
||||
{
|
||||
"categories": ["university events"],
|
||||
@@ -0,0 +1,60 @@
|
||||
{
|
||||
"filter": {
|
||||
"arguments": {
|
||||
"filters": [
|
||||
{
|
||||
"arguments": {
|
||||
"filters": [
|
||||
{
|
||||
"arguments": {
|
||||
"operation": "and",
|
||||
"filters": [
|
||||
{
|
||||
"type": "value",
|
||||
"arguments": {
|
||||
"field": "type",
|
||||
"value": "catalog"
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "value",
|
||||
"arguments": {
|
||||
"field": "superCatalog.uid"
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"type": "boolean"
|
||||
},
|
||||
{
|
||||
"arguments": {
|
||||
"operation": "and",
|
||||
"filters": [
|
||||
{
|
||||
"type": "value",
|
||||
"arguments": {
|
||||
"field": "type",
|
||||
"value": "academic event"
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "value",
|
||||
"arguments": {
|
||||
"field": "catalogs.uid"
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"type": "boolean"
|
||||
}
|
||||
],
|
||||
"operation": "or"
|
||||
},
|
||||
"type": "boolean"
|
||||
}
|
||||
],
|
||||
"operation": "and"
|
||||
},
|
||||
"type": "boolean"
|
||||
}
|
||||
}
|
||||
364
frontend/app/cypress/fixtures/catalog/children.search.res.json
Normal file
364
frontend/app/cypress/fixtures/catalog/children.search.res.json
Normal file
@@ -0,0 +1,364 @@
|
||||
{
|
||||
"data": [
|
||||
{
|
||||
"uid": "1a91ca6f-c1f2-51f4-b48b-0680c661e86b",
|
||||
"superCatalogs": [
|
||||
{
|
||||
"categories": ["university events"],
|
||||
"identifiers": {
|
||||
"LSF": "92339"
|
||||
},
|
||||
"level": 0,
|
||||
"name": "FB 2 - Wirtschaftswissenschaften",
|
||||
"type": "catalog",
|
||||
"uid": "ed67e49a-927e-5051-aa03-140385553945",
|
||||
"description": "Alle Veranstaltungen beginnen grundsätzlich in der ersten Vorlesungswoche, es sei denn, es ist im Folgenden anders vermerkt.\nBis zum Semesterbeginn haben alle Angaben nur vorläufigen Charakter.\n\nBeratung zu allen Fragen erhalten Sie bei der Studienfachberatung Wirtschaftswissenschaften: \nSprechzeiten und Kontaktmöglichkeiten\n\n\nWeitere Informationen finden Sie auch auf der Website: \nhttps://www.wiwi.uni-frankfurt.de/"
|
||||
}
|
||||
],
|
||||
"level": 1,
|
||||
"academicTerm": {
|
||||
"acronym": "WiSe 2022/23",
|
||||
"alternateNames": ["Winter 2022/23"],
|
||||
"endDate": "2023-03-31T21:59:59.999Z",
|
||||
"eventsEndDate": "2023-02-10T22:59:59.999Z",
|
||||
"eventsStartDate": "2022-10-16T22:00:00.000Z",
|
||||
"name": "Wintersemester 2022/23",
|
||||
"startDate": "2022-09-30T22:00:00.000Z",
|
||||
"type": "semester",
|
||||
"uid": "d8045576-799a-5bec-85be-bc0026a76509"
|
||||
},
|
||||
"identifiers": {
|
||||
"LSF": "94412"
|
||||
},
|
||||
"origin": {
|
||||
"indexed": "2023-02-24T23:14:58.001Z",
|
||||
"name": "Goethe-Uni QIS / LSF",
|
||||
"type": "remote"
|
||||
},
|
||||
"name": "Allgemeine Veranstaltungen / Informationsveranstaltungen",
|
||||
"categories": ["university events"],
|
||||
"type": "catalog",
|
||||
"superCatalog": {
|
||||
"categories": ["university events"],
|
||||
"identifiers": {
|
||||
"LSF": "92339"
|
||||
},
|
||||
"level": 0,
|
||||
"name": "FB 2 - Wirtschaftswissenschaften",
|
||||
"type": "catalog",
|
||||
"uid": "ed67e49a-927e-5051-aa03-140385553945",
|
||||
"description": "Alle Veranstaltungen beginnen grundsätzlich in der ersten Vorlesungswoche, es sei denn, es ist im Folgenden anders vermerkt.\nBis zum Semesterbeginn haben alle Angaben nur vorläufigen Charakter.\n\nBeratung zu allen Fragen erhalten Sie bei der Studienfachberatung Wirtschaftswissenschaften: \nSprechzeiten und Kontaktmöglichkeiten\n\n\nWeitere Informationen finden Sie auch auf der Website: \nhttps://www.wiwi.uni-frankfurt.de/"
|
||||
}
|
||||
},
|
||||
{
|
||||
"uid": "c448ee2b-6a5e-5d88-973b-f71c7a1b63cd",
|
||||
"superCatalogs": [
|
||||
{
|
||||
"categories": ["university events"],
|
||||
"identifiers": {
|
||||
"LSF": "92339"
|
||||
},
|
||||
"level": 0,
|
||||
"name": "FB 2 - Wirtschaftswissenschaften",
|
||||
"type": "catalog",
|
||||
"uid": "ed67e49a-927e-5051-aa03-140385553945",
|
||||
"description": "Alle Veranstaltungen beginnen grundsätzlich in der ersten Vorlesungswoche, es sei denn, es ist im Folgenden anders vermerkt.\nBis zum Semesterbeginn haben alle Angaben nur vorläufigen Charakter.\n\nBeratung zu allen Fragen erhalten Sie bei der Studienfachberatung Wirtschaftswissenschaften: \nSprechzeiten und Kontaktmöglichkeiten\n\n\nWeitere Informationen finden Sie auch auf der Website: \nhttps://www.wiwi.uni-frankfurt.de/"
|
||||
}
|
||||
],
|
||||
"level": 1,
|
||||
"academicTerm": {
|
||||
"acronym": "WiSe 2022/23",
|
||||
"alternateNames": ["Winter 2022/23"],
|
||||
"endDate": "2023-03-31T21:59:59.999Z",
|
||||
"eventsEndDate": "2023-02-10T22:59:59.999Z",
|
||||
"eventsStartDate": "2022-10-16T22:00:00.000Z",
|
||||
"name": "Wintersemester 2022/23",
|
||||
"startDate": "2022-09-30T22:00:00.000Z",
|
||||
"type": "semester",
|
||||
"uid": "d8045576-799a-5bec-85be-bc0026a76509"
|
||||
},
|
||||
"identifiers": {
|
||||
"LSF": "91482"
|
||||
},
|
||||
"origin": {
|
||||
"indexed": "2023-02-24T23:14:58.029Z",
|
||||
"name": "Goethe-Uni QIS / LSF",
|
||||
"type": "remote"
|
||||
},
|
||||
"name": "Anwendungsfächer/Exportmodule gemäß Vereinbarungen",
|
||||
"description": "Dieses Verzeichnis gilt ausschließlich für Studierende, die in das Nebenfach BWL bzw. VWL des Fachbereichs 02 Wirtschaftswissenschaften eingeschrieben sind. Ob diese Regelung für Sie gilt, finden Sie unter:\nhttp://www.wiwi.uni-frankfurt.de/mein-wiwi-studium/pruefungsamt/allgemeine-informationen/infos-nebenfachstudierende.html",
|
||||
"categories": ["university events"],
|
||||
"type": "catalog",
|
||||
"superCatalog": {
|
||||
"categories": ["university events"],
|
||||
"identifiers": {
|
||||
"LSF": "92339"
|
||||
},
|
||||
"level": 0,
|
||||
"name": "FB 2 - Wirtschaftswissenschaften",
|
||||
"type": "catalog",
|
||||
"uid": "ed67e49a-927e-5051-aa03-140385553945",
|
||||
"description": "Alle Veranstaltungen beginnen grundsätzlich in der ersten Vorlesungswoche, es sei denn, es ist im Folgenden anders vermerkt.\nBis zum Semesterbeginn haben alle Angaben nur vorläufigen Charakter.\n\nBeratung zu allen Fragen erhalten Sie bei der Studienfachberatung Wirtschaftswissenschaften: \nSprechzeiten und Kontaktmöglichkeiten\n\n\nWeitere Informationen finden Sie auch auf der Website: \nhttps://www.wiwi.uni-frankfurt.de/"
|
||||
}
|
||||
},
|
||||
{
|
||||
"uid": "55f677f4-98ab-5645-bfe0-06a38b2c5d72",
|
||||
"superCatalogs": [
|
||||
{
|
||||
"categories": ["university events"],
|
||||
"identifiers": {
|
||||
"LSF": "92339"
|
||||
},
|
||||
"level": 0,
|
||||
"name": "FB 2 - Wirtschaftswissenschaften",
|
||||
"type": "catalog",
|
||||
"uid": "ed67e49a-927e-5051-aa03-140385553945",
|
||||
"description": "Alle Veranstaltungen beginnen grundsätzlich in der ersten Vorlesungswoche, es sei denn, es ist im Folgenden anders vermerkt.\nBis zum Semesterbeginn haben alle Angaben nur vorläufigen Charakter.\n\nBeratung zu allen Fragen erhalten Sie bei der Studienfachberatung Wirtschaftswissenschaften: \nSprechzeiten und Kontaktmöglichkeiten\n\n\nWeitere Informationen finden Sie auch auf der Website: \nhttps://www.wiwi.uni-frankfurt.de/"
|
||||
}
|
||||
],
|
||||
"level": 1,
|
||||
"academicTerm": {
|
||||
"acronym": "WiSe 2022/23",
|
||||
"alternateNames": ["Winter 2022/23"],
|
||||
"endDate": "2023-03-31T21:59:59.999Z",
|
||||
"eventsEndDate": "2023-02-10T22:59:59.999Z",
|
||||
"eventsStartDate": "2022-10-16T22:00:00.000Z",
|
||||
"name": "Wintersemester 2022/23",
|
||||
"startDate": "2022-09-30T22:00:00.000Z",
|
||||
"type": "semester",
|
||||
"uid": "d8045576-799a-5bec-85be-bc0026a76509"
|
||||
},
|
||||
"identifiers": {
|
||||
"LSF": "92478"
|
||||
},
|
||||
"origin": {
|
||||
"indexed": "2023-02-24T23:14:58.001Z",
|
||||
"name": "Goethe-Uni QIS / LSF",
|
||||
"type": "remote"
|
||||
},
|
||||
"name": "Bachelorstudium",
|
||||
"categories": ["university events"],
|
||||
"type": "catalog",
|
||||
"superCatalog": {
|
||||
"categories": ["university events"],
|
||||
"identifiers": {
|
||||
"LSF": "92339"
|
||||
},
|
||||
"level": 0,
|
||||
"name": "FB 2 - Wirtschaftswissenschaften",
|
||||
"type": "catalog",
|
||||
"uid": "ed67e49a-927e-5051-aa03-140385553945",
|
||||
"description": "Alle Veranstaltungen beginnen grundsätzlich in der ersten Vorlesungswoche, es sei denn, es ist im Folgenden anders vermerkt.\nBis zum Semesterbeginn haben alle Angaben nur vorläufigen Charakter.\n\nBeratung zu allen Fragen erhalten Sie bei der Studienfachberatung Wirtschaftswissenschaften: \nSprechzeiten und Kontaktmöglichkeiten\n\n\nWeitere Informationen finden Sie auch auf der Website: \nhttps://www.wiwi.uni-frankfurt.de/"
|
||||
}
|
||||
},
|
||||
{
|
||||
"uid": "c22d157e-9cfa-551a-8d5c-2c77046e814b",
|
||||
"superCatalogs": [
|
||||
{
|
||||
"categories": ["university events"],
|
||||
"identifiers": {
|
||||
"LSF": "92339"
|
||||
},
|
||||
"level": 0,
|
||||
"name": "FB 2 - Wirtschaftswissenschaften",
|
||||
"type": "catalog",
|
||||
"uid": "ed67e49a-927e-5051-aa03-140385553945",
|
||||
"description": "Alle Veranstaltungen beginnen grundsätzlich in der ersten Vorlesungswoche, es sei denn, es ist im Folgenden anders vermerkt.\nBis zum Semesterbeginn haben alle Angaben nur vorläufigen Charakter.\n\nBeratung zu allen Fragen erhalten Sie bei der Studienfachberatung Wirtschaftswissenschaften: \nSprechzeiten und Kontaktmöglichkeiten\n\n\nWeitere Informationen finden Sie auch auf der Website: \nhttps://www.wiwi.uni-frankfurt.de/"
|
||||
}
|
||||
],
|
||||
"level": 1,
|
||||
"academicTerm": {
|
||||
"acronym": "WiSe 2022/23",
|
||||
"alternateNames": ["Winter 2022/23"],
|
||||
"endDate": "2023-03-31T21:59:59.999Z",
|
||||
"eventsEndDate": "2023-02-10T22:59:59.999Z",
|
||||
"eventsStartDate": "2022-10-16T22:00:00.000Z",
|
||||
"name": "Wintersemester 2022/23",
|
||||
"startDate": "2022-09-30T22:00:00.000Z",
|
||||
"type": "semester",
|
||||
"uid": "d8045576-799a-5bec-85be-bc0026a76509"
|
||||
},
|
||||
"identifiers": {
|
||||
"LSF": "91546"
|
||||
},
|
||||
"origin": {
|
||||
"indexed": "2023-02-24T23:14:58.028Z",
|
||||
"name": "Goethe-Uni QIS / LSF",
|
||||
"type": "remote"
|
||||
},
|
||||
"name": "Graduiertenstudium",
|
||||
"categories": ["university events"],
|
||||
"type": "catalog",
|
||||
"superCatalog": {
|
||||
"categories": ["university events"],
|
||||
"identifiers": {
|
||||
"LSF": "92339"
|
||||
},
|
||||
"level": 0,
|
||||
"name": "FB 2 - Wirtschaftswissenschaften",
|
||||
"type": "catalog",
|
||||
"uid": "ed67e49a-927e-5051-aa03-140385553945",
|
||||
"description": "Alle Veranstaltungen beginnen grundsätzlich in der ersten Vorlesungswoche, es sei denn, es ist im Folgenden anders vermerkt.\nBis zum Semesterbeginn haben alle Angaben nur vorläufigen Charakter.\n\nBeratung zu allen Fragen erhalten Sie bei der Studienfachberatung Wirtschaftswissenschaften: \nSprechzeiten und Kontaktmöglichkeiten\n\n\nWeitere Informationen finden Sie auch auf der Website: \nhttps://www.wiwi.uni-frankfurt.de/"
|
||||
}
|
||||
},
|
||||
{
|
||||
"uid": "3da3bc68-d27f-5730-b224-eef7a3e328cc",
|
||||
"superCatalogs": [
|
||||
{
|
||||
"categories": ["university events"],
|
||||
"identifiers": {
|
||||
"LSF": "92339"
|
||||
},
|
||||
"level": 0,
|
||||
"name": "FB 2 - Wirtschaftswissenschaften",
|
||||
"type": "catalog",
|
||||
"uid": "ed67e49a-927e-5051-aa03-140385553945",
|
||||
"description": "Alle Veranstaltungen beginnen grundsätzlich in der ersten Vorlesungswoche, es sei denn, es ist im Folgenden anders vermerkt.\nBis zum Semesterbeginn haben alle Angaben nur vorläufigen Charakter.\n\nBeratung zu allen Fragen erhalten Sie bei der Studienfachberatung Wirtschaftswissenschaften: \nSprechzeiten und Kontaktmöglichkeiten\n\n\nWeitere Informationen finden Sie auch auf der Website: \nhttps://www.wiwi.uni-frankfurt.de/"
|
||||
}
|
||||
],
|
||||
"level": 1,
|
||||
"academicTerm": {
|
||||
"acronym": "WiSe 2022/23",
|
||||
"alternateNames": ["Winter 2022/23"],
|
||||
"endDate": "2023-03-31T21:59:59.999Z",
|
||||
"eventsEndDate": "2023-02-10T22:59:59.999Z",
|
||||
"eventsStartDate": "2022-10-16T22:00:00.000Z",
|
||||
"name": "Wintersemester 2022/23",
|
||||
"startDate": "2022-09-30T22:00:00.000Z",
|
||||
"type": "semester",
|
||||
"uid": "d8045576-799a-5bec-85be-bc0026a76509"
|
||||
},
|
||||
"identifiers": {
|
||||
"LSF": "92114"
|
||||
},
|
||||
"origin": {
|
||||
"indexed": "2023-02-24T23:14:58.014Z",
|
||||
"name": "Goethe-Uni QIS / LSF",
|
||||
"type": "remote"
|
||||
},
|
||||
"name": "Masterstudium",
|
||||
"categories": ["university events"],
|
||||
"type": "catalog",
|
||||
"superCatalog": {
|
||||
"categories": ["university events"],
|
||||
"identifiers": {
|
||||
"LSF": "92339"
|
||||
},
|
||||
"level": 0,
|
||||
"name": "FB 2 - Wirtschaftswissenschaften",
|
||||
"type": "catalog",
|
||||
"uid": "ed67e49a-927e-5051-aa03-140385553945",
|
||||
"description": "Alle Veranstaltungen beginnen grundsätzlich in der ersten Vorlesungswoche, es sei denn, es ist im Folgenden anders vermerkt.\nBis zum Semesterbeginn haben alle Angaben nur vorläufigen Charakter.\n\nBeratung zu allen Fragen erhalten Sie bei der Studienfachberatung Wirtschaftswissenschaften: \nSprechzeiten und Kontaktmöglichkeiten\n\n\nWeitere Informationen finden Sie auch auf der Website: \nhttps://www.wiwi.uni-frankfurt.de/"
|
||||
}
|
||||
},
|
||||
{
|
||||
"uid": "67303028-6ee7-5d64-86b5-f154221a2e93",
|
||||
"superCatalogs": [
|
||||
{
|
||||
"categories": ["university events"],
|
||||
"identifiers": {
|
||||
"LSF": "92339"
|
||||
},
|
||||
"level": 0,
|
||||
"name": "FB 2 - Wirtschaftswissenschaften",
|
||||
"type": "catalog",
|
||||
"uid": "ed67e49a-927e-5051-aa03-140385553945",
|
||||
"description": "Alle Veranstaltungen beginnen grundsätzlich in der ersten Vorlesungswoche, es sei denn, es ist im Folgenden anders vermerkt.\nBis zum Semesterbeginn haben alle Angaben nur vorläufigen Charakter.\n\nBeratung zu allen Fragen erhalten Sie bei der Studienfachberatung Wirtschaftswissenschaften: \nSprechzeiten und Kontaktmöglichkeiten\n\n\nWeitere Informationen finden Sie auch auf der Website: \nhttps://www.wiwi.uni-frankfurt.de/"
|
||||
}
|
||||
],
|
||||
"level": 1,
|
||||
"academicTerm": {
|
||||
"acronym": "WiSe 2022/23",
|
||||
"alternateNames": ["Winter 2022/23"],
|
||||
"endDate": "2023-03-31T21:59:59.999Z",
|
||||
"eventsEndDate": "2023-02-10T22:59:59.999Z",
|
||||
"eventsStartDate": "2022-10-16T22:00:00.000Z",
|
||||
"name": "Wintersemester 2022/23",
|
||||
"startDate": "2022-09-30T22:00:00.000Z",
|
||||
"type": "semester",
|
||||
"uid": "d8045576-799a-5bec-85be-bc0026a76509"
|
||||
},
|
||||
"identifiers": {
|
||||
"LSF": "94694"
|
||||
},
|
||||
"origin": {
|
||||
"indexed": "2023-02-24T23:14:58.027Z",
|
||||
"name": "Goethe-Uni QIS / LSF",
|
||||
"type": "remote"
|
||||
},
|
||||
"name": "Wirtschaftssprachen",
|
||||
"categories": ["university events"],
|
||||
"type": "catalog",
|
||||
"superCatalog": {
|
||||
"categories": ["university events"],
|
||||
"identifiers": {
|
||||
"LSF": "92339"
|
||||
},
|
||||
"level": 0,
|
||||
"name": "FB 2 - Wirtschaftswissenschaften",
|
||||
"type": "catalog",
|
||||
"uid": "ed67e49a-927e-5051-aa03-140385553945",
|
||||
"description": "Alle Veranstaltungen beginnen grundsätzlich in der ersten Vorlesungswoche, es sei denn, es ist im Folgenden anders vermerkt.\nBis zum Semesterbeginn haben alle Angaben nur vorläufigen Charakter.\n\nBeratung zu allen Fragen erhalten Sie bei der Studienfachberatung Wirtschaftswissenschaften: \nSprechzeiten und Kontaktmöglichkeiten\n\n\nWeitere Informationen finden Sie auch auf der Website: \nhttps://www.wiwi.uni-frankfurt.de/"
|
||||
}
|
||||
}
|
||||
],
|
||||
"facets": [
|
||||
{
|
||||
"buckets": [
|
||||
{
|
||||
"count": 6,
|
||||
"key": "catalog"
|
||||
}
|
||||
],
|
||||
"field": "type"
|
||||
},
|
||||
{
|
||||
"buckets": [
|
||||
{
|
||||
"count": 6,
|
||||
"key": "WiSe 2022/23"
|
||||
}
|
||||
],
|
||||
"field": "academicTerm.acronym",
|
||||
"onlyOnType": "catalog"
|
||||
},
|
||||
{
|
||||
"buckets": [
|
||||
{
|
||||
"count": 6,
|
||||
"key": "university events"
|
||||
}
|
||||
],
|
||||
"field": "categories",
|
||||
"onlyOnType": "catalog"
|
||||
},
|
||||
{
|
||||
"buckets": [
|
||||
{
|
||||
"count": 6,
|
||||
"key": "university events"
|
||||
}
|
||||
],
|
||||
"field": "superCatalog.categories",
|
||||
"onlyOnType": "catalog"
|
||||
},
|
||||
{
|
||||
"buckets": [
|
||||
{
|
||||
"count": 6,
|
||||
"key": "university events"
|
||||
}
|
||||
],
|
||||
"field": "superCatalogs.categories",
|
||||
"onlyOnType": "catalog"
|
||||
}
|
||||
],
|
||||
"pagination": {
|
||||
"count": 6,
|
||||
"offset": 0,
|
||||
"total": 6
|
||||
},
|
||||
"stats": {
|
||||
"time": 3
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"filter": {
|
||||
"arguments": {
|
||||
"field": "type",
|
||||
"value": "semester"
|
||||
},
|
||||
"type": "value"
|
||||
}
|
||||
}
|
||||
209
frontend/app/cypress/fixtures/catalog/semesters.search.res.json
Normal file
209
frontend/app/cypress/fixtures/catalog/semesters.search.res.json
Normal file
@@ -0,0 +1,209 @@
|
||||
{
|
||||
"data": [
|
||||
{
|
||||
"uid": "ff2626e2-c1d8-5cd0-a6a2-cc68547a8079",
|
||||
"alternateNames": ["Winter 2019/20"],
|
||||
"acronym": "WiSe 2019/20",
|
||||
"endDate": "2020-03-31T21:59:59.999Z",
|
||||
"eventsStartDate": "2019-10-13T22:00:00.000Z",
|
||||
"origin": {
|
||||
"indexed": "2023-02-24T23:14:26.429Z",
|
||||
"name": "Goethe-Uni QIS / LSF",
|
||||
"type": "remote"
|
||||
},
|
||||
"name": "Wintersemester 2019/20",
|
||||
"eventsEndDate": "2020-02-14T22:59:59.999Z",
|
||||
"type": "semester",
|
||||
"startDate": "2019-09-30T22:00:00.000Z"
|
||||
},
|
||||
{
|
||||
"uid": "283210ef-60fd-571c-b2d7-233a223d815c",
|
||||
"alternateNames": ["Sommer 2019"],
|
||||
"acronym": "SoSe 2019",
|
||||
"endDate": "2019-09-30T21:59:59.999Z",
|
||||
"eventsStartDate": "2019-04-14T22:00:00.000Z",
|
||||
"origin": {
|
||||
"indexed": "2023-02-24T23:14:26.427Z",
|
||||
"name": "Goethe-Uni QIS / LSF",
|
||||
"type": "remote"
|
||||
},
|
||||
"name": "Sommersemester 2019",
|
||||
"eventsEndDate": "2019-07-19T21:59:59.999Z",
|
||||
"type": "semester",
|
||||
"startDate": "2019-03-31T22:00:00.000Z"
|
||||
},
|
||||
{
|
||||
"uid": "e9333354-79c5-5afc-8c28-e5e7079956ed",
|
||||
"alternateNames": ["Sommer 2020"],
|
||||
"acronym": "SoSe 2020",
|
||||
"endDate": "2020-09-30T21:59:59.999Z",
|
||||
"eventsStartDate": "2020-04-13T22:00:00.000Z",
|
||||
"origin": {
|
||||
"indexed": "2023-02-24T23:14:26.430Z",
|
||||
"name": "Goethe-Uni QIS / LSF",
|
||||
"type": "remote"
|
||||
},
|
||||
"name": "Sommersemester 2020",
|
||||
"eventsEndDate": "2020-07-17T21:59:59.999Z",
|
||||
"type": "semester",
|
||||
"startDate": "2020-03-31T22:00:00.000Z"
|
||||
},
|
||||
{
|
||||
"uid": "34757b85-6f96-5b72-adc4-b96ef4c67037",
|
||||
"alternateNames": ["Winter 2020/21"],
|
||||
"acronym": "WiSe 2020/21",
|
||||
"endDate": "2021-03-31T21:59:59.999Z",
|
||||
"eventsStartDate": "2020-11-01T23:00:00.000Z",
|
||||
"origin": {
|
||||
"indexed": "2023-02-24T23:14:26.431Z",
|
||||
"name": "Goethe-Uni QIS / LSF",
|
||||
"type": "remote"
|
||||
},
|
||||
"name": "Wintersemester 2020/21",
|
||||
"eventsEndDate": "2020-02-21T22:59:59.999Z",
|
||||
"type": "semester",
|
||||
"startDate": "2020-09-30T22:00:00.000Z"
|
||||
},
|
||||
{
|
||||
"uid": "dbf1d23d-5ee9-58d6-af40-f64f3b3019fa",
|
||||
"alternateNames": ["Sommer 2021"],
|
||||
"acronym": "SoSe 2021",
|
||||
"endDate": "2021-09-30T21:59:59.999Z",
|
||||
"eventsStartDate": "2021-04-11T22:00:00.000Z",
|
||||
"origin": {
|
||||
"indexed": "2023-02-24T23:14:26.431Z",
|
||||
"name": "Goethe-Uni QIS / LSF",
|
||||
"type": "remote"
|
||||
},
|
||||
"name": "Sommersemester 2021",
|
||||
"eventsEndDate": "2021-07-16T21:59:59.999Z",
|
||||
"type": "semester",
|
||||
"startDate": "2021-03-31T22:00:00.000Z"
|
||||
},
|
||||
{
|
||||
"uid": "049ab143-8b77-5dcc-95e9-8bb6755f3db4",
|
||||
"alternateNames": ["Winter 2021/22"],
|
||||
"acronym": "WiSe 2021/22",
|
||||
"endDate": "2022-03-31T21:59:59.999Z",
|
||||
"eventsStartDate": "2021-10-17T22:00:00.000Z",
|
||||
"origin": {
|
||||
"indexed": "2023-02-24T23:14:26.432Z",
|
||||
"name": "Goethe-Uni QIS / LSF",
|
||||
"type": "remote"
|
||||
},
|
||||
"name": "Wintersemester 2021/22",
|
||||
"eventsEndDate": "2022-02-18T22:59:59.999Z",
|
||||
"type": "semester",
|
||||
"startDate": "2021-09-30T22:00:00.000Z"
|
||||
},
|
||||
{
|
||||
"uid": "4b2766cb-e16d-5698-b5b3-e650613d497a",
|
||||
"alternateNames": ["Sommer 2022"],
|
||||
"acronym": "SoSe 2022",
|
||||
"endDate": "2022-09-30T21:59:59.999Z",
|
||||
"eventsStartDate": "2022-04-10T22:00:00.000Z",
|
||||
"origin": {
|
||||
"indexed": "2023-02-24T23:14:26.433Z",
|
||||
"name": "Goethe-Uni QIS / LSF",
|
||||
"type": "remote"
|
||||
},
|
||||
"name": "Sommersemester 2022",
|
||||
"eventsEndDate": "2022-07-15T21:59:59.999Z",
|
||||
"type": "semester",
|
||||
"startDate": "2022-03-31T22:00:00.000Z"
|
||||
},
|
||||
{
|
||||
"uid": "d8045576-799a-5bec-85be-bc0026a76509",
|
||||
"alternateNames": ["Winter 2022/23"],
|
||||
"acronym": "WiSe 2022/23",
|
||||
"endDate": "2023-03-31T21:59:59.999Z",
|
||||
"eventsStartDate": "2022-10-16T22:00:00.000Z",
|
||||
"origin": {
|
||||
"indexed": "2023-02-24T23:14:26.433Z",
|
||||
"name": "Goethe-Uni QIS / LSF",
|
||||
"type": "remote"
|
||||
},
|
||||
"name": "Wintersemester 2022/23",
|
||||
"eventsEndDate": "2023-02-10T22:59:59.999Z",
|
||||
"type": "semester",
|
||||
"startDate": "2022-09-30T22:00:00.000Z"
|
||||
},
|
||||
{
|
||||
"uid": "7391f2ee-8f3b-577b-890a-a3f4f4728a9d",
|
||||
"alternateNames": ["Sommer 2023"],
|
||||
"acronym": "SoSe 2023",
|
||||
"endDate": "2023-09-30T21:59:59.999Z",
|
||||
"eventsStartDate": "2023-04-10T22:00:00.000Z",
|
||||
"origin": {
|
||||
"indexed": "2023-02-24T23:14:26.434Z",
|
||||
"name": "Goethe-Uni QIS / LSF",
|
||||
"type": "remote"
|
||||
},
|
||||
"name": "Sommersemester 2023",
|
||||
"eventsEndDate": "2023-07-14T21:59:59.999Z",
|
||||
"type": "semester",
|
||||
"startDate": "2023-03-31T22:00:00.000Z"
|
||||
}
|
||||
],
|
||||
"facets": [
|
||||
{
|
||||
"buckets": [
|
||||
{
|
||||
"count": 9,
|
||||
"key": "semester"
|
||||
}
|
||||
],
|
||||
"field": "type"
|
||||
},
|
||||
{
|
||||
"buckets": [
|
||||
{
|
||||
"count": 1,
|
||||
"key": "SoSe 2019"
|
||||
},
|
||||
{
|
||||
"count": 1,
|
||||
"key": "SoSe 2020"
|
||||
},
|
||||
{
|
||||
"count": 1,
|
||||
"key": "SoSe 2021"
|
||||
},
|
||||
{
|
||||
"count": 1,
|
||||
"key": "SoSe 2022"
|
||||
},
|
||||
{
|
||||
"count": 1,
|
||||
"key": "SoSe 2023"
|
||||
},
|
||||
{
|
||||
"count": 1,
|
||||
"key": "WiSe 2019/20"
|
||||
},
|
||||
{
|
||||
"count": 1,
|
||||
"key": "WiSe 2020/21"
|
||||
},
|
||||
{
|
||||
"count": 1,
|
||||
"key": "WiSe 2021/22"
|
||||
},
|
||||
{
|
||||
"count": 1,
|
||||
"key": "WiSe 2022/23"
|
||||
}
|
||||
],
|
||||
"field": "acronym",
|
||||
"onlyOnType": "semester"
|
||||
}
|
||||
],
|
||||
"pagination": {
|
||||
"count": 9,
|
||||
"offset": 0,
|
||||
"total": 9
|
||||
},
|
||||
"stats": {
|
||||
"time": 2
|
||||
}
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user