Files
calendar/packages/trpc/server/routers/viewer/apps/updateAppCredentials.handler.ts
T
Benny JooGitHubDevin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
76bba1ca05 refactor: remove circular dependency between appstore and trpc (#23768)
* mv PaymentPage to web

* mv 2 more components to web

* refactor

* update imports

* mv

* revert

* fix

* fix

* update

* migrate relevant test too

* move setup components to web from appstore

* move wipemycalother

* mv

* fix typechecks

* mv more routing forms components

* fix

* fix

* fix

* fix: resolve type errors in SingleForm.tsx after migration

- Updated SingleFormComponentProps type to include enriched form properties
- Added proper typing for user, team, nonOrgUsername, nonOrgTeamslug, userOrigin, teamOrigin
- Fixes type errors that occurred after migrating SingleForm.tsx from packages/app-store/routing-forms/components/
- Resolves both SingleForm.tsx and TestForm.tsx type errors

Co-Authored-By: benny@cal.com <sldisek783@gmail.com>

* delete

* refactors

* fix

* fix

* fix

* remove usage of trpc client from OmniInstallAppButton.tsx

* fix test

* import only type

* fix test

* remove trpc package from appstore package.json

* remove remaining trpc usage

* update test

* fix type checks

* fix errors

* fix

* make it error

* nit

---------

Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2025-09-14 12:51:05 +00:00

73 lines
1.9 KiB
TypeScript

import { prisma } from "@calcom/prisma";
import type { Prisma } from "@calcom/prisma/client";
import { TRPCError } from "@trpc/server";
import type { TrpcSessionUser } from "../../../types";
import type { TUpdateAppCredentialsInputSchema } from "./updateAppCredentials.schema";
export type UpdateAppCredentialsOptions = {
ctx: {
user: NonNullable<TrpcSessionUser>;
};
input: TUpdateAppCredentialsInputSchema;
};
const validators = {
paypal: () => import("@calcom/paypal/lib/updateAppCredentials.validator"),
};
export const handleCustomValidations = async ({
input,
appId,
}: UpdateAppCredentialsOptions & { appId: string }) => {
const { key } = input;
const validatorGetter = validators[appId as keyof typeof validators];
// If no validator is found, return the key as is
if (!validatorGetter) return key;
try {
const validator = (await validatorGetter()).default;
return await validator({ input });
} catch (error) {
throw new TRPCError({
code: "BAD_REQUEST",
message: error instanceof Error ? error.message : "Validation failed",
});
}
};
export const updateAppCredentialsHandler = async ({ ctx, input }: UpdateAppCredentialsOptions) => {
const { user } = ctx;
// Find user credential
const credential = await prisma.credential.findFirst({
where: {
id: input.credentialId,
userId: user.id,
},
});
// Check if credential exists
if (!credential) {
throw new TRPCError({
code: "BAD_REQUEST",
message: `Could not find credential ${input.credentialId}`,
});
}
const validatedKeys = await handleCustomValidations({ ctx, input, appId: credential.appId || "" });
const updated = await prisma.credential.update({
where: {
id: credential.id,
},
data: {
key: {
...(credential.key as Prisma.JsonObject),
...(validatedKeys as Prisma.JsonObject),
},
},
});
return !!updated;
};