refactor: remove backend changes from dashboard PR

Backend CORS/CSRF changes moved to #92.
Source registry removed (sources hardcoded in frontend).

Co-authored-by: Ona <no-reply@ona.com>
This commit is contained in:
2026-03-23 00:23:11 +00:00
parent c1d9ec9399
commit 39ced53900
3 changed files with 0 additions and 234 deletions

View File

@@ -1,210 +0,0 @@
/**
* Registry of all known feed source types and their configuration schemas.
* Used by the admin API to describe available sources and validate config.
*/
const FieldType = {
String: "string",
Number: "number",
Select: "select",
} as const
type FieldType = (typeof FieldType)[keyof typeof FieldType]
interface BaseFieldDef {
label: string
required?: boolean
description?: string
}
interface StringFieldDef extends BaseFieldDef {
type: typeof FieldType.String
secret?: boolean
defaultValue?: string
}
interface NumberFieldDef extends BaseFieldDef {
type: typeof FieldType.Number
defaultValue?: number
}
interface SelectFieldDef extends BaseFieldDef {
type: typeof FieldType.Select
options: { label: string; value: string }[]
defaultValue?: string
}
export type ConfigFieldDef = StringFieldDef | NumberFieldDef | SelectFieldDef
export interface SourceDefinition {
id: string
name: string
description: string
/** Whether this source is always enabled and cannot be toggled off */
alwaysEnabled?: boolean
fields: Record<string, ConfigFieldDef>
}
export const sourceRegistry: SourceDefinition[] = [
{
id: "aelis.location",
name: "Location",
description: "Device location provider. Always enabled as a dependency for other sources.",
alwaysEnabled: true,
fields: {},
},
{
id: "aelis.weather",
name: "WeatherKit",
description: "Apple WeatherKit weather data. Requires Apple Developer credentials.",
fields: {
privateKey: {
type: FieldType.String,
label: "Private Key",
required: true,
secret: true,
description: "Apple WeatherKit private key (PEM format)",
},
keyId: {
type: FieldType.String,
label: "Key ID",
required: true,
},
teamId: {
type: FieldType.String,
label: "Team ID",
required: true,
},
serviceId: {
type: FieldType.String,
label: "Service ID",
required: true,
},
units: {
type: FieldType.Select,
label: "Units",
options: [
{ label: "Metric", value: "metric" },
{ label: "Imperial", value: "imperial" },
],
defaultValue: "metric",
},
hourlyLimit: {
type: FieldType.Number,
label: "Hourly Forecast Limit",
defaultValue: 12,
description: "Number of hourly forecasts to include",
},
dailyLimit: {
type: FieldType.Number,
label: "Daily Forecast Limit",
defaultValue: 7,
description: "Number of daily forecasts to include",
},
},
},
{
id: "aelis.tfl",
name: "TFL",
description: "Transport for London status updates.",
fields: {
apiKey: {
type: FieldType.String,
label: "API Key",
required: true,
secret: true,
},
},
},
{
id: "aelis.caldav",
name: "CalDAV",
description: "CalDAV calendar source (basic auth).",
fields: {
serverUrl: {
type: FieldType.String,
label: "Server URL",
required: true,
description: "CalDAV server URL",
},
username: {
type: FieldType.String,
label: "Username",
required: true,
},
password: {
type: FieldType.String,
label: "Password",
required: true,
secret: true,
},
lookAheadDays: {
type: FieldType.Number,
label: "Look-Ahead Days",
defaultValue: 0,
description: "Days beyond today to fetch (0 = today only)",
},
timeZone: {
type: FieldType.String,
label: "Time Zone",
defaultValue: "UTC",
description: "IANA timezone (e.g. America/New_York)",
},
},
},
{
id: "aelis.google-calendar",
name: "Google Calendar",
description: "Google Calendar events via OAuth.",
fields: {
clientId: {
type: FieldType.String,
label: "Client ID",
required: true,
},
clientSecret: {
type: FieldType.String,
label: "Client Secret",
required: true,
secret: true,
},
accessToken: {
type: FieldType.String,
label: "Access Token",
required: true,
secret: true,
},
refreshToken: {
type: FieldType.String,
label: "Refresh Token",
required: true,
secret: true,
},
tokenUrl: {
type: FieldType.String,
label: "Token URL",
required: true,
defaultValue: "https://oauth2.googleapis.com/token",
},
calendarIds: {
type: FieldType.String,
label: "Calendar IDs",
description: "Comma-separated list of calendar IDs",
},
lookaheadHours: {
type: FieldType.Number,
label: "Lookahead Hours",
defaultValue: 24,
},
},
},
]
const registryMap = new Map(sourceRegistry.map((s) => [s.id, s]))
export function getSourceDefinition(sourceId: string): SourceDefinition | undefined {
return registryMap.get(sourceId)
}
export function isKnownSource(sourceId: string): boolean {
return registryMap.has(sourceId)
}

View File

@@ -16,9 +16,6 @@ export function createAuth(db: Database) {
provider: "pg",
schema,
}),
advanced: {
disableCSRFCheck: process.env.NODE_ENV !== "production",
},
emailAndPassword: {
enabled: true,
},

View File

@@ -1,5 +1,4 @@
import { Hono } from "hono"
import { cors } from "hono/cors"
import { registerAdminHttpHandlers } from "./admin/http.ts"
import { createRequireAdmin } from "./auth/admin-middleware.ts"
@@ -51,26 +50,6 @@ function main() {
const app = new Hono()
app.use(
"/api/auth/*",
cors({
origin: (origin) => origin,
allowHeaders: ["Content-Type", "Authorization"],
allowMethods: ["POST", "GET", "OPTIONS"],
exposeHeaders: ["Content-Length"],
maxAge: 600,
credentials: true,
}),
)
app.use(
"*",
cors({
origin: (origin) => origin,
credentials: true,
}),
)
app.get("/health", (c) => c.json({ status: "ok" }))
const authSessionMiddleware = createRequireSession(auth)