phonepe #61
@ -27,9 +27,6 @@ jobs:
|
|||||||
|
|
||||||
- name: Replace variables in .env
|
- name: Replace variables in .env
|
||||||
run: |
|
run: |
|
||||||
sed -i "s/#{MAILGUN_API_KEY}#/${{ secrets.MAILGUN_API_KEY }}/" functions/.env
|
|
||||||
sed -i "s/#{MAILGUN_SERVER}#/${{ secrets.MAILGUN_SERVER }}/" functions/.env
|
|
||||||
sed -i "s/#{MAILGUN_FROM_ADDRESS}#/${{ secrets.MAILGUN_FROM_ADDRESS }}/" functions/.env
|
|
||||||
sed -i "s/#{TWILIO_ACCOUNT_SID}#/${{ secrets.TWILIO_ACCOUNT_SID }}/" functions/.env
|
sed -i "s/#{TWILIO_ACCOUNT_SID}#/${{ secrets.TWILIO_ACCOUNT_SID }}/" functions/.env
|
||||||
sed -i "s/#{TWILIO_AUTH_TOKEN}#/${{ secrets.TWILIO_AUTH_TOKEN }}/" functions/.env
|
sed -i "s/#{TWILIO_AUTH_TOKEN}#/${{ secrets.TWILIO_AUTH_TOKEN }}/" functions/.env
|
||||||
sed -i "s/#{TWILIO_PHONE_NUMBER}#/${{ secrets.TWILIO_PHONE_NUMBER }}/" functions/.env
|
sed -i "s/#{TWILIO_PHONE_NUMBER}#/${{ secrets.TWILIO_PHONE_NUMBER }}/" functions/.env
|
||||||
@ -50,7 +47,7 @@ jobs:
|
|||||||
- name: "Replace #{SERVICES_RGN}# in all .ts files"
|
- name: "Replace #{SERVICES_RGN}# in all .ts files"
|
||||||
run: |
|
run: |
|
||||||
find . -type f -name "*.ts" -exec sed -i "s/#{SERVICES_RGN}#/${{ vars.SERVICES_RGN }}/g" {} +
|
find . -type f -name "*.ts" -exec sed -i "s/#{SERVICES_RGN}#/${{ vars.SERVICES_RGN }}/g" {} +
|
||||||
cat functions/src/email/sendEmail.ts
|
|
||||||
- name: Build
|
- name: Build
|
||||||
run: |
|
run: |
|
||||||
npm install -g typescript
|
npm install -g typescript
|
||||||
|
|||||||
64
.gitea/workflows/deploy-qa.yaml
Normal file
64
.gitea/workflows/deploy-qa.yaml
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
name: Deploy FitLien services to Dev
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- qa
|
||||||
|
jobs:
|
||||||
|
deploy:
|
||||||
|
name: Deploy to QA
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v2
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
|
||||||
|
- name: Setup Node
|
||||||
|
uses: actions/setup-node@v3
|
||||||
|
with:
|
||||||
|
node-version: 22
|
||||||
|
|
||||||
|
- name: Clean install
|
||||||
|
run: npm clean-install
|
||||||
|
|
||||||
|
- name: Copy .env.example to .env
|
||||||
|
run: cp functions/.env.example functions/.env
|
||||||
|
|
||||||
|
- name: Replace variables in .env
|
||||||
|
run: |
|
||||||
|
sed -i "s/#{TWILIO_ACCOUNT_SID}#/${{ secrets.TWILIO_ACCOUNT_SID }}/" functions/.env
|
||||||
|
sed -i "s/#{TWILIO_AUTH_TOKEN}#/${{ secrets.TWILIO_AUTH_TOKEN }}/" functions/.env
|
||||||
|
sed -i "s/#{TWILIO_PHONE_NUMBER}#/${{ secrets.TWILIO_PHONE_NUMBER }}/" functions/.env
|
||||||
|
sed -i "s/#{SERVICES_RGN}#/${{ vars.SERVICES_RGN }}/" functions/.env
|
||||||
|
sed -i "s/#{GOOGLE_MAPS_API_KEY}#/${{ secrets.GOOGLE_MAPS_API_KEY }}/" functions/.env
|
||||||
|
sed -i "s/#{SES_FROM_EMAIL}#/${{ vars.SES_FROM_EMAIL }}/" functions/.env
|
||||||
|
sed -i "s/#{SES_REPLY_TO_EMAIL}#/${{ vars.SES_REPLY_TO_EMAIL }}/" functions/.env
|
||||||
|
sed -i "s/#{AWS_ACCESS_KEY_ID}#/${{ secrets.AWS_ACCESS_KEY_ID }}/" functions/.env
|
||||||
|
sed -i "s/#{AWS_SECRET_ACCESS_KEY}#/${{ secrets.AWS_SECRET_ACCESS_KEY }}/" functions/.env
|
||||||
|
sed -i "s/#{AWS_REGION}#/${{ secrets.AWS_REGION }}/" functions/.env
|
||||||
|
sed -i "s/#{PHONEPE_CLIENT_ID}#/${{ secrets.PHONEPE_CLIENT_ID }}/" functions/.env
|
||||||
|
sed -i "s/#{PHONEPE_CLIENT_SECRET}#/${{ secrets.PHONEPE_CLIENT_SECRET }}/" functions/.env
|
||||||
|
sed -i "s/#{PHONEPE_API_URL}#/${{ secrets.PHONEPE_API_URL }}/" functions/.env
|
||||||
|
sed -i "s/#{PHONEPE_WEBHOOK_USERNAME}#/${{ secrets.PHONEPE_WEBHOOK_USERNAME }}/" functions/.env
|
||||||
|
sed -i "s/#{PHONEPE_WEBHOOK_PASSWORD}#/${{ secrets.PHONEPE_WEBHOOK_PASSWORD }}/" functions/.env
|
||||||
|
|
||||||
|
cat functions/.env
|
||||||
|
- name: "Replace #{SERVICES_RGN}# in all .ts files"
|
||||||
|
run: |
|
||||||
|
find . -type f -name "*.ts" -exec sed -i "s/#{SERVICES_RGN}#/${{ vars.SERVICES_RGN }}/g" {} +
|
||||||
|
|
||||||
|
- name: Build
|
||||||
|
run: |
|
||||||
|
npm install -g typescript
|
||||||
|
cd functions
|
||||||
|
npm install
|
||||||
|
npx tsc
|
||||||
|
cd ..
|
||||||
|
ls -la
|
||||||
|
|
||||||
|
- name: Deploy
|
||||||
|
run: |
|
||||||
|
curl -sL firebase.tools | upgrade=true bash
|
||||||
|
firebase use --token ${{ secrets.FIREBASE_TOKEN }} qa
|
||||||
|
firebase deploy --token "${{ secrets.FIREBASE_TOKEN }}" --force --non-interactive
|
||||||
@ -1,3 +1 @@
|
|||||||
export { sendEmailMessage } from './sendEmail';
|
|
||||||
export { sendEmailWithAttachment } from './sendEmailWithAttachment';
|
|
||||||
export { sendEmailSES } from './sendEmailSES';
|
export { sendEmailSES } from './sendEmailSES';
|
||||||
|
|||||||
@ -1,40 +0,0 @@
|
|||||||
import { onRequest } from "firebase-functions/v2/https";
|
|
||||||
import { Request } from "firebase-functions/v2/https";
|
|
||||||
import { getCorsHandler } from "../shared/middleware";
|
|
||||||
import { getLogger } from "../shared/config";
|
|
||||||
import formData from 'form-data';
|
|
||||||
import Mailgun from 'mailgun.js';
|
|
||||||
const { convert } = require('html-to-text');
|
|
||||||
|
|
||||||
const mailgun = new Mailgun(formData);
|
|
||||||
const logger = getLogger();
|
|
||||||
const corsHandler = getCorsHandler();
|
|
||||||
export const sendEmailMessage = onRequest({
|
|
||||||
region: '#{SERVICES_RGN}#'
|
|
||||||
}, (request: Request, response) => {
|
|
||||||
return corsHandler(request, response, async () => {
|
|
||||||
const mailGunClient = mailgun.client({ username: 'api', key: process.env.MAILGUN_API_KEY! });
|
|
||||||
|
|
||||||
const toAddress = request.body.toAddress;
|
|
||||||
const subject = request.body.subject;
|
|
||||||
const message = request.body.message;
|
|
||||||
const options = {
|
|
||||||
wordwrap: 130,
|
|
||||||
};
|
|
||||||
|
|
||||||
const textMessage = convert(message, options);
|
|
||||||
mailGunClient.messages.create(process.env.MAILGUN_SERVER!, {
|
|
||||||
from: process.env.MAILGUN_FROM_ADDRESS,
|
|
||||||
to: toAddress,
|
|
||||||
subject: subject,
|
|
||||||
text: textMessage,
|
|
||||||
html: message
|
|
||||||
}).then((res: any) => {
|
|
||||||
logger.info(res);
|
|
||||||
response.send(res);
|
|
||||||
}).catch((err: any) => {
|
|
||||||
logger.error(err);
|
|
||||||
response.send(err);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
@ -1,81 +0,0 @@
|
|||||||
import { onRequest } from "firebase-functions/v2/https";
|
|
||||||
import { Request } from "firebase-functions/v2/https";
|
|
||||||
import * as os from 'os';
|
|
||||||
import * as path from 'path';
|
|
||||||
import * as fs from 'fs';
|
|
||||||
import * as https from 'https';
|
|
||||||
import { getCorsHandler } from "../shared/middleware";
|
|
||||||
import { getLogger } from "../shared/config";
|
|
||||||
import formData from 'form-data';
|
|
||||||
import Mailgun from 'mailgun.js';
|
|
||||||
const { convert } = require('html-to-text');
|
|
||||||
|
|
||||||
const mailgun = new Mailgun(formData);
|
|
||||||
const logger = getLogger();
|
|
||||||
const corsHandler = getCorsHandler();
|
|
||||||
export const sendEmailWithAttachment = onRequest({
|
|
||||||
region: '#{SERVICES_RGN}#'
|
|
||||||
}, async (request: Request, response) => {
|
|
||||||
return corsHandler(request, response, async () => {
|
|
||||||
try {
|
|
||||||
const { toAddress, subject, message, fileUrl, fileName } = request.body;
|
|
||||||
|
|
||||||
if (!toAddress || !subject || !message || !fileUrl) {
|
|
||||||
response.status(400).json({
|
|
||||||
error: 'Missing required fields (toAddress, subject, message, fileUrl)'
|
|
||||||
});
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
const tempFilePath = path.join(os.tmpdir(), fileName || 'attachment.pdf');
|
|
||||||
await new Promise<void>((resolve, reject) => {
|
|
||||||
const file = fs.createWriteStream(tempFilePath);
|
|
||||||
https.get(fileUrl, (res) => {
|
|
||||||
res.pipe(file);
|
|
||||||
file.on('finish', () => {
|
|
||||||
file.close();
|
|
||||||
resolve();
|
|
||||||
});
|
|
||||||
}).on('error', (err) => {
|
|
||||||
fs.unlink(tempFilePath, () => { });
|
|
||||||
reject(err);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
try {
|
|
||||||
const client = mailgun.client({ username: 'api', key: process.env.MAILGUN_API_KEY! });
|
|
||||||
|
|
||||||
const options = {
|
|
||||||
wordwrap: 130,
|
|
||||||
};
|
|
||||||
const textMessage = convert(message, options);
|
|
||||||
const fileBuffer = fs.readFileSync(tempFilePath);
|
|
||||||
const attachmentFilename = fileName || path.basename(fileUrl.split('?')[0]);
|
|
||||||
|
|
||||||
const data = {
|
|
||||||
from: process.env.MAILGUN_FROM_ADDRESS,
|
|
||||||
to: toAddress,
|
|
||||||
subject: subject,
|
|
||||||
text: textMessage,
|
|
||||||
html: message,
|
|
||||||
attachment: {
|
|
||||||
data: fileBuffer,
|
|
||||||
filename: attachmentFilename,
|
|
||||||
contentType: 'application/pdf',
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
const result = await client.messages.create(process.env.MAILGUN_SERVER!, data);
|
|
||||||
fs.unlinkSync(tempFilePath);
|
|
||||||
logger.info('Email with attachment from URL sent successfully');
|
|
||||||
response.json({ success: true, result });
|
|
||||||
|
|
||||||
} catch (e) {
|
|
||||||
console.error(`Error while sending E-mail. Error: ${e}`);
|
|
||||||
}
|
|
||||||
} catch (error) {
|
|
||||||
logger.error('Error sending email with attachment from URL:', error);
|
|
||||||
response.status(500).json({ success: false, error: error instanceof Error ? error.message : String(error) });
|
|
||||||
}
|
|
||||||
});
|
|
||||||
});
|
|
||||||
@ -10,7 +10,7 @@ setGlobalOptions({
|
|||||||
});
|
});
|
||||||
|
|
||||||
export * from './shared/config';
|
export * from './shared/config';
|
||||||
export { sendEmailMessage, sendEmailWithAttachment, sendEmailSES } from './email';
|
export { sendEmailSES } from './email';
|
||||||
export { sendSMSMessage } from './sms';
|
export { sendSMSMessage } from './sms';
|
||||||
export { accessFile } from './storage';
|
export { accessFile } from './storage';
|
||||||
export { processNotificationOnCreate } from './notifications';
|
export { processNotificationOnCreate } from './notifications';
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user