def all_source_replies(source_uuid): if request.method == 'GET': source = get_or_404(Source, source_uuid, column=Source.uuid) return jsonify( {'replies': [reply.to_json() for reply in source.replies]}), 200 elif request.method == 'POST': source = get_or_404(Source, source_uuid, column=Source.uuid) if request.json is None: abort(400, 'please send requests in valid JSON') if 'reply' not in request.json: abort(400, 'reply not found in request body') user = get_user_object(request) data = request.json if not data['reply']: abort(400, 'reply should not be empty') source.interaction_count += 1 try: filename = current_app.storage.save_pre_encrypted_reply( source.filesystem_id, source.interaction_count, source.journalist_filename, data['reply']) except NotEncrypted: return jsonify( {'message': 'You must encrypt replies client side'}), 400 # issue #3918 filename = path.basename(filename) reply = Reply(user, source, filename) reply_uuid = data.get('uuid', None) if reply_uuid is not None: # check that is is parseable try: UUID(reply_uuid) except ValueError: abort(400, "'uuid' was not a valid UUID") reply.uuid = reply_uuid try: db.session.add(reply) db.session.add(source) db.session.commit() except IntegrityError as e: db.session.rollback() if 'UNIQUE constraint failed: replies.uuid' in str(e): abort(409, 'That UUID is already in use.') else: raise e return jsonify({'message': 'Your reply has been stored', 'uuid': reply.uuid, 'filename': reply.filename}), 201
def all_source_replies(source_uuid: str) -> Tuple[flask.Response, int]: if request.method == "GET": source = get_or_404(Source, source_uuid, column=Source.uuid) return jsonify( {"replies": [reply.to_json() for reply in source.replies]}), 200 elif request.method == "POST": source = get_or_404(Source, source_uuid, column=Source.uuid) if request.json is None: abort(400, "please send requests in valid JSON") if "reply" not in request.json: abort(400, "reply not found in request body") user = _authenticate_user_from_auth_header(request) data = request.json if not data["reply"]: abort(400, "reply should not be empty") source.interaction_count += 1 try: filename = Storage.get_default().save_pre_encrypted_reply( source.filesystem_id, source.interaction_count, source.journalist_filename, data["reply"], ) except NotEncrypted: return jsonify( {"message": "You must encrypt replies client side"}), 400 # issue #3918 filename = path.basename(filename) reply = Reply(user, source, filename, Storage.get_default()) reply_uuid = data.get("uuid", None) if reply_uuid is not None: # check that is is parseable try: UUID(reply_uuid) except ValueError: abort(400, "'uuid' was not a valid UUID") reply.uuid = reply_uuid try: db.session.add(reply) seen_reply = SeenReply(reply=reply, journalist=user) db.session.add(seen_reply) db.session.add(source) db.session.commit() except IntegrityError as e: db.session.rollback() if "UNIQUE constraint failed: replies.uuid" in str(e): abort(409, "That UUID is already in use.") else: raise e return ( jsonify({ "message": "Your reply has been stored", "uuid": reply.uuid, "filename": reply.filename, }), 201, ) else: abort(405)