Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

integrate oauth to full-stack #8

Open
wants to merge 32 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
c30c3fe
Create extension
nhanaa May 31, 2024
a074e6a
Add instruction to run extension
nhanaa May 31, 2024
aa4abc9
add api
linhphan03 Jun 1, 2024
d841673
added initial link rec stuffs
tindo1234 Jun 1, 2024
9788d43
added create folder based on recommended links
tindo1234 Jun 1, 2024
5b8dd11
ensure indices are addded
tindo1234 Jun 1, 2024
b61ee1a
add initial chat
tindo1234 Jun 1, 2024
85d7dee
added .env.example
tindo1234 Jun 1, 2024
eafaf5e
add a possilbe implementation of inserting to browsing history
tindo1234 Jun 2, 2024
278a410
debugged get_links
tindo1234 Jun 2, 2024
bd7fdaf
create_chunks works
tindo1234 Jun 2, 2024
e660ce5
working chat endpoint
tindo1234 Jun 2, 2024
41f92c6
edited the UI
mellieho9 Jun 3, 2024
0883e22
remove linh tinh files
linhphan03 Jun 6, 2024
b97f25f
Merge branch 'linh-backend-init-backend' of github.com:nhanaa/bento i…
linhphan03 Jun 6, 2024
692d4ea
Merge pull request #5 from nhanaa/ngan-frontend-browser-extension
mellieho9 Jun 6, 2024
4fd2921
Jesus Christ
mellieho9 Jun 6, 2024
988a82f
Merge branch 'tin-backend-chatwithrag' into ngan-backend-auth
mellieho9 Jun 6, 2024
d96b200
integrated oauth with frontend
mellieho9 Jun 6, 2024
7fc741c
Integrate OAuth
mellieho9 Jun 6, 2024
983cfd3
ignore keys
mellieho9 Jun 6, 2024
c936e68
Stop tracking google_secret_key.json
mellieho9 Jun 6, 2024
9d10877
add search engine and end points
linhphan03 Jun 7, 2024
d1b4e3c
Added animation and created a separate hook folder
mellieho9 Jun 7, 2024
fb8d371
Merge branch 'linh-backend-init-backend' into ngan-backend-auth
mellieho9 Jun 7, 2024
51047dc
Added logout and create user
mellieho9 Jun 7, 2024
2184db5
update backend to use MongoDB
nhanaa Jun 8, 2024
fa9cb18
Merge branch 'main' of https://github.com/nhanaa/bento into nhan-exte…
nhanaa Jun 9, 2024
8d62245
Merge branch 'nhan-extension-send-browsing-history' of https://github…
nhanaa Jun 9, 2024
3f86b91
Merge branch 'nhan-backend-extension-update' into ngan-backend-auth
mellieho9 Jun 9, 2024
b7e16b6
Updated endpoints
mellieho9 Jun 9, 2024
41d3328
deleted files
mellieho9 Jun 9, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file modified .DS_Store
Binary file not shown.
Binary file added backend/.DS_Store
Binary file not shown.
1 change: 1 addition & 0 deletions backend/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
/myenv
5 changes: 4 additions & 1 deletion backend/app/.gitignore
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
.venv*
*__pycache__*
.env

flask_session/
services/.env
services/google_secret_key.json
note.txt
36 changes: 24 additions & 12 deletions backend/app/app.py
Original file line number Diff line number Diff line change
@@ -1,24 +1,36 @@
import os
from flask import Flask
from routes.user import user_bp
from routes.folder import folder_bp
from routes.file import file_bp
from utils.db import CosmosDB
from pymongo import MongoClient
from config import Config
from dotenv import load_dotenv


def create_app():
app = Flask(__name__)
app.config.from_object(Config)

# Initialize Azure Cosmos DB
CosmosDB.init_app(app)
app = Flask(__name__)
app.config.from_object(Config)
app.app_context()

# Initialize Azure Cosmos DB
# CosmosDB.init_app(app)
app.secret_key = app.config["GOOGLE_SECRET_KEY"]
mongo = MongoClient(app.config['MONGO_DB_URI'])
db = mongo[app.config['MONGO_DB_NAME']]

def create_app():
from routes.user import user_bp
from routes.folder import folder_bp

# Register blueprints
from routes.user import user_bp
from routes.folder import folder_bp
from routes.search import search_bp
from routes.oauth import oauth_bp

app.register_blueprint(user_bp, url_prefix='/users')
app.register_blueprint(folder_bp, url_prefix='/folders')
app.register_blueprint(file_bp, url_prefix='/files')

app.register_blueprint(oauth_bp, url_prefix='/oauth')
return app

if __name__ == '__main__':
app = create_app()
app.run(debug=True)
app.run(debug=True)
12 changes: 6 additions & 6 deletions backend/app/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,9 @@
class Config:
load_dotenv()

COSMOS_DB_URI = os.getenv('COSMOS_DB_URI')
COSMOS_DB_KEY = os.getenv('COSMOS_DB_KEY')
COSMOS_DB_DATABASE_NAME = os.getenv('COSMOS_DB_DATABASE_NAME')
# COSMOS_CONTAINER_NAME = os.getenv('COSMOS_CONTAINER_NAME', 'Users')

print(222, os.getenv('COSMOS_DB_URI'))
# COSMOS_DB_URI = os.getenv('COSMOS_DB_URI')
# COSMOS_DB_KEY = os.getenv('COSMOS_DB_KEY')
# COSMOS_DB_DATABASE_NAME = os.getenv('COSMOS_DB_DATABASE_NAME')
GOOGLE_SECRET_KEY = os.getenv("GOOGLE_SECRET_KEY")
MONGO_DB_URI = os.getenv('MONGO_DB_URI')
MONGO_DB_NAME = os.getenv('MONGO_DB_NAME')
7 changes: 3 additions & 4 deletions backend/app/models/folder.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@
import datetime
import uuid

class Folder:
def __init__(self, name, summary):
self.id = str(uuid.uuid4())
def __init__(self, user_id, name, summary):
self.user_id = user_id
self.name = name
self.last_synced_at = datetime.datetime.now()
self.summary = summary
Expand All @@ -13,7 +12,7 @@ def __init__(self, name, summary):

def to_dict(self):
return {
'id': self.id,
'user_id': self.user_id,
'name': self.name,
'last_synced_at': self.last_synced_at,
'summary': self.summary,
Expand Down
8 changes: 4 additions & 4 deletions backend/app/models/user.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,7 @@
import datetime
import uuid

class User:
def __init__(self, email, name):
self.id = str(uuid.uuid4())
self.email = email
self.name = name
self.is_deactivated = False
Expand All @@ -12,9 +10,11 @@ def __init__(self, email, name):

def to_dict(self):
return {
'id': self.id,
'email': self.email,
'name': self.name
'name': self.name,
'is_deactivated': self.is_deactivated,
'created_at': self.created_at,
'updated_at': self.updated_at
}

# Create User object from dict
Expand Down
14 changes: 12 additions & 2 deletions backend/app/requirements.txt
Original file line number Diff line number Diff line change
@@ -1,4 +1,14 @@
flask
azure-core
azure-cosmos
python-dotenv
flask==3.0.3
pymongo==4.7.2
python-dotenv==1.0.1
google-auth-oauthlib
google-auth-httplib2
google-api-python-client
requests_oauthlib
Flask-Session
pyjwt
flask-cors
whoosh

124 changes: 85 additions & 39 deletions backend/app/routes/folder.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,59 +7,105 @@
# folders
@folder_bp.route('/', methods=['POST'])
def add_folder():
data = request.json
folder = folder_service.create_folder(data['name'], data['summary'])
return jsonify(folder.to_dict()), 201
data = request.get_json()
folder = folder_service.create_folder(data['user_id'], data['name'], data['summary'])
return jsonify(folder), 201

@folder_bp.route('/all/<user_id>', methods=['GET'])
def get_folders_by_user_id(user_id):
folders = folder_service.get_folders_by_user_id(user_id)
if not folders:
return jsonify({"error": "Folders not found"}), 404
return jsonify(folders)

@folder_bp.route('/all', methods=['GET'])
def get_folders():
return jsonify(folder_service.get_folders())
@folder_bp.route('/<folder_id>/', methods=['GET'])
def get_folder(folder_id):
folder = folder_service.get_folder_by_id(folder_id)
if not folder:
return jsonify({"error": "Folder not found"}), 404
return jsonify(folder)

@folder_bp.route('/<folder_id>/', methods=['PUT'])
def update_folder(folder_id):
data = request.json
folder = folder_service.update_folder_by_id(folder_id, data)
if not folder:
return jsonify({"error": "Folder not found"}), 404
return jsonify(folder)

@folder_bp.route('/<folder_name>', methods=['GET'])
def get_folder(folder_name):
return jsonify(folder_service.get_folder_by_name(folder_name))
@folder_bp.route('/<folder_id>/', methods=['DELETE'])
def delete_folder(folder_id):
folder = folder_service.delete_folder_by_id(folder_id)
if not folder:
return jsonify({"error": "Folder not found"}), 404
return jsonify({"message": "Folder deleted successfully"})

# folder web_urls
@folder_bp.route('/<folder_name>/web_urls', methods=['GET'])
def get_folder_web_urls(folder_name):
return jsonify(folder_service.get_web_urls(folder_name))
@folder_bp.route('/<folder_id>/web_urls', methods=['GET'])
def get_folder_web_urls(folder_id):
web_urls = folder_service.get_web_urls(folder_id)
if web_urls == None:
return jsonify({"error": "Web URLs not found"}), 404
return jsonify(web_urls)

@folder_bp.route('/<folder_name>/web_urls/add', methods=['PUT'])
def add_folder_web_urls(folder_name):
@folder_bp.route('/<folder_id>/web_urls', methods=['PUT'])
def add_folder_web_urls(folder_id):
data = request.json
return jsonify(folder_service.add_web_urls(folder_name, data['web_urls']))
folder = folder_service.add_web_urls(folder_id, data['web_urls'])
if not folder:
return jsonify({"error": "Folder not found"}), 404
return jsonify(folder)

@folder_bp.route('/<folder_name>/web_urls/delete', methods=['PUT'])
def delete_folder_web_urls(folder_name):
data = request.json
return jsonify(folder_service.delete_web_urls(folder_name, data['web_urls']))
@folder_bp.route('/<folder_id>/web_urls', methods=['DELETE'])
def delete_folder_web_urls(folder_id):
folder = folder_service.delete_web_urls(folder_id)
if not folder:
return jsonify({"error": "Folder not found"}), 404
return jsonify(folder)

# folder image_urls
@folder_bp.route('/<folder_name>/image_urls', methods=['GET'])
def get_folder_image_urls(folder_name):
return jsonify(folder_service.get_image_urls(folder_name))
@folder_bp.route('/<folder_id>/image_urls', methods=['GET'])
def get_folder_image_urls(folder_id):
image_urls = folder_service.get_image_urls(folder_id)
if image_urls == None:
return jsonify({"error": "Image URLs not found"}), 404
return jsonify(image_urls)

@folder_bp.route('/<folder_name>/image_urls/add', methods=['PUT'])
def add_folder_image_urls(folder_name):
@folder_bp.route('/<folder_id>/image_urls', methods=['PUT'])
def add_folder_image_urls(folder_id):
data = request.json
return jsonify(folder_service.add_image_urls(folder_name, data['image_urls']))
folder = folder_service.add_image_urls(folder_id, data['image_urls'])
if not folder:
return jsonify({"error": "Folder not found"}), 404
return jsonify(folder)

@folder_bp.route('/<folder_name>/image_urls/delete', methods=['PUT'])
def delete_folder_image_urls(folder_name):
data = request.json
return jsonify(folder_service.delete_image_urls(folder_name, data['image_urls']))

@folder_bp.route('/<folder_id>/image_urls', methods=['DELETE'])
def delete_folder_image_urls(folder_id):
folder = folder_service.delete_image_urls(folder_id)
if not folder:
return jsonify({"error": "Folder not found"}), 404
return jsonify(folder)

# folder download_urls
@folder_bp.route('/<folder_name>/download_urls', methods=['GET'])
def get_folder_download_urls(folder_name):
return jsonify(folder_service.get_download_urls(folder_name))
@folder_bp.route('/<folder_id>/download_urls', methods=['GET'])
def get_folder_download_urls(folder_id):
download_urls = folder_service.get_download_urls(folder_id)
if download_urls == None:
return jsonify({"error": "Download URLs not found"}), 404
return jsonify(download_urls)

@folder_bp.route('/<folder_name>/download_urls/add', methods=['PUT'])
def add_folder_download_urls(folder_name):
@folder_bp.route('/<folder_id>/download_urls', methods=['PUT'])
def add_folder_download_urls(folder_id):
data = request.json
return jsonify(folder_service.add_download_urls(folder_name, data['download_urls']))
folder = folder_service.add_download_urls(folder_id, data['download_urls'])
if not folder:
return jsonify({"error": "Folder not found"}), 404
return jsonify(folder)

@folder_bp.route('/<folder_name>/download_urls/delete', methods=['PUT'])
def delete_folder_download_urls(folder_name):
data = request.json
return jsonify(folder_service.delete_download_urls(folder_name, data['download_urls']))
@folder_bp.route('/<folder_id>/download_urls', methods=['DELETE'])
def delete_folder_download_urls(folder_id):
folder = folder_service.delete_download_urls(folder_id)
if not folder:
return jsonify({"error": "Folder not found"}), 404
return jsonify(folder)
27 changes: 27 additions & 0 deletions backend/app/routes/oauth.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
from flask import Blueprint, request, jsonify
from services.oauth import OAuthService

oauth_bp = Blueprint('oauth_bp', __name__)
oauth_service = OAuthService()

# testing
@oauth_bp.route('/', methods=['GET'])
def default():
return 'Testing OAuth!'

@oauth_bp.route('/google/login', methods=['GET'])
def google_login():
return oauth_service.google_login()

@oauth_bp.route('/google/callback', methods=['GET', 'POST']) # Allow both GET and POST
def google_callback():
if request.method == 'POST':
code = request.json.get('code')
if code:
return oauth_service.google_callback()
return oauth_service.google_callback()

@oauth_bp.route('/logout', methods=['GET', 'POST'])
def logout():
return oauth_service.logout()

13 changes: 13 additions & 0 deletions backend/app/routes/search.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
from flask import Blueprint, request, jsonify

from services.search import SearchService

search_bp = Blueprint('search_bp', __name__)
search_service = SearchService()

@search_bp.route('/', methods=['GET'])
def search():
query = request.args.get('q')
res = search_service.search(query)
print(111, res)
return jsonify(res), 200
8 changes: 4 additions & 4 deletions backend/app/routes/user.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
from flask import Blueprint, jsonify, request
from utils.db import CosmosDB
from services.user import UserService

user_bp = Blueprint('user_bp', __name__)
Expand Down Expand Up @@ -29,12 +28,12 @@ def create_user():
data = request.get_json()
email = data.get('email')
name = data.get('name')

if not email or not name:
return jsonify({"error": "Email and name are required"}), 400

user = user_service.create_user(email, name)
return jsonify(user.to_dict()), 201
return jsonify(user), 201

@user_bp.route('/<user_id>', methods=['PUT'])
def update_user_by_id(user_id):
Expand All @@ -48,6 +47,7 @@ def update_user_by_id(user_id):
def update_user_by_email(email):
data = request.get_json()
user = user_service.update_user_by_email(email, data)
print('User:', user)
if not user:
return jsonify({"error": "User not found"}), 404
return jsonify(user)
Expand Down
Loading