untitled-266README.md8 matches
41## Tech Stack
4243- **Backend**: Hono (API framework)
44- **Database**: SQLite
45- **Frontend**: React with TypeScript
47- **Real-time**: Server-Sent Events (SSE)
4849## API Endpoints
5051- `POST /api/auth/register` - Register new user
52- `POST /api/auth/login` - User login
53- `GET /api/users` - Get all users
54- `GET /api/messages` - Get message history
55- `POST /api/messages` - Send new message
56- `GET /api/messages/stream` - SSE endpoint for real-time messages
5758## Getting Started
1import { Hono } from "https://esm.sh/hono@3.11.7";
2import { getChatMessages, createChatMessage } from "../database/queries.ts";
3import type { CreateMessageRequest, ApiResponse } from "../../shared/types.ts";
45const chat = new Hono();
13success: true,
14data: messages
15} as ApiResponse<typeof messages>);
16} catch (error) {
17return c.json({
18success: false,
19error: "Failed to fetch messages"
20} as ApiResponse<never>, 500);
21}
22});
32success: false,
33error: "Username and message are required"
34} as ApiResponse<never>, 400);
35}
3640success: false,
41error: "Message too long (max 500 characters)"
42} as ApiResponse<never>, 400);
43}
4448success: false,
49error: "Username too long (max 50 characters)"
50} as ApiResponse<never>, 400);
51}
5255success: true,
56data: newMessage
57} as ApiResponse<typeof newMessage>, 201);
58} catch (error) {
59return c.json({
60success: false,
61error: "Failed to send message"
62} as ApiResponse<never>, 500);
63}
64});
soulandfoodindex.html2 matches
22
23<!-- Fonts -->
24<link rel="preconnect" href="https://fonts.googleapis.com">
25<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
26<link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&family=Playfair+Display:wght@400;500;600;700&display=swap" rel="stylesheet">
27
28<!-- TailwindCSS -->
1import { Hono } from "https://esm.sh/hono@3.11.7";
2import { getAllJobs, createJob, deleteJob } from "../database/queries.ts";
3import type { CreateJobRequest, ApiResponse } from "../../shared/types.ts";
45const jobs = new Hono();
12success: true,
13data: jobList
14} as ApiResponse<typeof jobList>);
15} catch (error) {
16return c.json({
17success: false,
18error: "Failed to fetch jobs"
19} as ApiResponse<never>, 500);
20}
21});
32success: false,
33error: "Missing required fields"
34} as ApiResponse<never>, 400);
35}
3641success: false,
42error: "Invalid email format"
43} as ApiResponse<never>, 400);
44}
4548success: true,
49data: newJob
50} as ApiResponse<typeof newJob>, 201);
51} catch (error) {
52return c.json({
53success: false,
54error: "Failed to create job"
55} as ApiResponse<never>, 500);
56}
57});
65success: false,
66error: "Invalid job ID"
67} as ApiResponse<never>, 400);
68}
6973success: false,
74error: "Job not found"
75} as ApiResponse<never>, 404);
76}
7779success: true,
80data: { id }
81} as ApiResponse<{ id: number }>);
82} catch (error) {
83return c.json({
84success: false,
85error: "Failed to delete job"
86} as ApiResponse<never>, 500);
87}
88});
soulandfoodREADME.md2 matches
1516- **Frontend**: React with TypeScript, TailwindCSS
17- **Backend**: Hono API framework
18- **Database**: SQLite for user data and engagement tracking
19- **AI**: OpenAI for mood-based affirmations
32โ โ โโโ music.ts # Music suggestion endpoints
33โ โ โโโ user.ts # User data and favorites
34โ โโโ index.ts # Main API server
35โโโ frontend/
36โ โโโ components/
17โ โ โโโ queries.ts # Database query functions
18โ โโโ routes/
19โ โ โโโ jobs.ts # Job posting API routes
20โ โ โโโ chat.ts # Chat API routes
21โ โโโ index.ts # Main Hono server
22โโโ frontend/
34## Tech Stack
3536- **Backend**: Hono (TypeScript API framework)
37- **Database**: SQLite
38- **Frontend**: React with TypeScript
40- **Real-time**: Polling-based chat updates
4142## API Endpoints
4344### Jobs
45- `GET /api/jobs` - Get all job postings
46- `POST /api/jobs` - Create a new job posting
47- `DELETE /api/jobs/:id` - Delete a job posting
4849### Chat
50- `GET /api/chat/messages` - Get chat messages
51- `POST /api/chat/messages` - Send a chat message
5253## Getting Started
5455This app runs on Val Town. The backend serves both the API and static frontend files.
CHATBOTmigrations.ts1 match
82id: 'fashion-design-advanced',
83name: 'Advanced Fashion Design',
84description: 'Advanced techniques in fashion design, draping, and professional garment construction.',
85duration: '6 months',
86fee: 300000,
soulandfooduser.ts32 matches
15getAppUsageStats
16} from "../database/queries.ts";
17import type { User, UserFavorite, APIResponse } from "../../shared/types.ts";
1819export const userRoutes = new Hono();
64});
6566return c.json<APIResponse<{ user: User; sessionId: string }>>({
67success: true,
68data: { user, sessionId },
72} catch (error) {
73console.error('Error initializing user:', error);
74return c.json<APIResponse<null>>({
75success: false,
76error: 'Failed to initialize user'
8586if (!userId) {
87return c.json<APIResponse<null>>({
88success: false,
89error: 'User ID is required'
9495if (!user) {
96return c.json<APIResponse<null>>({
97success: false,
98error: 'User not found'
100}
101102return c.json<APIResponse<User>>({
103success: true,
104data: user
107} catch (error) {
108console.error('Error fetching user:', error);
109return c.json<APIResponse<null>>({
110success: false,
111error: 'Failed to fetch user'
122123if (!userId || !language) {
124return c.json<APIResponse<null>>({
125success: false,
126error: 'User ID and language are required'
129130if (!['en', 'fr'].includes(language)) {
131return c.json<APIResponse<null>>({
132success: false,
133error: 'Language must be "en" or "fr"'
149}
150151return c.json<APIResponse<{ language: string }>>({
152success: true,
153data: { language },
157} catch (error) {
158console.error('Error updating user language:', error);
159return c.json<APIResponse<null>>({
160success: false,
161error: 'Failed to update language preference'
172173if (!userId || !type || !itemId) {
174return c.json<APIResponse<null>>({
175success: false,
176error: 'User ID, type, and item ID are required'
179180if (!['recipe', 'music'].includes(type)) {
181return c.json<APIResponse<null>>({
182success: false,
183error: 'Type must be "recipe" or "music"'
205}
206207return c.json<APIResponse<UserFavorite>>({
208success: true,
209data: favorite,
213} catch (error) {
214console.error('Error adding favorite:', error);
215return c.json<APIResponse<null>>({
216success: false,
217error: 'Failed to add favorite'
228229if (!userId || !type || !itemId) {
230return c.json<APIResponse<null>>({
231success: false,
232error: 'User ID, type, and item ID are required'
236await removeFavorite(userId, type, itemId);
237238return c.json<APIResponse<null>>({
239success: true,
240message: 'Removed from favorites'
243} catch (error) {
244console.error('Error removing favorite:', error);
245return c.json<APIResponse<null>>({
246success: false,
247error: 'Failed to remove favorite'
257258if (!userId) {
259return c.json<APIResponse<null>>({
260success: false,
261error: 'User ID is required'
265const favorites = await getUserFavorites(userId, type);
266267return c.json<APIResponse<UserFavorite[]>>({
268success: true,
269data: favorites
272} catch (error) {
273console.error('Error fetching favorites:', error);
274return c.json<APIResponse<null>>({
275success: false,
276error: 'Failed to fetch favorites'
287288if (!userId || !type || !itemId) {
289return c.json<APIResponse<null>>({
290success: false,
291error: 'User ID, type, and item ID are required'
295const isFav = await isFavorite(userId, type, itemId);
296297return c.json<APIResponse<{ isFavorite: boolean }>>({
298success: true,
299data: { isFavorite: isFav }
302} catch (error) {
303console.error('Error checking favorite status:', error);
304return c.json<APIResponse<null>>({
305success: false,
306error: 'Failed to check favorite status'
317318if (!sessionId) {
319return c.json<APIResponse<null>>({
320success: false,
321error: 'Session ID is required'
335}
336337return c.json<APIResponse<null>>({
338success: true,
339message: 'Session ended successfully'
342} catch (error) {
343console.error('Error ending session:', error);
344return c.json<APIResponse<null>>({
345success: false,
346error: 'Failed to end session'
356357if (!userId) {
358return c.json<APIResponse<null>>({
359success: false,
360error: 'User ID is required'
364const stats = await getUserEngagementStats(userId, days);
365366return c.json<APIResponse<any>>({
367success: true,
368data: stats
371} catch (error) {
372console.error('Error fetching engagement stats:', error);
373return c.json<APIResponse<null>>({
374success: false,
375error: 'Failed to fetch engagement statistics'
384const stats = await getAppUsageStats(days);
385386return c.json<APIResponse<any>>({
387success: true,
388data: stats
391} catch (error) {
392console.error('Error fetching app usage stats:', error);
393return c.json<APIResponse<null>>({
394success: false,
395error: 'Failed to fetch app usage statistics'
soulandfoodmusic.ts22 matches
2import { musicSuggestions, getMusicByMood, getMusicById, getMusicByGenre, getRandomMusicByMood } from "../../frontend/data/music.ts";
3import { trackEngagement } from "../database/queries.ts";
4import type { MusicSuggestion, APIResponse } from "../../shared/types.ts";
56export const musicRoutes = new Hono();
9musicRoutes.get('/', async (c) => {
10try {
11return c.json<APIResponse<MusicSuggestion[]>>({
12success: true,
13data: musicSuggestions
15} catch (error) {
16console.error('Error fetching music suggestions:', error);
17return c.json<APIResponse<null>>({
18success: false,
19error: 'Failed to fetch music suggestions'
3233if (!mood) {
34return c.json<APIResponse<null>>({
35success: false,
36error: 'Mood parameter is required'
58}
5960return c.json<APIResponse<MusicSuggestion[]>>({
61success: true,
62data: moodMusic,
66} catch (error) {
67console.error('Error fetching music by mood:', error);
68return c.json<APIResponse<null>>({
69success: false,
70error: 'Failed to fetch music by mood'
8182if (!id) {
83return c.json<APIResponse<null>>({
84success: false,
85error: 'Music ID is required'
9091if (!music) {
92return c.json<APIResponse<null>>({
93success: false,
94error: 'Music not found'
108}
109110return c.json<APIResponse<MusicSuggestion>>({
111success: true,
112data: music
115} catch (error) {
116console.error('Error fetching music:', error);
117return c.json<APIResponse<null>>({
118success: false,
119error: 'Failed to fetch music'
128129if (!genre) {
130return c.json<APIResponse<null>>({
131success: false,
132error: 'Genre parameter is required'
136const genreMusic = getMusicByGenre(genre);
137138return c.json<APIResponse<MusicSuggestion[]>>({
139success: true,
140data: genreMusic,
144} catch (error) {
145console.error('Error fetching music by genre:', error);
146return c.json<APIResponse<null>>({
147success: false,
148error: 'Failed to fetch music by genre'
195const recommendations = filteredMusic.slice(0, 8);
196197return c.json<APIResponse<MusicSuggestion[]>>({
198success: true,
199data: recommendations,
203} catch (error) {
204console.error('Error generating music recommendations:', error);
205return c.json<APIResponse<null>>({
206success: false,
207error: 'Failed to generate music recommendations'
233const randomMusic = shuffled.slice(0, Math.min(count, availableMusic.length));
234235return c.json<APIResponse<MusicSuggestion[]>>({
236success: true,
237data: randomMusic,
241} catch (error) {
242console.error('Error fetching random music:', error);
243return c.json<APIResponse<null>>({
244success: false,
245error: 'Failed to fetch random music'
261});
262263return c.json<APIResponse<{
264genres: string[];
265culturalOrigins: string[];
278} catch (error) {
279console.error('Error fetching music metadata:', error);
280return c.json<APIResponse<null>>({
281success: false,
282error: 'Failed to fetch music metadata'
292293if (!moods || !Array.isArray(moods) || moods.length === 0) {
294return c.json<APIResponse<null>>({
295success: false,
296error: 'Moods array is required'
311);
312313return c.json<APIResponse<{
314playlist: MusicSuggestion[];
315totalSongs: number;
329} catch (error) {
330console.error('Error creating mood journey playlist:', error);
331return c.json<APIResponse<null>>({
332success: false,
333error: 'Failed to create mood journey playlist'