def delete(self) -> None: """Delete this workspace.""" doc = self.get_metadata() sysdb = system_db(readonly=False) coll = workspace_mapping_collection(readonly=False) sysdb.delete_database(doc["internal"]) coll.delete(doc["_id"]) # Invalidate the cache for things changed by this function workspace_mapping.cache_clear()
def create(name: str, owner: User) -> Workspace: """Create a workspace, owned by `owner`.""" if Workspace.exists(name): raise AlreadyExists("Workspace", name) internal = util.generate_arango_workspace_name() try: system_db(readonly=False).create_database(internal) except DatabaseCreateError: # Could only happen if there's a name collision raise InternalServerError("Error creating workspace") workspace_dict = { "name": name, "internal": internal, "permissions": WorkspacePermissions(owner=owner.sub).dict(), } coll = workspace_mapping_collection(readonly=False) coll.insert(workspace_dict, sync=True) workspace_mapping.cache_clear() return Workspace(name)
def search(query: str) -> Cursor: """Search for users given a partial string.""" coll = user_collection() aql = system_db().aql bind_vars = {"@users": coll.name, "query": query} query = """ FOR doc in @@users FILTER CONTAINS(LOWER(doc.name), LOWER(@query)) OR CONTAINS(LOWER(doc.email), LOWER(@query)) LIMIT 50 RETURN doc """ return _run_aql_query(aql, query, bind_vars)
def available_workspaces(self) -> Generator[str, None, None]: """Return all workspaces this user has access to.""" sysdb = system_db() bind_vars = {"@workspaces": "workspace_mapping", "userid": self.sub} query = """ FOR w in @@workspaces FILTER ( w.permissions.public == true || w.permissions.owner == @userid || @userid IN w.permissions.maintainers || @userid IN w.permissions.writers || @userid IN w.permissions.readers ) RETURN w """ return (x["name"] for x in _run_aql_query(sysdb.aql, query, bind_vars))