Übersicht über Fixkosten (Einnahmen/Ausgaben)
Ein Nutzer kann wiederkehrende Einnahmen und Ausgaben in der Anwendung registrieren.
- id
- firstName
- lastName
- phone
- password
- salt
- active
Eine einmalige Einnahme/Ausgabe muss einer Kategorie zugeordnet werden.
- id
- name
- category
- amount
- date
Eine Vertrag muss einer Kategorie zugeordnet werden und kann um ein Dokument ergänzt werden.
- id
- name
- category
- amount
- startDate
- endDate
- interval (monatlich, quartalsweise, halbjährlich, jährlich)
- filename
- Login
- Registrierung
- Passwort Vergessen
- Aktivierung
- Nutzer bearbeiten
- Aktueller Zeitraum (Monat) als Datum mit Slidern nach rechts/links
- Aktueller Finanzstand
- Voraussichtlich verbleibendes Geld
- Graph mit Monatsfinanzentwicklung
- Diagramm mit Einnahmen nach Kategorie
- Diagramm mit Ausgaben nach Kategorie
- Wenn Verträge bald enden: anzeigen mit Enddatum
- Intervalle als Tabs
Um die Sicherheit zu erhöhen, wurde der API Token Ansatz verworfen und stattdesse n OAuth2 implementiert.
Zuerst muss ein Access Token erzeugt werden. Dafür müssen die Client- & User-Credentials als Parameter and den Tokenendpoint übergeben werden:
GET /oauth/v2/token?client_id=CLIENT_ID&client_secret=CLIENT_SECRET&grant_type=password&username=USERNAME&password=USERPWD
Response
{
"access_token": "ZmJiMTJlMTZlZWQ3M2NmMDNkMTliNTIyMTgwZjFmNzk1YzZjODg0NWE3MTAyMjgwZGUxODAwZjk0MGY3MDlmNw",
"expires_in": 3600,
"token_type": "bearer",
"scope": null,
"refresh_token": "MTUwYWI2YTViNjllOTA1MzcyYjkzMjc5NGJkNmM5Y2ZhOTQ5NTYzMjE1ZjBjYTYwZGRkMGMzY2EyMDM0OGVkYg"
}
Der Bearer-Token muss jedem Request, welches dem Pattern ˆ\cv
folgt, übergeben werden.
Mit dem Refresh Token kann ein neues Token angefordert werden:
GET /oauth/v2/token?client_id=CLIENT_ID&client_secret=CLIENT_SECRET&grant_type=refresh_token&refresh_token=REFRESH_TOKEN
Ein Nutzer wird über die /register
Route angelegt, welche im Gegensatz zur /cv/execute
Route public ist.
Bei einem erfolgreichen Request kommt der Code 201 Created zurück, bei Duplikaten 409 Conflict, ansonsten 500.
{
"parameters": {
"id": "a942ed44-fc9e-431b-8c01-31aaecd91689",
"firstName": "Lorem",
"lastName": "Ipsum",
"email": "[email protected]",
"password": "test123"
}
}
Passwörter können jederzeit neu angefordert werden. Dazu muss dieser Endpoint genutzt werden:
GET /reset_password/user/{email}
Dadurch wird ein Reset-Token erzeugt und eine Mail mit dem Link zum ändern verschickt.
Nun muss das neue Passwort an die API mitsamt dem Token gesendet werden:
POST /reset_password/confirm/{token}
{
"parameters": {
"password": "new_pwd"
}
}
API ist eine HTTP-RPC baiserte Webschnittstelle. Es wird das eos ComView Projekt als Library genutzt. POST Requests werden als Commands interpretiert, GET Requests sind Views, die durch Query Parameter eingeschränkt werden.
Für die folgenden Requests gilt:
- ist der Request ein Command, wird dieses per POST an
/cv/execute
gesendet - jeder Request auf
^/cv$
benötigt ein valides Token
Aktueller authentifizierter Nutzer
GET /cv/me
{
"user": {
"id": "1942ed44-fc9e-431b-8c01-31aaecd91689",
"username": "[email protected]"
}
}
Nutzer Patchen
{
"1": {
"command": "updateUser",
"parameters": {
"id": "1242ed44-fc9e-431b-8c01-31aaecd91689",
"firstName": "Anderer Name",
"lastName": "Nachname"
}
}
}
GET /showUserById [id]
/cv/showUserById?parameters[id]=1242ed44-fc9e-431b-8c01-31aaecd91689
Response:
{
"parameters": {
"id": "1242ed44-fc9e-431b-8c01-31aaecd91689"
},
"pagination": [],
"orderBy": null,
"data": {
"firstName": "Anderer Name",
"lastName": "Nachname",
"email": "[email protected]"
}
}
Eintrag anlegen/patchen
{
"1": {
"command": "createEntry",
"parameters": {
"id": "5542ed44-fc9e-431b-8c01-31aaecd91689",
"name": "Test",
"amount": -7.2,
"date": "2017-08-17",
"category": "Lebensmittel"
}
}
}
Vertrag anlegen/patchen
{
"1": {
"command": "createContract",
"parameters": {
"id": "1142ed44-fc9e-431b-8c01-31aaecd91689",
"name": "Testvertrag",
"amount": -19.99,
"startDate": "2019-03-05",
"endDate": "2019-03-05",
"interval": "monthly",
"category": "Unterhaltung"
}
}
}
/getOverviewWithinInterval [start, end]
/cv/getOverviewWithinInterval?parameters[start]=2019-03-03¶meters[end]=2019-03-06
{
"parameters": {
"start": "2019-03-01",
"end": "2019-03-06"
},
"pagination": [],
"orderBy": null,
"data": {
"entries": [
{
"name": "Was anderes",
"amount": -7.2,
"date": "2019-03-05",
"category": "Miete"
},
{
"name": "Test",
"amount": 82.2,
"date": "2019-03-05",
"category": "Lebensmittel"
}
],
"contracts": [
{
"name": "Netflix",
"amount": -9.95,
"startDate": "2019-03-05",
"endDate": "2019-03-05",
"interval": "monthly",
"category": "Unterhaltung"
},
{
"name": "Testvertrag",
"amount": -19.99,
"startDate": "2019-03-05",
"endDate": "2019-03-05",
"interval": "quartal",
"category": "Sonstiges"
},
{
"name": "Gehalt",
"amount": 240,
"startDate": "2019-03-05",
"endDate": "2019-03-05",
"interval": "monthly",
"category": "Gehalt"
}
],
"graphData": {
"income": {
"Lebensmittel": 82.2,
"Gehalt": 240
},
"expenses": {
"Miete": -7.2,
"Unterhaltung": -9.95,
"Sonstiges": -19.99
}
},
"meta": {
"calculatedBalance": 285.06,
"totalIncome": 322.2,
"totalExpenses": -37.14
}
}
}
GET /getBillingIntervals
{
"parameters": [],
"pagination": [],
"orderBy": null,
"data": {
"monthly": [
{
"name": "Netflix",
"amount": -9.95,
"startDate": "2019-03-05",
"endDate": "2019-03-05",
"category": "Unterhaltung"
},
{
"name": "Gehalt",
"amount": 240,
"startDate": "2019-03-05",
"endDate": "2019-03-05",
"category": "Gehalt"
}
],
"quartal": [
{
"name": "Testvertrag",
"amount": -19.99,
"startDate": "2019-03-05",
"endDate": "2019-03-05",
"category": "Sonstiges"
}
]
}
}
Der Webserver muss diesen Anforderungen entsprechen:
- PHP 7.2
- MySQL 5.7
- Composer
- Apache 2
- PHP-fpm
Zum Deployen muss zuerst dieses Projekt via Git geklont werden
git clone https://github.com/pguetschow/project_04.git
Danach die Dependencies mit Composer installieren
composer install
In der .env müssen die Parameter für die Datenbankverbindung und den Mailer angegeben werden:
DATABASE_URL=mysql://user:pwd@host:port/database
MAILER_URL=smtp://user:pwd@host:port/?auth_mode=cram-md5&weitererParam=...
Um die Datenbank zu konfigurieren, muss diese erstellt werden und die aktuelle Migration aufgespielt werden:
php bin/console doctrine:database:create --if-not-exists
php bin/console doctrine:migrations:migrate
Für den Web Client wird ein OAuth2 Client benötigt:
php bin/console fos:oauth-server:create-client --grant-type=password --grant-type=refresh_token
Danach kann die Anwednung gestartet werden:
php bin/console server:start