From 7728c67875234d44e50e31fb3352991eeb7c8e17 Mon Sep 17 00:00:00 2001 From: Wenyi Xu Date: Sat, 3 Aug 2024 12:09:58 +0800 Subject: [PATCH] associate user info to directory (#301) (#305) * associate user info to directory (#301) * associate user info to directory (#301) * associate user info to directory (#301) --- .github/workflows/build-examples.yml | 4 +- docker/postgres/init.sql | 40 +++++++++++-------- examples/666 | 32 --------------- examples/{ => user_0@gmail.com}/demo.ipynb | 0 .../{ => user_0@gmail.com}/notebook.ipynb | 0 .../{ => user_0@gmail.com}/quickstart.ipynb | 0 .../sg-resale-flat-prices.ipynb | 0 .../word-count/Dockerfile | 0 .../{ => user_0@gmail.com}/word-count/pom.xml | 0 .../word-count/src/main/resources/example.txt | 0 .../word-count/src/main/scala/WordCount.scala | 0 server/app/routes/login.py | 2 + webapp/src/App.js | 14 ++++++- webapp/src/components/auth/LoginForm.js | 3 +- webapp/src/components/sidebar/Sidebar.js | 6 ++- .../sidebar/workspace/WorkspaceSidebar.js | 9 ++++- 16 files changed, 52 insertions(+), 58 deletions(-) delete mode 100644 examples/666 rename examples/{ => user_0@gmail.com}/demo.ipynb (100%) rename examples/{ => user_0@gmail.com}/notebook.ipynb (100%) rename examples/{ => user_0@gmail.com}/quickstart.ipynb (100%) rename examples/{ => user_0@gmail.com}/sg-resale-flat-prices/sg-resale-flat-prices.ipynb (100%) rename examples/{ => user_0@gmail.com}/word-count/Dockerfile (100%) rename examples/{ => user_0@gmail.com}/word-count/pom.xml (100%) rename examples/{ => user_0@gmail.com}/word-count/src/main/resources/example.txt (100%) rename examples/{ => user_0@gmail.com}/word-count/src/main/scala/WordCount.scala (100%) diff --git a/.github/workflows/build-examples.yml b/.github/workflows/build-examples.yml index 27f2987..bcff397 100644 --- a/.github/workflows/build-examples.yml +++ b/.github/workflows/build-examples.yml @@ -31,7 +31,7 @@ jobs: # Runs a set of commands using the runners shell - name: Maven Package run: | - cd examples/word-count + cd examples/user_0@gmail.com/word-count mvn clean package version=$(mvn help:evaluate -Dexpression=project.version -q -DforceStdout) @@ -50,7 +50,7 @@ jobs: - name: Docker Build & Push run: | - cd examples/word-count + cd examples/user_0@gmail.com/word-count docker build -t ${{ secrets.DOCKERHUB_USERNAME }}/word-count:$VERSION_WITH_TIMESTAMP --build-arg VERSION=$VERSION . docker push ${{ secrets.DOCKERHUB_USERNAME }}/word-count:$VERSION_WITH_TIMESTAMP diff --git a/docker/postgres/init.sql b/docker/postgres/init.sql index ef83f8e..714170f 100644 --- a/docker/postgres/init.sql +++ b/docker/postgres/init.sql @@ -8,7 +8,7 @@ CREATE TABLE users ( id SERIAL PRIMARY KEY, name VARCHAR(100) NOT NULL, password_hash VARCHAR(255) NOT NULL, - email VARCHAR(100) NOT NULL + email VARCHAR(100) NOT NULL UNIQUE ); CREATE TABLE notebooks ( @@ -43,22 +43,28 @@ GRANT ALL PRIVILEGES ON TABLE spark_apps TO server; -- Add some initial data --- 12345A -INSERT INTO users (name, password_hash, email) VALUES ('user_0', 'scrypt:32768:8:1$1k6HpQA8N58PkDz7$db383b0d69d7a2f6893116b1955da70cb217173dc44ce169acf57cfe6a79f63118ad7515563a0b4f8f39dda49510d061acdba26be8f7c8786c161dd54d7a91c1', 'user_0@gmail.com'); -INSERT INTO users (name, password_hash, email) VALUES ('user_1', 'pbkdf2:sha256:150000$3Z6Z6Z6Z$e3', 'user_1@gmail.com'); +-- user_0 -12345A +INSERT INTO users (name, password_hash, email) VALUES +('user_0', 'scrypt:32768:8:1$1k6HpQA8N58PkDz7$db383b0d69d7a2f6893116b1955da70cb217173dc44ce169acf57cfe6a79f63118ad7515563a0b4f8f39dda49510d061acdba26be8f7c8786c161dd54d7a91c1', 'user_0@gmail.com'), +('user_1', 'pbkdf2:sha256:150000$3Z6Z6Z6Z$e3', 'user_1@gmail.com'); -INSERT INTO notebooks (name, path, user_id) VALUES ('demo.ipynb', 'work/demo.ipynb', 1); -INSERT INTO notebooks (name, path, user_id) VALUES ('notebook.ipynb', 'work/notebook.ipynb', 1); -INSERT INTO notebooks (name, path, user_id) VALUES ('quickstart.ipynb', 'work/quickstart.ipynb', 1); -INSERT INTO notebooks (name, path, user_id) VALUES ('sg-resale-flat-prices.ipynb', 'work/sg-resale-flat-prices/sg-resale-flat-prices.ipynb', 1); +INSERT INTO notebooks (name, path, user_id) VALUES +('demo.ipynb', 'work/user_0@gmail.com/demo.ipynb', 1), +('notebook.ipynb', 'work/user_0@gmail.com/notebook.ipynb', 1), +('quickstart.ipynb', 'work/user_0@gmail.com/quickstart.ipynb', 1), +('sg-resale-flat-prices.ipynb', 'work/user_0@gmail.com/sg-resale-flat-prices/sg-resale-flat-prices.ipynb', 1); -INSERT INTO directories (name, path, user_id) VALUES ('work', '/work', 1); -INSERT INTO directories (name, path, user_id) VALUES ('word-count', '/work/word-count', 1); -INSERT INTO directories (name, path, user_id) VALUES ('sg-resale-flat-prices', '/work/sg-resale-flat-prices', 1); -INSERT INTO directories (name, path, user_id) VALUES ('output', '/work/sg-resale-flat-prices/output', 1); +INSERT INTO directories (name, path, user_id) VALUES +-- ('work', '/work', 1), +('user_0@gmail.com', '/work/user_0@gmail.com', 1), +('word-count', '/work/user_0@gmail.com/word-count', 1), +('sg-resale-flat-prices', '/work/user_0@gmail.com/sg-resale-flat-prices', 1), +('output', '/work/user_0@gmail.com/sg-resale-flat-prices/output', 1), +('user_1@gmail.com', '/work/user_0@gmail.com', 1); -INSERT INTO spark_apps (spark_app_id, notebook_id) VALUES ('app-0000-0000', 1); -INSERT INTO spark_apps (spark_app_id, notebook_id) VALUES ('app-0000-0001', 1); -INSERT INTO spark_apps (spark_app_id, notebook_id) VALUES ('app-0000-0002', 1); -INSERT INTO spark_apps (spark_app_id, notebook_id) VALUES ('app-0000-0003', 2); -INSERT INTO spark_apps (spark_app_id, notebook_id) VALUES ('app-0000-0004', 2); +INSERT INTO spark_apps (spark_app_id, notebook_id) VALUES +('app-0000-0000', 1), +('app-0000-0001', 1), +('app-0000-0002', 1), +('app-0000-0003', 2), +('app-0000-0004', 2); diff --git a/examples/666 b/examples/666 deleted file mode 100644 index 7fb97b4..0000000 --- a/examples/666 +++ /dev/null @@ -1,32 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# My Notebook" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "# SparkSession: spark is already created\n", - "spark" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "name": "python3" - }, - "language_info": { - "name": "python" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/examples/demo.ipynb b/examples/user_0@gmail.com/demo.ipynb similarity index 100% rename from examples/demo.ipynb rename to examples/user_0@gmail.com/demo.ipynb diff --git a/examples/notebook.ipynb b/examples/user_0@gmail.com/notebook.ipynb similarity index 100% rename from examples/notebook.ipynb rename to examples/user_0@gmail.com/notebook.ipynb diff --git a/examples/quickstart.ipynb b/examples/user_0@gmail.com/quickstart.ipynb similarity index 100% rename from examples/quickstart.ipynb rename to examples/user_0@gmail.com/quickstart.ipynb diff --git a/examples/sg-resale-flat-prices/sg-resale-flat-prices.ipynb b/examples/user_0@gmail.com/sg-resale-flat-prices/sg-resale-flat-prices.ipynb similarity index 100% rename from examples/sg-resale-flat-prices/sg-resale-flat-prices.ipynb rename to examples/user_0@gmail.com/sg-resale-flat-prices/sg-resale-flat-prices.ipynb diff --git a/examples/word-count/Dockerfile b/examples/user_0@gmail.com/word-count/Dockerfile similarity index 100% rename from examples/word-count/Dockerfile rename to examples/user_0@gmail.com/word-count/Dockerfile diff --git a/examples/word-count/pom.xml b/examples/user_0@gmail.com/word-count/pom.xml similarity index 100% rename from examples/word-count/pom.xml rename to examples/user_0@gmail.com/word-count/pom.xml diff --git a/examples/word-count/src/main/resources/example.txt b/examples/user_0@gmail.com/word-count/src/main/resources/example.txt similarity index 100% rename from examples/word-count/src/main/resources/example.txt rename to examples/user_0@gmail.com/word-count/src/main/resources/example.txt diff --git a/examples/word-count/src/main/scala/WordCount.scala b/examples/user_0@gmail.com/word-count/src/main/scala/WordCount.scala similarity index 100% rename from examples/word-count/src/main/scala/WordCount.scala rename to examples/user_0@gmail.com/word-count/src/main/scala/WordCount.scala diff --git a/server/app/routes/login.py b/server/app/routes/login.py index 870f5c3..7c0f4f2 100644 --- a/server/app/routes/login.py +++ b/server/app/routes/login.py @@ -17,6 +17,8 @@ def login(): return Response( response=json.dumps({ 'message': 'Login successful', + 'name': g.user.name, + 'email': g.user.email, 'access_token': access_token }), status=200 diff --git a/webapp/src/App.js b/webapp/src/App.js index e386057..ec6ab54 100644 --- a/webapp/src/App.js +++ b/webapp/src/App.js @@ -34,6 +34,8 @@ const theme = createTheme({ const App = () => { const [isLoggedIn, setIsLoggedIn] = useState(false); + const [username, setUsername] = useState(''); + const [useremail, setUseremail] = useState(''); const [showHistoryServer, setShowHistoryServer] = useState(false); const [showScheduler, setShowScheduler] = useState(false); @@ -45,6 +47,7 @@ const App = () => { const [openWorkspaceDrawer, setOpenWorkspaceDrawer] = useState(false); const [currentPath, setCurrentPath] = useState('work'); + const [rootPath, setRootPath] = useState('work'); const [workspaceFiles, setWorkspaceFiles] = useState([]); const [refreshKey, setRefreshKey] = useState(0); @@ -140,7 +143,13 @@ const App = () => { }; if (!isLoggedIn) { - return setIsLoggedIn(true)} />; + return { + setUsername(username); + setUseremail(useremail); + setCurrentPath(`work/${useremail}`); + setRootPath(`work/${useremail}`); + setIsLoggedIn(true)} + } />; } return ( @@ -156,7 +165,8 @@ const App = () => { currentPath={currentPath} setCurrentPath={setCurrentPath} setRefreshKey={setRefreshKey} - workspaceFiles={workspaceFiles}/> + workspaceFiles={workspaceFiles} + rootPath={rootPath}/> + workspaceFiles={workspaceFiles} + rootPath={rootPath}/> )} {/* History Server */} diff --git a/webapp/src/components/sidebar/workspace/WorkspaceSidebar.js b/webapp/src/components/sidebar/workspace/WorkspaceSidebar.js index b3dad0e..e0f2975 100644 --- a/webapp/src/components/sidebar/workspace/WorkspaceSidebar.js +++ b/webapp/src/components/sidebar/workspace/WorkspaceSidebar.js @@ -14,13 +14,18 @@ function WorkspaceSidebar({ currentPath, setCurrentPath, setRefreshKey, - workspaceFiles}) { + workspaceFiles, + rootPath}) { const workspaceSidebarWidth = 300; const handleBackClick = () => { const parentPath = currentPath.split('/').slice(0, -1).join('/'); - setCurrentPath(parentPath || 'work'); // Navigate to parent directory or root if at top level + if (parentPath === 'work') { + setCurrentPath(rootPath); + } else { + setCurrentPath(parentPath); + } }; return (