phonepe #54
| @ -27,9 +27,6 @@ jobs: | ||||
| 
 | ||||
|       - name: Replace variables in .env | ||||
|         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_AUTH_TOKEN}#/${{ secrets.TWILIO_AUTH_TOKEN }}/" 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" | ||||
|         run: | | ||||
|           find . -type f -name "*.ts" -exec sed -i "s/#{SERVICES_RGN}#/${{ vars.SERVICES_RGN }}/g" {} + | ||||
|           cat functions/src/email/sendEmail.ts | ||||
| 
 | ||||
|       - name: Build | ||||
|         run: | | ||||
|           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'; | ||||
|  | ||||
| @ -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 { sendEmailMessage, sendEmailWithAttachment, sendEmailSES } from './email'; | ||||
| export { sendEmailSES } from './email'; | ||||
| export { sendSMSMessage } from './sms'; | ||||
| export { accessFile } from './storage'; | ||||
| export { processNotificationOnCreate } from './notifications'; | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user