12 implement twilio sms #37
6
.env
|
|
@ -1,7 +1,7 @@
|
||||||
# TWILIO
|
# TWILIO
|
||||||
VITE_TWILIO_ACCOUNT_SID=
|
TWILIO_ACCOUNT_SID=
|
||||||
VITE_TWILIO_AUTH_TOKEN=
|
TWILIO_AUTH_TOKEN=
|
||||||
VITE_TWILIO_PHONE_NUMBER=
|
TWILIO_PHONE_NUMBER=
|
||||||
|
|
||||||
# PRISMA
|
# PRISMA
|
||||||
|
|
|||||||
DATABASE_URL="postgres://hestia:test123@localhost:5432/hestia"
|
DATABASE_URL="postgres://hestia:test123@localhost:5432/hestia"
|
||||||
7
src/app.d.ts
vendored
|
|
@ -1,4 +1,7 @@
|
||||||
// See https://svelte.dev/docs/kit/types#app.d.ts
|
// See https://svelte.dev/docs/kit/types#app.d.ts
|
||||||
|
|
||||||
|
import type { TwilioConfiguration } from '$lib/server/twilio';
|
||||||
|
|
||||||
// for information about these interfaces
|
// for information about these interfaces
|
||||||
declare global {
|
declare global {
|
||||||
namespace App {
|
namespace App {
|
||||||
|
|
@ -6,6 +9,10 @@ declare global {
|
||||||
interface Locals {
|
interface Locals {
|
||||||
user: import('lucia').User | null;
|
user: import('lucia').User | null;
|
||||||
session: import('lucia').Session | null;
|
session: import('lucia').Session | null;
|
||||||
|
twilio: {
|
||||||
|
config: TwilioConfiguration;
|
||||||
|
client: import('twilio').Twilio;
|
||||||
|
};
|
||||||
}
|
}
|
||||||
// interface PageData {}
|
// interface PageData {}
|
||||||
// interface PageState {}
|
// interface PageState {}
|
||||||
|
|
|
||||||
12
src/hooks.server.ts
Normal file
|
|
@ -0,0 +1,12 @@
|
||||||
|
import { TwilioConfig } from '$lib/server/twilio';
|
||||||
|
import twilio from 'twilio';
|
||||||
|
|
||||||
|
export async function handle({ event, resolve }) {
|
||||||
|
const twilioConfig = TwilioConfig();
|
||||||
|
const twilioClient = twilio(twilioConfig.twilio_account_sid, twilioConfig.twilio_auth_token);
|
||||||
|
event.locals.twilio = {
|
||||||
|
config: twilioConfig,
|
||||||
|
client: twilioClient,
|
||||||
|
};
|
||||||
|
return await resolve(event);
|
||||||
|
}
|
||||||
|
|
@ -1 +1 @@
|
||||||
export * from './twilio.client';
|
export * from './twilio.config';
|
||||||
|
|
|
||||||
|
|
@ -1,4 +0,0 @@
|
||||||
import twilio from 'twilio';
|
|
||||||
import { TwilioConfig } from './twilio.config';
|
|
||||||
|
|
||||||
export const twilioClient = twilio(TwilioConfig.twilio_account_sid, TwilioConfig.twilio_auth_token);
|
|
||||||
|
|
@ -1,3 +1,4 @@
|
||||||
|
Add a script instead + add it to Add a script instead + add it to `bun dev`
Add a script instead + add it to Add a script instead + add it to `bun dev`
|
|||||||
|
import { env } from '$env/dynamic/private';
|
||||||
|
Add a script instead + add it to Add a script instead + add it to `bun dev`
|
|||||||
import { PhoneRegex } from '$lib/regex';
|
import { PhoneRegex } from '$lib/regex';
|
||||||
import { logger } from '$lib/server/logger';
|
import { logger } from '$lib/server/logger';
|
||||||
import { z } from 'zod';
|
import { z } from 'zod';
|
||||||
|
|
@ -8,24 +9,22 @@ export interface TwilioConfiguration {
|
||||||
|
Add a script instead + add it to Add a script instead + add it to `bun dev`
Add a script instead + add it to Add a script instead + add it to `bun dev`
|
|||||||
twilio_phone_number: string;
|
twilio_phone_number: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
const LoadConfig = (): TwilioConfiguration => {
|
export const TwilioConfig = (): TwilioConfiguration => {
|
||||||
|
Add a script instead + add it to Add a script instead + add it to `bun dev`
Add a script instead + add it to Add a script instead + add it to `bun dev`
|
|||||||
const { success, data, error } = z
|
const { success, data, error } = z
|
||||||
.object({
|
.object({
|
||||||
VITE_TWILIO_ACCOUNT_SID: z.string(),
|
TWILIO_ACCOUNT_SID: z.string().min(1),
|
||||||
|
Add a script instead + add it to Add a script instead + add it to `bun dev`
Add a script instead + add it to Add a script instead + add it to `bun dev`
|
|||||||
VITE_TWILIO_AUTH_TOKEN: z.string(),
|
TWILIO_AUTH_TOKEN: z.string().min(1),
|
||||||
|
Add a script instead + add it to Add a script instead + add it to `bun dev`
Add a script instead + add it to Add a script instead + add it to `bun dev`
|
|||||||
VITE_TWILIO_PHONE_NUMBER: z.string().regex(PhoneRegex),
|
TWILIO_PHONE_NUMBER: z.string().regex(PhoneRegex),
|
||||||
|
Add a script instead + add it to Add a script instead + add it to `bun dev`
Add a script instead + add it to Add a script instead + add it to `bun dev`
|
|||||||
})
|
})
|
||||||
.safeParse(import.meta.env);
|
.safeParse(env);
|
||||||
|
Add a script instead + add it to Add a script instead + add it to `bun dev`
Add a script instead + add it to Add a script instead + add it to `bun dev`
|
|||||||
|
|
||||||
if (!success) {
|
if (!success) {
|
||||||
logger.error(error.message);
|
logger.error(error.message);
|
||||||
}
|
}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
twilio_account_sid: data!.VITE_TWILIO_ACCOUNT_SID,
|
twilio_account_sid: data!.TWILIO_ACCOUNT_SID,
|
||||||
|
Add a script instead + add it to Add a script instead + add it to `bun dev`
Add a script instead + add it to Add a script instead + add it to `bun dev`
|
|||||||
twilio_auth_token: data!.VITE_TWILIO_AUTH_TOKEN,
|
twilio_auth_token: data!.TWILIO_AUTH_TOKEN,
|
||||||
|
Add a script instead + add it to Add a script instead + add it to `bun dev`
Add a script instead + add it to Add a script instead + add it to `bun dev`
|
|||||||
twilio_phone_number: data!.VITE_TWILIO_PHONE_NUMBER,
|
twilio_phone_number: data!.TWILIO_PHONE_NUMBER,
|
||||||
|
Add a script instead + add it to Add a script instead + add it to `bun dev`
Add a script instead + add it to Add a script instead + add it to `bun dev`
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Add a script instead + add it to Add a script instead + add it to `bun dev`
|
|||||||
export const TwilioConfig = LoadConfig();
|
|
||||||
|
Add a script instead + add it to Add a script instead + add it to `bun dev`
|
|||||||
|
|
|
||||||
|
Add a script instead + add it to Add a script instead + add it to `bun dev`
Add a script instead + add it to Add a script instead + add it to `bun dev`
|
|||||||
|
|
@ -1,7 +1,5 @@
|
||||||
import { PhoneRegex } from '$lib/regex';
|
import { PhoneRegex } from '$lib/regex';
|
||||||
import { logger } from '$lib/server/logger';
|
import { logger } from '$lib/server/logger';
|
||||||
import { twilioClient } from '$lib/server/twilio';
|
|
||||||
import { TwilioConfig } from '$lib/server/twilio/twilio.config';
|
|
||||||
import { fail, type Actions } from '@sveltejs/kit';
|
import { fail, type Actions } from '@sveltejs/kit';
|
||||||
import zod from 'zod';
|
import zod from 'zod';
|
||||||
|
|
||||||
|
|
@ -31,11 +29,12 @@ export const actions = {
|
||||||
return fail(400, { error: 'invalid_message' });
|
return fail(400, { error: 'invalid_message' });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const twilio = event.locals.twilio;
|
||||||
try {
|
try {
|
||||||
const result = await twilioClient.messages.create({
|
const result = await twilio.client.messages.create({
|
||||||
to: phone,
|
to: phone,
|
||||||
body: message,
|
body: message,
|
||||||
from: TwilioConfig.twilio_phone_number,
|
from: twilio.config.twilio_phone_number,
|
||||||
});
|
});
|
||||||
logger.debug(result);
|
logger.debug(result);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
|
|
|
||||||
Prefill them please with CHANGE_ME