flyFlyApiClient.ts1 match
47}
4849// Base API client functions that can be imported by other files
50export class FlyApiClient {
51private token: string;
1import { FlyApiClient } from "./FlyApiClient.ts";
23export default async function(req: Request): Promise<Response> {
4try {
5const client = new FlyApiClient();
111
112// Add some interactivity
113document.addEventListener('DOMContentLoaded', function() {
114console.log('Fly.io Dashboard loaded with ${apps.length} apps');
115});
34];
3536export default function App() {
37const [config, setConfig] = useState<AppConfig>({
38anthropicApiKey: "",
22// Initialize database on startup
23let dbInitialized = false;
24async function initializeDatabase() {
25if (!dbInitialized) {
26console.log('Initializing database...');
Test2validation.ts8 matches
2324// Validation middleware factory
25export function validateBody(schema: ValidationSchema) {
26return async (c: Context, next: Next) => {
27try {
4546// Validate query parameters
47export function validateQuery(schema: ValidationSchema) {
48return async (c: Context, next: Next) => {
49const query = Object.fromEntries(c.req.queries());
62}
6364// Core validation function
65export function validateObject(obj: any, schema: ValidationSchema): ValidationError[] {
66const errors: ValidationError[] = [];
677677// Validate individual field
78function validateField(field: string, value: any, rule: ValidationRule): ValidationError[] {
79const errors: ValidationError[] = [];
80142143// Type validation
144function validateType(field: string, value: any, type: string): ValidationError | null {
145switch (type) {
146case 'string':
302303// Helper to get validated body from context
304export function getValidatedBody<T = any>(c: Context): T {
305return c.get('validatedBody');
306}
307308// Helper to get validated query from context
309export function getValidatedQuery<T = any>(c: Context): T {
310return c.get('validatedQuery');
311}
133134// Authentication middleware
135export async function authMiddleware(c: Context, next: Next) {
136const authHeader = c.req.header('Authorization');
137
159160// Optional authentication middleware (doesn't fail if no token)
161export async function optionalAuthMiddleware(c: Context, next: Next) {
162const authHeader = c.req.header('Authorization');
163
181182// Admin role middleware
183export async function adminMiddleware(c: Context, next: Next) {
184const user = c.get('user') as User;
185
192193// Customer role middleware (customer or admin)
194export async function customerMiddleware(c: Context, next: Next) {
195const user = c.get('user') as User;
196
203204// Get current user helper
205export function getCurrentUser(c: Context): User | null {
206return c.get('user') || null;
207}
208209// Check if user has permission
210export function hasPermission(user: User | null, requiredRole: 'customer' | 'admin'): boolean {
211if (!user) return false;
212
Test2queries.ts1 match
1// Database query functions for IoT Solutions platform
23import { sqlite } from "https://esm.town/v/stevekrouse/sqlite";
Test2migrations.ts5 matches
6* Initialize all database tables
7*/
8export async function runMigrations(): Promise<void> {
9console.log('Running database migrations...');
10
235* Create database indexes for better query performance
236*/
237async function createIndexes(): Promise<void> {
238const indexes = [
239'CREATE INDEX IF NOT EXISTS idx_users_email ON users(email)',
266* Insert default data for categories, solutions, and admin user
267*/
268async function insertDefaultData(): Promise<void> {
269// Check if data already exists
270const existingCategories = await sqlite.execute('SELECT COUNT(*) as count FROM categories');
407* Create default admin user if none exists
408*/
409export async function createDefaultAdmin(): Promise<void> {
410const adminEmail = Deno.env.get('ADMIN_EMAIL') || 'admin@iotcompany.com';
411const adminPassword = Deno.env.get('ADMIN_PASSWORD') || 'admin123!';
437* Simple password hashing (use bcrypt in production)
438*/
439async function hashPassword(password: string): Promise<string> {
440const encoder = new TextEncoder();
441const data = encoder.encode(password + 'salt123'); // Add proper salt in production
1// Shared utility functions for the IoT Solutions platform
23import type { ValidationError, FormErrors } from './types.ts';
6* Format currency values
7*/
8export function formatCurrency(amount: number, currency = 'USD'): string {
9return new Intl.NumberFormat('en-US', {
10style: 'currency',
16* Format dates consistently
17*/
18export function formatDate(date: string | Date, options?: Intl.DateTimeFormatOptions): string {
19const dateObj = typeof date === 'string' ? new Date(date) : date;
20return new Intl.DateTimeFormat('en-US', {
29* Format date and time
30*/
31export function formatDateTime(date: string | Date): string {
32return formatDate(date, {
33year: 'numeric',
42* Generate a slug from a string
43*/
44export function generateSlug(text: string): string {
45return text
46.toLowerCase()
53* Generate a random order number
54*/
55export function generateOrderNumber(): string {
56const timestamp = Date.now().toString(36);
57const random = Math.random().toString(36).substr(2, 5);
62* Validate email format
63*/
64export function isValidEmail(email: string): boolean {
65const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
66return emailRegex.test(email);
70* Validate phone number (basic US format)
71*/
72export function isValidPhone(phone: string): boolean {
73const phoneRegex = /^\+?1?[-.\s]?\(?([0-9]{3})\)?[-.\s]?([0-9]{3})[-.\s]?([0-9]{4})$/;
74return phoneRegex.test(phone);
78* Validate password strength
79*/
80export function validatePassword(password: string): ValidationError[] {
81const errors: ValidationError[] = [];
82
103* Convert validation errors array to form errors object
104*/
105export function validationErrorsToFormErrors(errors: ValidationError[]): FormErrors {
106return errors.reduce((acc, error) => {
107acc[error.field] = error.message;
111112/**
113* Debounce function for search inputs
114*/
115export function debounce<T extends (...args: any[]) => any>(
116func: T,
117wait: number
127* Calculate order totals
128*/
129export function calculateOrderTotals(
130subtotal: number,
131taxRate = 0.08,
146* Calculate shipping cost based on order value and weight
147*/
148export function calculateShipping(orderValue: number, weight = 1): number {
149// Free shipping over $500
150if (orderValue >= 500) return 0;
160* Truncate text to specified length
161*/
162export function truncateText(text: string, maxLength: number): string {
163if (text.length <= maxLength) return text;
164return text.substr(0, maxLength - 3) + '...';
168* Get initials from name
169*/
170export function getInitials(firstName: string, lastName: string): string {
171return `${firstName.charAt(0)}${lastName.charAt(0)}`.toUpperCase();
172}
175* Format file size
176*/
177export function formatFileSize(bytes: number): string {
178const sizes = ['Bytes', 'KB', 'MB', 'GB'];
179if (bytes === 0) return '0 Bytes';
185* Generate a random color for avatars
186*/
187export function generateAvatarColor(seed: string): string {
188const colors = [
189'#FF6B6B', '#4ECDC4', '#45B7D1', '#96CEB4', '#FFEAA7',
202* Check if user has permission
203*/
204export function hasPermission(userRole: string, requiredRole: string): boolean {
205const roleHierarchy = { customer: 0, admin: 1 };
206return roleHierarchy[userRole as keyof typeof roleHierarchy] >=
211* Deep clone an object
212*/
213export function deepClone<T>(obj: T): T {
214if (obj === null || typeof obj !== 'object') return obj;
215if (obj instanceof Date) return new Date(obj.getTime()) as unknown as T;
230* Convert search params to query string
231*/
232export function buildQueryString(params: Record<string, any>): string {
233const searchParams = new URLSearchParams();
234
245* Parse query string to object
246*/
247export function parseQueryString(queryString: string): Record<string, string> {
248const params = new URLSearchParams(queryString);
249const result: Record<string, string> = {};
5## ๐ Features
67### Core Functionality
8- **Product Storefront**: Browse IoT devices, view specs, add to cart, secure checkout
9- **IoT Solutions Portal**: Showcase vertical solutions with lead capture
27โ โโโ database/
28โ โ โโโ migrations.ts # Database schema setup
29โ โ โโโ queries.ts # Database query functions
30โ โ โโโ README.md
31โ โโโ routes/
60โ โโโ types.ts # Shared TypeScript types
61โ โโโ constants.ts # Shared constants
62โ โโโ utils.ts # Shared utility functions
63โโโ README.md
64```