diff --git a/app/dao/invited_user_dao.py b/app/dao/invited_user_dao.py index c5eb75918..c045489e8 100644 --- a/app/dao/invited_user_dao.py +++ b/app/dao/invited_user_dao.py @@ -1,7 +1,7 @@ from datetime import datetime, timedelta from app import db -from app.models import INVITE_EXPIRED, InvitedUser +from app.models import INVITE_EXPIRED, INVITE_PENDING, InvitedUser def save_invited_user(invited_user): @@ -31,7 +31,10 @@ def get_invited_users_for_service(service_id): def expire_invitations_created_more_than_two_days_ago(): expired = ( db.session.query(InvitedUser) - .filter(InvitedUser.created_at <= datetime.utcnow() - timedelta(days=2)) + .filter( + InvitedUser.created_at <= datetime.utcnow() - timedelta(days=2), + InvitedUser.status.in_(INVITE_PENDING), + ) .update({InvitedUser.status: INVITE_EXPIRED}) ) db.session.commit() diff --git a/app/service_invite/rest.py b/app/service_invite/rest.py index b5f9c95a7..e54fba3cd 100644 --- a/app/service_invite/rest.py +++ b/app/service_invite/rest.py @@ -1,3 +1,7 @@ +from re import I + + +from datetime import datetime from flask import Blueprint, current_app, jsonify, request from itsdangerous import BadData, SignatureExpired from notifications_utils.url_safe_token import check_token, generate_token @@ -12,7 +16,7 @@ from app.dao.invited_user_dao import ( ) from app.dao.templates_dao import dao_get_template_by_id from app.errors import InvalidRequest, register_errors -from app.models import EMAIL_TYPE, KEY_TYPE_NORMAL, Service +from app.models import EMAIL_TYPE, INVITE_PENDING, KEY_TYPE_NORMAL, Service from app.notifications.process_notifications import ( persist_notification, send_notification_to_queue, @@ -23,13 +27,7 @@ service_invite = Blueprint("service_invite", __name__) register_errors(service_invite) - -@service_invite.route("/service//invite", methods=["POST"]) -def create_invited_user(service_id): - request_json = request.get_json() - invited_user = invited_user_schema.load(request_json) - save_invited_user(invited_user) - +def _create_service_invite(invited_user, invite_link_host): template_id = current_app.config["INVITATION_EMAIL_TEMPLATE_ID"] template = dao_get_template_by_id(template_id) @@ -43,10 +41,7 @@ def create_invited_user(service_id): personalisation={ "user_name": invited_user.from_user.name, "service_name": invited_user.service.name, - "url": invited_user_url( - invited_user.id, - request_json.get("invite_link_host"), - ), + "url": invited_user_url(invited_user.id, invite_link_host), }, notification_type=EMAIL_TYPE, api_key_id=None, @@ -56,6 +51,15 @@ def create_invited_user(service_id): send_notification_to_queue(saved_notification, queue=QueueNames.NOTIFY) + +@service_invite.route("/service//invite", methods=["POST"]) +def create_invited_user(service_id): + request_json = request.get_json() + invited_user = invited_user_schema.load(request_json) + save_invited_user(invited_user) + + _create_service_invite(invited_user, request_json.get("invite_link_host")) + return jsonify(data=invited_user_schema.dump(invited_user)), 201 @@ -92,6 +96,34 @@ def update_invited_user(service_id, invited_user_id): return jsonify(data=invited_user_schema.dump(fetched)), 200 +@service_invite.route( + "/service//invite//resend", methods=["POST"] +) +def resend_service_invite(service_id, invited_user_id): + """Resend an expired invite. + + This resets the invited user's created date and status to make it a new invite, and + sends the new invite out to the user. + + Note: + This ignores the POST data entirely. + """ + fetched = get_invited_user_by_service_and_id( + service_id=service_id, invited_user_id=invited_user_id + ) + + fetched.created_at = datetime.utcnow() + fetched.status = INVITE_PENDING + + current_data = {k: v for k, v in invited_user_schema.dump(fetched).items()} + update_dict = invited_user_schema.load(current_data) + save_invited_user(update_dict) + + _create_service_invite(fetched, current_app.config["ADMIN_BASE_URL"]) + + return jsonify(data=invited_user_schema.dump(fetched)), 200 + + def invited_user_url(invited_user_id, invite_link_host=None): token = generate_token( str(invited_user_id),