Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
10 changes: 0 additions & 10 deletions backend/.env.sample

This file was deleted.

23 changes: 22 additions & 1 deletion backend/app/db/database.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,4 +17,25 @@ def get_db():
try:
yield db
finally:
db.close()
db.close()

# am I supposed to use 'db' or 'base' or what so as to connect with supabase here?
# backend/db.py
from supabase import create_client

SUPABASE_URL = os.getenv("SUPABASE_URL")
SUPABASE_KEY = os.getenv("SUPABASE_KEY")

supabase = create_client(SUPABASE_URL, SUPABASE_KEY)

def get_impact_stats():
"""
Fetch NGO impact stats from Supabase.
Expected table: 'impact_stats'
Example row: { totalLearners, supportPartners, volunteerHours, activeVolunteers }
"""
response = supabase.table("impact_stats").select("*").execute() # so i can know what to use here ..................

if response.data and len(response.data) > 0:
return response.data[0] # take first row for demo
return {"learners_reached": 0, "volunteer_hours": 0, "events_hosted": 0}
2 changes: 1 addition & 1 deletion backend/app/db/seeds/volunteers.py
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,6 @@ def seed_volunteers():
print(f"Adding Volunteer: {data['name']}")

db.commit()
print("Volunteers table seeded successfully.")
print("Volunteers table seeded successfully.")
finally:
db.close()
23 changes: 20 additions & 3 deletions backend/main.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,15 @@
# main.py
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware

from app.db.database import Base, engine
from app.api.routes.metrics import router as metrics_router
from app.api.routes.impact import router as impact_router

import app.api.models
import app.api.models

from summarizer import summarize_impact
from db import get_impact_stats # added this in database.py



# Base.metadata.drop_all(bind=engine)
Expand All @@ -31,5 +34,19 @@
def health_check():
return {"message": f"Server is running and healthy"}

# check here .....................
@app.get("/report")
def generate_report():
# Fetch stats from Supabase
stats = get_impact_stats()

# Pass stats to Gemini summarizer
summary = summarize_impact(stats)

return {
"stats": stats,
"summary": summary
}

app.include_router(metrics_router, prefix="/api", tags=["metrics"])
app.include_router(impact_router, prefix="/api", tags=["impact"])
app.include_router(impact_router, prefix="/api", tags=["impact"])
45 changes: 45 additions & 0 deletions backend/summarizer.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
import os
import google.generativeai as genai
from dotenv import load_dotenv

# Load environment variables
load_dotenv()

# Configure Gemini client
genai.configure(api_key=os.getenv("GEMINI_API_KEY"))

# The summarizer function
def summarize_impact(data: dict) -> str:
"""
Summarize NGO impact stats into a donor-friendly narrative.

Args:
data (dict): Example:
{
"total_learners": 120,
"support_partners": 19,
"volunteer_hours": 85,
"active_volunteers": 30
}

Returns:
str: AI-generated summary text.
"""
model = genai.GenerativeModel("gemini-1.5-flash")

prompt = f"""
You are helping an NGO write a donor-friendly impact report.

Stats provided:
- Total learners: {data.get('total_learners', 0)}
- Support partners: {data.get('support_partners', 0)}
- Volunteer hours: {data.get('volunteer_hours', 0)}
- Active volunteers: {data.get('active_volunteers', 0)}

Write a short, positive summary (3–4 sentences) highlighting achievements.
Make it clear, inspiring, and professional.
"""

response = model.generate_content(prompt)

return response.text if response and response.text else "No summary generated."