mirror of
https://github.com/LeRoid-hub/Mensa-API.git
synced 2025-01-31 03:34:57 +00:00
huh
This commit is contained in:
parent
3c6ab561fd
commit
099a388e23
11
Dockerfile
11
Dockerfile
@ -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
|
9
Makefile
9
Makefile
@ -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
|
19
README.md
19
README.md
@ -1,18 +1 @@
|
||||
# Mensa-API
|
||||
|
||||
## Usage
|
||||
```
|
||||
npm install
|
||||
npx tsc
|
||||
node ./dist/index.js
|
||||
```
|
||||
|
||||
### Dev
|
||||
```
|
||||
make up
|
||||
```
|
||||
|
||||
### Prod
|
||||
```
|
||||
make up-prod
|
||||
```
|
||||
# Mensa-API
|
||||
|
@ -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"
|
||||
)
|
||||
|
||||
|
@ -1,7 +0,0 @@
|
||||
version: '3.7'
|
||||
|
||||
services:
|
||||
mensa-api-docker:
|
||||
build:
|
||||
target: production
|
||||
command: node build/index.js
|
@ -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
|
@ -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.
|
@ -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
|
||||
```
|
@ -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
32
go.mod
Normal 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
86
go.sum
Normal 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=
|
@ -1,6 +0,0 @@
|
||||
{
|
||||
"verbose": true,
|
||||
"ignore": [],
|
||||
"watch": ["src/**/*.ts"],
|
||||
"exec": "ts-node ./src/index.ts"
|
||||
}
|
1904
package-lock.json
generated
1904
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
33
package.json
33
package.json
@ -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"
|
||||
}
|
||||
}
|
61
src/cache.ts
61
src/cache.ts
@ -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);
|
||||
}
|
||||
}
|
23
src/fetch.ts
23
src/fetch.ts
@ -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;
|
||||
}
|
||||
}
|
93
src/index.ts
93
src/index.ts
@ -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}`);
|
||||
});
|
202
src/stripper.ts
202
src/stripper.ts
@ -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));
|
||||
}
|
||||
|
113
tsconfig.json
113
tsconfig.json
@ -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"
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user