default user role; updateProfile method

This commit is contained in:
knst-kotov 2021-12-08 15:51:30 +03:00
parent 8092d8a262
commit 6e939f43db
9 changed files with 70 additions and 15 deletions

View File

@ -71,6 +71,9 @@ class JWTAuthenticate(AuthenticationBackend):
return AuthCredentials(scopes=[]), AuthUser(user_id=None) return AuthCredentials(scopes=[]), AuthUser(user_id=None)
user = await UserStorage.get_user(payload.user_id) user = await UserStorage.get_user(payload.user_id)
if not user:
return AuthCredentials(scopes=[]), AuthUser(user_id=None)
scopes = await user.get_permission() scopes = await user.get_permission()
return AuthCredentials(user_id=payload.user_id, scopes=scopes, logged_in=True), user return AuthCredentials(user_id=payload.user_id, scopes=scopes, logged_in=True), user

View File

@ -14,6 +14,8 @@ __all__ = ["User", "Role", "Community", "Operation", "Permission", "Message", "S
Base.metadata.create_all(engine) Base.metadata.create_all(engine)
Operation.init_table() Operation.init_table()
Resource.init_table() Resource.init_table()
Community.init_table()
Role.init_table()
with local_session() as session: with local_session() as session:
ShoutRatingStorage.init(session) ShoutRatingStorage.init(session)

View File

@ -33,7 +33,7 @@ class Base(declarative_base()):
@classmethod @classmethod
def create(cls: Generic[T], **kwargs) -> Generic[T]: def create(cls: Generic[T], **kwargs) -> Generic[T]:
instance = cls(**kwargs) instance = cls(**kwargs)
return instance.save() return instance.save(session)
def save(self) -> Generic[T]: def save(self) -> Generic[T]:
with local_session() as session: with local_session() as session:

View File

@ -1,15 +1,31 @@
from datetime import datetime from datetime import datetime
from sqlalchemy import Column, Integer, String, ForeignKey, DateTime from sqlalchemy import Column, Integer, String, ForeignKey, DateTime
from sqlalchemy.orm import relationship, backref from sqlalchemy.orm import relationship, backref
from orm.base import Base from orm.base import Base, local_session
class Community(Base): class Community(Base):
__tablename__ = 'community' __tablename__ = 'community'
# id is auto number
name: str = Column(String, nullable=False, comment="Name") name: str = Column(String, nullable=False, comment="Name")
slug: str = Column(String, unique = True, nullable = False) slug: str = Column(String, unique = True, nullable = False)
desc: str = Column(String, nullable=False, default='') desc: str = Column(String, nullable=False, default='')
pic: str = Column(String, nullable=False, default='') pic: str = Column(String, nullable=False, default='')
createdAt: str = Column(DateTime, nullable=False, default = datetime.now, comment="Created at") createdAt: str = Column(DateTime, nullable=False, default = datetime.now, comment="Created at")
createdBy: str = Column(ForeignKey("user.id"), nullable=False, comment="Creator") createdBy: str = Column(ForeignKey("user.id"), nullable=False, comment="Creator")
@staticmethod
def init_table():
with local_session() as session:
default = session.query(Community).filter(Community.slug == "default").first()
if default:
Community.default_community = default
return
default = Community.create(
name = "default",
slug = "default",
createdBy = 0
)
Community.default_community = default

View File

@ -7,6 +7,7 @@ from sqlalchemy import String, Integer, Column, ForeignKey, UniqueConstraint, Ty
from sqlalchemy.orm import relationship, selectinload from sqlalchemy.orm import relationship, selectinload
from orm.base import Base, REGISTRY, engine, local_session from orm.base import Base, REGISTRY, engine, local_session
from orm.community import Community
class ClassType(TypeDecorator): class ClassType(TypeDecorator):
@ -31,13 +32,27 @@ class ClassType(TypeDecorator):
class Role(Base): class Role(Base):
__tablename__ = 'role' __tablename__ = 'role'
# id is auto field
name: str = Column(String, nullable=False, comment="Role Name") name: str = Column(String, nullable=False, comment="Role Name")
desc: str = Column(String, nullable=True, comment="Role Description") desc: str = Column(String, nullable=True, comment="Role Description")
community: int = Column(ForeignKey("community.id", ondelete="CASCADE"), nullable=False, comment="Community") community: int = Column(ForeignKey("community.id", ondelete="CASCADE"), nullable=False, comment="Community")
permissions = relationship(lambda: Permission) permissions = relationship(lambda: Permission)
@staticmethod
def init_table():
with local_session() as session:
default = session.query(Role).filter(Role.name == "author").first()
if default:
Role.default_role = default
return
default = Role.create(
name = "author",
desc = "Role for author",
community = Community.default_community.id
)
Role.default_role = default
class Operation(Base): class Operation(Base):
__tablename__ = 'operation' __tablename__ = 'operation'
name: str = Column(String, nullable=False, unique=True, comment="Operation Name") name: str = Column(String, nullable=False, unique=True, comment="Operation Name")

View File

@ -94,7 +94,7 @@ class UserStorage:
async def add_user(user): async def add_user(user):
self = UserStorage self = UserStorage
async with self.lock: async with self.lock:
self.users[id] = user self.users[user.id] = user
@staticmethod @staticmethod
async def del_user(id): async def del_user(id):

View File

@ -8,7 +8,7 @@ from auth.authorize import Authorize
from auth.identity import Identity from auth.identity import Identity
from auth.password import Password from auth.password import Password
from auth.email import send_confirm_email, send_auth_email from auth.email import send_confirm_email, send_auth_email
from orm import User, UserStorage from orm import User, UserStorage, Role, UserRole
from orm.base import local_session from orm.base import local_session
from resolvers.base import mutation, query from resolvers.base import mutation, query
from exceptions import InvalidPassword from exceptions import InvalidPassword
@ -37,16 +37,21 @@ async def register(*_, email: str, password: str = ""):
username = email.split('@')[0] username = email.split('@')[0]
user_dict["username"] = username user_dict["username"] = username
user_dict["slug"] = quote_plus(translit(username, 'ru', reversed=True).replace('.', '-').lower()) user_dict["slug"] = quote_plus(translit(username, 'ru', reversed=True).replace('.', '-').lower())
if not password: if password:
user = User.create(**user_dict) user_dict["password"] = Password.encode(password)
await send_confirm_email(user) user = User(**user_dict)
user.roles.append(Role.default_role)
with local_session() as session:
session.add(user)
session.commit()
await UserStorage.add_user(user) await UserStorage.add_user(user)
if not password:
await send_confirm_email(user)
return { "user": user } return { "user": user }
user_dict["password"] = Password.encode(password)
user = User.create(**user_dict)
token = await Authorize.authorize(user) token = await Authorize.authorize(user)
await UserStorage.add_user(user)
return {"user": user, "token": token } return {"user": user, "token": token }

View File

@ -16,7 +16,7 @@ async def get_user_by_slug(_, info, slug):
group_by(User.id).\ group_by(User.id).\
first() first()
user = row.User user = row.User
user.rating = row.rating user["rating"] = row.rating
return { "user": user } # TODO: remove some fields for public return { "user": user } # TODO: remove some fields for public
@query.field("getCurrentUser") @query.field("getCurrentUser")
@ -46,3 +46,16 @@ async def user_roles(_, info):
where(UserRole.user_id == user_id).all() where(UserRole.user_id == user_id).all()
return roles return roles
@mutation.field("updateProfile")
@login_required
async def update_profile(_, info, profile):
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()
user.update(profile)
session.commit()
return {}

View File

@ -36,9 +36,10 @@ input ShoutInput {
} }
input ProfileInput { input ProfileInput {
email: String name: String
username: String
userpic: String userpic: String
links: [String]
bio: String
} }
input CommunityInput { input CommunityInput {