export const AccountApiLive = HttpApiBuilder.group(
Api,
'accounts',
(handlers) =>
Effect.gen(function* () {
const accountService = yield* AccountService;
const accountPolicy = yield* AccountPolicy;
return handlers
.handle('signIn', ({ payload }) =>
accountService.signIn(payload).pipe(
withSystemActor,
Effect.tap((result) =>
HttpApiBuilder.securitySetCookie(
HttpApiSecurity.apiKey({
in: 'cookie',
key: 'access-token',
}),
result.accessToken,
{
path: '/',
},
),
),
Effect.tap((result) =>
HttpApiBuilder.securitySetCookie(
HttpApiSecurity.apiKey({
in: 'cookie',
key: 'refresh-token',
}),
result.refreshToken,
{
path: '/',
},
),
),
),
)
.handle('signOut', () =>
securityRemoveCookie(
HttpApiSecurity.apiKey({
in: 'cookie',
key: 'access-token',
}),
).pipe(
Effect.tap(() => {
Effect.log('access-token removed');
}),
),
)
}),
)...
// securityRemoveCookie
import { HttpApiSecurity, HttpApp, HttpServerResponse } from '@effect/platform';
import { Effect } from 'effect';
export const securityRemoveCookie = (
self: HttpApiSecurity.ApiKey,
): Effect.Effect<void> => {
return HttpApp.appendPreResponseHandler((_req, response) =>
HttpServerResponse.removeCookie(response, self.key),
);
};
export const AccountApiLive = HttpApiBuilder.group(
Api,
'accounts',
(handlers) =>
Effect.gen(function* () {
const accountService = yield* AccountService;
const accountPolicy = yield* AccountPolicy;
return handlers
.handle('signIn', ({ payload }) =>
accountService.signIn(payload).pipe(
withSystemActor,
Effect.tap((result) =>
HttpApiBuilder.securitySetCookie(
HttpApiSecurity.apiKey({
in: 'cookie',
key: 'access-token',
}),
result.accessToken,
{
path: '/',
},
),
),
Effect.tap((result) =>
HttpApiBuilder.securitySetCookie(
HttpApiSecurity.apiKey({
in: 'cookie',
key: 'refresh-token',
}),
result.refreshToken,
{
path: '/',
},
),
),
),
)
.handle('signOut', () =>
securityRemoveCookie(
HttpApiSecurity.apiKey({
in: 'cookie',
key: 'access-token',
}),
).pipe(
Effect.tap(() => {
Effect.log('access-token removed');
}),
),
)
}),
)...
// securityRemoveCookie
import { HttpApiSecurity, HttpApp, HttpServerResponse } from '@effect/platform';
import { Effect } from 'effect';
export const securityRemoveCookie = (
self: HttpApiSecurity.ApiKey,
): Effect.Effect<void> => {
return HttpApp.appendPreResponseHandler((_req, response) =>
HttpServerResponse.removeCookie(response, self.key),
);
};