From 848908aca01d9eefa87d75e80483c4f3c9b27263 Mon Sep 17 00:00:00 2001 From: knst-kotov Date: Sun, 8 Aug 2021 09:49:15 +0000 Subject: [PATCH] add git task --- main.py | 14 ++++++---- resolvers/zine.py | 68 ++++++++++++++++++++++++++++++++++++----------- 2 files changed, 62 insertions(+), 20 deletions(-) diff --git a/main.py b/main.py index 8c0de51b..37a5c5b4 100644 --- a/main.py +++ b/main.py @@ -12,6 +12,9 @@ from auth.authenticate import JWTAuthenticate from auth.oauth import oauth_login, oauth_authorize from redis import redis from resolvers.base import resolvers +from resolvers.zine import GitTask + +import asyncio import_module('resolvers') schema = make_executable_schema(load_schema_from_path("schema.graphql"), resolvers) @@ -22,15 +25,16 @@ middleware = [ ] async def start_up(): - await redis.connect() + await redis.connect() + git_task = asyncio.create_task(GitTask.git_task_worker()) async def shutdown(): - await redis.disconnect() - + await redis.disconnect() + routes = [ - Route("/oauth/{provider}", endpoint=oauth_login), - Route("/authorize", endpoint=oauth_authorize) + Route("/oauth/{provider}", endpoint=oauth_login), + Route("/authorize", endpoint=oauth_authorize) ] app = Starlette(debug=True, on_startup=[start_up], on_shutdown=[shutdown], middleware=middleware, routes=routes) diff --git a/resolvers/zine.py b/resolvers/zine.py index f03597a4..3edefcd9 100644 --- a/resolvers/zine.py +++ b/resolvers/zine.py @@ -7,6 +7,47 @@ from auth.authenticate import login_required from settings import SHOUTS_REPO import subprocess +import asyncio + +class GitTask: + + queue = asyncio.Queue() + + def __init__(self, shout_id, shout_body, username, user_email, comment): + self.shout_id = shout_id; + self.shout_body = shout_body; + self.username = username; + self.user_email = user_email; + self.comment = comment; + + GitTask.queue.put_nowait(self) + + def execute(self): + cmd = "cd %s; git checkout master" % (SHOUTS_REPO) + output = subprocess.check_output(cmd, shell=True) + print(output) + + shout_filename = "shout%s.md" % (self.shout_id) + shout_full_filename = "%s/%s" % (SHOUTS_REPO, shout_filename) + with open(shout_full_filename, mode='w', encoding='utf-8') as shout_file: + shout_file.write(self.shout_body) + + author = "%s <%s>" % (self.username, self.user_email) + cmd = "cd %s; git add %s; git commit -m '%s' --author='%s'" % \ + (SHOUTS_REPO, shout_filename, self.comment, author) + output = subprocess.check_output(cmd, shell=True) + print(output) + + @staticmethod + async def git_task_worker(): + print("git task worker start") + while True: + task = await GitTask.queue.get() + try: + task.execute() + except Exception as err: + print("git task worker error = %s" % (err)) + @query.field("topShouts") async def top_shouts(_, info): @@ -26,25 +67,22 @@ async def create_shout(_, info, body): auth = info.context["request"].auth user_id = auth.user_id + with local_session() as session: + user = session.query(User).filter(User.id == user_id).first() + new_shout = Shout.create( author_id = user_id, body = body ) - - branch_name = "shout%s" % (new_shout.id) - - cmd = "cd %s; git checkout master && git checkout -b %s && git branch %s-dev" % (SHOUTS_REPO, branch_name, branch_name) - output = subprocess.check_output(cmd, shell=True) - print(output) - - shout_filename = "%s/body" % (SHOUTS_REPO) - with open(shout_filename, mode='w', encoding='utf-8') as shout_file: - shout_file.write(body) - - cmd = "cd %s; git commit -a -m 'initial version'" % (SHOUTS_REPO) - output = subprocess.check_output(cmd, shell=True) - print(output) - + + task = GitTask( + new_shout.id, + body, + user.username, + user.email, + "new shout %s" % (new_shout.id) + ) + return { "shout" : new_shout }