permission.ts 3.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. import { Location } from "@kirincode-ai/core/location"
  2. import { PermissionV2 } from "@kirincode-ai/core/permission"
  3. import { PermissionSaved } from "@kirincode-ai/core/permission/saved"
  4. import { Effect } from "effect"
  5. import { HttpApiBuilder, HttpApiSchema } from "effect/unstable/httpapi"
  6. import { Api } from "../api"
  7. import { PermissionNotFoundError, SessionNotFoundError } from "@kirincode-ai/protocol/errors"
  8. import { response } from "../location"
  9. function missingRequest(id: PermissionV2.ID) {
  10. return new PermissionNotFoundError({ requestID: id, message: `Permission request not found: ${id}` })
  11. }
  12. export const PermissionHandler = HttpApiBuilder.group(Api, "server.permission", (handlers) =>
  13. Effect.gen(function* () {
  14. return handlers
  15. .handle(
  16. "permission.request.list",
  17. Effect.fn(function* () {
  18. return yield* response((yield* PermissionV2.Service).list())
  19. }),
  20. )
  21. .handle(
  22. "session.permission.create",
  23. Effect.fn(function* (ctx) {
  24. const permission = yield* PermissionV2.Service
  25. return {
  26. data: yield* permission
  27. .ask({
  28. id: ctx.payload.id,
  29. sessionID: ctx.params.sessionID,
  30. action: ctx.payload.action,
  31. resources: ctx.payload.resources,
  32. save: ctx.payload.save,
  33. metadata: ctx.payload.metadata,
  34. source: ctx.payload.source,
  35. agent: ctx.payload.agent,
  36. })
  37. .pipe(
  38. Effect.catchTag(
  39. "Session.NotFoundError",
  40. (error) =>
  41. new SessionNotFoundError({
  42. sessionID: error.sessionID,
  43. message: `Session not found: ${error.sessionID}`,
  44. }),
  45. ),
  46. ),
  47. }
  48. }),
  49. )
  50. .handle(
  51. "session.permission.list",
  52. Effect.fn(function* (ctx) {
  53. const permission = yield* PermissionV2.Service
  54. return { data: yield* permission.forSession(ctx.params.sessionID) }
  55. }),
  56. )
  57. .handle(
  58. "session.permission.get",
  59. Effect.fn(function* (ctx) {
  60. const request = yield* (yield* PermissionV2.Service).get(ctx.params.requestID)
  61. if (!request || request.sessionID !== ctx.params.sessionID) return yield* missingRequest(ctx.params.requestID)
  62. return { data: request }
  63. }),
  64. )
  65. .handle(
  66. "session.permission.reply",
  67. Effect.fn(function* (ctx) {
  68. const permission = yield* PermissionV2.Service
  69. const request = yield* permission.get(ctx.params.requestID)
  70. if (!request || request.sessionID !== ctx.params.sessionID) return yield* missingRequest(ctx.params.requestID)
  71. yield* permission
  72. .reply({ requestID: ctx.params.requestID, reply: ctx.payload.reply, message: ctx.payload.message })
  73. .pipe(Effect.catchTag("PermissionV2.NotFoundError", () => missingRequest(ctx.params.requestID)))
  74. return HttpApiSchema.NoContent.make()
  75. }),
  76. )
  77. .handle(
  78. "permission.saved.list",
  79. Effect.fn(function* (ctx) {
  80. const location = yield* Location.Service
  81. return {
  82. data: yield* (yield* PermissionSaved.Service).list({
  83. projectID: ctx.query.projectID ?? location.project.id,
  84. }),
  85. }
  86. }),
  87. )
  88. .handle(
  89. "permission.saved.remove",
  90. Effect.fn(function* (ctx) {
  91. yield* (yield* PermissionSaved.Service).remove(ctx.params.id)
  92. return HttpApiSchema.NoContent.make()
  93. }),
  94. )
  95. }),
  96. )