import { HttpApi, HttpApiEndpoint, HttpApiGroup, HttpApiSwagger, HttpServer } from '@effect/platform'
import { Layer, Schema } from 'effect'
// contract.ts
export class QuestionGroup extends HttpApiGroup.make('question')
.add(
HttpApiEndpoint.get('get-question', '/get/:id')
.setPath(
Schema.Struct({
id: Schema.NumberFromString,
}),
)
.addSuccess(Schema.Unknown),
)
.prefix('/question') {}
import { FetchHttpClient, HttpClient } from '@effect/platform'
import { Console, Effect } from 'effect'
// service.ts
export class QuestionService extends Effect.Service<QuestionService>()('QuestionService', {
effect: Effect.gen(function* () {
const client = yield* HttpClient.HttpClient
const url = (id: number) => `https://example.com/questions/${id}` // Replaced with generic URL
const getById = Effect.fn('QuestionService.getById')(function* (id: number) {
// Call client to get data with GET request and catch errors
return yield* client.get(url(id)).pipe(
Effect.andThen((response) => response.json),
Effect.catchAll((error) => Console.log(error)),
)
})
return { getById }
}).pipe(Effect.provide(FetchHttpClient.layer)),
}) {}
import { HttpApiBuilder } from '@effect/platform'
export class DomainApi extends HttpApi.make('domain').add(QuestionGroup) {}
export const Api = HttpApi.make('api').addHttpApi(DomainApi)
// live.ts (implementation)
export const QuestionLive = HttpApiBuilder.group(Api, 'question', (handlers) => {
return Effect.gen(function* () {
const service = yield* QuestionService
return handlers.handle('get-question', ({ path }) => service.getById(path.id))
})
}).pipe(Layer.provide(QuestionService.Default))
import { HttpApi, HttpApiEndpoint, HttpApiGroup, HttpApiSwagger, HttpServer } from '@effect/platform'
import { Layer, Schema } from 'effect'
// contract.ts
export class QuestionGroup extends HttpApiGroup.make('question')
.add(
HttpApiEndpoint.get('get-question', '/get/:id')
.setPath(
Schema.Struct({
id: Schema.NumberFromString,
}),
)
.addSuccess(Schema.Unknown),
)
.prefix('/question') {}
import { FetchHttpClient, HttpClient } from '@effect/platform'
import { Console, Effect } from 'effect'
// service.ts
export class QuestionService extends Effect.Service<QuestionService>()('QuestionService', {
effect: Effect.gen(function* () {
const client = yield* HttpClient.HttpClient
const url = (id: number) => `https://example.com/questions/${id}` // Replaced with generic URL
const getById = Effect.fn('QuestionService.getById')(function* (id: number) {
// Call client to get data with GET request and catch errors
return yield* client.get(url(id)).pipe(
Effect.andThen((response) => response.json),
Effect.catchAll((error) => Console.log(error)),
)
})
return { getById }
}).pipe(Effect.provide(FetchHttpClient.layer)),
}) {}
import { HttpApiBuilder } from '@effect/platform'
export class DomainApi extends HttpApi.make('domain').add(QuestionGroup) {}
export const Api = HttpApi.make('api').addHttpApi(DomainApi)
// live.ts (implementation)
export const QuestionLive = HttpApiBuilder.group(Api, 'question', (handlers) => {
return Effect.gen(function* () {
const service = yield* QuestionService
return handlers.handle('get-question', ({ path }) => service.getById(path.id))
})
}).pipe(Layer.provide(QuestionService.Default))