replace twilio connect with account sid/auth token form

This commit is contained in:
m5r
2022-06-09 00:33:19 +02:00
parent c047e169f2
commit e8ba6a63ab
19 changed files with 437 additions and 208 deletions

View File

@ -9,10 +9,7 @@ import authenticator from "./authenticator.server";
import { AuthenticationError, NotFoundError } from "./errors";
import { commitSession, destroySession, getSession } from "./session.server";
type SessionTwilioAccount = Pick<
TwilioAccount,
"accountSid" | "subAccountSid" | "subAccountAuthToken" | "apiKeySid" | "apiKeySecret" | "twimlAppSid"
>;
type SessionTwilioAccount = Pick<TwilioAccount, "accountSid" | "authToken">;
type SessionOrganization = Pick<Organization, "id"> & { role: MembershipRole; membershipId: string };
type SessionPhoneNumber = Pick<PhoneNumber, "id" | "number">;
export type SessionUser = Pick<User, "id" | "role" | "email" | "fullName">;
@ -20,7 +17,7 @@ export type SessionData = {
user: SessionUser;
organization: SessionOrganization;
phoneNumber: SessionPhoneNumber | null;
twilioAccount: SessionTwilioAccount | null;
twilio: SessionTwilioAccount | null;
};
const SP = new SecurePassword();
@ -62,6 +59,7 @@ export async function login({ form }: FormStrategyVerifyParams): Promise<Session
try {
return await buildSessionData(user.id);
} catch (error: any) {
logger.error(error);
if (error instanceof AuthenticationError) {
throw error;
}
@ -178,14 +176,7 @@ async function buildSessionData(id: string): Promise<SessionData> {
select: {
id: true,
twilioAccount: {
select: {
accountSid: true,
subAccountSid: true,
subAccountAuthToken: true,
apiKeySid: true,
apiKeySecret: true,
twimlAppSid: true,
},
select: { accountSid: true, authToken: true },
},
},
},
@ -214,6 +205,6 @@ async function buildSessionData(id: string): Promise<SessionData> {
user: rest,
organization,
phoneNumber,
twilioAccount,
twilio: twilioAccount,
};
}

View File

@ -4,20 +4,17 @@ import type { CallInstance } from "twilio/lib/rest/api/v2010/account/call";
import { type TwilioAccount, CallStatus, Direction, MessageStatus } from "@prisma/client";
import serverConfig from "~/config/config.server";
import { decrypt } from "~/utils/encryption";
export default function getTwilioClient({
accountSid,
subAccountSid,
subAccountAuthToken,
}: Pick<TwilioAccount, "accountSid" | "subAccountSid"> &
Partial<Pick<TwilioAccount, "subAccountAuthToken">>): twilio.Twilio {
if (!subAccountSid || !accountSid) {
authToken,
}: Pick<TwilioAccount, "accountSid" | "authToken">): twilio.Twilio {
if (!accountSid || !authToken) {
throw new Error("unreachable");
}
return twilio(subAccountSid, serverConfig.twilio.authToken, {
accountSid,
});
return twilio(accountSid, decrypt(authToken));
}
export const smsUrl = `https://${serverConfig.app.baseUrl}/webhook/message`;

View File

@ -32,3 +32,16 @@ export function validate<Data, Schema = z.Schema<Data>["_type"]>(
errors,
};
}
type FormFailureData<Validations extends Record<string, z.Schema>, Action extends keyof Validations> = {
errors: FormError<Validations[Action]>;
submitted?: never;
};
type FormSuccessData = {
errors?: never;
submitted: true;
};
export type FormActionData<Validations extends Record<string, z.Schema>, Action extends keyof Validations> = Record<
Action,
FormSuccessData | FormFailureData<Validations, Action>
>;