Add export endpoints

This commit is contained in:
Sylvia van Os 2021-03-06 21:56:42 +01:00
parent d933bffa2f
commit 3932ed2eb8
4 changed files with 94 additions and 39 deletions

View File

@ -11,4 +11,5 @@ from .views import (
mailbox,
notification,
setting,
export,
)

67
app/api/views/export.py Normal file
View File

@ -0,0 +1,67 @@
import csv
from io import StringIO
from flask import g
from flask import jsonify
from flask import make_response
from flask import request
from app.api.base import api_bp, require_api_auth
from app.models import Alias, Client, CustomDomain
@api_bp.route("/export/data", methods=["GET"])
@require_api_auth
def export_data():
"""
Get user data
Output:
Alias, custom domain and app info
"""
user = g.user
data = {
"email": user.email,
"name": user.name,
"aliases": [],
"apps": [],
"custom_domains": [],
}
for alias in Alias.filter_by(user_id=user.id).all(): # type: Alias
data["aliases"].append(dict(email=alias.email, enabled=alias.enabled))
for custom_domain in CustomDomain.filter_by(user_id=user.id).all():
data["custom_domains"].append(custom_domain.domain)
for app in Client.filter_by(user_id=user.id): # type: Client
data["apps"].append(
dict(name=app.name, home_url=app.home_url, published=app.published)
)
return jsonify(data)
@api_bp.route("/export/aliases", methods=["GET"])
@require_api_auth
def export_aliases():
"""
Get user aliases as importable CSV file
Output:
Importable CSV file
"""
user = g.user
data = [["alias", "note", "enabled"]]
for alias in Alias.filter_by(user_id=user.id).all(): # type: Alias
data.append([alias.email, alias.note, alias.enabled])
si = StringIO()
cw = csv.writer(si)
cw.writerows(data)
output = make_response(si.getvalue())
output.headers["Content-Disposition"] = "attachment; filename=aliases.csv"
output.headers["Content-type"] = "text/csv"
return output

View File

@ -1,6 +1,5 @@
import csv
import json
from io import BytesIO, StringIO
from io import BytesIO
import arrow
from flask import (
@ -10,7 +9,6 @@ from flask import (
url_for,
flash,
Response,
make_response,
)
from flask_login import login_required, current_user, logout_user
from flask_wtf import FlaskForm
@ -266,42 +264,9 @@ def setting():
return redirect(url_for("dashboard.setting"))
elif request.form.get("form-name") == "export-data":
data = {
"email": current_user.email,
"name": current_user.name,
"aliases": [],
"apps": [],
"custom_domains": [],
}
for alias in Alias.filter_by(user_id=current_user.id).all(): # type: Alias
data["aliases"].append(dict(email=alias.email, enabled=alias.enabled))
for custom_domain in CustomDomain.filter_by(user_id=current_user.id).all():
data["custom_domains"].append(custom_domain.domain)
for app in Client.filter_by(user_id=current_user.id): # type: Client
data["apps"].append(
dict(name=app.name, home_url=app.home_url, published=app.published)
)
return Response(
json.dumps(data),
mimetype="text/json",
headers={"Content-Disposition": "attachment;filename=data.json"},
)
return redirect(url_for("api.export_data"))
elif request.form.get("form-name") == "export-alias":
data = [["alias", "note", "enabled"]]
for alias in Alias.filter_by(user_id=current_user.id).all(): # type: Alias
data.append([alias.email, alias.note, alias.enabled])
si = StringIO()
cw = csv.writer(si)
cw.writerows(data)
output = make_response(si.getvalue())
output.headers["Content-Disposition"] = "attachment; filename=aliases.csv"
output.headers["Content-type"] = "text/csv"
return output
return redirect(url_for("api.export_aliases"))
manual_sub = ManualSubscription.get_by(user_id=current_user.id)
apple_sub = AppleSubscription.get_by(user_id=current_user.id)

View File

@ -14,6 +14,8 @@
[Settings endpoints](#settings-endpoints)
[Import and export endpoints](#import-and-export-endpoints)
[MISC endpoints](#misc-endpoints)
---
@ -786,7 +788,27 @@ Return domains that user can use to create random alias
}
]
```
### Import and export endpoints
#### GET /api/export/data
Export user data
Input:
- `Authentication` in header: the api key
Output:
Alias, custom domain and app info
#### GET /api/export/aliases
Export user aliases in an importable CSV format
Input:
- `Authentication` in header: the api key
Output:
A CSV file with alias information that can be imported in the settings screen
### Misc endpoints
#### POST /api/apple/process_payment