fix(server): return validation error bodies
This commit is contained in:
@@ -21,6 +21,7 @@ import { TuiApi } from "./groups/tui"
|
|||||||
import { WorkspaceApi } from "./groups/workspace"
|
import { WorkspaceApi } from "./groups/workspace"
|
||||||
import { V2Api } from "./groups/v2"
|
import { V2Api } from "./groups/v2"
|
||||||
import { Authorization } from "./middleware/authorization"
|
import { Authorization } from "./middleware/authorization"
|
||||||
|
import { SchemaErrorMiddleware } from "./middleware/schema-error"
|
||||||
|
|
||||||
// SSE event schemas built from the BusEvent/SyncEvent registries.
|
// SSE event schemas built from the BusEvent/SyncEvent registries.
|
||||||
const EventSchema = Schema.Union(BusEvent.effectPayloads()).annotate({ identifier: "Event" })
|
const EventSchema = Schema.Union(BusEvent.effectPayloads()).annotate({ identifier: "Event" })
|
||||||
@@ -29,6 +30,7 @@ const SyncEventSchemas = SyncEvent.effectPayloads()
|
|||||||
export const RootHttpApi = HttpApi.make("opencode-root")
|
export const RootHttpApi = HttpApi.make("opencode-root")
|
||||||
.addHttpApi(ControlApi)
|
.addHttpApi(ControlApi)
|
||||||
.addHttpApi(GlobalApi)
|
.addHttpApi(GlobalApi)
|
||||||
|
.middleware(SchemaErrorMiddleware)
|
||||||
.middleware(Authorization)
|
.middleware(Authorization)
|
||||||
|
|
||||||
export const InstanceHttpApi = HttpApi.make("opencode-instance")
|
export const InstanceHttpApi = HttpApi.make("opencode-instance")
|
||||||
@@ -47,6 +49,7 @@ export const InstanceHttpApi = HttpApi.make("opencode-instance")
|
|||||||
.addHttpApi(V2Api)
|
.addHttpApi(V2Api)
|
||||||
.addHttpApi(TuiApi)
|
.addHttpApi(TuiApi)
|
||||||
.addHttpApi(WorkspaceApi)
|
.addHttpApi(WorkspaceApi)
|
||||||
|
.middleware(SchemaErrorMiddleware)
|
||||||
|
|
||||||
export const OpenCodeHttpApi = HttpApi.make("opencode")
|
export const OpenCodeHttpApi = HttpApi.make("opencode")
|
||||||
.addHttpApi(RootHttpApi)
|
.addHttpApi(RootHttpApi)
|
||||||
|
|||||||
@@ -0,0 +1,21 @@
|
|||||||
|
import { Effect } from "effect"
|
||||||
|
import { HttpServerResponse } from "effect/unstable/http"
|
||||||
|
import { HttpApiMiddleware } from "effect/unstable/httpapi"
|
||||||
|
|
||||||
|
export class SchemaErrorMiddleware extends HttpApiMiddleware.Service<SchemaErrorMiddleware>()(
|
||||||
|
"@opencode/ExperimentalHttpApiSchemaError",
|
||||||
|
) {}
|
||||||
|
|
||||||
|
export const schemaErrorLayer = HttpApiMiddleware.layerSchemaErrorTransform(SchemaErrorMiddleware, (error) => {
|
||||||
|
if (error.kind === "Body") return Effect.fail(error)
|
||||||
|
return Effect.succeed(
|
||||||
|
HttpServerResponse.jsonUnsafe(
|
||||||
|
{
|
||||||
|
data: {},
|
||||||
|
errors: [{ kind: error.kind, message: error.cause.message }],
|
||||||
|
success: false,
|
||||||
|
},
|
||||||
|
{ status: 400 },
|
||||||
|
),
|
||||||
|
)
|
||||||
|
})
|
||||||
@@ -84,6 +84,7 @@ import { compressionLayer } from "./middleware/compression"
|
|||||||
import { corsVaryFix } from "./middleware/cors-vary"
|
import { corsVaryFix } from "./middleware/cors-vary"
|
||||||
import { errorLayer } from "./middleware/error"
|
import { errorLayer } from "./middleware/error"
|
||||||
import { fenceLayer } from "./middleware/fence"
|
import { fenceLayer } from "./middleware/fence"
|
||||||
|
import { schemaErrorLayer } from "./middleware/schema-error"
|
||||||
|
|
||||||
export const context = Context.makeUnsafe<unknown>(new Map())
|
export const context = Context.makeUnsafe<unknown>(new Map())
|
||||||
|
|
||||||
@@ -114,6 +115,7 @@ const authOnlyRouterLayer = authorizationRouterMiddleware.layer.pipe(Layer.provi
|
|||||||
const httpApiAuthLayer = authorizationLayer.pipe(Layer.provide(ServerAuth.Config.defaultLayer))
|
const httpApiAuthLayer = authorizationLayer.pipe(Layer.provide(ServerAuth.Config.defaultLayer))
|
||||||
const rootApiRoutes = HttpApiBuilder.layer(RootHttpApi).pipe(
|
const rootApiRoutes = HttpApiBuilder.layer(RootHttpApi).pipe(
|
||||||
Layer.provide([controlHandlers, globalHandlers]),
|
Layer.provide([controlHandlers, globalHandlers]),
|
||||||
|
Layer.provide(schemaErrorLayer),
|
||||||
Layer.provide(httpApiAuthLayer),
|
Layer.provide(httpApiAuthLayer),
|
||||||
)
|
)
|
||||||
const instanceRouterLayer = authorizationRouterMiddleware
|
const instanceRouterLayer = authorizationRouterMiddleware
|
||||||
@@ -142,6 +144,7 @@ const instanceApiRoutes = HttpApiBuilder.layer(InstanceHttpApi).pipe(
|
|||||||
tuiHandlers,
|
tuiHandlers,
|
||||||
workspaceHandlers,
|
workspaceHandlers,
|
||||||
]),
|
]),
|
||||||
|
Layer.provide(schemaErrorLayer),
|
||||||
)
|
)
|
||||||
|
|
||||||
const rawInstanceRoutes = Layer.mergeAll(ptyConnectRoute).pipe(Layer.provide(instanceRouterLayer))
|
const rawInstanceRoutes = Layer.mergeAll(ptyConnectRoute).pipe(Layer.provide(instanceRouterLayer))
|
||||||
|
|||||||
Reference in New Issue
Block a user