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
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()
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
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)
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()
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
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
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
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
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