1import { Hono } from "npm:hono";
2import Stripe from "npm:stripe";
3import { addCredits } from "../database/queries.tsx";
4import { getEnvVarName } from "../../shared/is-prod-branch.ts";
5
1import { Hono } from "npm:hono";
2import Stripe from "npm:stripe";
3import { getUser } from "../database/queries.tsx";
4import { getEnvVarName } from "../../shared/is-prod-branch.ts";
5
1import { Hono } from "npm:hono";
2import { getUser, getCreditBalance } from "../database/queries.tsx";
3
4const app = new Hono();
14**Goal**: Replace limit checking with credit checking
15
16**Database Changes:**
17
18* Added credit\_additions table with indexes for performance
21
22
23**New Functions in /backend/database/queries.tsx:**
24
25* getCreditBalance(userId)Â - calculates balance with 50% markup on usage
145--------------------------
146
147**Database Schema:**
148
149Plain textANTLR4BashCC#CSSCoffeeScriptCMakeDartDjangoDockerEJSErlangGitGoGraphQLGroovyHTMLJavaJavaScriptJSONJSXKotlinLaTeXLessLuaMakefileMarkdownMATLABMarkupObjective-CPerlPHPPowerShell.propertiesProtocol BuffersPythonRRubySass (Sass)Sass (Scss)SchemeSQLShellSwiftSVGTSXTypeScriptWebAssemblyYAMLXML` credit_additions ( id, user_id, created_at, stripe_payment_intent_id, amount, note ) -- Indexes on user_id for both credit_additions and townie_usage `
169**Backend:**
170
171* backend/database/schema.tsx - Added credit\_additions table
172
173* backend/database/queries.tsx - New credit functions, removed old limits
174
175* backend/routes/send-message.ts - Updated to use credit checking
4import { serveFile } from "https://esm.town/v/std/utils@85-main/index.ts";
5import { Area } from "../shared/types.ts";
6import { setupDatabase } from "./database.ts";
7import { seedDatabase } from "./seed.ts";
8import { AREAS_TABLE, SETTINGS_TABLE, TASKS_TABLE } from "./config.ts";
9
10// Setup database on startup
11await setupDatabase();
12
13const app = new Hono();
23// API routes
24app.post("/api/setup", async (c) => {
25 await seedDatabase();
26 return c.json({ success: true });
27});
2import { AREAS_TABLE, SETTINGS_TABLE, TASKS_TABLE } from "./config.ts";
3
4export async function setupDatabase() {
5 await sqlite.batch([
6 `CREATE TABLE IF NOT EXISTS ${AREAS_TABLE} (
2import { AREAS_TABLE, TASKS_TABLE } from "./config.ts";
3
4export async function seedDatabase() {
5 console.log("Seeding database...");
6
7 const overdueDate = new Date();
4const EMAIL_TABLE = 'prediction_blog_emails_v1';
5
6// Initialize database table
7async function initDatabase() {
8 await sqlite.execute(`CREATE TABLE IF NOT EXISTS ${EMAIL_TABLE} (
9 id INTEGER PRIMARY KEY AUTOINCREMENT,
23 if (url.pathname === "/api/signup" && req.method === "POST") {
24 try {
25 await initDatabase();
26
27 const data = await req.json();
65 if (url.pathname === "/api/emails" && req.method === "GET") {
66 try {
67 await initDatabase();
68 const result = await sqlite.execute(`SELECT * FROM ${EMAIL_TABLE} ORDER BY created_at DESC`);
69
1// Script to set up the telegram_chats table in SQLite
2// Run this script manually to create the database table
3
4export default async function setupTelegramChatDb() {
25 `);
26
27 return "Telegram chat database table created successfully.";
28 } catch (error) {
29 console.error("Error setting up telegram_chats table:", error);
13## Technical Architecture
14
15**⚠️ important caveat: the admin dashboard doesn't have auth! currently it just relies on security by obscurity of people not knowing the url to a private val. this is not very secure. if you fork this project and put sensitive data in a database you should think carefully about how to secure it.**
16
17Stevens has been designed with the utmost simplicity and extensibility, much like a well-organized household. At the heart of his operation lies a single "memories" table - a digital equivalent of a butler's meticulous records. This table serves as the foundation for all of Stevens' operations.
45- `dashboard`: the admin view for showing the memories notebook + visualizing imports
46- `dailyBriefing`: stuff related to sending a daily update via telegram
47- `dbUtils`: little one-off scripts for database stuff
48
49## Hiring your own Stevens
57- For the Google Calendar integration you'll need `GOOGLE_CALENDAR_ACCOUNT_ID` and `GOOGLE_CALENDAR_CALENDAR_ID`. See [these instuctions](https://www.val.town/v/stevekrouse/pipedream) for details.
58
59**important caveat: the admin dashboard doesn't have auth! currently it just relies on security by obscurity of people not knowing the url to a private val. this is not very secure, if you put sensitive data in a database you should think carefully about how to secure it.**
60
61Overall it's a simple enough project that I encourage you to just copy the ideas and run in your own direction rather than try to use it as-is.