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();