Add export endpoints
This commit is contained in:
parent
d933bffa2f
commit
3932ed2eb8
|
@ -11,4 +11,5 @@ from .views import (
|
||||||
mailbox,
|
mailbox,
|
||||||
notification,
|
notification,
|
||||||
setting,
|
setting,
|
||||||
|
export,
|
||||||
)
|
)
|
||||||
|
|
|
@ -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
|
|
@ -1,6 +1,5 @@
|
||||||
import csv
|
|
||||||
import json
|
import json
|
||||||
from io import BytesIO, StringIO
|
from io import BytesIO
|
||||||
|
|
||||||
import arrow
|
import arrow
|
||||||
from flask import (
|
from flask import (
|
||||||
|
@ -10,7 +9,6 @@ from flask import (
|
||||||
url_for,
|
url_for,
|
||||||
flash,
|
flash,
|
||||||
Response,
|
Response,
|
||||||
make_response,
|
|
||||||
)
|
)
|
||||||
from flask_login import login_required, current_user, logout_user
|
from flask_login import login_required, current_user, logout_user
|
||||||
from flask_wtf import FlaskForm
|
from flask_wtf import FlaskForm
|
||||||
|
@ -266,42 +264,9 @@ def setting():
|
||||||
return redirect(url_for("dashboard.setting"))
|
return redirect(url_for("dashboard.setting"))
|
||||||
|
|
||||||
elif request.form.get("form-name") == "export-data":
|
elif request.form.get("form-name") == "export-data":
|
||||||
data = {
|
return redirect(url_for("api.export_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"},
|
|
||||||
)
|
|
||||||
elif request.form.get("form-name") == "export-alias":
|
elif request.form.get("form-name") == "export-alias":
|
||||||
data = [["alias", "note", "enabled"]]
|
return redirect(url_for("api.export_aliases"))
|
||||||
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
|
|
||||||
|
|
||||||
manual_sub = ManualSubscription.get_by(user_id=current_user.id)
|
manual_sub = ManualSubscription.get_by(user_id=current_user.id)
|
||||||
apple_sub = AppleSubscription.get_by(user_id=current_user.id)
|
apple_sub = AppleSubscription.get_by(user_id=current_user.id)
|
||||||
|
|
24
docs/api.md
24
docs/api.md
|
@ -14,6 +14,8 @@
|
||||||
|
|
||||||
[Settings endpoints](#settings-endpoints)
|
[Settings endpoints](#settings-endpoints)
|
||||||
|
|
||||||
|
[Import and export endpoints](#import-and-export-endpoints)
|
||||||
|
|
||||||
[MISC endpoints](#misc-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
|
### Misc endpoints
|
||||||
#### POST /api/apple/process_payment
|
#### POST /api/apple/process_payment
|
||||||
|
|
Loading…
Reference in New Issue