Skip to content

Commit

Permalink
Unified Modeling Language
Browse files Browse the repository at this point in the history
  • Loading branch information
zobkazi committed May 21, 2024
1 parent a2bfced commit c3419f6
Show file tree
Hide file tree
Showing 11 changed files with 119 additions and 146 deletions.
3 changes: 2 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -42,4 +42,5 @@ The User Pet Adoption and Rescue Platform is developed using a microservices arc

## Additional Resources

- [User Pet Adoption and Rescue Platform](https://github.com/zobkazi/PurrRescue)
- [System Design PurrRescue](https://zobaidulkazi.notion.site/System-Design-PurrRescue-d7d15956853140cab6398c7a975364a8)
- [User Pet Adoption and Rescue Platform Docker Image](https://hub.docker.com/r/zobaidulkazihub/purrrescue)
32 changes: 1 addition & 31 deletions packages/services/email/package.json
Original file line number Diff line number Diff line change
@@ -1,31 +1 @@
{
"name": "analytics",
"version": "1.0.0",
"main": "index.js",
"license": "MIT",
"scripts": {
"dev": "ts-node-dev -r tsconfig-paths/register ./src/index.ts",
"build": "tsc & tsc-alias",
"migrate:dev": "prisma migrate dev",
"migrate:prod": "prisma migrate deploy"
},
"dependencies": {
"cors": "^2.8.5",
"dotenv": "^16.4.5",
"express": "^4.19.2",
"ioredis": "^5.4.1",
"morgan": "^1.10.0",
"nodemailer": "^6.9.13",
"zod": "^3.22.4"
},
"devDependencies": {
"@types/cors": "^2.8.17",
"@types/express": "^4.17.21",
"@types/node": "^20.11.19",
"ts-node-dev": "^2.0.0",
"tsc": "^2.0.4",
"tsc-alias": "^1.8.8",
"tsconfig-paths": "^4.2.0",
"typescript": "^5.3.3"
}
}
"{\"name\":\"email\",\"version\":\"1.0.0\",\"main\":\"index.js\",\"license\":\"MIT\",\"scripts\":{\"dev\":\"ts-node-dev -r tsconfig-paths/register ./src/index.ts\",\"build\":\"tsc && tsc-alias\",\"migrate:dev\":\"prisma migrate dev\",\"migrate:prod\":\"prisma migrate deploy\"},\"dependencies\":{\"@prisma/client\":\"^5.10.1\",\"amqplib\":\"^0.10.3\",\"axios\":\"^1.6.7\",\"bcryptjs\":\"^2.4.3\",\"cors\":\"^2.8.5\",\"dotenv\":\"^16.4.5\",\"express\":\"^4.18.2\",\"ioredis\":\"^5.4.1\",\"jsonwebtoken\":\"^9.0.2\",\"morgan\":\"^1.10.0\",\"nodemailer\":\"^6.9.10\",\"zod\":\"^3.22.4\"},\"devDependencies\":{\"@types/amqplib\":\"^0.10.5\",\"@types/bcryptjs\":\"^2.4.6\",\"@types/cors\":\"^2.8.17\",\"@types/express\":\"^4.17.21\",\"@types/node\":\"^20.11.19\",\"@types/nodemailer\":\"^6.4.14\",\"prisma\":\"^5.10.1\",\"ts-node-dev\":\"^2.0.0\",\"tsc\":\"^2.0.4\",\"tsc-alias\":\"^1.8.8\",\"tsconfig-paths\":\"^4.2.0\",\"typescript\":\"^5.3.3\"}}"
16 changes: 0 additions & 16 deletions packages/services/email/src/EmailBody.ts

This file was deleted.

13 changes: 5 additions & 8 deletions packages/services/email/src/client.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,8 @@
import { Redis } from 'ioredis'

import { Redis } from "ioredis";

const client = new Redis({
host: 'localhost',
port: 6379

})

host: "localhost",
port: 6379,
});

export default client
export default client;
9 changes: 0 additions & 9 deletions packages/services/email/src/config.ts

This file was deleted.

9 changes: 9 additions & 0 deletions packages/services/email/src/config/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
import nodemailer from "nodemailer";

export const transporter = nodemailer.createTransport({
host: process.env.SMTP_HOST || "host.docker.internal",
port: parseInt(process.env.SMTP_PORT || "1025"),
});

export const defaultSender =
process.env.DEFAULT_SENDER_EMAIL || "admin@example.com";
20 changes: 10 additions & 10 deletions packages/services/email/src/controllers/getEmails.ts
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
import prisma from "@/utils/prisma"
import { Request, Response,NextFunction } from "express"
import prisma from "@/utils/prisma";
import { Request, Response, NextFunction } from "express";

const getEmails = async (req: Request, res: Response, next: NextFunction) => {
try {
const emails = await prisma.email.findMany()
try {
const emails = await prisma.email.findMany();

res.status(200).json(emails)
} catch (error) {
next(error)
}
}
res.status(200).json(emails);
} catch (error) {
next(error);
}
};

export default getEmails
export default getEmails;
109 changes: 51 additions & 58 deletions packages/services/email/src/controllers/sendEmail.ts
Original file line number Diff line number Diff line change
@@ -1,64 +1,57 @@
import { Request, Response, NextFunction } from 'express';
import prisma from '@/utils/prisma';
import { emailCreateSchema } from '@/utils/schemas';
import { defaultSender, transporter } from '@/config';



import { Request, Response, NextFunction } from "express";
import prisma from "@/utils/prisma";
import { emailCreateSchema } from "@/utils/schemas";
import { defaultSender, transporter } from "@/config";

const sendEmail = async (req: Request, res: Response, next: NextFunction) => {
try {
// validate input the req body
const parsedBody = emailCreateSchema.safeParse(req.body)

if (!parsedBody.success) {
return res.status(400).json(parsedBody.error.errors)
}

// create a new email option
const { sender, recipient, subject, body, source } = parsedBody.data
const from = sender || defaultSender

const emailOptions = {
from,
to: recipient,
subject,
text: body,

}

// send email

const { rejected } = await transporter.sendMail(emailOptions)
if(rejected.length){
console.log("Email not sent", rejected)
return res.status(500).json({
message: "Email not sent",
rejected
})
}

await prisma.email.create({
data: {
sender,
recipient,
subject,
body,
source
}
})

// return success

return res.status(200).json({
message: "Email sent"

})
try {
// validate input the req body
const parsedBody = emailCreateSchema.safeParse(req.body);

if (!parsedBody.success) {
return res.status(400).json(parsedBody.error.errors);
}

} catch (error) {
next(error)
// create a new email option
const { sender, recipient, subject, body, source } = parsedBody.data;
const from = sender || defaultSender;

const emailOptions = {
from,
to: recipient,
subject,
text: body,
};

// send email

const { rejected } = await transporter.sendMail(emailOptions);
if (rejected.length) {
console.log("Email not sent", rejected);
return res.status(500).json({
message: "Email not sent",
rejected,
});
}
}

export default sendEmail
await prisma.email.create({
data: {
sender,
recipient,
subject,
body,
source,
},
});

// return success

return res.status(200).json({
message: "Email sent",
});
} catch (error) {
next(error);
}
};

export default sendEmail;
2 changes: 1 addition & 1 deletion packages/services/email/src/utils/receiver.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ const receiveFromQueue = async (
callback(message.content.toString());
}

channel.ack(message);
channel.ack(message as any);

connection.close();
});
Expand Down
52 changes: 40 additions & 12 deletions yarn.lock
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@

"@ioredis/commands@^1.1.1":
version "1.2.0"
resolved "https://registry.npmjs.org/@ioredis/commands/-/commands-1.2.0.tgz"
resolved "https://registry.yarnpkg.com/@ioredis/commands/-/commands-1.2.0.tgz#6d61b3097470af1fdbbe622795b8921d42018e11"
integrity sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg==

"@isaacs/cliui@^8.0.2":
Expand Down Expand Up @@ -622,6 +622,18 @@
"@tufjs/canonical-json" "2.0.0"
minimatch "^9.0.3"

"@types/amqplib@^0.10.5":
version "0.10.5"
resolved "https://registry.yarnpkg.com/@types/amqplib/-/amqplib-0.10.5.tgz#fd883eddfbd669702a727fa10007b27c4c1e6ec7"
integrity sha512-/cSykxROY7BWwDoi4Y4/jLAuZTshZxd8Ey1QYa/VaXriMotBDoou7V/twJiOSHzU6t1Kp1AHAUXGCgqq+6DNeg==
dependencies:
"@types/node" "*"

"@types/bcryptjs@^2.4.6":
version "2.4.6"
resolved "https://registry.yarnpkg.com/@types/bcryptjs/-/bcryptjs-2.4.6.tgz#2b92e3c2121c66eba3901e64faf8bb922ec291fa"
integrity sha512-9xlo6R2qDs5uixm0bcIqCeMCE6HiQsIyel9KQySStiyqNl2tnj2mP3DX1Nf56MD6KMenNNlBBsy3LJ7gUEQPXQ==

"@types/body-parser@*":
version "1.19.5"
resolved "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz"
Expand Down Expand Up @@ -696,6 +708,13 @@
dependencies:
undici-types "~5.26.4"

"@types/nodemailer@^6.4.14":
version "6.4.15"
resolved "https://registry.yarnpkg.com/@types/nodemailer/-/nodemailer-6.4.15.tgz#494be695e11c438f7f5df738fb4ab740312a6ed2"
integrity sha512-0EBJxawVNjPkng1zm2vopRctuWVCxk34JcIlRuXSf54habUWdz1FB7wHDqOqvDa8Mtpt0Q3LTXQkAs2LNyK5jQ==
dependencies:
"@types/node" "*"

"@types/normalize-package-data@^2.4.0":
version "2.4.4"
resolved "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz"
Expand Down Expand Up @@ -823,7 +842,7 @@ aggregate-error@^3.0.0:
clean-stack "^2.0.0"
indent-string "^4.0.0"

amqplib@^0.10.4:
amqplib@^0.10.3, amqplib@^0.10.4:
version "0.10.4"
resolved "https://registry.npmjs.org/amqplib/-/amqplib-0.10.4.tgz"
integrity sha512-DMZ4eCEjAVdX1II2TfIUpJhfKAuoCeDIo/YyETbfAqehHTXxxs7WOOd+N1Xxr4cKhx12y23zk8/os98FxlZHrw==
Expand Down Expand Up @@ -966,6 +985,15 @@ axios@^1.6.0, axios@^1.6.8:
form-data "^4.0.0"
proxy-from-env "^1.1.0"

axios@^1.6.7:
version "1.7.2"
resolved "https://registry.yarnpkg.com/axios/-/axios-1.7.2.tgz#b625db8a7051fbea61c35a3cbb3a1daa7b9c7621"
integrity sha512-2A8QhOMrbomlDuiLeK9XibIBzuHeRcqqNOHp0Cyp5EoJ1IFDh+XZH3A6BkXtv0K4gFGCI0Y4BM7B1wOEi0Rmgw==
dependencies:
follow-redirects "^1.15.6"
form-data "^4.0.0"
proxy-from-env "^1.1.0"

balanced-match@^1.0.0:
version "1.0.2"
resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz"
Expand Down Expand Up @@ -1274,7 +1302,7 @@ clone@^1.0.2:

cluster-key-slot@^1.1.0:
version "1.1.2"
resolved "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.2.tgz"
resolved "https://registry.yarnpkg.com/cluster-key-slot/-/cluster-key-slot-1.1.2.tgz#88ddaa46906e303b5de30d3153b7d9fe0a0c19ac"
integrity sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==

cmd-shim@6.0.1:
Expand Down Expand Up @@ -1571,7 +1599,7 @@ delegates@^1.0.0:

denque@^2.1.0:
version "2.1.0"
resolved "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz"
resolved "https://registry.yarnpkg.com/denque/-/denque-2.1.0.tgz#e93e1a6569fb5e66f16a3c2a2964617d349d6ab1"
integrity sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==

depd@2.0.0, depd@~2.0.0:
Expand Down Expand Up @@ -2453,7 +2481,7 @@ inquirer@^8.2.4:

ioredis@^5.4.1:
version "5.4.1"
resolved "https://registry.npmjs.org/ioredis/-/ioredis-5.4.1.tgz"
resolved "https://registry.yarnpkg.com/ioredis/-/ioredis-5.4.1.tgz#1c56b70b759f01465913887375ed809134296f40"
integrity sha512-2YZsvl7jopIa1gaePkeMtd9rAcSjOOjPtpcLlOeusyO+XH2SK5ZcT+UCrElPP+WVIInh2TzeI4XW9ENaSLVVHA==
dependencies:
"@ioredis/commands" "^1.1.1"
Expand Down Expand Up @@ -2910,7 +2938,7 @@ locate-path@^5.0.0:

lodash.defaults@^4.2.0:
version "4.2.0"
resolved "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz"
resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c"
integrity sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==

lodash.includes@^4.3.0:
Expand All @@ -2920,7 +2948,7 @@ lodash.includes@^4.3.0:

lodash.isarguments@^3.1.0:
version "3.1.0"
resolved "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz"
resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a"
integrity sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==

lodash.isboolean@^3.0.3:
Expand Down Expand Up @@ -3378,9 +3406,9 @@ node-machine-id@1.1.12:
resolved "https://registry.npmjs.org/node-machine-id/-/node-machine-id-1.1.12.tgz"
integrity sha512-QNABxbrPa3qEIfrE6GOJ7BYIuignnJw7iQ2YPbc3Nla1HzRJjXzZOiikfF8m7eAMfichLt3M4VgLOetqgDmgGQ==

nodemailer@^6.9.13:
nodemailer@^6.9.10:
version "6.9.13"
resolved "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.13.tgz"
resolved "https://registry.yarnpkg.com/nodemailer/-/nodemailer-6.9.13.tgz#5b292bf1e92645f4852ca872c56a6ba6c4a3d3d6"
integrity sha512-7o38Yogx6krdoBf3jCAqnIN4oSQFx+fMa0I7dK1D+me9kBxx12D+/33wSb+fhOCtIxvYJ+4x4IMEhmhCKfAiOA==

nopt@^7.0.0:
Expand Down Expand Up @@ -4200,12 +4228,12 @@ redent@^3.0.0:

redis-errors@^1.0.0, redis-errors@^1.2.0:
version "1.2.0"
resolved "https://registry.npmjs.org/redis-errors/-/redis-errors-1.2.0.tgz"
resolved "https://registry.yarnpkg.com/redis-errors/-/redis-errors-1.2.0.tgz#eb62d2adb15e4eaf4610c04afe1529384250abad"
integrity sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==

redis-parser@^3.0.0:
version "3.0.0"
resolved "https://registry.npmjs.org/redis-parser/-/redis-parser-3.0.0.tgz"
resolved "https://registry.yarnpkg.com/redis-parser/-/redis-parser-3.0.0.tgz#b66d828cdcafe6b4b8a428a7def4c6bcac31c8b4"
integrity sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==
dependencies:
redis-errors "^1.0.0"
Expand Down Expand Up @@ -4588,7 +4616,7 @@ ssri@^9.0.1:

standard-as-callback@^2.1.0:
version "2.1.0"
resolved "https://registry.npmjs.org/standard-as-callback/-/standard-as-callback-2.1.0.tgz"
resolved "https://registry.yarnpkg.com/standard-as-callback/-/standard-as-callback-2.1.0.tgz#8953fc05359868a77b5b9739a665c5977bb7df45"
integrity sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==

statuses@2.0.1:
Expand Down

0 comments on commit c3419f6

Please sign in to comment.