diff --git a/.history/be/docs_20250213073657.py b/.history/be/docs_20250213073657.py new file mode 100644 index 0000000..a6985d9 --- /dev/null +++ b/.history/be/docs_20250213073657.py @@ -0,0 +1,78 @@ +from mangum import Mangum +import os +from os.path import join, dirname +from fastapi import FastAPI +from fastapi.openapi.utils import get_openapi +from dotenv import load_dotenv + +load_dotenv(join(dirname(__file__), '..', '.env.test')) +base_api_server_url: str = os.getenv('BASE_API_SERVER_URL') + +from be.api.v1.endpoints.products.get import router as v1_products_get + + +from be.api.v1.endpoints.product_categories.get import ( + router as v1_product_categories_get, +) +from be.api.v1.endpoints.product_categories.post import ( + router as v1_product_categories_post, +) +from be.api.v1.endpoints.product_categories.delete import ( + router as v1_product_categories_delete, +) + +from be.api.v1.endpoints.payments.intent.post import router as v1_payments_intent_post +from be.api.v1.endpoints.cart.quotation.post import router as v1_cart_quotation_post +from be.api.v1.endpoints.cart.checkout.post import router as v1_checkout_post + +tags_metadata = [ + { + "name": "merchandise", + "description": ( + "CRUD for merchandise products." + "GET for all users, POST/DELETE/PATCH for admin users." + ), + }, +] + +app = FastAPI( + title="NTU SCSE Site API Docs", + description="![Powered by Vercel](https://www.datocms-assets.com/31049/1618983297-powered-by-vercel.svg)", + version="0.0.1", + openapi_tags=tags_metadata +) + +app.include_router(v1_products_get) + +app.include_router(v1_product_categories_get) +app.include_router(v1_product_categories_post) +app.include_router(v1_product_categories_delete) + +app.include_router(v1_payments_intent_post) +app.include_router(v1_cart_quotation_post) +app.include_router(v1_checkout_post) + + +def custom_openapi(): + if app.openapi_schema: + return app.openapi_schema + openapi_schema = get_openapi( + title=app.title, + version=app.version, + openapi_version=app.openapi_version, + description=app.description, + routes=app.routes, + servers=[{"url": base_api_server_url}, {"url": "http://localhost:4000"}] + # openapi_prefix=app.openapi_prefix, + ) + # openapi_schema["info"]["x-logo"] = { + # "url": "https://www.datocms-assets.com/31049/1618983297-powered-by-vercel.svg" + # } + + app.openapi_schema = openapi_schema + return openapi_schema + + +app.openapi = custom_openapi + +handler = Mangum(app) diff --git a/.history/be/docs_20250213074014.py b/.history/be/docs_20250213074014.py new file mode 100644 index 0000000..db27cfa --- /dev/null +++ b/.history/be/docs_20250213074014.py @@ -0,0 +1,83 @@ +import os +from os.path import join, dirname + +from dotenv import load_dotenv +from fastapi import FastAPI +from fastapi.openapi.utils import get_openapi +from mangum import Mangum + +# Memuat environment variable dari file .env.test +env_path = join(dirname(__file__), '..', '.env.test') +load_dotenv(env_path) + +# Mengambil BASE_API_SERVER_URL dari environment variable, dengan fallback ke localhost +base_api_server_url: str = os.getenv('BASE_API_SERVER_URL', 'http://localhost:8000') + +# Debugging jika variabel environment tidak ditemukan +if not os.getenv('BASE_API_SERVER_URL'): + print(f"⚠️ BASE_API_SERVER_URL tidak ditemukan di {env_path}, menggunakan default: {base_api_server_url}") + +# Mengimpor endpoint API +from be.api.v1.endpoints.products.get import router as v1_products_get +from be.api.v1.endpoints.product_categories.get import router as v1_product_categories_get +from be.api.v1.endpoints.product_categories.post import router as v1_product_categories_post +from be.api.v1.endpoints.product_categories.delete import router as v1_product_categories_delete +from be.api.v1.endpoints.payments.intent.post import router as v1_payments_intent_post +from be.api.v1.endpoints.cart.quotation.post import router as v1_cart_quotation_post +from be.api.v1.endpoints.cart.checkout.post import router as v1_checkout_post + +# Metadata untuk dokumentasi OpenAPI +tags_metadata = [ + { + "name": "merchandise", + "description": ( + "CRUD for merchandise products. " + "GET for all users, POST/DELETE/PATCH for admin users." + ), + }, +] + +# Inisialisasi FastAPI +app = FastAPI( + title="NTU SCSE Site API Docs", + description="![Powered by Vercel](https://www.datocms-assets.com/31049/1618983297-powered-by-vercel.svg)", + version="0.0.1", + openapi_tags=tags_metadata, +) + +# Menyertakan router API +app.include_router(v1_products_get) +app.include_router(v1_product_categories_get) +app.include_router(v1_product_categories_post) +app.include_router(v1_product_categories_delete) +app.include_router(v1_payments_intent_post) +app.include_router(v1_cart_quotation_post) +app.include_router(v1_checkout_post) + +# Fungsi untuk menyesuaikan OpenAPI Schema +def custom_openapi(): + if app.openapi_schema: + return app.openapi_schema + + servers = [{"url": base_api_server_url}] + + # Menambahkan server lokal jika belum ada + if base_api_server_url != "http://localhost:4000": + servers.append({"url": "http://localhost:4000"}) + + openapi_schema = get_openapi( + title=app.title, + version=app.version, + openapi_version="3.0.2", # Menentukan versi OpenAPI secara eksplisit + description=app.description, + routes=app.routes, + servers=servers, + ) + + app.openapi_schema = openapi_schema + return openapi_schema + +app.openapi = custom_openapi + +# Handler untuk AWS Lambda melalui Mangum +handler = Mangum(app) diff --git a/.history/be/docs_generate_20250213073915.py b/.history/be/docs_generate_20250213073915.py new file mode 100644 index 0000000..b539078 --- /dev/null +++ b/.history/be/docs_generate_20250213073915.py @@ -0,0 +1,23 @@ +import os +import json +from os.path import join, dirname +from be.docs import app + +# Menentukan path file output untuk OpenAPI +file_path = join(dirname(__file__), '..', 'out', 'openapi.json') + +# Membuat direktori jika belum ada +os.makedirs(dirname(file_path), exist_ok=True) + +# Mendapatkan URL server API dari environment variable +base_api_server_url = os.getenv('BASE_API_SERVER_URL', 'http://localhost:8000') + +# Menghasilkan dokumentasi OpenAPI dan menulis ke file +openapi_data = app.openapi() + +if openapi_data: + with open(file_path, 'w', encoding='utf-8') as f: + json.dump(openapi_data, f, indent=4) + print(f"OpenAPI spec telah disimpan di {file_path}") +else: + print("Peringatan: Tidak ada data OpenAPI yang dihasilkan.") diff --git a/.history/be/root_20250213073657.py b/.history/be/root_20250213073657.py new file mode 100644 index 0000000..fcb7e7b --- /dev/null +++ b/.history/be/root_20250213073657.py @@ -0,0 +1,11 @@ +from fastapi import FastAPI +from mangum import Mangum + +app = FastAPI() + +@app.get("/") +def index(): + return {"Hello": "World"} + + +handler = Mangum(app) diff --git a/.history/be/root_20250213074113.py b/.history/be/root_20250213074113.py new file mode 100644 index 0000000..fcb7e7b --- /dev/null +++ b/.history/be/root_20250213074113.py @@ -0,0 +1,11 @@ +from fastapi import FastAPI +from mangum import Mangum + +app = FastAPI() + +@app.get("/") +def index(): + return {"Hello": "World"} + + +handler = Mangum(app) diff --git a/.history/be/root_20250213074119.py b/.history/be/root_20250213074119.py new file mode 100644 index 0000000..7e4e1fe --- /dev/null +++ b/.history/be/root_20250213074119.py @@ -0,0 +1,32 @@ +from fastapi import FastAPI +from fastapi.middleware.cors import CORSMiddleware +from mangum import Mangum + +# Inisialisasi aplikasi FastAPI +app = FastAPI( + title="Simple FastAPI App", + description="Sebuah API sederhana yang menggunakan FastAPI dan Mangum.", + version="1.0.0", +) + +# Middleware untuk mengizinkan CORS (bisa diakses dari berbagai domain) +app.add_middleware( + CORSMiddleware, + allow_origins=["*"], # Bisa diubah untuk membatasi domain tertentu + allow_credentials=True, + allow_methods=["*"], + allow_headers=["*"], +) + +@app.get("/") +async def index() -> dict: + """ + Endpoint root yang mengembalikan pesan Hello World. + """ + return {"message": "Hello, World!"} + +# Handler untuk AWS Lambda atau serverless deployment +handler = Mangum(app) + +# Debugging: Menampilkan pesan saat API dijalankan +print("🚀 FastAPI server is running...") diff --git a/be/docs.py b/be/docs.py index a6985d9..db27cfa 100644 --- a/be/docs.py +++ b/be/docs.py @@ -1,78 +1,83 @@ -from mangum import Mangum import os from os.path import join, dirname + +from dotenv import load_dotenv from fastapi import FastAPI from fastapi.openapi.utils import get_openapi -from dotenv import load_dotenv +from mangum import Mangum -load_dotenv(join(dirname(__file__), '..', '.env.test')) -base_api_server_url: str = os.getenv('BASE_API_SERVER_URL') +# Memuat environment variable dari file .env.test +env_path = join(dirname(__file__), '..', '.env.test') +load_dotenv(env_path) -from be.api.v1.endpoints.products.get import router as v1_products_get +# Mengambil BASE_API_SERVER_URL dari environment variable, dengan fallback ke localhost +base_api_server_url: str = os.getenv('BASE_API_SERVER_URL', 'http://localhost:8000') +# Debugging jika variabel environment tidak ditemukan +if not os.getenv('BASE_API_SERVER_URL'): + print(f"⚠️ BASE_API_SERVER_URL tidak ditemukan di {env_path}, menggunakan default: {base_api_server_url}") -from be.api.v1.endpoints.product_categories.get import ( - router as v1_product_categories_get, -) -from be.api.v1.endpoints.product_categories.post import ( - router as v1_product_categories_post, -) -from be.api.v1.endpoints.product_categories.delete import ( - router as v1_product_categories_delete, -) - +# Mengimpor endpoint API +from be.api.v1.endpoints.products.get import router as v1_products_get +from be.api.v1.endpoints.product_categories.get import router as v1_product_categories_get +from be.api.v1.endpoints.product_categories.post import router as v1_product_categories_post +from be.api.v1.endpoints.product_categories.delete import router as v1_product_categories_delete from be.api.v1.endpoints.payments.intent.post import router as v1_payments_intent_post from be.api.v1.endpoints.cart.quotation.post import router as v1_cart_quotation_post from be.api.v1.endpoints.cart.checkout.post import router as v1_checkout_post +# Metadata untuk dokumentasi OpenAPI tags_metadata = [ { "name": "merchandise", "description": ( - "CRUD for merchandise products." + "CRUD for merchandise products. " "GET for all users, POST/DELETE/PATCH for admin users." ), }, ] +# Inisialisasi FastAPI app = FastAPI( title="NTU SCSE Site API Docs", description="![Powered by Vercel](https://www.datocms-assets.com/31049/1618983297-powered-by-vercel.svg)", version="0.0.1", - openapi_tags=tags_metadata + openapi_tags=tags_metadata, ) +# Menyertakan router API app.include_router(v1_products_get) - app.include_router(v1_product_categories_get) app.include_router(v1_product_categories_post) app.include_router(v1_product_categories_delete) - app.include_router(v1_payments_intent_post) app.include_router(v1_cart_quotation_post) app.include_router(v1_checkout_post) - +# Fungsi untuk menyesuaikan OpenAPI Schema def custom_openapi(): if app.openapi_schema: return app.openapi_schema + + servers = [{"url": base_api_server_url}] + + # Menambahkan server lokal jika belum ada + if base_api_server_url != "http://localhost:4000": + servers.append({"url": "http://localhost:4000"}) + openapi_schema = get_openapi( title=app.title, version=app.version, - openapi_version=app.openapi_version, + openapi_version="3.0.2", # Menentukan versi OpenAPI secara eksplisit description=app.description, routes=app.routes, - servers=[{"url": base_api_server_url}, {"url": "http://localhost:4000"}] - # openapi_prefix=app.openapi_prefix, + servers=servers, ) - # openapi_schema["info"]["x-logo"] = { - # "url": "https://www.datocms-assets.com/31049/1618983297-powered-by-vercel.svg" - # } app.openapi_schema = openapi_schema return openapi_schema - app.openapi = custom_openapi +# Handler untuk AWS Lambda melalui Mangum handler = Mangum(app) diff --git a/be/docs_generate.py b/be/docs_generate.py index 460c9b6..b539078 100644 --- a/be/docs_generate.py +++ b/be/docs_generate.py @@ -1,13 +1,23 @@ import os -from os import makedirs -from os.path import join, dirname import json +from os.path import join, dirname from be.docs import app -filePath = join(dirname(__file__), '..', 'out', 'openapi.json') -makedirs(dirname(filePath), exist_ok=True) +# Menentukan path file output untuk OpenAPI +file_path = join(dirname(__file__), '..', 'out', 'openapi.json') + +# Membuat direktori jika belum ada +os.makedirs(dirname(file_path), exist_ok=True) + +# Mendapatkan URL server API dari environment variable +base_api_server_url = os.getenv('BASE_API_SERVER_URL', 'http://localhost:8000') -base_api_server_url: str = os.getenv('BASE_API_SERVER_URL') +# Menghasilkan dokumentasi OpenAPI dan menulis ke file +openapi_data = app.openapi() -with open(filePath, 'w') as f: - json.dump(app.openapi(), f) +if openapi_data: + with open(file_path, 'w', encoding='utf-8') as f: + json.dump(openapi_data, f, indent=4) + print(f"OpenAPI spec telah disimpan di {file_path}") +else: + print("Peringatan: Tidak ada data OpenAPI yang dihasilkan.") diff --git a/be/root.py b/be/root.py index fcb7e7b..7e4e1fe 100644 --- a/be/root.py +++ b/be/root.py @@ -1,11 +1,32 @@ from fastapi import FastAPI +from fastapi.middleware.cors import CORSMiddleware from mangum import Mangum -app = FastAPI() +# Inisialisasi aplikasi FastAPI +app = FastAPI( + title="Simple FastAPI App", + description="Sebuah API sederhana yang menggunakan FastAPI dan Mangum.", + version="1.0.0", +) -@app.get("/") -def index(): - return {"Hello": "World"} +# Middleware untuk mengizinkan CORS (bisa diakses dari berbagai domain) +app.add_middleware( + CORSMiddleware, + allow_origins=["*"], # Bisa diubah untuk membatasi domain tertentu + allow_credentials=True, + allow_methods=["*"], + allow_headers=["*"], +) +@app.get("/") +async def index() -> dict: + """ + Endpoint root yang mengembalikan pesan Hello World. + """ + return {"message": "Hello, World!"} +# Handler untuk AWS Lambda atau serverless deployment handler = Mangum(app) + +# Debugging: Menampilkan pesan saat API dijalankan +print("🚀 FastAPI server is running...")