This commit is contained in:
Jan Barfuss 2024-03-20 00:04:26 +01:00
parent 3c6ab561fd
commit 099a388e23
19 changed files with 120 additions and 2589 deletions

View File

@ -1,11 +0,0 @@
FROM node:latest as build-stage
WORKDIR /app
COPY package*.json ./
RUN npm i
COPY . .
FROM build-stage as production
ENV NODE_PATH=./build
RUN npm run build

View File

@ -1,9 +0,0 @@
up:
docker-compose up -d
up-prod:
docker-compose -f docker-compose.yml -f docker-compose.prod.yml up
# docker-compose -f docker-compose.yml -f docker-compose.prod.yml up --build -d
down:
docker-compose down

View File

@ -1,18 +1 @@
# Mensa-API
## Usage
```
npm install
npx tsc
node ./dist/index.js
```
### Dev
```
make up
```
### Prod
```
make up-prod
```

View File

@ -3,7 +3,7 @@ package main
import (
"net/http"
"fetch"
"github.com/LeRoid-hub/Mensa-API/blob/go/api/fetch.go"
"github.com/gin-gonic/gin"
)

View File

@ -1,7 +0,0 @@
version: '3.7'
services:
mensa-api-docker:
build:
target: production
command: node build/index.js

View File

@ -1,17 +0,0 @@
version: '3.7'
services:
mensa-api-docker:
build:
context: .
dockerfile: Dockerfile
target: build-stage
volumes:
- ./src:/home/node/app/src
- ./nodemon.json:/home/node/app/nodemon.json
container_name: mensa-api-docker
expose:
- '4000'
ports:
- '4000:4000'
command: npm run dev

View File

@ -1 +0,0 @@
TypeDoc added this file to prevent GitHub Pages from using Jekyll. You can turn off this behavior by setting the `githubPages` option to false.

View File

@ -1,20 +0,0 @@
mensa-api / [Exports](modules.md)
# Mensa-API
## Usage
```
npm install
npx tsc
node ./dist/index.js
```
### Dev
```
make up
```
### Prod
```
make up-prod
```

View File

@ -1,70 +0,0 @@
[mensa-api](README.md) / Exports
# mensa-api
## Table of contents
### Functions
- [stripCampus](modules.md#stripcampus)
- [stripMensa](modules.md#stripmensa)
## Functions
### stripCampus
**stripCampus**(`html`): `JSON`
This function strips the html from the campus and Bundesland page and returns a JSON object
#### Parameters
| Name | Type | Description |
| :------ | :------ | :------ |
| `html` | `string` | The html of the campus or Bundesland page |
#### Returns
`JSON`
JSON object
**`Example`**
```ts
stripCampus(html);
```
#### Defined in
[stripper.ts:141](https://github.com/LeRoid-hub/Mensa-API/blob/5e9a6b1/src/stripper.ts#L141)
___
### stripMensa
**stripMensa**(`html`): `string`
This function strips the html from the mensa page and returns a JSON object
#### Parameters
| Name | Type | Description |
| :------ | :------ | :------ |
| `html` | `string` | The html of the mensa page |
#### Returns
`string`
JSON object
**`Example`**
```ts
stripMensa(html);
```
#### Defined in
[stripper.ts:168](https://github.com/LeRoid-hub/Mensa-API/blob/5e9a6b1/src/stripper.ts#L168)

32
go.mod Normal file
View File

@ -0,0 +1,32 @@
module mensa
go 1.22.1
require github.com/gin-gonic/gin v1.9.1
require (
github.com/bytedance/sonic v1.9.1 // indirect
github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 // indirect
github.com/gabriel-vasile/mimetype v1.4.2 // indirect
github.com/gin-contrib/sse v0.1.0 // indirect
github.com/go-playground/locales v0.14.1 // indirect
github.com/go-playground/universal-translator v0.18.1 // indirect
github.com/go-playground/validator/v10 v10.14.0 // indirect
github.com/goccy/go-json v0.10.2 // indirect
github.com/json-iterator/go v1.1.12 // indirect
github.com/klauspost/cpuid/v2 v2.2.4 // indirect
github.com/leodido/go-urn v1.2.4 // indirect
github.com/mattn/go-isatty v0.0.19 // indirect
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.2 // indirect
github.com/pelletier/go-toml/v2 v2.0.8 // indirect
github.com/twitchyliquid64/golang-asm v0.15.1 // indirect
github.com/ugorji/go/codec v1.2.11 // indirect
golang.org/x/arch v0.3.0 // indirect
golang.org/x/crypto v0.9.0 // indirect
golang.org/x/net v0.10.0 // indirect
golang.org/x/sys v0.8.0 // indirect
golang.org/x/text v0.9.0 // indirect
google.golang.org/protobuf v1.30.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
)

86
go.sum Normal file
View File

@ -0,0 +1,86 @@
github.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=
github.com/bytedance/sonic v1.9.1 h1:6iJ6NqdoxCDr6mbY8h18oSO+cShGSMRGCEo7F2h0x8s=
github.com/bytedance/sonic v1.9.1/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=
github.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY=
github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 h1:qSGYFH7+jGhDF8vLC+iwCD4WpbV1EBDSzWkJODFLams=
github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/gabriel-vasile/mimetype v1.4.2 h1:w5qFW6JKBz9Y393Y4q372O9A7cUSequkh1Q7OhCmWKU=
github.com/gabriel-vasile/mimetype v1.4.2/go.mod h1:zApsH/mKG4w07erKIaJPFiX0Tsq9BFQgN3qGY5GnNgA=
github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE=
github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI=
github.com/gin-gonic/gin v1.9.1 h1:4idEAncQnU5cB7BeOkPtxjfCSye0AAm1R0RVIqJ+Jmg=
github.com/gin-gonic/gin v1.9.1/go.mod h1:hPrL7YrpYKXt5YId3A/Tnip5kqbEAP+KLuI3SUcPTeU=
github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s=
github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4=
github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA=
github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY=
github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY=
github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY=
github.com/go-playground/validator/v10 v10.14.0 h1:vgvQWe3XCz3gIeFDm/HnTIbj6UGmg/+t63MyGU2n5js=
github.com/go-playground/validator/v10 v10.14.0/go.mod h1:9iXMNT7sEkjXb0I+enO7QXmzG6QCsPWY4zveKFVRSyU=
github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU=
github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=
github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU=
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
github.com/klauspost/cpuid/v2 v2.2.4 h1:acbojRNwl3o09bUq+yDCtZFc1aiwaAAxtcn8YkZXnvk=
github.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=
github.com/leodido/go-urn v1.2.4 h1:XlAE/cm/ms7TE/VMVoduSpNBoyc2dOxHs5MZSwAN63Q=
github.com/leodido/go-urn v1.2.4/go.mod h1:7ZrI8mTSeBSHl/UaRyKQW1qZeMgak41ANeCNaVckg+4=
github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA=
github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=
github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
github.com/pelletier/go-toml/v2 v2.0.8 h1:0ctb6s9mE31h0/lhu+J6OPmVeDxJn+kYnJc2jZR9tGQ=
github.com/pelletier/go-toml/v2 v2.0.8/go.mod h1:vuYfssBdrU2XDZ9bYydBu6t+6a6PYNcZljzZR9VXg+4=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
github.com/stretchr/testify v1.8.3 h1:RP3t2pwF7cMEbC1dqtB6poj3niw/9gnV4Cjg5oW5gtY=
github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=
github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=
github.com/ugorji/go/codec v1.2.11 h1:BMaWp1Bb6fHwEtbplGBGJ498wD+LKlNSl25MjdZY4dU=
github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg=
golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=
golang.org/x/arch v0.3.0 h1:02VY4/ZcO/gBOH6PUaoiptASxtXU10jazRCP865E97k=
golang.org/x/arch v0.3.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=
golang.org/x/crypto v0.9.0 h1:LF6fAI+IutBocDJ2OT0Q1g8plpYljMZ4+lty+dsqw3g=
golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0=
golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M=
golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.8.0 h1:EBmGv8NaZBZTWvrbjNoL6HVt+IVy3QDQpJs7VRIw3tU=
golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE=
golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
google.golang.org/protobuf v1.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng=
google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=

View File

@ -1,6 +0,0 @@
{
"verbose": true,
"ignore": [],
"watch": ["src/**/*.ts"],
"exec": "ts-node ./src/index.ts"
}

1904
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -1,33 +0,0 @@
{
"name": "mensa-api",
"version": "1.0.0",
"description": "",
"main": "dist/index.js",
"scripts": {
"start": "NODE_PATH=./build node build/index.js",
"build": "tsc -p .",
"dev": "nodemon src/index.ts"
},
"author": "Jan Barfuss",
"license": "ISC",
"dependencies": {
"@types/cors": "^2.8.17",
"@types/morgan": "^1.9.9",
"axios": "^1.6.2",
"body-parser": "^1.20.2",
"cheerio": "^1.0.0-rc.12",
"cors": "^2.8.5",
"dotenv": "^16.3.1",
"express": "^4.18.2",
"morgan": "^1.10.0"
},
"devDependencies": {
"@types/express": "^4.17.21",
"@types/node": "^20.10.5",
"nodemon": "^3.0.2",
"ts-node": "^10.9.2",
"typedoc": "^0.25.4",
"typedoc-plugin-markdown": "^3.17.1",
"typescript": "^5.3.3"
}
}

View File

@ -1,61 +0,0 @@
class SiteCache {
cachedData: any;
lastUsed: Date;
lifeTime: number;
key: string;
constructor() {
this.cachedData = null;
this.lastUsed = new Date();
this.lifeTime = 1000 * 30;
this.key = "";
}
get() {
if (Date.now() - this.lastUsed.getTime() > this.lifeTime) {
return null;
}
if (this.cachedData == null) {
return null;
}
return this.cachedData;
}
set(key: string, data: any, lifeTime: number = 1000 * 60 * 30) {
this.cachedData = data;
this.lastUsed = new Date();
this.key = key;
this.lifeTime = lifeTime;
}
}
export default class Cache {
cache: SiteCache[];
constructor() {
this.cache = [];
}
get(key: string) {
for (let i = 0; i < this.cache.length; i++) {
if (this.cache[i].key === key) {
return this.cache[i].get();
}
}
return null;
}
set(key: string, data: any, lifeTime: number = 1000 * 60 * 30) {
for (let i = 0; i < this.cache.length; i++) {
if (this.cache[i].key === key) {
this.cache[i].set(key, data, lifeTime);
return;
}
}
let siteCache = new SiteCache();
siteCache.set(key, data);
this.cache.push(siteCache);
}
}

View File

@ -1,23 +0,0 @@
import axios from 'axios';
const isUrl = (url: string) => {
try {
new URL(url);
return true;
} catch (err) {
return false;
}
}
export default async function fetch(url: string) {
if (!isUrl(url)) {
throw new Error('Invalid URL');
}
try {
const res = await axios.get(url)
return res.data;
} catch (err) {
console.log(err);
return null;
}
}

View File

@ -1,93 +0,0 @@
// index.ts
/**
* @file This is the main file of the project.
* @version 1.0.0
*/
import express, { Express, Request, Response} from "express";
import dotenv from "dotenv";
import cors from "cors";
import bodyParser, { text } from "body-parser";
import morgan from "morgan";
import fetch from './fetch.js';
import Cache from './cache.js';
import {stripMensa, stripCampus} from "./stripper.js";
dotenv.config();
const app: Express = express().use(cors({ origin: '*' })).use(bodyParser.json());
app.use(morgan('combined'))
const port = process.env.PORT || 3000;
const baseUrl = "https://www.imensa.de/";
const cache = new Cache();
app.get("/", (req: Request, res: Response) => {
res.send("Mensa API");
});
app.get("/api/bl/:Bundesland", (req: Request, res: Response) => {
if (req.params.Bundesland === undefined) {
return res.send("Invalid request");
}
let cachedData = cache.get("BL: "+req.params.Bundesland);
if (cachedData !== null) {
return res.send(cachedData);
}else {
let url = baseUrl + req.params.Bundesland.toLowerCase()+".html";
fetch(url).then((data) => {
let stripedData = null;
if (data === null) {
return res.send("Invalid request");
}
stripedData = stripCampus(data);
const lifeTime = 1000 * 60 * 60 * 24 * 7;
cache.set("BL: "+req.params.Bundesland, stripedData, lifeTime);
res.send(stripedData);
});
}
});
app.get("/api/:Location/:Mensa?", (req: Request, res: Response) => {
if (req.params.Location === undefined) {
return res.send("Invalid request");
}
let cachedData = cache.get(req.params.Mensa ?? req.params.Location);
if (cachedData !== null) {
return res.send(cachedData);
}else {
let url = baseUrl + req.params.Location.toLowerCase();
if (req.params.Mensa !== undefined) {
url += "/" + req.params.Mensa.toLowerCase();
}
fetch(url).then((data) => {
let stripedData = null;
let lifeTime = 1000 * 30;
if (data === null) {
return res.send("Invalid request");
}
if (req.params.Mensa !== undefined) {
stripedData = stripMensa(data);
lifeTime = 1000 * 60 * 60 * 24;
}else {
stripedData = stripCampus(data);
lifeTime = 1000 * 60 * 30;
}
cache.set(req.params.Mensa ?? req.params.Location, stripedData);
res.send(stripedData);
});
}
});
app.get("/api", (req: Request, res: Response) => {
res.send("/api/:Location/:Mensa?");
});
app.listen(port, () => {
console.log(`[server]: Server is running at http://localhost:${port}`);
});

View File

@ -1,202 +0,0 @@
import * as cheerio from 'cheerio';
/**
* This class represents a Campus or Bundesland
*@class campus
*@property {string} name The name of the Campus or Bundesland
*@property {mensa[]} locations The locations of the Campus or Bundesland
*/
class Campus {
name: string;
locations: Mensa[];
/**
* constructor for campus
* @param name The name of the Campus or Bundesland
* @returns Campus
* @example
* let campus = new Campus("Campus");
*/
constructor(name: string) {
this.name = name;
this.locations = [];
}
/**
* This function adds a location to the Campus or Bundesland
* @param mensa The location or to add
* @returns void
* @example
* campus.addMensa(mensa);
*/
addMensa(mensa: Mensa) {
this.locations.push(mensa);
}
/**
* This function returns a string representation of the Campus or Bundesland
*/
toString() {
let str = this.name + "\n";
this.locations.forEach((elem) => {
str += " -> " + elem.name + " | " + elem.url + "\n";
});
return str;
}
}
/**
* This class represents a mensa
*@class Mensa
*@property {string} name The name of the Mensa
*@property {string} url The url of the mensa
*/
class Mensa {
name: string;
url: string;
/**
* constructor for mensa
* @param name The name of the mensa
* @param url The url of the Mensa
* @example
* let mensa = new Mensa("Mensa", url;
*/
constructor(name: string, url: string) {
this.name = name;
this.url = url;
}
}
/**
* This class represents a menus
*@class menus
*@property {string} name The name of the menus
*@property {meal[]} meals The meals of the menus
*/
class Menu {
name: string;
meals: Meal[];
/**
* constructor for menus
* @param name The name of the menus
*/
constructor(name: string) {
this.name = name;
this.meals = [];
}
/**
* This function adds a meal to the menus
* @param meal The meal to add
* @returns void
* @example
* menu.addMeal(meal);
*/
addMeal(meal: Meal) {
this.meals.push(meal);
}
/**
* This function returns a string representation of the menus
* @returns string
*/
toString() {
let str = this.name + "\n";
this.meals.forEach((elem) => {
str += " -> " + elem.name + " | " + elem.price + " | " + elem.atributs + "\n";
});
return str;
}
}
class Meal {
name: string;
price: string;
atributs: string[];
/**
* constructor for meals
* @param name The name of the meal
* @param price The price of the meals
* @param atributs The atributs of the meals
* @example
* let meal = new Meal("Pommes", "2,50€", ["vegan", "vegetarisch"]);
*/
constructor(name: string, price: string, atributs: string[] ) {
this.name = name;
this.price = price;
this.atributs = atributs;
}
}
/**
* This function strips the html from the campus and Bundesland page and returns a JSON object
* @param html The html of the campus or Bundesland page
* @returns JSON object
* @example
* stripCampus(html);
*/
export function stripCampus(html: string): JSON {
const $ = cheerio.load(html);
let ort :Campus[] = [];
const $campus = $('.tagged').find('.group');
$campus.each((i, elem) => {
let campus = new Campus($(elem).find('h2').text());
//console.log($(elem).find('h2').text() + "\n");
$(elem).find('a').each((i, elem) => {
const link = $(elem).attr('href')?.replace("/index.html","");
campus.addMensa(new Mensa($(elem).text(), link ?? ""));
//console.log(" -> " + $(elem).text() + " | " + $(elem).attr('href')?.replace("/index.html","") + "\n");
});
ort.push(campus);
});
return JSON.parse(JSON.stringify(ort));
}
/**
* This function strips the html from the mensa page and returns a JSON object
* @param html The html of the mensa page
* @returns JSON object
* @example
* stripMensa(html);
*/
export function stripMensa(html: string): string {
const $ = cheerio.load(html);
let menus :Menu[] = [];
const $menu = $('.aw-meal-category');
$menu.each((i, elem) => {
const menu = new Menu($(elem).find('h3').text());
//meal
$(elem).find('.aw-meal').each((i, elem) => {
const name = $(elem).find('.aw-meal-description').text();
const price = $(elem).find('.aw-meal-price').text();
//delete last time served
$(elem).find('.aw-meal-attributes').find('.hidden-md').remove();
const atributs :string[] = $(elem).find('.aw-meal-attributes').text().split(" ");
atributs.forEach((elem, i) => {
elem = elem.trim();
atributs[i] = elem;
});
menu.addMeal(new Meal(name, price, atributs));
});
menus.push(menu);
});
if (menus.length === 0) {
return JSON.parse("No usable Data found");
}
return JSON.parse(JSON.stringify(menus));
}

View File

@ -1,113 +0,0 @@
{
"compilerOptions": {
/* Visit https://aka.ms/tsconfig to read more about this file */
/* Projects */
// "incremental": true, /* Save .tsbuildinfo files to allow for incremental compilation of projects. */
// "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */
// "tsBuildInfoFile": "./.tsbuildinfo", /* Specify the path to .tsbuildinfo incremental compilation file. */
// "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects. */
// "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */
// "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */
/* Language and Environment */
"target": "es2016", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */
// "lib": [], /* Specify a set of bundled library declaration files that describe the target runtime environment. */
// "jsx": "preserve", /* Specify what JSX code is generated. */
// "experimentalDecorators": true, /* Enable experimental support for legacy experimental decorators. */
// "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */
// "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h'. */
// "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */
// "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using 'jsx: react-jsx*'. */
// "reactNamespace": "", /* Specify the object invoked for 'createElement'. This only applies when targeting 'react' JSX emit. */
// "noLib": true, /* Disable including any library files, including the default lib.d.ts. */
// "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */
// "moduleDetection": "auto", /* Control what method is used to detect module-format JS files. */
/* Modules */
"module": "commonjs", /* Specify what module code is generated. */
// "rootDir": "./", /* Specify the root folder within your source files. */
// "moduleResolution": "node10", /* Specify how TypeScript looks up a file from a given module specifier. */
// "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */
// "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */
// "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */
// "typeRoots": [], /* Specify multiple folders that act like './node_modules/@types'. */
// "types": [], /* Specify type package names to be included without being referenced in a source file. */
// "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */
// "moduleSuffixes": [], /* List of file name suffixes to search when resolving a module. */
// "allowImportingTsExtensions": true, /* Allow imports to include TypeScript file extensions. Requires '--moduleResolution bundler' and either '--noEmit' or '--emitDeclarationOnly' to be set. */
// "resolvePackageJsonExports": true, /* Use the package.json 'exports' field when resolving package imports. */
// "resolvePackageJsonImports": true, /* Use the package.json 'imports' field when resolving imports. */
// "customConditions": [], /* Conditions to set in addition to the resolver-specific defaults when resolving imports. */
// "resolveJsonModule": true, /* Enable importing .json files. */
// "allowArbitraryExtensions": true, /* Enable importing files with any extension, provided a declaration file is present. */
// "noResolve": true, /* Disallow 'import's, 'require's or '<reference>'s from expanding the number of files TypeScript should add to a project. */
/* JavaScript Support */
// "allowJs": true, /* Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files. */
// "checkJs": true, /* Enable error reporting in type-checked JavaScript files. */
// "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from 'node_modules'. Only applicable with 'allowJs'. */
/* Emit */
// "declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */
// "declarationMap": true, /* Create sourcemaps for d.ts files. */
// "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */
// "sourceMap": true, /* Create source map files for emitted JavaScript files. */
// "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */
// "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If 'declaration' is true, also designates a file that bundles all .d.ts output. */
"outDir": "./dist", /* Specify an output folder for all emitted files. */
// "removeComments": true, /* Disable emitting comments. */
// "noEmit": true, /* Disable emitting files from a compilation. */
// "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */
// "importsNotUsedAsValues": "remove", /* Specify emit/checking behavior for imports that are only used for types. */
// "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */
// "sourceRoot": "", /* Specify the root path for debuggers to find the reference source code. */
// "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */
// "inlineSources": true, /* Include source code in the sourcemaps inside the emitted JavaScript. */
// "emitBOM": true, /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */
// "newLine": "crlf", /* Set the newline character for emitting files. */
// "stripInternal": true, /* Disable emitting declarations that have '@internal' in their JSDoc comments. */
// "noEmitHelpers": true, /* Disable generating custom helper functions like '__extends' in compiled output. */
// "noEmitOnError": true, /* Disable emitting files if any type checking errors are reported. */
// "preserveConstEnums": true, /* Disable erasing 'const enum' declarations in generated code. */
// "declarationDir": "./", /* Specify the output directory for generated declaration files. */
// "preserveValueImports": true, /* Preserve unused imported values in the JavaScript output that would otherwise be removed. */
/* Interop Constraints */
// "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */
// "verbatimModuleSyntax": true, /* Do not transform or elide any imports or exports not marked as type-only, ensuring they are written in the output file's format based on the 'module' setting. */
// "allowSyntheticDefaultImports": true, /* Allow 'import x from y' when a module doesn't have a default export. */
"esModuleInterop": true, /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */
// "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */
"forceConsistentCasingInFileNames": true, /* Ensure that casing is correct in imports. */
/* Type Checking */
"strict": true, /* Enable all strict type-checking options. */
// "noImplicitAny": true, /* Enable error reporting for expressions and declarations with an implied 'any' type. */
// "strictNullChecks": true, /* When type checking, take into account 'null' and 'undefined'. */
// "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */
// "strictBindCallApply": true, /* Check that the arguments for 'bind', 'call', and 'apply' methods match the original function. */
// "strictPropertyInitialization": true, /* Check for class properties that are declared but not set in the constructor. */
// "noImplicitThis": true, /* Enable error reporting when 'this' is given the type 'any'. */
// "useUnknownInCatchVariables": true, /* Default catch clause variables as 'unknown' instead of 'any'. */
// "alwaysStrict": true, /* Ensure 'use strict' is always emitted. */
// "noUnusedLocals": true, /* Enable error reporting when local variables aren't read. */
// "noUnusedParameters": true, /* Raise an error when a function parameter isn't read. */
// "exactOptionalPropertyTypes": true, /* Interpret optional property types as written, rather than adding 'undefined'. */
// "noImplicitReturns": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */
// "noFallthroughCasesInSwitch": true, /* Enable error reporting for fallthrough cases in switch statements. */
// "noUncheckedIndexedAccess": true, /* Add 'undefined' to a type when accessed using an index. */
// "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier. */
// "noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type. */
// "allowUnusedLabels": true, /* Disable error reporting for unused labels. */
// "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */
/* Completeness */
// "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */
"skipLibCheck": true /* Skip type checking all .d.ts files. */
},
"typedocOptions": {
"entryPoints": ["src/index.ts"],
"out": "docs"
}
}