47 lines
1.7 KiB
TypeScript
47 lines
1.7 KiB
TypeScript
import { AppRuntime } from "@/effect/app-runtime"
|
|
import * as InstanceState from "@/effect/instance-state"
|
|
import { InstanceBootstrap } from "@/project/bootstrap"
|
|
import { Project } from "@/project/project"
|
|
import { ProjectID } from "@/project/schema"
|
|
import { Effect } from "effect"
|
|
import { HttpApiBuilder } from "effect/unstable/httpapi"
|
|
import { InstanceHttpApi } from "../api"
|
|
import { markInstanceForReload } from "../lifecycle"
|
|
|
|
export const projectHandlers = HttpApiBuilder.group(InstanceHttpApi, "project", (handlers) =>
|
|
Effect.gen(function* () {
|
|
const svc = yield* Project.Service
|
|
|
|
const list = Effect.fn("ProjectHttpApi.list")(function* () {
|
|
return yield* svc.list()
|
|
})
|
|
|
|
const current = Effect.fn("ProjectHttpApi.current")(function* () {
|
|
return (yield* InstanceState.context).project
|
|
})
|
|
|
|
const initGit = Effect.fn("ProjectHttpApi.initGit")(function* () {
|
|
const ctx = yield* InstanceState.context
|
|
const next = yield* svc.initGit({ directory: ctx.directory, project: ctx.project })
|
|
if (next.id === ctx.project.id && next.vcs === ctx.project.vcs && next.worktree === ctx.project.worktree)
|
|
return next
|
|
yield* markInstanceForReload(ctx, {
|
|
directory: ctx.directory,
|
|
worktree: ctx.directory,
|
|
project: next,
|
|
init: () => AppRuntime.runPromise(InstanceBootstrap),
|
|
})
|
|
return next
|
|
})
|
|
|
|
const update = Effect.fn("ProjectHttpApi.update")(function* (ctx: {
|
|
params: { projectID: ProjectID }
|
|
payload: Project.UpdatePayload
|
|
}) {
|
|
return yield* svc.update({ ...ctx.payload, projectID: ctx.params.projectID })
|
|
})
|
|
|
|
return handlers.handle("list", list).handle("current", current).handle("initGit", initGit).handle("update", update)
|
|
}),
|
|
)
|