default user role; updateProfile method
This commit is contained in:
parent
8092d8a262
commit
6e939f43db
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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:
|
||||||
|
|
|
@ -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
|
||||||
|
|
19
orm/rbac.py
19
orm/rbac.py
|
@ -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")
|
||||||
|
|
|
@ -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):
|
||||||
|
|
|
@ -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 }
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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 {}
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
Loading…
Reference in New Issue
Block a user