def referral_claim():
    if not use_referrals:
        return bad_request(web_utils.NOT_AVAILABLE)
    token, api_key, err_response = auth_request_get_single_param(db, "token")
    if err_response:
        return err_response
    if not api_key.user.has_role(
            Role.ROLE_ADMIN) and not api_key.user.has_role(
                Role.ROLE_REFERRAL_CLAIMER):
        return bad_request(web_utils.UNAUTHORIZED)
    ref = Referral.from_token(db.session, token)
    if not ref:
        return bad_request(web_utils.NOT_FOUND)
    if ref.status != ref.STATUS_CREATED:
        return bad_request(web_utils.NOT_FOUND)
    # send referral rewards
    category = Category.from_name(db.session, Category.CATEGORY_REFERRAL)
    if not category:
        return bad_request(web_utils.INVALID_CATEGORY)
    if ref.reward_sender <= 0:
        return bad_request(web_utils.INVALID_AMOUNT)
    if ref.reward_recipient_type == ref.REWARD_TYPE_FIXED and ref.reward_recipient <= 0:
        return bad_request(web_utils.INVALID_AMOUNT)
    reason = f'{ref.token}: reward for referral'
    _reward_create(api_key.user, reason, category, ref.recipient,
                   ref.reward_sender, 'Thank you for referring a friend')
    if ref.reward_recipient_type == ref.REWARD_TYPE_FIXED:
        _reward_create(api_key.user, reason, category, ref.recipient,
                       ref.reward_recipient, 'Thank you for using our service')
    ref.status = ref.STATUS_CLAIMED
    db.session.add(ref)
    db.session.commit()
    return jsonify(dict(referral=ref.to_json()))
def referral_validate():
    if not use_referrals:
        return bad_request(web_utils.NOT_AVAILABLE)
    token, api_key, err_response = auth_request_get_single_param(db, "token")
    if err_response:
        return err_response
    if not api_key.user.has_role(
            Role.ROLE_ADMIN) and not api_key.user.has_role(
                Role.ROLE_REFERRAL_CLAIMER):
        return bad_request(web_utils.UNAUTHORIZED)
    ref = Referral.from_token(db.session, token)
    if not ref:
        return bad_request(web_utils.NOT_FOUND)
    if ref.status != ref.STATUS_CREATED:
        return bad_request(web_utils.NOT_FOUND)
    return jsonify(dict(referral=ref.to_json()))