Ejemplo n.º 1
0
    def mutate(self, _, email, ws_id, start_date=None):
        check_role_or_error(ws_id=ws_id, role=WorkspaceUserRoles.ADMIN)

        start_date = start_date if start_date else datetime.datetime.utcnow()

        try:
            user = _UserModel.find(email=email)
            if user is None:
                if WorkspaceInvitation.find(email=email, ws_id=ws_id) is None:
                    WorkspaceInvitation(
                        email=email,
                        ws_id=ws_id,
                        start_date=start_date,
                        status=WorkspaceInvitationStatus.PENDING).save()
            elif WorkspaceUser.find(user_id=user.id, ws_id=ws_id) is None:
                WorkspaceInvitation(
                    email=email,
                    ws_id=ws_id,
                    start_date=start_date,
                    status=WorkspaceInvitationStatus.ACCEPTED).save()

                WorkspaceUser(user_id=user.id,
                              ws_id=ws_id,
                              start_date=start_date).save()

            Persistent.commit()

            return AddMember(ok=True)
        except Exception as e:
            LOG.error(f'Could not add member into workspace. Error: {e}')
            Persistent.rollback()
            return GraphQLError('Could not add member into workspace.')
Ejemplo n.º 2
0
    def mutate(self, _, email, password, user_data):
        if _UserModel.find_by_email(email):
            LOG.warning(f'Repeated registration for {email}')
            raise GraphQLError(f'User {email} already exists')

        access_token = create_access_token(identity=email)
        refresh_token = create_refresh_token(identity=email)
        try:
            new_user = _UserModel(email=email.strip(),
                                  password=_UserModel.generate_hash(password),
                                  jti=decode_token(refresh_token)['jti'],
                                  created_time=datetime.datetime.now())

            new_user.save()
            Persistent.flush()
            new_user_profile = UserProfile(
                user_id=new_user.id,
                email=email.strip(),
                first_name=user_data.first_name.strip(),
                last_name=user_data.last_name.strip())
            new_user_profile.save_and_persist()
        except Exception as e:
            LOG.error(f"User registration failed. Error: {e}")
            Persistent.rollback()
            raise GraphQLError("User registration failed.")
        else:
            # check ws invitatitons
            try:
                pending_invitations = WorkspaceInvitation.find_all(
                    email=email, status=WorkspaceInvitationStatus.PENDING)
                processed_ws_ids = set()
                for inv in pending_invitations:
                    if inv.ws_id not in processed_ws_ids:
                        processed_ws_ids.add(inv.ws_id)
                        WorkspaceUser(user_id=new_user.id,
                                      ws_id=inv.ws_id,
                                      start_date=inv.start_date).save()

                        WorkspaceUserRole(
                            ws_id=inv.ws_id,
                            user_id=new_user.id,
                            role=WorkspaceUserRoles.MEMBER).save()

                    inv.status = WorkspaceInvitationStatus.ACCEPTED
                    WorkspaceInvitation.query() \
                        .filter(WorkspaceInvitation.id == inv.id) \
                        .update({WorkspaceInvitation.status: inv.status})

                Persistent.commit()
            except Exception as e:
                LOG.error(
                    f"Workspace invitations check failed for user {new_user.email}. Error: {e}"
                )
                db.session.rollback()

        return Register(ok=True,
                        user_id=new_user.id,
                        access_token=access_token,
                        refresh_token=refresh_token)
Ejemplo n.º 3
0
    def mutate(self, _, name, description, members):
        now = datetime.datetime.now()
        user = current_user_or_error()

        try:
            new_ws = WorkspaceModel(name=name, description=description)
            new_ws.save()
            Persistent.flush()  # so we now have ID for new_ws

            WorkspaceUser(ws_id=new_ws.id, user_id=user.id,
                          start_date=now).save()

            for role in WorkspaceUserRoles.__members__:
                WorkspaceUserRole(ws_id=new_ws.id, user_id=user.id,
                                  role=role).save()

            for email in members:
                if email.strip() == user.email:
                    continue
                wsi = WorkspaceInvitation(email=email, ws_id=new_ws.id)
                # check if user with this email already exist
                user_by_email = _UserModel.find_by_email(email=email)

                if user_by_email:
                    WorkspaceUser(ws_id=new_ws.id,
                                  user_id=user_by_email.id,
                                  start_date=now).save()

                    WorkspaceUserRole(ws_id=new_ws.id,
                                      user_id=user_by_email.id,
                                      role=WorkspaceUserRoles.MEMBER).save()

                    wsi.status = WorkspaceInvitationStatus.ACCEPTED

                wsi.save()

            Persistent.commit()

            return CreateWorkspace(ok=True, ws=new_ws)
        except Exception as e:
            LOG.error(f'Workspace creation failed. Error: {e}')
            Persistent.rollback()
            raise GraphQLError('Workspace creation failed.')