Files
calendar/packages/features/flags/operations/check-if-user-has-feature.controller.ts
T

33 lines
1.3 KiB
TypeScript

import { startSpan } from "@sentry/nextjs";
import { checkIfUserHasFeatureUseCase } from "./check-if-user-has-feature.use-case";
/**
* Controllers use Presenters to convert the data to a UI-friendly format just before
* returning it to the "consumer". This helps us ship less JavaScript to the client (logic
* and libraries to convert the data), helps prevent leaking any sensitive properties, like
* emails or hashed passwords, and also helps us slim down the amount of data we're sending
* back to the client.
*/
function presenter(userHasFeature: boolean) {
return startSpan({ name: "checkIfUserHasFeature Presenter", op: "serialize" }, () => {
return userHasFeature;
});
}
/**
* Controllers perform authentication checks and input validation before passing the input
* to the specific use cases. Controllers orchestrate Use Cases. They don't implement any
* logic, but define the whole operations using use cases.
*/
export async function checkIfUserHasFeatureController(
userId: number | undefined,
slug: string
): Promise<ReturnType<typeof presenter>> {
return await startSpan({ name: "checkIfUserHasFeature Controller" }, async () => {
if (!userId) throw new Error("Missing userId in checkIfUserHasFeatureController");
const userHasFeature = await checkIfUserHasFeatureUseCase(userId, slug);
return presenter(userHasFeature);
});
}