29});
3031// API routes
32app.route("/api/auth", auth);
33app.route("/api/locations", locations);
3435// Check for floods for a specific user
36app.post("/api/check-floods", async (c) => {
37try {
38const { userId } = await c.req.json();
FloodAppfloodPredictor.ts4 matches
5const RAINFALL_THRESHOLD = 50; // Adjust based on local conditions
67// Open-Meteo API for weather forecasts
8const WEATHER_API_URL = "https://api.open-meteo.com/v1/forecast";
910interface WeatherForecast {
17// Get weather forecast for a location
18async function getWeatherForecast(latitude: number, longitude: number): Promise<WeatherForecast> {
19const url = new URL(WEATHER_API_URL);
20url.searchParams.append("latitude", latitude.toString());
21url.searchParams.append("longitude", longitude.toString());
27
28if (!response.ok) {
29throw new Error(`Weather API error: ${response.statusText}`);
30}
31
12## Project Structure
1314- `/backend` - Server-side code and API endpoints
15- `/frontend` - User interface and client-side code
16- `/shared` - Shared types and utilities
21- Database: SQLite
22- Frontend: HTML, JavaScript, Tailwind CSS
23- Weather Data: Open-Meteo API
24- Notifications: Email
25
56setupDatabase().catch(console.error);
5758// API Routes
5960// Get all job postings
61app.get("/api/jobs", async (c) => {
62const jobs = await sqlite.execute(`SELECT * FROM ${JOBS_TABLE} ORDER BY created_at DESC`);
63return c.json(jobs);
6566// Create a new job posting
67app.post("/api/jobs", async (c) => {
68const body = await c.req.json();
69const { title, description, company, location, salary, contact } = body;
8586// Get chat messages
87app.get("/api/chat", async (c) => {
88const messages = await sqlite.execute(
89`SELECT * FROM ${CHAT_TABLE} ORDER BY created_at DESC LIMIT 100`
9394// Post a chat message
95app.post("/api/chat", async (c) => {
96const body = await c.req.json();
97const { username, message } = body;
GodinoMawabankAuthContext.tsx11 matches
2import React, { createContext, useContext, useState, useEffect } from "https://esm.sh/react@18.2.0";
3import { useNavigate } from "https://esm.sh/react-router-dom@6.16.0?deps=react@18.2.0";
4import { User, AuthResponse, ApiResponse } from "../../../shared/types";
56interface AuthContextType {
8isAuthenticated: boolean;
9isLoading: boolean;
10login: (email: string, password: string) => Promise<ApiResponse<AuthResponse>>;
11register: (formData: any) => Promise<ApiResponse<AuthResponse>>;
12logout: () => void;
13checkAuth: () => Promise<boolean>;
42
43try {
44const response = await fetch("/api/auth/me", {
45headers: {
46Authorization: `Bearer ${token}`
52}
53
54const data: ApiResponse<User> = await response.json();
55
56if (data.success && data.data) {
70};
7172const login = async (email: string, password: string): Promise<ApiResponse<AuthResponse>> => {
73try {
74const response = await fetch("/api/auth/login", {
75method: "POST",
76headers: {
80});
81
82const data: ApiResponse<AuthResponse> = await response.json();
83
84if (data.success && data.data) {
98};
99100const register = async (formData: any): Promise<ApiResponse<AuthResponse>> => {
101try {
102const response = await fetch("/api/auth/register", {
103method: "POST",
104headers: {
108});
109
110const data: ApiResponse<AuthResponse> = await response.json();
111
112if (data.success && data.data) {
GodinoMawabankindex.ts4 matches
21app.use("*", cors());
2223// Mount API routes
24app.route("/api/auth", authRoutes);
25app.route("/api/kyc", kycRoutes);
26app.route("/api/accounts", accountRoutes);
2728// Mount static routes (should be last)
GodinoMawabankstatic.ts1 match
3738// Serve KYC document images
39staticRoutes.get("/api/images/:key", async (c) => {
40try {
41const key = c.req.param("key");
GodinoMawabankaccounts.ts13 matches
7getUserById
8} from "../database/queries";
9import { createApiResponse, generateAccountNumber } from "../../shared/utils";
10import {
11Account,
34const user = await getUserById(userId);
35if (!user) {
36return c.json(createApiResponse(false, undefined, "User not found"), 404);
37}
38
39if (user.kycStatus !== KYCStatus.APPROVED) {
40return c.json(
41createApiResponse(
42false,
43undefined,
52if (existingAccounts.length > 0) {
53return c.json(
54createApiResponse<AccountGenerationResponse>(
55true,
56{ accounts: existingAccounts },
114// Return the generated accounts
115return c.json(
116createApiResponse<AccountGenerationResponse>(
117true,
118{ accounts: generatedAccounts }
122} catch (error) {
123console.error("Account generation error:", error);
124return c.json(createApiResponse(false, undefined, "Account generation failed"), 500);
125}
126});
135const accounts = await getAccountsByUserId(userId);
136
137return c.json(createApiResponse(true, { accounts }));
138} catch (error) {
139console.error("Get accounts error:", error);
140return c.json(createApiResponse(false, undefined, "Failed to get accounts"), 500);
141}
142});
150
151if (isNaN(accountId)) {
152return c.json(createApiResponse(false, undefined, "Invalid account ID"), 400);
153}
154
157
158if (!account) {
159return c.json(createApiResponse(false, undefined, "Account not found"), 404);
160}
161
162// Check if account belongs to user
163if (account.userId !== userId) {
164return c.json(createApiResponse(false, undefined, "Unauthorized"), 403);
165}
166
167return c.json(createApiResponse(true, { account }));
168} catch (error) {
169console.error("Get account error:", error);
170return c.json(createApiResponse(false, undefined, "Failed to get account"), 500);
171}
172});
GodinoMawabankkyc.ts15 matches
3import { blob } from "https://esm.town/v/std/blob";
4import { createKYCData, getKYCDataByUserId, updateKYCStatus, updateUserKYCStatus } from "../database/queries";
5import { createApiResponse } from "../../shared/utils";
6import { DocumentType, KYCData, KYCStatus, KYCSubmissionResponse } from "../../shared/types";
727!data.country || !data.postalCode || !data.documentType ||
28!data.documentId || !data.documentImageUrl || !data.selfieImageUrl) {
29return c.json(createApiResponse(false, undefined, "All fields are required"), 400);
30}
31
34if (existingKYC) {
35return c.json(
36createApiResponse(false, undefined, "KYC already submitted. Current status: " + existingKYC.status),
37409
38);
53// Return success response
54return c.json(
55createApiResponse<KYCSubmissionResponse>(
56true,
57{
64} catch (error) {
65console.error("KYC submission error:", error);
66return c.json(createApiResponse(false, undefined, "KYC submission failed"), 500);
67}
68});
79
80if (!file || !documentType) {
81return c.json(createApiResponse(false, undefined, "Document file and type are required"), 400);
82}
83
84// Validate document type
85if (!Object.values(DocumentType).includes(documentType as DocumentType)) {
86return c.json(createApiResponse(false, undefined, "Invalid document type"), 400);
87}
88
97// Return the blob key as the URL
98return c.json(
99createApiResponse(true, { documentUrl: blobKey }),
100200
101);
102} catch (error) {
103console.error("Document upload error:", error);
104return c.json(createApiResponse(false, undefined, "Document upload failed"), 500);
105}
106});
116
117if (!file) {
118return c.json(createApiResponse(false, undefined, "Selfie file is required"), 400);
119}
120
129// Return the blob key as the URL
130return c.json(
131createApiResponse(true, { selfieUrl: blobKey }),
132200
133);
134} catch (error) {
135console.error("Selfie upload error:", error);
136return c.json(createApiResponse(false, undefined, "Selfie upload failed"), 500);
137}
138});
148if (!kycData) {
149return c.json(
150createApiResponse(true, { status: KYCStatus.NOT_STARTED, message: "KYC not started" })
151);
152}
154// Return KYC status
155return c.json(
156createApiResponse(true, {
157status: kycData.status,
158message: getKYCStatusMessage(kycData.status),
163} catch (error) {
164console.error("Get KYC status error:", error);
165return c.json(createApiResponse(false, undefined, "Failed to get KYC status"), 500);
166}
167});
GodinoMawabankauth.ts16 matches
2import { jwt } from "https://esm.sh/hono@3.11.7/jwt";
3import { createUser, getUserByEmail, getUserPasswordHash } from "../database/queries";
4import { createApiResponse, isStrongPassword, isValidEmail } from "../../shared/utils";
5import { AuthResponse, User, UserCredentials, UserRegistration } from "../../shared/types";
625// Validate input
26if (!data.email || !data.password || !data.firstName || !data.lastName || !data.phone) {
27return c.json(createApiResponse(false, undefined, "All fields are required"), 400);
28}
29
30if (!isValidEmail(data.email)) {
31return c.json(createApiResponse(false, undefined, "Invalid email format"), 400);
32}
33
34if (!isStrongPassword(data.password)) {
35return c.json(
36createApiResponse(
37false,
38undefined,
46const existingUser = await getUserByEmail(data.email);
47if (existingUser) {
48return c.json(createApiResponse(false, undefined, "Email already registered"), 409);
49}
50
66
67// Return user data and token
68return c.json(createApiResponse<AuthResponse>(true, { user, token }), 201);
69} catch (error) {
70console.error("Registration error:", error);
71return c.json(createApiResponse(false, undefined, "Registration failed"), 500);
72}
73});
80// Validate input
81if (!email || !password) {
82return c.json(createApiResponse(false, undefined, "Email and password are required"), 400);
83}
84
86const user = await getUserByEmail(email);
87if (!user) {
88return c.json(createApiResponse(false, undefined, "Invalid credentials"), 401);
89}
90
92const storedHash = await getUserPasswordHash(email);
93if (!storedHash) {
94return c.json(createApiResponse(false, undefined, "Invalid credentials"), 401);
95}
96
104// Compare hashes
105if (passwordHash !== storedHash) {
106return c.json(createApiResponse(false, undefined, "Invalid credentials"), 401);
107}
108
111
112// Return user data and token
113return c.json(createApiResponse<AuthResponse>(true, { user, token }));
114} catch (error) {
115console.error("Login error:", error);
116return c.json(createApiResponse(false, undefined, "Login failed"), 500);
117}
118});
127const user = await getUserByEmail(payload.email);
128if (!user) {
129return c.json(createApiResponse(false, undefined, "User not found"), 404);
130}
131
132return c.json(createApiResponse<User>(true, user));
133} catch (error) {
134console.error("Get user error:", error);
135return c.json(createApiResponse(false, undefined, "Failed to get user data"), 500);
136}
137});