Пример #1
0
async def put_group(group: GroupFull) -> GroupFull:
    try:
        async with db.acquire():
            group_orm = await GroupOrm.get(group.group_id)
            if group_orm is None:
                raise ApiError(404, 'Group not found')
            await group_orm.update(description=group.description).apply()
            if group.users is not None:
                for u in group.users:
                    user: Optional[UserOrm] = await UserOrm.get(u.user_id)
                    if user is None:
                        raise ApiError(404, 'User not found')
                    ug = await UserGroupOrm.query.where(
                        (UserGroupOrm.user_id == user.user_id)
                        & (UserGroupOrm.group_id == group.group_id)
                    ).gino.first()
                    if ug is None:
                        await UserGroupOrm.create(user_id=user.user_id,
                                                  group_id=group.group_id,
                                                  mode=u.mode)
                    else:
                        await ug.update(mode=u.mode).apply()
    except asyncpg.exceptions.IntegrityConstraintViolationError:
        raise ApiError(400, 'Some error')
    result = await get_group(group.group_id)
    return result
Пример #2
0
async def delete_user(user_id):
    async with db.acquire():
        u: UserOrm = await UserOrm.get(user_id)
        if u is None:
            raise ApiError(404, 'User not found')
        await UserGroupOrm.delete.where(UserGroupOrm.user_id == user_id).gino.status()
        await u.delete()
Пример #3
0
async def auth_google(request: web.Request, state):
    session = await get_session(request)
    if 'state' not in session or session['state'] != state:
        raise ApiError(401, 'Invalid state')
    oauth = GoogleOauth(request=request)
    result = await oauth.get_token_google(request.url)
    return result
Пример #4
0
async def auth_wsso(request: web.Request, state, code):
    session = await get_session(request)
    if ('state' not in session
            or 'code_verifier' not in session
            or 'nonce' not in session
            or session['state'] != state):
        raise ApiError(401, 'Invalid session')
    code_verifier = session['code_verifier']
    nonce = session['nonce']
    del session['nonce']
    del session['state']
    del session['code_verifier']

    redirection = None
    if 'redirection' in session:
        redirection = session['redirection']
        del session['redirection']

    oauth = MyOauth(request=request)
    token = await oauth.fetch_token(oauth.access_token_url, grant_type='authorization_code', code=code,
                                    code_verifier=code_verifier)
    result = await oauth.parse_id_token(token, nonce)
    user_id = result['sub']
    tokens = await create_tokens_object(user_id)
    session['refresh_token'] = tokens.refresh_token.token
    if redirection is None:
        return web.Response(status=200, body=tokens.json(by_alias=True))
    else:
        return web.HTTPFound(redirection)
Пример #5
0
async def delete_group(group_id):
    async with db.acquire():
        u: GroupOrm = await GroupOrm.get(group_id)
        if u is None:
            raise ApiError(404, 'Group not found')
        await UserGroupOrm.delete.where(UserGroupOrm.group_id == group_id
                                        ).gino.status()
        await u.delete()
Пример #6
0
async def refresh(request, token_info: dict):
    session = await get_session(request)
    if 'user_info' in token_info:
        user_info: UserInfo = token_info['user_info']
        user_id = user_info.user_id
    elif 'sub_coro' in token_info:
        user_id = await token_info['sub_coro']
        if user_id is None:
            raise ApiError(401, 'Unauthorized')
        token_info['sub'] = user_id
    elif 'refresh_token' in session:
        refresh_token = session['refresh_token']
        user_id = await get_user_id_by_refresh_token(refresh_token)
    else:
        raise ApiError(401, 'auth key error')
    access_token, exp = await generate_access_token(user_id)
    result = TokenResponse(token=access_token, expiresAt=exp)
    return result
Пример #7
0
async def put_user(user: UserInfo) -> UserInfo:
    try:
        async with db.acquire():
            user_orm = await UserOrm.get(user.user_id)
            if user_orm is None:
                raise ApiError(404, 'User not found')
            await user_orm.update(global_role=user.global_role).apply()

            await UserGroupOrm.delete.where(UserGroupOrm.user_id == user.user_id).gino.status()
            if user.groups is not None:
                for g in user.groups:
                    group: Optional[GroupOrm] = await GroupOrm.get(g.group_id)
                    if group is None:
                        await GroupOrm.create(group_id=g.group_id, description=g.description)
                    await UserGroupOrm.create(user_id=user.user_id, group_id=g.group_id, mode=g.mode)
    except asyncpg.exceptions.IntegrityConstraintViolationError:
        raise ApiError(400, 'Some error')
    result = await get_user_info(user.user_id)
    return result
Пример #8
0
async def add_user(user_info: UserInfo):
    try:
        async with db.acquire():
            if (await UserOrm.get(user_info.user_id)) is not None:
                raise ApiError(409, 'User already exists')
            role = user_info.global_role
            await UserOrm.create(user_id=user_info.user_id, global_role=role)
            if user_info.groups is not None:
                for g in user_info.groups:
                    group: Optional[GroupOrm] = await GroupOrm.get(g.group_id)
                    if group is None:
                        await GroupOrm.create(group_id=g.group_id, description=g.description)
                    await UserGroupOrm.create(user_id=user_info.user_id, group_id=g.group_id, mode=g.mode)
    except asyncpg.exceptions.IntegrityConstraintViolationError as ex:
        print(str(ex))
        await delete_user(user_info.user_id)

        raise ApiError(400, 'Some error')

    result = await get_user_info(user_info.user_id)
    return result
Пример #9
0
async def add_group(group_post: GroupPost) -> GroupFull:
    # try:
    async with db.acquire():
        if (await GroupOrm.get(group_post.group_id)) is not None:
            raise ApiError(409, 'Group already exists')
        await GroupOrm.create(group_id=group_post.group_id,
                              description=group_post.description)
    # except asyncpg.exceptions.IntegrityConstraintViolationError:
    #     await delete_user(user_info.user_id)
    #     raise DsmApiError(400, 'Some error')

    result = await get_group(group_post.group_id)
    return result
Пример #10
0
async def get_group(group_id) -> Optional[GroupFull]:
    async with db.acquire():
        u: GroupOrm = await GroupOrm.get(group_id)
        if u is None:
            raise ApiError(404, 'Group not found')

        users_groups = await db.select([
            UserGroupOrm.user_id, UserGroupOrm.mode
        ]).select_from(UserGroupOrm).where(UserGroupOrm.group_id == group_id
                                           ).gino.all()

        group = GroupFull(groupId=group_id,
                          description=u.description,
                          users=[])
        for ug in users_groups:
            uid, mode = ug
            group.users.append(UserInGroup(userId=uid, mode=mode.value))
        return group