Compare commits
2 Commits
cloud/novu
...
feat/card-
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1ff9353e20 | ||
|
|
8907362c58 |
@@ -35,7 +35,8 @@ services:
|
|||||||
- SMTP_PASSWORD=${SMTP_PASSWORD}
|
- SMTP_PASSWORD=${SMTP_PASSWORD}
|
||||||
- SMTP_SECURE=${SMTP_SECURE}
|
- SMTP_SECURE=${SMTP_SECURE}
|
||||||
- EMAIL_FROM=${EMAIL_FROM}
|
- EMAIL_FROM=${EMAIL_FROM}
|
||||||
- NOVU_API_KEY=${NOVU_API_KEY}
|
- PLUNK_API_KEY=${PLUNK_API_KEY}
|
||||||
|
- PLUNK_API_URL=${PLUNK_API_URL}
|
||||||
|
|
||||||
# S3 storage
|
# S3 storage
|
||||||
- S3_ACCESS_KEY_ID=${S3_ACCESS_KEY_ID}
|
- S3_ACCESS_KEY_ID=${S3_ACCESS_KEY_ID}
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ import * as subscriptionRepo from "@kan/db/repository/subscription.repo";
|
|||||||
import * as userRepo from "@kan/db/repository/user.repo";
|
import * as userRepo from "@kan/db/repository/user.repo";
|
||||||
import * as workspaceRepo from "@kan/db/repository/workspace.repo";
|
import * as workspaceRepo from "@kan/db/repository/workspace.repo";
|
||||||
import * as schema from "@kan/db/schema";
|
import * as schema from "@kan/db/schema";
|
||||||
import { notificationClient, sendEmail } from "@kan/email";
|
import { cloudMailerClient, sendEmail } from "@kan/email";
|
||||||
import { createStripeClient } from "@kan/stripe";
|
import { createStripeClient } from "@kan/stripe";
|
||||||
|
|
||||||
export const configuredProviders = socialProviderList.reduce<
|
export const configuredProviders = socialProviderList.reduce<
|
||||||
@@ -348,7 +348,17 @@ export const initAuth = (db: dbClient) => {
|
|||||||
return Promise.resolve(true);
|
return Promise.resolve(true);
|
||||||
},
|
},
|
||||||
async after(user) {
|
async after(user) {
|
||||||
let avatarKey = user.image;
|
if (cloudMailerClient) {
|
||||||
|
await cloudMailerClient.events.track({
|
||||||
|
event: "user-signup",
|
||||||
|
email: user.email,
|
||||||
|
data: {
|
||||||
|
name: user.name,
|
||||||
|
userId: user.id,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
if (
|
if (
|
||||||
user.image &&
|
user.image &&
|
||||||
!user.image.includes(process.env.NEXT_PUBLIC_STORAGE_DOMAIN!)
|
!user.image.includes(process.env.NEXT_PUBLIC_STORAGE_DOMAIN!)
|
||||||
@@ -381,9 +391,6 @@ export const initAuth = (db: dbClient) => {
|
|||||||
ACL: "public-read",
|
ACL: "public-read",
|
||||||
}),
|
}),
|
||||||
);
|
);
|
||||||
|
|
||||||
avatarKey = key;
|
|
||||||
|
|
||||||
await userRepo.update(db, user.id, {
|
await userRepo.update(db, user.id, {
|
||||||
image: key,
|
image: key,
|
||||||
});
|
});
|
||||||
@@ -391,40 +398,6 @@ export const initAuth = (db: dbClient) => {
|
|||||||
console.error(error);
|
console.error(error);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (notificationClient) {
|
|
||||||
try {
|
|
||||||
const [firstName, ...rest] = user.name
|
|
||||||
.split(" ")
|
|
||||||
.filter(Boolean);
|
|
||||||
const lastName = rest.length ? rest.join(" ") : undefined;
|
|
||||||
const avatarUrl = avatarKey
|
|
||||||
? `${env("NEXT_PUBLIC_STORAGE_URL")}/${env("NEXT_PUBLIC_AVATAR_BUCKET_NAME")}/${avatarKey}`
|
|
||||||
: undefined;
|
|
||||||
|
|
||||||
await notificationClient.trigger({
|
|
||||||
to: {
|
|
||||||
subscriberId: user.id,
|
|
||||||
firstName: firstName,
|
|
||||||
lastName: lastName,
|
|
||||||
email: user.email,
|
|
||||||
avatar: avatarUrl,
|
|
||||||
data: {
|
|
||||||
emailVerified: user.emailVerified,
|
|
||||||
stripeCustomerId: user.stripeCustomerId,
|
|
||||||
createdAt: user.createdAt,
|
|
||||||
updatedAt: user.updatedAt,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
workflowId: "user-signup",
|
|
||||||
});
|
|
||||||
} catch (error) {
|
|
||||||
console.error(
|
|
||||||
"Error adding user to notification client",
|
|
||||||
error,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -23,7 +23,7 @@
|
|||||||
"typecheck": "tsc --noEmit --emitDeclarationOnly false"
|
"typecheck": "tsc --noEmit --emitDeclarationOnly false"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@novu/api": "^3.11.0",
|
"@plunk/node": "^3.0.3",
|
||||||
"@react-email/components": "^0.0.25",
|
"@react-email/components": "^0.0.25",
|
||||||
"nodemailer": "^7.0.3",
|
"nodemailer": "^7.0.3",
|
||||||
"react-email": "^3.0.1"
|
"react-email": "^3.0.1"
|
||||||
|
|||||||
10
packages/email/src/cloudMailerClient.tsx
Normal file
10
packages/email/src/cloudMailerClient.tsx
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
import Plunk from "@plunk/node";
|
||||||
|
|
||||||
|
export const cloudMailerClient =
|
||||||
|
process.env.NEXT_PUBLIC_KAN_ENV === "cloud" &&
|
||||||
|
process.env.PLUNK_API_KEY &&
|
||||||
|
process.env.PLUNK_API_URL
|
||||||
|
? new Plunk(process.env.PLUNK_API_KEY ?? "", {
|
||||||
|
baseUrl: process.env.PLUNK_API_URL,
|
||||||
|
})
|
||||||
|
: null;
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
export const name = "email";
|
export const name = "email";
|
||||||
|
|
||||||
export { sendEmail } from "./sendEmail";
|
export { sendEmail } from "./sendEmail";
|
||||||
export { notificationClient } from "./notificationClient";
|
export { cloudMailerClient } from "./cloudMailerClient";
|
||||||
|
|||||||
@@ -1,6 +0,0 @@
|
|||||||
import { Novu } from "@novu/api";
|
|
||||||
|
|
||||||
export const notificationClient =
|
|
||||||
process.env.NEXT_PUBLIC_KAN_ENV === "cloud" && process.env.NOVU_API_KEY
|
|
||||||
? new Novu({ secretKey: process.env.NOVU_API_KEY })
|
|
||||||
: null;
|
|
||||||
@@ -1,6 +1,7 @@
|
|||||||
import { render } from "@react-email/render";
|
import { render } from "@react-email/render";
|
||||||
import nodemailer from "nodemailer";
|
import nodemailer from "nodemailer";
|
||||||
|
|
||||||
|
import { cloudMailerClient } from "./cloudMailerClient";
|
||||||
import JoinWorkspaceTemplate from "./templates/join-workspace";
|
import JoinWorkspaceTemplate from "./templates/join-workspace";
|
||||||
import MagicLinkTemplate from "./templates/magic-link";
|
import MagicLinkTemplate from "./templates/magic-link";
|
||||||
import ResetPasswordTemplate from "./templates/reset-password";
|
import ResetPasswordTemplate from "./templates/reset-password";
|
||||||
@@ -44,6 +45,15 @@ export const sendEmail = async (
|
|||||||
html,
|
html,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// if (cloudMailerClient) {
|
||||||
|
// const response = await cloudMailerClient.emails.send({
|
||||||
|
// ...options,
|
||||||
|
// body: html,
|
||||||
|
// });
|
||||||
|
|
||||||
|
// return response;
|
||||||
|
// }
|
||||||
|
|
||||||
const response = await transporter.sendMail(options);
|
const response = await transporter.sendMail(options);
|
||||||
|
|
||||||
if (!response.accepted.length) {
|
if (!response.accepted.length) {
|
||||||
|
|||||||
20
pnpm-lock.yaml
generated
20
pnpm-lock.yaml
generated
@@ -440,9 +440,9 @@ importers:
|
|||||||
|
|
||||||
packages/email:
|
packages/email:
|
||||||
dependencies:
|
dependencies:
|
||||||
'@novu/api':
|
'@plunk/node':
|
||||||
specifier: ^3.11.0
|
specifier: ^3.0.3
|
||||||
version: 3.11.0
|
version: 3.0.3
|
||||||
'@react-email/components':
|
'@react-email/components':
|
||||||
specifier: ^0.0.25
|
specifier: ^0.0.25
|
||||||
version: 0.0.25(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
|
version: 0.0.25(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
|
||||||
@@ -2683,9 +2683,6 @@ packages:
|
|||||||
resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==}
|
resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==}
|
||||||
engines: {node: '>= 8'}
|
engines: {node: '>= 8'}
|
||||||
|
|
||||||
'@novu/api@3.11.0':
|
|
||||||
resolution: {integrity: sha512-8u0mB5VThL7MhdxoN0UoA4CS9eu2k3Xa6iulauMhCHENuJNxUNuirJWq5t8jDoH4bFTQTfMN0VRkC0qodKR2qA==}
|
|
||||||
|
|
||||||
'@octokit/auth-token@3.0.4':
|
'@octokit/auth-token@3.0.4':
|
||||||
resolution: {integrity: sha512-TWFX7cZF2LXoCvdmJWY7XVPi74aSY0+FfBZNSXEXFkMpjcqsQwDSYVv5FhRFaI0V1ECnwbz4j59T/G+rXNWaIQ==}
|
resolution: {integrity: sha512-TWFX7cZF2LXoCvdmJWY7XVPi74aSY0+FfBZNSXEXFkMpjcqsQwDSYVv5FhRFaI0V1ECnwbz4j59T/G+rXNWaIQ==}
|
||||||
engines: {node: '>= 14'}
|
engines: {node: '>= 14'}
|
||||||
@@ -2765,6 +2762,9 @@ packages:
|
|||||||
resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==}
|
resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==}
|
||||||
engines: {node: '>=14'}
|
engines: {node: '>=14'}
|
||||||
|
|
||||||
|
'@plunk/node@3.0.3':
|
||||||
|
resolution: {integrity: sha512-f3NT418/EdLjebQ4arAwR64cnz7d5H7i1CeKh8+B0cVBrwzHvF+Q+QkhutF+FAp49yuI/BYc71qQH+RFc2fxxQ==}
|
||||||
|
|
||||||
'@popperjs/core@2.11.8':
|
'@popperjs/core@2.11.8':
|
||||||
resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==}
|
resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==}
|
||||||
|
|
||||||
@@ -10226,10 +10226,6 @@ snapshots:
|
|||||||
'@nodelib/fs.scandir': 2.1.5
|
'@nodelib/fs.scandir': 2.1.5
|
||||||
fastq: 1.19.1
|
fastq: 1.19.1
|
||||||
|
|
||||||
'@novu/api@3.11.0':
|
|
||||||
dependencies:
|
|
||||||
zod: 3.25.76
|
|
||||||
|
|
||||||
'@octokit/auth-token@3.0.4': {}
|
'@octokit/auth-token@3.0.4': {}
|
||||||
|
|
||||||
'@octokit/core@4.2.4':
|
'@octokit/core@4.2.4':
|
||||||
@@ -10349,6 +10345,10 @@ snapshots:
|
|||||||
'@pkgjs/parseargs@0.11.0':
|
'@pkgjs/parseargs@0.11.0':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
|
'@plunk/node@3.0.3':
|
||||||
|
dependencies:
|
||||||
|
tslib: 2.8.1
|
||||||
|
|
||||||
'@popperjs/core@2.11.8': {}
|
'@popperjs/core@2.11.8': {}
|
||||||
|
|
||||||
'@posthog/core@1.0.2': {}
|
'@posthog/core@1.0.2': {}
|
||||||
|
|||||||
@@ -120,7 +120,8 @@
|
|||||||
"PORT",
|
"PORT",
|
||||||
"BETTER_AUTH_SECRET",
|
"BETTER_AUTH_SECRET",
|
||||||
"BETTER_AUTH_TRUSTED_ORIGINS",
|
"BETTER_AUTH_TRUSTED_ORIGINS",
|
||||||
"NOVU_API_KEY"
|
"PLUNK_API_KEY",
|
||||||
|
"PLUNK_API_URL"
|
||||||
],
|
],
|
||||||
"globalPassThroughEnv": [
|
"globalPassThroughEnv": [
|
||||||
"NODE_ENV",
|
"NODE_ENV",
|
||||||
|
|||||||
Reference in New Issue
Block a user