collab methods updates

This commit is contained in:
tonyrewin 2022-11-24 20:53:39 +03:00
parent 4eb98e7d0c
commit 7a818ff8f5
4 changed files with 78 additions and 59 deletions

View File

@ -1,6 +1,6 @@
from datetime import datetime from datetime import datetime
from sqlalchemy import Boolean, Column, String, ForeignKey, DateTime from sqlalchemy import Column, ForeignKey, DateTime, String
from sqlalchemy.orm import relationship from sqlalchemy.orm import relationship
from base.orm import Base from base.orm import Base
from orm.user import User from orm.user import User
@ -12,16 +12,23 @@ class CollabAuthor(Base):
id = None # type: ignore id = None # type: ignore
collab = Column(ForeignKey("collab.id"), primary_key=True) collab = Column(ForeignKey("collab.id"), primary_key=True)
author = Column(ForeignKey("user.slug"), primary_key=True) author = Column(ForeignKey("user.slug"), primary_key=True)
accepted = Column(Boolean, default=False) invitedBy = Column(ForeignKey("user.slug"))
class CollabInvited(Base):
__tablename__ = "collab_invited"
id = None # type: ignore
collab = Column(ForeignKey("collab.id"), primary_key=True)
author = Column(ForeignKey("user.slug"), primary_key=True)
invitedBy = Column(ForeignKey("user.slug"))
class Collab(Base): class Collab(Base):
__tablename__ = "collab" __tablename__ = "collab"
authors = Column() shout = Column(ForeignKey("shout.id"), primary_key=True)
title = Column(String, nullable=True, comment="Title")
body = Column(String, nullable=True, comment="Body")
pic = Column(String, nullable=True, comment="Picture")
authors = relationship(lambda: User, secondary=CollabAuthor.__tablename__) authors = relationship(lambda: User, secondary=CollabAuthor.__tablename__)
invites = relationship(lambda: User, secondary=CollabInvited.__tablename__)
createdAt = Column(DateTime, default=datetime.now, comment="Created At") createdAt = Column(DateTime, default=datetime.now, comment="Created At")
createdBy = Column(ForeignKey("user.id"), comment="Created By") chat = Column(String, unique=True, nullable=False)

View File

@ -1,9 +1,8 @@
from datetime import datetime, timezone
from auth.authenticate import login_required from auth.authenticate import login_required
from base.orm import local_session from base.orm import local_session
from base.resolvers import query, mutation from base.resolvers import query, mutation
from orm.collab import Collab from base.exceptions import OperationNotAllowed, ObjectNotExist
from orm.collab import Collab, CollabAuthor
from orm.shout import Shout from orm.shout import Shout
from orm.user import User from orm.user import User
@ -11,65 +10,74 @@ from orm.user import User
@query.field("getCollabs") @query.field("getCollabs")
@login_required @login_required
async def get_collabs(_, info): async def get_collabs(_, info):
auth = info.context["request"].auth user = info.context["request"].user
user_id = auth.user_id
with local_session() as session: with local_session() as session:
user = session.query(User).where(User.id == user_id).first()
collabs = session.query(Collab).filter(user.slug in Collab.authors) collabs = session.query(Collab).filter(user.slug in Collab.authors)
return collabs return collabs
@mutation.field("inviteAuthor") @mutation.field("inviteCoauthor")
@login_required @login_required
async def invite_author(_, info, author, shout): async def invite_coauthor(_, info, author: str, shout: int):
auth = info.context["request"].auth user = info.context["request"].user
user_id = auth.user_id
with local_session() as session: with local_session() as session:
shout = session.query(Shout).filter(Shout.slug == shout).first() s = session.query(Shout).where(Shout.id == shout).one()
if not shout: if not s:
return {"error": "invalid shout slug"} raise ObjectNotExist("invalid shout id")
authors = [a.id for a in shout.authors] else:
if user_id not in authors: c = session.query(Collab).where(Collab.shout == shout).one()
return {"error": "access denied"} if user.slug not in c.authors:
author = session.query(User).filter(User.id == author.id).first() raise OperationNotAllowed("you are not in authors list")
if author: else:
if author.id in authors: invited_user = session.query(User).where(User.slug == author).one()
return {"error": "already added"} c.invites.append(invited_user)
shout.authors.append(author) session.add(c)
shout.updated_at = datetime.now(tz=timezone.utc) session.commit()
session.add(shout)
session.commit()
# TODO: email notify # TODO: email notify
return {} return {}
@mutation.field("removeAuthor") @mutation.field("removeCoauthor")
@login_required @login_required
async def remove_author(_, info, author, shout): async def remove_coauthor(_, info, author: str, shout: int):
auth = info.context["request"].auth user = info.context["request"].user
user_id = auth.user_id
with local_session() as session: with local_session() as session:
shout = session.query(Shout).filter(Shout.slug == shout).first() s = session.query(Shout).where(Shout.id == shout).one()
if not shout: if not s:
return {"error": "invalid shout slug"} raise ObjectNotExist("invalid shout id")
authors = [author.id for author in shout.authors] if user.slug != s.createdBy.slug:
if user_id not in authors: raise OperationNotAllowed("only onwer can remove coauthors")
return {"error": "access denied"} else:
author = session.query(User).filter(User.slug == author).first() c = session.query(Collab).where(Collab.shout == shout).one()
if author: ca = session.query(CollabAuthor).where(c.shout == shout, c.author == author).one()
if author.id not in authors: session.remve(ca)
return {"error": "not in authors"} c.invites = filter(lambda x: x.slug == author, c.invites)
shout.authors.remove(author) c.authors = filter(lambda x: x.slug == author, c.authors)
shout.updated_at = datetime.now(tz=timezone.utc) session.add(c)
session.add(shout) session.commit()
session.commit()
# result = Result("INVITED")
# FIXME: await ShoutStorage.put(result)
# TODO: email notify # TODO: email notify
return {} return {}
@mutation.field("acceptCoauthor")
@login_required
async def accept_coauthor(_, info, shout: int):
user = info.context["request"].user
with local_session() as session:
s = session.query(Shout).where(Shout.id == shout).one()
if not s:
raise ObjectNotExist("invalid shout id")
else:
c = session.query(Collab).where(Collab.shout == shout).one()
accepted = filter(lambda x: x.slug == user.slug, c.invites).pop()
if accepted:
c.authors.append(accepted)
s.authors.append(accepted)
session.add(s)
session.add(c)
session.commit()
return {}
else:
raise OperationNotAllowed("only invited can accept")

View File

@ -30,7 +30,10 @@ async def create_shout(_, info, inp):
new_shout = Shout.create({ new_shout = Shout.create({
"title": inp.get("title", body[:12] + '...'), "title": inp.get("title", body[:12] + '...'),
"body": body, "body": body,
"authors": authors "authors": authors,
"topics": inp.get("topics", []),
"mainTopic": inp.get("topics", []).pop(),
"visibility": "authors"
}) })
authors.remove(user.slug) authors.remove(user.slug)
if authors: if authors:
@ -44,7 +47,6 @@ async def create_shout(_, info, inp):
"invites": authors "invites": authors
}) })
session.add(new_collab) session.add(new_collab)
session.commit()
# NOTE: shout made by one first author # NOTE: shout made by one first author
sa = ShoutAuthor.create(shout=new_shout.slug, user=user.slug) sa = ShoutAuthor.create(shout=new_shout.slug, user=user.slug)

View File

@ -187,8 +187,9 @@ type Mutation {
deleteReaction(id: Int!): Result! deleteReaction(id: Int!): Result!
# collab # collab
inviteAuthor(author: String!, shout: String!): Result! inviteCoauthor(author: String!, shout: int!): Result!
removeAuthor(author: String!, shout: String!): Result! removeCouthor(author: String!, shout: Int!): Result!
acceptCoauthor(shout: Int!): Result!
# following # following
follow(what: FollowingEntity!, slug: String!): Result! follow(what: FollowingEntity!, slug: String!): Result!
@ -523,4 +524,5 @@ type Collab {
invites: [String] invites: [String]
shout: Shout shout: Shout
chat: Chat chat: Chat
createdAt: Int!
} }