diff --git a/app/api/__init__.py b/app/api/__init__.py index 42a7cf19..00f5f78a 100644 --- a/app/api/__init__.py +++ b/app/api/__init__.py @@ -11,4 +11,5 @@ from .views import ( mailbox, notification, setting, + export, ) diff --git a/app/api/views/export.py b/app/api/views/export.py new file mode 100644 index 00000000..624927e4 --- /dev/null +++ b/app/api/views/export.py @@ -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 diff --git a/app/dashboard/views/setting.py b/app/dashboard/views/setting.py index 5f06ef70..2dc4674a 100644 --- a/app/dashboard/views/setting.py +++ b/app/dashboard/views/setting.py @@ -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) diff --git a/docs/api.md b/docs/api.md index 2db34520..d64f2adf 100644 --- a/docs/api.md +++ b/docs/api.md @@ -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