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/
32```
3334## API Endpoints
3536### Jobs
37- `GET /api/jobs` - Get all job postings
38- `POST /api/jobs` - Create a new job posting
39- `DELETE /api/jobs/:id` - Delete a job posting
4041### Chat
42- `GET /api/chat/messages` - Get recent chat messages
43- `POST /api/chat/messages` - Send a new chat message
4445## Database Schema
63## Getting Started
6465This app runs on Val Town. The backend serves both the API and the frontend files.
6667Visit the HTTP endpoint to access the application.
Jobpostingsjobs.ts15 matches
1import { Hono } from "https://esm.sh/hono@3.11.7";
2import { getAllJobs, getJobById, createJob, deleteJob } from "../database/queries.ts";
3import type { CreateJobRequest, ApiResponse } from "../../shared/types.ts";
45const jobs = new Hono();
9try {
10const jobList = await getAllJobs();
11return c.json({ success: true, data: jobList } as ApiResponse<typeof jobList>);
12} catch (error) {
13return c.json({ success: false, error: "Failed to fetch jobs" } as ApiResponse<never>, 500);
14}
15});
20const id = parseInt(c.req.param("id"));
21if (isNaN(id)) {
22return c.json({ success: false, error: "Invalid job ID" } as ApiResponse<never>, 400);
23}
2425const job = await getJobById(id);
26if (!job) {
27return c.json({ success: false, error: "Job not found" } as ApiResponse<never>, 404);
28}
2930return c.json({ success: true, data: job } as ApiResponse<typeof job>);
31} catch (error) {
32return c.json({ success: false, error: "Failed to fetch job" } as ApiResponse<never>, 500);
33}
34});
44success: false,
45error: "Missing required fields: title, company, description, requirements, type"
46} as ApiResponse<never>, 400);
47}
4853success: false,
54error: "Invalid job type. Must be one of: " + validTypes.join(', ')
55} as ApiResponse<never>, 400);
56}
5758const newJob = await createJob(body);
59return c.json({ success: true, data: newJob } as ApiResponse<typeof newJob>, 201);
60} catch (error) {
61return c.json({ success: false, error: "Failed to create job" } as ApiResponse<never>, 500);
62}
63});
68const id = parseInt(c.req.param("id"));
69if (isNaN(id)) {
70return c.json({ success: false, error: "Invalid job ID" } as ApiResponse<never>, 400);
71}
7273const deleted = await deleteJob(id);
74if (!deleted) {
75return c.json({ success: false, error: "Job not found" } as ApiResponse<never>, 404);
76}
7778return c.json({ success: true, data: { deleted: true } } as ApiResponse<{ deleted: boolean }>);
79} catch (error) {
80return c.json({ success: false, error: "Failed to delete job" } as ApiResponse<never>, 500);
81}
82});
Jobpostingstypes.ts1 match
38}
3940export interface ApiResponse<T> {
41success: boolean;
42data?: T;
JobpostingsREADME.md3 matches
18โ โ โโโ queries.ts # Database query functions
19โ โโโ routes/
20โ โ โโโ jobs.ts # Job posting API routes
21โ โ โโโ chat.ts # Chat API routes
22โ โโโ index.ts # Main Hono server
23โโโ frontend/
35## Tech Stack
3637- **Backend**: Hono (TypeScript API framework)
38- **Database**: SQLite
39- **Frontend**: React with TypeScript
16await runMigrations();
1718// API routes
19app.route("/api/cycles", cyclesRoutes);
20app.route("/api/symptoms", symptomsRoutes);
2122// Serve frontend files
1import { Hono } from "https://esm.sh/hono@3.11.7";
2import type { TodoItem, ApiResponse } from "../../shared/types.ts";
3import * as queries from "../database/queries.ts";
49try {
10const todos = await queries.getTodos();
11return c.json({ success: true, data: todos } as ApiResponse<TodoItem[]>);
12} catch (error) {
13return c.json({ success: false, error: error.message }, 500);
19try {
20const todos = await queries.getPendingTodos();
21return c.json({ success: true, data: todos } as ApiResponse<TodoItem[]>);
22} catch (error) {
23return c.json({ success: false, error: error.message }, 500);
43
44const createdTodo = await queries.createTodo(todo);
45return c.json({ success: true, data: createdTodo } as ApiResponse<TodoItem>, 201);
46} catch (error) {
47return c.json({ success: false, error: error.message }, 500);
60}
61
62return c.json({ success: true, data: todo } as ApiResponse<TodoItem>);
63} catch (error) {
64return c.json({ success: false, error: error.message }, 500);
80
81const todo = await queries.updateTodo(id, { completed: !currentTodo.completed });
82return c.json({ success: true, data: todo } as ApiResponse<TodoItem>);
83} catch (error) {
84return c.json({ success: false, error: error.message }, 500);
96}
97
98return c.json({ success: true } as ApiResponse<null>);
99} catch (error) {
100return c.json({ success: false, error: error.message }, 500);
TrackerTodoList.tsx3 matches
21try {
22setLoading(true);
23const response = await fetch('/api/todos');
24const result = await response.json();
25
36const toggleTodoComplete = async (todo: TodoItem) => {
37try {
38const response = await fetch(`/api/todos/${todo.id}/toggle`, {
39method: 'PATCH'
40});
53
54try {
55const response = await fetch(`/api/todos/${todoId}`, {
56method: 'DELETE'
57});
1516// Initialize database endpoint
17app.get("/api/init", async (c) => {
18try {
19await runMigrations();
24});
2526// API routes
27app.route("/api/events", eventsRouter);
28app.route("/api/todos", todosRouter);
2930// Dashboard data endpoint
31app.get("/api/dashboard", async (c) => {
32try {
33// Try to initialize database if not already done
102html = html.replace("</head>", `${dataScript}</head>`);
103} catch (dataError) {
104console.log("Could not load initial data, app will load it via API:", dataError.message);
105// App will load data via API instead
106}
107
1import { Hono } from "https://esm.sh/hono@3.11.7";
2import type { ScheduleEvent, ApiResponse } from "../../shared/types.ts";
3import * as queries from "../database/queries.ts";
49try {
10const events = await queries.getEvents();
11return c.json({ success: true, data: events } as ApiResponse<ScheduleEvent[]>);
12} catch (error) {
13return c.json({ success: false, error: error.message }, 500);
26
27const events = await queries.getEventsByDateRange(startDate, endDate);
28return c.json({ success: true, data: events } as ApiResponse<ScheduleEvent[]>);
29} catch (error) {
30return c.json({ success: false, error: error.message }, 500);
43
44const event = await queries.createEvent(eventData);
45return c.json({ success: true, data: event } as ApiResponse<ScheduleEvent>, 201);
46} catch (error) {
47return c.json({ success: false, error: error.message }, 500);
60}
61
62return c.json({ success: true, data: event } as ApiResponse<ScheduleEvent>);
63} catch (error) {
64return c.json({ success: false, error: error.message }, 500);
76}
77
78return c.json({ success: true } as ApiResponse<null>);
79} catch (error) {
80return c.json({ success: false, error: error.message }, 500);