mirror of
https://github.com/kennethnym/aris.git
synced 2026-03-20 09:01:19 +00:00
feat: add actions to FeedSource interface
Add listActions() and executeAction() to FeedSource for write operations back to external services. Actions use arktype schemas for input validation via StandardSchemaV1. - ActionDefinition type with optional input schema - FeedEngine routes actions with existence and ID validation - Source IDs use reverse-domain format (aris.location, aris.tfl) - LocationSource: update-location action with schema validation - TflSource: set-lines-of-interest action with lineId validation - No-op implementations for sources without actions Co-authored-by: Ona <no-reply@ona.com>
This commit is contained in:
@@ -45,13 +45,15 @@ describe("GoogleCalendarSource", () => {
|
||||
describe("constructor", () => {
|
||||
test("has correct id", () => {
|
||||
const source = new GoogleCalendarSource({ client: defaultMockClient() })
|
||||
expect(source.id).toBe("google-calendar")
|
||||
expect(source.id).toBe("aris.google-calendar")
|
||||
})
|
||||
})
|
||||
|
||||
describe("fetchItems", () => {
|
||||
test("returns empty array when no events", async () => {
|
||||
const source = new GoogleCalendarSource({ client: createMockClient({ primary: [] }) })
|
||||
const source = new GoogleCalendarSource({
|
||||
client: createMockClient({ primary: [] }),
|
||||
})
|
||||
const items = await source.fetchItems(createContext())
|
||||
expect(items).toEqual([])
|
||||
})
|
||||
@@ -198,7 +200,9 @@ describe("GoogleCalendarSource", () => {
|
||||
|
||||
describe("fetchContext", () => {
|
||||
test("returns null when no events", async () => {
|
||||
const source = new GoogleCalendarSource({ client: createMockClient({ primary: [] }) })
|
||||
const source = new GoogleCalendarSource({
|
||||
client: createMockClient({ primary: [] }),
|
||||
})
|
||||
const result = await source.fetchContext(createContext())
|
||||
expect(result).toBeNull()
|
||||
})
|
||||
|
||||
@@ -1,4 +1,6 @@
|
||||
import type { Context, FeedSource } from "@aris/core"
|
||||
import type { ActionDefinition, Context, FeedSource } from "@aris/core"
|
||||
|
||||
import { UnknownActionError } from "@aris/core"
|
||||
|
||||
import type {
|
||||
ApiCalendarEvent,
|
||||
@@ -63,7 +65,7 @@ const PRIORITY_ALL_DAY = 0.4
|
||||
* ```
|
||||
*/
|
||||
export class GoogleCalendarSource implements FeedSource<CalendarFeedItem> {
|
||||
readonly id = "google-calendar"
|
||||
readonly id = "aris.google-calendar"
|
||||
|
||||
private readonly client: GoogleCalendarClient
|
||||
private readonly calendarIds: string[] | undefined
|
||||
@@ -75,6 +77,14 @@ export class GoogleCalendarSource implements FeedSource<CalendarFeedItem> {
|
||||
this.lookaheadHours = options.lookaheadHours ?? DEFAULT_LOOKAHEAD_HOURS
|
||||
}
|
||||
|
||||
async listActions(): Promise<Record<string, ActionDefinition>> {
|
||||
return {}
|
||||
}
|
||||
|
||||
async executeAction(actionId: string): Promise<void> {
|
||||
throw new UnknownActionError(actionId)
|
||||
}
|
||||
|
||||
async fetchContext(context: Context): Promise<Partial<Context> | null> {
|
||||
const events = await this.fetchAllEvents(context.time)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user