aboutsummaryrefslogtreecommitdiffstats
path: root/backend/backend.py
diff options
context:
space:
mode:
authorBryan Newbold <bnewbold@robocracy.org>2018-03-21 18:53:43 -0700
committerBryan Newbold <bnewbold@robocracy.org>2018-03-21 18:53:43 -0700
commit33492754881a27c88f6a1ed38e463bba15ecf837 (patch)
treee290f0719bc14c2d9590112652f8864ab9246229 /backend/backend.py
parentd66fed95534d7a443e2cf84e9290d0c9bdf72311 (diff)
downloadfatcat-33492754881a27c88f6a1ed38e463bba15ecf837.tar.gz
fatcat-33492754881a27c88f6a1ed38e463bba15ecf837.zip
merge front and back
Diffstat (limited to 'backend/backend.py')
-rwxr-xr-xbackend/backend.py301
1 files changed, 0 insertions, 301 deletions
diff --git a/backend/backend.py b/backend/backend.py
deleted file mode 100755
index a39ae790..00000000
--- a/backend/backend.py
+++ /dev/null
@@ -1,301 +0,0 @@
-
-import argparse
-from flask import Flask, render_template, send_from_directory, request, \
- url_for, abort, g, redirect, jsonify
-from sqlalchemy import create_engine, MetaData, Table
-
-app = Flask(__name__)
-app.config.from_object(__name__)
-
-# Load default config and override config from an environment variable
-app.config.update(dict(
- DATABASE_URI='sqlite://:memory:',
- SECRET_KEY='development-key',
- USERNAME='admin',
- PASSWORD='admin'
-))
-app.config.from_envvar('FATCAT_BACKEND_CONFIG', silent=True)
-
-metadata = MetaData()
-
-
-## SQL Schema ###############################################################
-
-import enum
-from sqlalchemy import Table, Column, Integer, String, MetaData, ForeignKey, \
- Enum
-
-# TODO: http://docs.sqlalchemy.org/en/latest/orm/extensions/declarative/mixins.html
-
-class IdState(enum.Enum):
- normal = 1
- redirect = 2
- removed = 3
-
-work_id = Table('work_id', metadata,
- Column('id', Integer, primary_key=True, autoincrement=False),
- Column('revision', ForeignKey('work_revision.id')),
- )
-
-work_revision = Table('work_revision', metadata,
- Column('id', Integer, primary_key=True, autoincrement=True),
- Column('previous', ForeignKey('work_revision.id'), nullable=True),
- Column('state', Enum(IdState)),
- Column('redirect_id', ForeignKey('work_id.id'), nullable=True),
- Column('edit_id', ForeignKey('edit.id')),
- Column('extra_json', ForeignKey('extra_json.sha1'), nullable=True),
-
- Column('title', String),
- Column('work_type', String),
- Column('date', String),
- )
-
-release_id = Table('release_id', metadata,
- Column('id', Integer, primary_key=True, autoincrement=False),
- Column('revision', ForeignKey('release_revision.id')),
- )
-
-release_revision = Table('release_revision', metadata,
- Column('id', Integer, primary_key=True, autoincrement=True),
- Column('previous', ForeignKey('release_revision.id'), nullable=True),
- Column('state', Enum(IdState)),
- Column('redirect_id', ForeignKey('release_id.id'), nullable=True),
- Column('edit_id', ForeignKey('edit.id')),
- Column('extra_json', ForeignKey('extra_json.sha1'), nullable=True),
-
- #Column('work', ForeignKey('work_id.id')),
- Column('container', ForeignKey('container_id.id')),
- Column('title', String),
- Column('license', String), # TODO: oa status foreign key
- Column('release_type', String), # TODO: foreign key
- Column('date', String), # TODO: datetime
- Column('doi', String), # TODO: identifier table
- )
-
-creator_id = Table('creator_id', metadata,
- Column('id', Integer, primary_key=True, autoincrement=False),
- Column('revision', ForeignKey('creator_revision.id')),
- )
-
-creator_revision = Table('creator_revision', metadata,
- Column('id', Integer, primary_key=True, autoincrement=True),
- Column('previous', ForeignKey('creator_revision.id'), nullable=True),
- Column('state', Enum(IdState)),
- Column('redirect_id', ForeignKey('creator_id.id'), nullable=True),
- Column('edit_id', ForeignKey('edit.id')),
- Column('extra_json', ForeignKey('extra_json.sha1'), nullable=True),
-
- Column('name', String),
- Column('sortname', String),
- Column('orcid', String), # TODO: identifier table
- )
-
-work_contrib = Table('work_contrib', metadata,
- Column('id', Integer, primary_key=True, autoincrement=True),
- Column('work_rev', ForeignKey('work_revision.id'), nullable=False),
- Column('creator_id', ForeignKey('creator_id.id'), nullable=False),
- Column('stub', String, nullable=False),
- )
-
-release_contrib = Table('release_contrib', metadata,
- Column('id', Integer, primary_key=True, autoincrement=True),
- Column('release_rev', ForeignKey('release_revision.id'), nullable=False),
- Column('creator_id', ForeignKey('creator_id.id'), nullable=False),
- )
-
-container_id = Table('container_id', metadata,
- Column('id', Integer, primary_key=True, autoincrement=False),
- Column('revision', ForeignKey('container_revision.id')),
- )
-
-container_revision = Table('container_revision', metadata,
- Column('id', Integer, primary_key=True, autoincrement=True),
- Column('previous', ForeignKey('container_revision.id'), nullable=True),
- Column('state', Enum(IdState)),
- Column('redirect_id', ForeignKey('container_id.id'), nullable=True),
- Column('edit_id', ForeignKey('edit.id')),
- Column('extra_json', ForeignKey('extra_json.sha1'), nullable=True),
-
- Column('name', String),
- Column('container', ForeignKey('container_id.id')),
- Column('publisher', String), # TODO: foreign key
- Column('sortname', String),
- Column('issn', String), # TODO: identifier table
- )
-
-file_id = Table('file_id', metadata,
- Column('id', Integer, primary_key=True, autoincrement=False),
- Column('revision', ForeignKey('container_revision.id')),
- )
-
-file_revision = Table('file_revision', metadata,
- Column('id', Integer, primary_key=True, autoincrement=True),
- Column('previous', ForeignKey('file_revision.id'), nullable=True),
- Column('state', Enum(IdState)),
- Column('redirect_id', ForeignKey('file_id.id'), nullable=True),
- Column('edit_id', ForeignKey('edit.id')),
- Column('extra_json', ForeignKey('extra_json.sha1'), nullable=True),
-
- Column('size', Integer),
- Column('sha1', Integer), # TODO: hash table... only or in addition?
- Column('url', Integer), # TODO: URL table
- )
-
-release_file= Table('release_file', metadata,
- Column('id', Integer, primary_key=True, autoincrement=True),
- Column('release_rev', ForeignKey('release_revision.id'), nullable=False),
- Column('file_id', ForeignKey('file_id.id'), nullable=False),
- )
-
-edit = Table('edit', metadata,
- Column('id', Integer, primary_key=True, autoincrement=True),
- Column('edit_group', ForeignKey('edit_group.id')),
- Column('editor', ForeignKey('editor.id')),
- Column('description', String),
- )
-
-edit_group = Table('edit_group', metadata,
- Column('id', Integer, primary_key=True, autoincrement=True),
- Column('editor', ForeignKey('editor.id')),
- Column('description', String),
- )
-
-editor = Table('editor', metadata,
- Column('id', Integer, primary_key=True, autoincrement=True),
- Column('username', String),
- )
-
-changelog = Table('changelog', metadata,
- Column('id', Integer, primary_key=True, autoincrement=True),
- Column('edit_id', ForeignKey('edit.id')),
- Column('timestamp', Integer),
- )
-
-extra_json = Table('extra_json', metadata,
- Column('sha1', String, primary_key=True, autoincrement=True),
- Column('json', String),
- )
-
-## Helpers ##################################################################
-
-def is_fcid(s):
- return len(s) == 26 and s.isalnum()
-
-# XXX: why isn't this running?
-def test_is_fcid():
-
- for s in ("rzga5b9cd7efgh04iljk", "RZGA5B9CD7Efgh04iljk"):
- assert is_fcid() is True
-
- for s in ("rzga59cd7efgh04iljk", "rzga.b9cd7efgh04iljk", "",
- "rzga5b9cd7efgh04iljkz"):
- assert is_fcid() is False
-
-def release_list(id_list):
- # XXX: MOCK
- l = []
- for i in id_list:
- l.append({
- "id": i,
- "rev": "8fkj28fjhqkjdhkjkj9s",
- "previous": "0021jdfjhqkjdhkjkj9s",
- "state": "normal",
- "redirect_id": None,
- "edit_id": "932582iuhckjvssk",
- "extra_json": None,
-
- "container_id": "0021jdfjhqkjdhkjkj9s",
- "title": "Mocks are great",
- "license": "CC-0",
- "release_type": "publication",
- "date": "2017-11-22",
- "doi": "10.1000/953kj.sdfkj",
- })
- return l
-
-def release_hydrate(release_id):
- e = release_list([release_id])[0]
- e['container'] = container_hydrate(d['container_id'])
- e.pop('container_id')
- e['creators'] = [creator_hydrate(c['id']) for c in e['creator_ids']]
- return e
-
-def work_list(id_list):
- """This is the fast/light version: populates entity-specific lists (eg,
- identifiers), and any primaries, but doesn't transclude all other
- entities"""
- if len(id_list) == 0:
- return []
-
- l = []
- for i in id_list:
- l.append({
- "id": "rzga5b9cd7efgh04iljk",
- "rev": "8fkj28fjhqkjdhkjkj9s",
- "previous": "0021jdfjhqkjdhkjkj9s",
- "state": "normal",
- "redirect_id": None,
- "edit_id": "932582iuhckjvssk",
- "extra_json": None,
-
- "title": "Mocks are great",
- "contributors": [],
- "work_type": "journal-article",
- "date": None,
-
- "primary_release": release_list(["8fkj28fjhqkjdhkjkj9s"])[0],
- })
- return l
-
-def work_hydrate(work_id):
- """This is the heavy/slowversion: everything from get_works(), but also
- recursively transcludes single-linked entities"""
- # XXX:
- return work_list([work_id])[0]
-
-## API Methods ##############################################################
-
-@app.route('/health', methods=['GET'])
-def health():
- return jsonify({'ok': True})
-
-
-@app.route('/v0/work/<work_id>', methods=['GET'])
-def work_get(work_id):
- if not is_fcid(work_id):
- print("not fcid: {}".format(work_id))
- return abort(404)
- work = work_hydrate(work_id)
- return jsonify(work)
-
-## Entry Point ##############################################################
-
-def main():
- parser = argparse.ArgumentParser()
- parser.add_argument('--debug',
- action='store_true',
- help="enable debugging interface")
- parser.add_argument('--host',
- default="127.0.0.1",
- help="listen on this host/IP")
- parser.add_argument('--port',
- type=int,
- default=8040,
- help="listen on this port")
- parser.add_argument('--database-uri',
- default=app.config['DATABASE_URI'],
- help="sqlalchemy database string")
- args = parser.parse_args()
-
- app.config['DATABASE_URI'] = args.database_uri
- app.conn = create_engine(app.config['DATABASE_URI'], convert_unicode=True)
- metadata.create_all(bind=engine)
-
- # XXX:
- db_test_data()
-
- app.run(debug=args.debug, host=args.host, port=args.port)
-
-
-if __name__ == '__main__':
- main()