project-copy.ts 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. import { ProjectCopy } from "@opencode-ai/schema/project-copy"
  2. import { Project } from "@opencode-ai/schema/project"
  3. import { Schema, Struct } from "effect"
  4. import { HttpApiEndpoint, HttpApiGroup, HttpApiSchema, OpenApi } from "effect/unstable/httpapi"
  5. import { LocationQuery, locationQueryOpenApi } from "./location"
  6. const root = "/experimental/project/:projectID/copy"
  7. export class ProjectCopyError extends Schema.ErrorClass<ProjectCopyError>("ProjectCopyError")(
  8. {
  9. name: Schema.Literal("ProjectCopyError"),
  10. data: Schema.Struct({
  11. message: Schema.String,
  12. forceRequired: Schema.optional(Schema.Boolean),
  13. }),
  14. },
  15. { httpApiStatus: 400 },
  16. ) {}
  17. const CreatePayload = Schema.Struct(Struct.omit(ProjectCopy.CreateInput.fields, ["projectID", "sourceDirectory"]))
  18. const RemovePayload = Schema.Struct(Struct.omit(ProjectCopy.RemoveInput.fields, ["projectID"]))
  19. export const ProjectCopyGroup = HttpApiGroup.make("server.projectCopy")
  20. .add(
  21. HttpApiEndpoint.post("projectCopy.create", root, {
  22. params: { projectID: Project.ID },
  23. query: LocationQuery,
  24. payload: CreatePayload,
  25. success: ProjectCopy.Copy,
  26. error: ProjectCopyError,
  27. })
  28. .annotateMerge(locationQueryOpenApi)
  29. .annotateMerge(OpenApi.annotations({ identifier: "v2.projectCopy.create" })),
  30. )
  31. .add(
  32. HttpApiEndpoint.delete("projectCopy.remove", root, {
  33. params: { projectID: Project.ID },
  34. query: LocationQuery,
  35. payload: RemovePayload,
  36. success: HttpApiSchema.NoContent,
  37. error: ProjectCopyError,
  38. })
  39. .annotateMerge(locationQueryOpenApi)
  40. .annotateMerge(OpenApi.annotations({ identifier: "v2.projectCopy.remove" })),
  41. )
  42. .add(
  43. HttpApiEndpoint.post("projectCopy.refresh", `${root}/refresh`, {
  44. params: { projectID: Project.ID },
  45. query: LocationQuery,
  46. success: HttpApiSchema.NoContent,
  47. error: ProjectCopyError,
  48. })
  49. .annotateMerge(locationQueryOpenApi)
  50. .annotateMerge(OpenApi.annotations({ identifier: "v2.projectCopy.refresh" })),
  51. )
  52. .annotateMerge(OpenApi.annotations({ title: "projectCopy", description: "Project copy management routes." }))