Busniess logic (server) : AWS Lambda Zip

I wrote the backend that serves requests to allow customer raise the register a pickup or drive & contact us to organize the drive in there society

app.use(express.json());
app.use('/v1/private/users', usersRouter);
app.use('/v1/register', registerRouter);
app.use('/v1/contact', contactRouter);
app.use('/v1/private/home', homepagerouter);

→ Raise connected the aws RDS to it

import { Pool } from 'pg';

export const pool = new Pool({
  host: process.env.RDS_HOST,
  user: process.env.RDS_USER,
  password: process.env.RDS_PASS,
  database: process.env.RDS_DB,
  port: 5432,
  ssl: {
    rejectUnauthorized: false, // For development purposes, adjust for production
  },
});

→ Centrilzed schema for multiple services

interface HeroTheme {
    headline: string;
    avatar_svg: string;
}

interface HeroThemes {
    default: HeroTheme;
    diwali: HeroTheme;
    newYear: HeroTheme;
}

interface VideoConfig {
    youtube_video_id: string;
}

interface ConversionRates {
    clothes_to_weight_kg: number;
    clothes_to_water_liters: number;
    clothes_to_co2_tons: number;
}

interface UpcomingDrive {
    apt_id: number;
    apt_name: string;
    address: string;
    apt_image: string;
}

interface Goodie {
    goodies_id: number;
    goodies_image_link: string;
}

interface Partner {
    partner_logo_image_link: string;
}

interface Statistics {
    clothes_saved: number;
    weight_kg: number;
    water_saved_liters: number;
    co2_prevented_tons: number;
}

interface HomePageData {
    heroSectionData: HeroTheme;
    youtubeVideoId: string;
    statistics: Statistics;
    upcomingDrives: UpcomingDrive[];
    goodies: Goodie[];
    partners: Partner[];
}

 enum ResidenceType {
    APARTMENT = 'apartment',
    INDIVIDUAL = 'individual'
  }
  
  
  enum PickupStatus {
    SCHEDULED = 'scheduled',
    COMPLETED = 'completed',
    CANCELLED = 'cancelled'
  }

  export { HeroTheme, HeroThemes, VideoConfig, ConversionRates, UpcomingDrive, Goodie, Partner, Statistics, HomePageData, ResidenceType, PickupStatus };

Return’s the Landing page assests dynamically as json data :

import { ConversionRates, Goodie, HeroTheme, HeroThemes, HomePageData, Partner, Statistics, UpcomingDrive, VideoConfig } from "../types";

class HomePageService {
    private readonly heroThemes: HeroThemes;
    private readonly videoConfig: VideoConfig;
    private readonly conversionRates: ConversionRates;
    private readonly upcomingDrives: UpcomingDrive[];
    private readonly goodies: Goodie[];
    private readonly partners: Partner[];

    constructor() {
        this.heroThemes = {
            default: {
                headline: "De-clutter your wardrobe with us and Enjoy Surprise Goodies",
                avatar_svg: "/assets/images/default-avatar.svg"
            },
            diwali: {
                headline: "Celebrate Diwali with a Clean Closet!",
                avatar_svg: "/assets/images/diwali-avatar.svg"
            },
            newYear: {
                headline: "Start Your New Year with a Fresh Wardrobe!",
                avatar_svg: "/assets/images/newyear-avatar.svg"
            }
        };

        this.videoConfig = {
            youtube_video_id: "your-video-id-here"
        };

        this.conversionRates = {
            clothes_to_weight_kg: 0.5,
            clothes_to_water_liters: 230,
            clothes_to_co2_tons: 0.0067
        };

        this.upcomingDrives = [
            {
                apt_id: 1,
                apt_name: "Green Valley Apartments",
                address: "123 Green Valley Road, City",
                apt_image: "/assets/images/green-valley.jpg"
            },
            {
                apt_id: 2,
                apt_name: "Sunshine Towers",
                address: "456 Sunshine Avenue, City",
                apt_image: "/assets/images/sunshine-towers.jpg"
            }
        ];

        this.goodies = [
            {
                goodies_id: 1,
                goodies_image_link: "/assets/images/goodie1.jpg"
            },
            {
                goodies_id: 2,
                goodies_image_link: "/assets/images/goodie2.jpg"
            }
        ];

        this.partners = [
            {
                partner_logo_image_link: "/assets/images/partner1.jpg"
            },
            {
                partner_logo_image_link: "/assets/images/partner2.jpg"
            }
        ];
    }

    private getCurrentTheme(): HeroTheme {
        const currentDate = new Date();
        const month = currentDate.getMonth();
        const date = currentDate.getDate();

        if ((month === 9 || month === 10) && (date >= 20 && date <= 25)) {
            return this.heroThemes.diwali;
        }
        if ((month === 11 && date >= 25) || (month === 0 && date <= 5)) {
            return this.heroThemes.newYear;
        }
        return this.heroThemes.default;
    }

    private calculateStats(totalClothes: number): Statistics {
        return {
            clothes_saved: totalClothes,
            weight_kg: Math.round(totalClothes * this.conversionRates.clothes_to_weight_kg),
            water_saved_liters: Math.round(totalClothes * this.conversionRates.clothes_to_water_liters),
            co2_prevented_tons: Math.round(totalClothes * this.conversionRates.clothes_to_co2_tons * 100) / 100
        };
    }

    async getHomePageData(): Promise<HomePageData> {
        try {
            const totalClothes = 4000; // Example hardcoded value

            return {
                heroSectionData: this.getCurrentTheme(),
                youtubeVideoId: this.videoConfig.youtube_video_id,
                statistics: this.calculateStats(totalClothes),
                upcomingDrives: this.upcomingDrives,
                goodies: this.goodies,
                partners: this.partners
            };
        } catch (error) {
            console.error('Error in getHomePageData:', error);
            throw error;
        }
    }
}

export const homePageService = new HomePageService();

Frontend Design & Code (client) : Next.js, ShadCN, Framer

Frontend has been the following components :