cleaning + fixig issue with env vars

This commit is contained in:
Kfir Dayan 2023-07-09 12:30:38 +03:00
parent 31c60d2d97
commit e8265f5fe3
9 changed files with 41 additions and 41 deletions

View file

@ -12,24 +12,6 @@ This README.md file provides instructions for setting up and running various com
docker-compose up -d docker-compose up -d
``` ```
## SQS/Terraform
Before proceeding, ensure that you have Terraform installed and have configured AWS CLI with the keys of an authorized user.
1. Navigate to the /infra/terraform directory.
2. Run the following command to initialize Terraform:
```terraform
terraform init
```
3. Run the following command to apply the Terraform configuration:
```terraform
terraform apply
```
## NotificationService ## NotificationService
Before running the NotificationService, ensure that you have Node.js, TypeScript (tsc), and npm installed. Before running the NotificationService, ensure that you have Node.js, TypeScript (tsc), and npm installed.

View file

@ -9,11 +9,15 @@ services:
- mongodb_vol:/data/db - mongodb_vol:/data/db
- ./mongo-init-scripts/init.js:/docker-entrypoint-initdb.d/mongo-init.js - ./mongo-init-scripts/init.js:/docker-entrypoint-initdb.d/mongo-init.js
platform: linux/arm64/v8 platform: linux/arm64/v8
environment:
- MONGO_INITDB_DATABASE=${MONGO_INITDB_DATABASE}
- MONGO_INITDB_ROOT_USERNAME=${MONGO_INITDB_ROOT_USERNAME}
- MONGO_INITDB_ROOT_PASSWORD=${MONGO_INITDB_ROOT_PASSWORD}
expose: expose:
- 27017 - 27017
rabbitmq: rabbitmq:
image: kfda89/todorabbit:latest image: todorabbit:latest
restart: always restart: always
ports: ports:
- 5672:5672 - 5672:5672
@ -21,6 +25,9 @@ services:
volumes: volumes:
- rabbitmq_volume:/var/lib/rabbitmq - rabbitmq_volume:/var/lib/rabbitmq
- ./rabbitmq-init-scripts/init.sh:/docker-entrypoint-initdb.d/init.sh - ./rabbitmq-init-scripts/init.sh:/docker-entrypoint-initdb.d/init.sh
environment:
- RABBITMQ_DEFAULT_USER=${RABBITMQ_DEFAULT_USER}
- RABBITMQ_DEFAULT_PASS=${RABBITMQ_DEFAULT_PASS}
expose: expose:
- 5672 - 5672
- 15672 - 15672

View file

@ -1,12 +0,0 @@
provider "aws" {
region = "eu-west-1"
}
resource "aws_sqs_queue" "queue" {
name = "todo_queue"
delay_seconds = 0
max_message_size = 262144
message_retention_seconds = 345600
visibility_timeout_seconds = 30
receive_wait_time_seconds = 0
}

View file

@ -13,7 +13,7 @@ Content-Type: application/json
} }
### update request ### update request
PUT http://localhost:3000/todo/64a9e3987a2dba152b1e44b0 PUT http://localhost:3000/todo/64aa7b55f73a81f5e374663b
Content-Type: application/json Content-Type: application/json
{ {

View file

@ -4,7 +4,7 @@
"description": "", "description": "",
"main": "main.js", "main": "main.js",
"scripts": { "scripts": {
"dev": "node dist/main.js" "dev": "nodemon dist/main.js"
}, },
"keywords": [], "keywords": [],
"author": "", "author": "",

View file

@ -2,6 +2,9 @@ import { Request, Response, NextFunction } from "express";
import { ApiError } from "../utils/ApiError"; import { ApiError } from "../utils/ApiError";
import { DateTime } from "luxon"; import { DateTime } from "luxon";
import mongoose from "mongoose"; import mongoose from "mongoose";
import { DateService } from "../services/DateService";
const currentDate = DateService.getInstance().getCurrentDate();
const createTodoMiddleWare = async ( const createTodoMiddleWare = async (
req: Request, req: Request,
@ -27,7 +30,7 @@ const createTodoMiddleWare = async (
); );
return next(error); return next(error);
} }
if (new Date(due_date) < new Date()) { if (new Date(due_date) < currentDate) {
const error = new ApiError( const error = new ApiError(
`due_date must be greater than current date`, `due_date must be greater than current date`,
400, 400,
@ -48,7 +51,6 @@ const paramIdMiddleware = async (
res: Response, res: Response,
next: NextFunction next: NextFunction
) => { ) => {
// check if it's a valid mongo id
const { id } = req.params; const { id } = req.params;
if (!mongoose.Types.ObjectId.isValid(id)) { if (!mongoose.Types.ObjectId.isValid(id)) {
const error = new ApiError( const error = new ApiError(

View file

@ -1,6 +1,7 @@
import amqp, { Options } from "amqplib"; import amqp, { Options } from "amqplib";
import { ITodo } from "../schemas/todoSchema"; import { ITodo } from "../schemas/todoSchema";
import { EnvService } from "../services/EnvService"; import { EnvService } from "../services/EnvService";
import { DateService } from "../services/DateService";
export class RabbitMQ { export class RabbitMQ {
connection: amqp.Connection; connection: amqp.Connection;
@ -8,8 +9,10 @@ export class RabbitMQ {
queue: string; queue: string;
exchange: string; exchange: string;
envService: EnvService; envService: EnvService;
currentDate: DateService;
constructor() { constructor() {
this.currentDate = DateService.getInstance();
this.envService = EnvService.getInstance(); this.envService = EnvService.getInstance();
this.queue = this.envService.getEnvVariable("RABBITMQ_QUEUE_NAME"); this.queue = this.envService.getEnvVariable("RABBITMQ_QUEUE_NAME");
this.exchange = "delayed_exchange"; this.exchange = "delayed_exchange";
@ -44,15 +47,12 @@ export class RabbitMQ {
await this.channel.bindQueue(this.queue, this.exchange, this.queue); await this.channel.bindQueue(this.queue, this.exchange, this.queue);
} catch (error) { } catch (error) {
console.error("Error connecting to RabbitMQ:", error);
throw error; throw error;
} }
} }
async create(payload: ITodo) { async create(payload: ITodo) {
const delayTimeForQueue = this.calculateDelayTimeForQueue(payload); const delayTimeForQueue = this.calculateDelayTimeForQueue(payload);
console.log("The Queue will be delayed for: ", delayTimeForQueue, " ms");
const message = JSON.stringify({ payload }); const message = JSON.stringify({ payload });
const options: Options.Publish = { const options: Options.Publish = {
headers: { "x-delay": delayTimeForQueue }, headers: { "x-delay": delayTimeForQueue },
@ -64,15 +64,13 @@ export class RabbitMQ {
Buffer.from(message), Buffer.from(message),
options options
); );
console.log(`Queue name is: ${this.queue}`);
} catch (error) { } catch (error) {
console.error("Error sending message to RabbitMQ:", error);
throw error; throw error;
} }
} }
calculateDelayTimeForQueue(payload: ITodo) { calculateDelayTimeForQueue(payload: ITodo) {
const delayTime = payload.due_date.getTime() - Date.now(); const delayTime = payload.due_date.getTime() - this.currentDate.getCurrentDate().getTime();
return delayTime; return delayTime;
} }
} }

View file

@ -4,12 +4,15 @@ import {
createTodoMiddleWare, createTodoMiddleWare,
paramIdMiddleware, paramIdMiddleware,
} from "../middleware/createTodoMiddleWare"; } from "../middleware/createTodoMiddleWare";
import { DateService } from "../services/DateService";
class TodoRouter { class TodoRouter {
router: Router; router: Router;
todoController: TodoController; todoController: TodoController;
currentDate: DateService;
constructor() { constructor() {
this.currentDate = DateService.getInstance();
this.router = Router(); this.router = Router();
this.todoController = new TodoController(); this.todoController = new TodoController();
this.setRoutes(); this.setRoutes();

View file

@ -0,0 +1,20 @@
import moment from "moment-timezone";
export class DateService {
private static instance: DateService;
private constructor() {}
public static getInstance(): DateService {
if (!DateService.instance) {
DateService.instance = new DateService();
}
return DateService.instance;
}
public getCurrentDate(): Date {
const israelTime = moment().tz("Asia/Jerusalem");
const currentDate = israelTime.toDate();
return currentDate;
}
}