Merge pull request #76 from simple-login/api-random-alias

able to create word-based or uuid-based in /api/alias/random/new
This commit is contained in:
Son Nguyen Kim 2020-02-07 21:52:44 +07:00 committed by GitHub
commit 50173483d3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 44 additions and 3 deletions

View File

@ -697,6 +697,7 @@ Create a new random alias.
Input: Input:
- `Authentication` header that contains the api key - `Authentication` header that contains the api key
- (Optional but recommended) `hostname` passed in query string - (Optional but recommended) `hostname` passed in query string
- (Optional) mode: either `uuid` or `word`. By default, use the user setting when creating new random alias.
Output: Output:
If success, 201 with the new alias, for example If success, 201 with the new alias, for example

View File

@ -3,11 +3,10 @@ from flask import jsonify, request
from flask_cors import cross_origin from flask_cors import cross_origin
from app.api.base import api_bp, verify_api_key from app.api.base import api_bp, verify_api_key
from app.config import EMAIL_DOMAIN, MAX_NB_EMAIL_FREE_PLAN from app.config import MAX_NB_EMAIL_FREE_PLAN
from app.extensions import db from app.extensions import db
from app.log import LOG from app.log import LOG
from app.models import GenEmail, AliasUsedOn from app.models import GenEmail, AliasUsedOn, AliasGeneratorEnum
from app.utils import convert_to_id
@api_bp.route("/alias/random/new", methods=["POST"]) @api_bp.route("/alias/random/new", methods=["POST"])
@ -32,6 +31,15 @@ def new_random_alias():
) )
scheme = user.alias_generator scheme = user.alias_generator
mode = request.args.get("mode")
if mode:
if mode == "word":
scheme = AliasGeneratorEnum.word.value
elif mode == "uuid":
scheme = AliasGeneratorEnum.uuid.value
else:
return jsonify(error=f"{mode} must be either word or alias"), 400
gen_email = GenEmail.create_new_random(user_id=user.id, scheme=scheme) gen_email = GenEmail.create_new_random(user_id=user.id, scheme=scheme)
db.session.commit() db.session.commit()

View File

@ -1,3 +1,5 @@
import uuid
from flask import url_for from flask import url_for
from app.config import EMAIL_DOMAIN, MAX_NB_EMAIL_FREE_PLAN from app.config import EMAIL_DOMAIN, MAX_NB_EMAIL_FREE_PLAN
@ -24,6 +26,28 @@ def test_success(flask_client):
assert r.json["alias"].endswith(EMAIL_DOMAIN) assert r.json["alias"].endswith(EMAIL_DOMAIN)
def test_custom_mode(flask_client):
user = User.create(
email="a@b.c", password="password", name="Test User", activated=True
)
db.session.commit()
# create api_key
api_key = ApiKey.create(user.id, "for test")
db.session.commit()
r = flask_client.post(
url_for("api.new_random_alias", hostname="www.test.com", mode="uuid"),
headers={"Authentication": api_key.code},
)
assert r.status_code == 201
# extract the uuid part
alias = r.json["alias"]
uuid_part = alias[: len(alias) - len(EMAIL_DOMAIN) - 1]
assert is_valid_uuid(uuid_part)
def test_out_of_quota(flask_client): def test_out_of_quota(flask_client):
user = User.create( user = User.create(
email="a@b.c", password="password", name="Test User", activated=True email="a@b.c", password="password", name="Test User", activated=True
@ -49,3 +73,11 @@ def test_out_of_quota(flask_client):
r.json["error"] r.json["error"]
== "You have reached the limitation of a free account with the maximum of 3 aliases, please upgrade your plan to create more aliases" == "You have reached the limitation of a free account with the maximum of 3 aliases, please upgrade your plan to create more aliases"
) )
def is_valid_uuid(val):
try:
uuid.UUID(str(val))
return True
except ValueError:
return False