dongli 2024-12-15 17:05:05 -08:00
commit e1c1738818
8 changed files with 152 additions and 82 deletions

View File

@ -4,25 +4,25 @@ FROM python:3.10-slim-bullseye
ARG CONTAINER_APP_ROOT="/app" ARG CONTAINER_APP_ROOT="/app"
ENV APP_NAME="authentication" ENV APP_NAME="authentication"
ENV DEVSVC_WEBAPI_URL_BASE="" ENV DEVSVC_WEBAPI_URL_BASE="http://devsvc:8007/api/devsvc"
ENV NOTIFICATION_WEBAPI_URL_BASE="" ENV NOTIFICATION_WEBAPI_URL_BASE="http://notification:8003/api/notification/"
ENV JWT_SECRET_KEY="" ENV JWT_SECRET_KEY="8f87ca8c3c9c3df09a9c78e0adb0927855568f6072d9efc892534aee35f5867b"
ENV JWT_ALGORITHM="" ENV JWT_ALGORITHM="HS256"
#site_settings #site_settings
ENV SERVICE_API_ACCESS_HOST=0.0.0.0 ENV SERVICE_API_ACCESS_HOST=0.0.0.0
ENV SERVICE_API_ACCESS_PORT=8004 ENV SERVICE_API_ACCESS_PORT=8004
ENV MONGODB_NAME= ENV MONGODB_NAME=freeleaps2
ENV MONGODB_PORT= ENV MONGODB_PORT=27017
ENV MONGODB_URI= ENV MONGODB_URI="mongodb://localhost:27017/"
#log_settings #log_settings
ENV LOG_BASE_PATH= ENV LOG_BASE_PATH=$CONTAINER_APP_ROOT/log/$APP_NAME
ENV BACKEND_LOG_FILE_NAME= ENV BACKEND_LOG_FILE_NAME=$APP_NAME
ENV APPLICATION_ACTIVITY_LOG= ENV APPLICATION_ACTIVITY_LOG=$APP_NAME-activity
WORKDIR ${CONTAINER_APP_ROOT} WORKDIR ${CONTAINER_APP_ROOT}

View File

@ -109,24 +109,6 @@ class UserAuthHandler:
def user_sign_out(self, token): def user_sign_out(self, token):
pass pass
async def generate_auth_code_for_email(self, email: str) -> str:
"""send auth code to email address
Args:
email (str): email address
"""
auth_code = generate_auth_code()
expiry = datetime.now(timezone.utc) + timedelta(minutes=5)
auth_code_doc = AuthCodeDoc(
auth_code=auth_code,
method=email.lower(),
method_type=AuthType.EMAIL,
expiry=expiry,
)
await auth_code_doc.create()
return auth_code
async def verify_email_code(self, email: str, code: str) -> bool: async def verify_email_code(self, email: str, code: str) -> bool:
"""sign in with email and code """sign in with email and code

View File

@ -1,25 +1,25 @@
FROM python:3.10-slim-buster FROM python:3.10-slim-buster
# docker settings # docker settings
ARG CONTAINER_APP_ROOT= ARG CONTAINER_APP_ROOT="/app"
ENV APP_NAME= ENV APP_NAME="central_storage"
ENV AZURE_STORAGE_DOCUMENT_API_KEY="" ENV AZURE_STORAGE_DOCUMENT_API_KEY="Cg+wtKpHt6Bo6bTUtjic40cRNRZ8NCI3JYBY69BNPgFJARVx/c18iVC7cASbJfzukyu4pksyhUep+AStFdpH7Q=="
ENV AZURE_STORAGE_DOCUMENT_API_ENDPOINT="" ENV AZURE_STORAGE_DOCUMENT_API_ENDPOINT="https://freeleaps1document.blob.core.windows.net/"
#site_settings #site_settings
ENV SERVICE_API_ACCESS_HOST=0.0.0.0 ENV SERVICE_API_ACCESS_HOST=0.0.0.0
ENV SERVICE_API_ACCESS_PORT=8005 ENV SERVICE_API_ACCESS_PORT=8005
ENV MONGODB_NAME= ENV MONGODB_NAME=freeleaps2
ENV MONGODB_PORT= ENV MONGODB_PORT=27017
ENV MONGODB_URI= ENV MONGODB_URI="mongodb://localhost:27017/"
#log_settings #log_settings
ENV LOG_BASE_PATH= ENV LOG_BASE_PATH=$CONTAINER_APP_ROOT/log/$APP_NAME
ENV BACKEND_LOG_FILE_NAME= ENV BACKEND_LOG_FILE_NAME=$APP_NAME
ENV APPLICATION_ACTIVITY_LOG= ENV APPLICATION_ACTIVITY_LOG=$APP_NAME-activity
WORKDIR ${CONTAINER_APP_ROOT} WORKDIR ${CONTAINER_APP_ROOT}

View File

@ -4,8 +4,8 @@ FROM python:3.10-slim-buster
ARG CONTAINER_APP_ROOT="/app" ARG CONTAINER_APP_ROOT="/app"
ENV APP_NAME="content" ENV APP_NAME="content"
ENV FREELEAPS_WWW_AS_AZURE_CLIENT_SECRET="" ENV FREELEAPS_WWW_AS_AZURE_CLIENT_SECRET="jTu8Q~WceiK-5dfZB44Ww-K4fVGi3_5tHNWYYbdX"
ENV CENTRAL_STORAGE_WEBAPI_URL_BASE="" ENV CENTRAL_STORAGE_WEBAPI_URL_BASE="http://central_storage:8005/api/central_storage/"
#site_settings #site_settings
ENV SERVICE_API_ACCESS_HOST=0.0.0.0 ENV SERVICE_API_ACCESS_HOST=0.0.0.0
@ -17,9 +17,9 @@ ENV MONGODB_URI="mongodb://freeleaps2-mongodb:27017"
#log_settings #log_settings
ENV LOG_BASE_PATH= ENV LOG_BASE_PATH=$CONTAINER_APP_ROOT/log/$APP_NAME
ENV BACKEND_LOG_FILE_NAME= ENV BACKEND_LOG_FILE_NAME=$APP_NAME
ENV APPLICATION_ACTIVITY_LOG= ENV APPLICATION_ACTIVITY_LOG=$APP_NAME-activity
WORKDIR ${CONTAINER_APP_ROOT} WORKDIR ${CONTAINER_APP_ROOT}

View File

@ -4,29 +4,33 @@ from datetime import datetime, timedelta, timezone
from backend.sharepoint.sharepoint_graph_client import SharePointGraphClient from backend.sharepoint.sharepoint_graph_client import SharePointGraphClient
from common.constants.region import UserRegion from common.constants.region import UserRegion
from backend.document.document_manager import DocumentManager from backend.document.document_manager import DocumentManager
from backend.content.constants import ContentSource, ContentMediaType, ContentDataFormat, ContentFileConstants from backend.content.constants import (
ContentSource,
ContentFileConstants,
)
from backend.content.models import ContentDirectory, ContentFolderDoc from backend.content.models import ContentDirectory, ContentFolderDoc
class ContentSharePointManager: class ContentSharePointManager:
def __init__(self) -> None: def __init__(self) -> None:
self.sharepoint_client = SharePointGraphClient( self.sharepoint_client = SharePointGraphClient(
tenant_id='cf151ee8-5c2c-4fe7-a1c4-809ba43c9f24', tenant_id="cf151ee8-5c2c-4fe7-a1c4-809ba43c9f24",
client_id='a91e3c1d-d55d-423d-83cb-a736df229817', client_id="a91e3c1d-d55d-423d-83cb-a736df229817",
client_secret= app_settings.FREELEAPS_WWW_AS_AZURE_CLIENT_SECRET, client_secret=app_settings.FREELEAPS_WWW_AS_AZURE_CLIENT_SECRET,
host_name="netorgft10898514.sharepoint.com", host_name="netorgft10898514.sharepoint.com",
site_name="MediaRoom" site_name="MediaRoom",
) )
self.sharepoint_client.set_document_scope( self.sharepoint_client.set_document_scope(
document_library="freeleaps", document_library="freeleaps", root_folder="production"
root_folder="production"
) )
self.share_point_file_expiry = timedelta(hours=24) self.share_point_file_expiry = timedelta(hours=24)
def __generate_created__by__(self, folder_name): def __generate_created__by__(self, folder_name):
return "content-service-" + folder_name.replace('/', '-').lower() return "content-service-" + folder_name.replace("/", "-").lower()
async def retrieve_directories_for_folder(self, folder_name: str, region: UserRegion): async def retrieve_directories_for_folder(
self, folder_name: str, region: UserRegion
):
content_folder_name = folder_name + "/" + region.name content_folder_name = folder_name + "/" + region.name
sp_folders = self.sharepoint_client.list_sub_folders(content_folder_name) sp_folders = self.sharepoint_client.list_sub_folders(content_folder_name)
current_time = datetime.now(timezone.utc) current_time = datetime.now(timezone.utc)
@ -42,69 +46,89 @@ class ContentSharePointManager:
udpate_time=current_time, udpate_time=current_time,
update_source=ContentSource.SHAREPOINT, update_source=ContentSource.SHAREPOINT,
valid_thru=current_time + self.share_point_file_expiry, valid_thru=current_time + self.share_point_file_expiry,
region=region region=region,
) )
else: else:
folder.content_directories.clear() folder.content_directories.clear()
for sp_folder in sp_folders: for sp_folder in sp_folders:
content_directory = ContentDirectory( content_directory = ContentDirectory(
content_name=sp_folder['name'], content_name=sp_folder["name"],
cover_document_id=None, cover_document_id=None,
summary_text=None, summary_text=None,
title_text=None, title_text=None,
content_link=None, content_link=None,
content_document_id=None, content_document_id=None,
) )
sp_files = self.sharepoint_client.list_files(content_folder_name + "/" + sp_folder['name']) sp_files = self.sharepoint_client.list_files(
content_folder_name + "/" + sp_folder["name"]
)
for sp_file in sp_files: for sp_file in sp_files:
if ( if (
sp_file['name'].lower() sp_file["name"].lower()
== ContentFileConstants.COVER_FILE_NAME.lower() == ContentFileConstants.COVER_FILE_NAME.lower()
): ):
cover_file_content = self.sharepoint_client.get_file_content(sp_file['id']) cover_file_content = self.sharepoint_client.get_file_content(
sp_file["id"]
)
cover_document_manager = DocumentManager() cover_document_manager = DocumentManager()
file_name=sp_file['name'].lower() file_name = sp_file["name"].lower()
created_by=self.__generate_created__by__(folder_name=folder_name) created_by = self.__generate_created__by__(folder_name=folder_name)
content_directory.cover_document_id = await cover_document_manager.save_document_file( content_directory.cover_document_id = (
created_by, file_name, cover_file_content await cover_document_manager.save_document_file(
created_by, file_name, cover_file_content
)
) )
elif ( elif (
sp_file['name'].lower() sp_file["name"].lower()
== ContentFileConstants.SUMMARY_FILE_NAME.lower() == ContentFileConstants.SUMMARY_FILE_NAME.lower()
): ):
content_directory.summary_text = self.sharepoint_client.get_file_content(sp_file['id']) content_directory.summary_text = (
self.sharepoint_client.get_file_content(sp_file["id"])
)
elif ( elif (
sp_file['name'].lower() sp_file["name"].lower()
== ContentFileConstants.TITLE_FILE_NAME.lower() == ContentFileConstants.TITLE_FILE_NAME.lower()
): ):
content_directory.title_text = self.sharepoint_client.get_file_content(sp_file['id']) content_directory.title_text = (
self.sharepoint_client.get_file_content(sp_file["id"])
)
elif ( elif (
sp_file['name'].lower() sp_file["name"].lower()
== ContentFileConstants.CONTENT_LINK_FILE_NAME.lower() == ContentFileConstants.CONTENT_LINK_FILE_NAME.lower()
): ):
content_directory.content_link = self.sharepoint_client.get_file_content(sp_file['id']) content_directory.content_link = (
self.sharepoint_client.get_file_content(sp_file["id"])
)
elif ( elif (
sp_file['name'].lower() sp_file["name"].lower()
== ContentFileConstants.CONTENT_HTML_FILE_NAME.lower() == ContentFileConstants.CONTENT_HTML_FILE_NAME.lower()
): ):
content_directory.content_html = self.sharepoint_client.get_file_content(sp_file['id']) content_directory.content_html = (
self.sharepoint_client.get_file_content(sp_file["id"])
)
elif ( elif (
sp_file['name'].lower() sp_file["name"].lower()
== ContentFileConstants.CONTENT_TEXT_FILE_NAME.lower() == ContentFileConstants.CONTENT_TEXT_FILE_NAME.lower()
): ):
content_directory.content_text = self.sharepoint_client.get_file_content(sp_file['id']) content_directory.content_text = (
self.sharepoint_client.get_file_content(sp_file["id"])
)
elif ( elif (
sp_file['name'].lower() sp_file["name"].lower()
== ContentFileConstants.CONTENT_PDF_FILE_NAME.lower() == ContentFileConstants.CONTENT_PDF_FILE_NAME.lower()
): ):
content_file_content = self.sharepoint_client.get_file_content(sp_file['id']) content_file_content = self.sharepoint_client.get_file_content(
sp_file["id"]
)
content_document_manager = DocumentManager() content_document_manager = DocumentManager()
file_name=sp_file['name'] file_name = sp_file["name"]
created_by=self.__generate_created__by__(folder_name=folder_name) created_by = self.__generate_created__by__(folder_name=folder_name)
content_directory.content_document_id = await content_document_manager.save_document_file( content_directory.content_document_id = (
created_by, file_name, content_file_content await content_document_manager.save_document_file(
created_by, file_name, content_file_content
)
) )
folder.content_directories.append(content_directory) folder.content_directories.append(content_directory)
@ -118,8 +142,10 @@ class ContentSharePointManager:
current_time = datetime.now(timezone.utc) current_time = datetime.now(timezone.utc)
folders = await ContentFolderDoc.find( folders = await ContentFolderDoc.find(
ContentFolderDoc.update_source == ContentSource.SHAREPOINT, ContentFolderDoc.update_source == ContentSource.SHAREPOINT,
ContentFolderDoc.valid_thru < current_time ContentFolderDoc.valid_thru < current_time,
).to_list() ).to_list()
for folder in folders: for folder in folders:
await self.retrieve_directories_for_folder(folder.folder_name, folder.region) await self.retrieve_directories_for_folder(
folder.folder_name, folder.region
)

View File

@ -15,12 +15,12 @@ ENV SYSTEM_USER_ID=117f191e810c19729de860aa
ENV SMS_FROM=+16898887156 ENV SMS_FROM=+16898887156
ENV EMAIL_FROM=freeleaps@freeleaps.com ENV EMAIL_FROM=freeleaps@freeleaps.com
ENV SECRET_KEY=ea84edf152976b2fcec12b78aa8e45bc26a5cf0ef61bf16f5c317ae33b3fd8b0 ENV SECRET_KEY=8f87ca8c3c9c3df09a9c78e0adb0927855568f6072d9efc892534aee35f5867b
ENV SENDGRID_API_KEY=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 ENV SENDGRID_API_KEY=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
ENV TWILIO_ACCOUNT_SID=ACf8c9283a6acda060258eadb29be58bc8 ENV TWILIO_ACCOUNT_SID=ACf8c9283a6acda060258eadb29be58bc8
ENV TWILIO_AUTH_TOKEN=ef160748cc22c8b7195b49df4b8eca7e ENV TWILIO_AUTH_TOKEN=120165c0550111ddfd58efc97dafc2fe

View File

@ -0,0 +1,25 @@
export APP_NAME=central_storage
export GIT_REPO_ROOT=/Users/yaojing/Work/Freeleaps/freeleaps-service-hub
export APP_PARENT_FOLDER=apps
export SERVICE_API_ACCESS_HOST=0.0.0.0
export SERVICE_API_ACCESS_PORT=8005
export CONTAINER_APP_ROOT=/app
export AZURE_STORAGE_DOCUMENT_API_KEY=xbiFtFeQ6v5dozgVM99fZ9huUomL7QcLu6s0y8zYHtIXZ8XdneKDMcg4liQr/9oNlVoRFcZhWjLY+ASt9cjICQ==
export AZURE_STORAGE_DOCUMENT_API_ENDPOINT="https://freeleaps1document.blob.core.windows.net/"
export LOG_BASE_PATH=$CONTAINER_APP_ROOT/log/$APP_NAME
export BACKEND_LOG_FILE_NAME=$APP_NAME
export APPLICATION_ACTIVITY_LOG=$APP_NAME-activity
export MONGODB_NAME=freeleaps2
export MONGODB_PORT=27017
export CODEBASE_ROOT=/Users/yaojing/Work/Freeleaps/freeleaps-service-hub/apps/central_storage
export WORKING_DIR=/Users/yaojing/Work/Freeleaps/freeleaps-service-hub/sites/central_storage/deploy
#!/bin/bash
export VENV_DIR=venv_t
export VENV_ACTIVATE=venv_t/bin/activate
export DOCKER_HOME=/var/lib/docker
export DOCKER_APP_HOME=$DOCKER_HOME/app
export DOCKER_BACKEND_HOME=$DOCKER_APP_HOME/$APP_NAME
export DOCKER_BACKEND_LOG_HOME=$DOCKER_BACKEND_HOME/log
export MONGODB_URI=mongodb://freeleaps2-mongodb:27017/
export FREELEAPS_ENV=dev

View File

@ -0,0 +1,37 @@
services:
central_storage:
container_name: $APP_NAME
build:
context: ${CODEBASE_ROOT}
args:
CONTAINER_APP_ROOT: ${CONTAINER_APP_ROOT}
profiles: [prod,alpha,dev]
restart: always
environment:
- APP_NAME=${APP_NAME}
- MONGODB_NAME=${MONGODB_NAME}
- MONGODB_PORT=${MONGODB_PORT}
- MONGODB_URI=${MONGODB_URI}
- SERVICE_API_ACCESS_HOST=${SERVICE_API_ACCESS_HOST}
- SERVICE_API_ACCESS_PORT=${SERVICE_API_ACCESS_PORT}
- AZURE_STORAGE_DOCUMENT_API_KEY=${AZURE_STORAGE_DOCUMENT_API_KEY}
- AZURE_STORAGE_DOCUMENT_API_ENDPOINT=${AZURE_STORAGE_DOCUMENT_API_ENDPOINT}
- LOG_BASE_PATH=${LOG_BASE_PATH}
- BACKEND_LOG_FILE_NAME=${BACKEND_LOG_FILE_NAME}
- APPLICATION_ACTIVITY_LOG=${APPLICATION_ACTIVITY_LOG}
ports:
- ${SERVICE_API_ACCESS_PORT}:${SERVICE_API_ACCESS_PORT}
command:
- /bin/sh
- -c
- |
uvicorn webapi.main:app --reload --port=${SERVICE_API_ACCESS_PORT} --host=${SERVICE_API_ACCESS_HOST}
networks:
- devbox_freeleaps2-network
volumes:
- type: bind
source: $DOCKER_BACKEND_LOG_HOME
target: $LOG_BASE_PATH
networks:
devbox_freeleaps2-network:
external: true