浏览代码

code readability
add formatter for consumers

mehmet.kirkoca 2 年之前
父节点
当前提交
3f0c7aba4a

+ 24 - 0
docker-compose.yml

@@ -32,6 +32,18 @@ services:
     build: ./services/gateway
     volumes:
       - ./services/gateway:/services/gateway
+      - ./services/utils:/services/gateway/utils
+    networks:
+      - socialMediaManagerNetwork
+    depends_on:
+      - messageBroker
+
+  formatter:
+    build: ./services/formatter
+    volumes:
+      - ./services/formatter:/services/formatter
+      - ./services/utils:/services/formatter/utils
+    restart: unless-stopped
     networks:
       - socialMediaManagerNetwork
     depends_on:
@@ -41,6 +53,18 @@ services:
     build: ./services/twitter
     volumes:
       - ./services/twitter:/services/twitter
+      - ./services/utils:/services/twitter/utils
+    restart: unless-stopped
+    networks:
+      - socialMediaManagerNetwork
+    depends_on:
+      - messageBroker
+      
+  linkedin:
+    build: ./services/linkedin
+    volumes:
+      - ./services/linkedin:/services/linkedin
+      - ./services/utils:/services/linkedin/utils
     restart: unless-stopped
     networks:
       - socialMediaManagerNetwork

+ 11 - 0
services/formatter/dockerfile

@@ -0,0 +1,11 @@
+FROM node:current-alpine3.17
+
+WORKDIR /services/formatter
+
+COPY package*.json ./
+
+RUN npm install
+
+COPY . .
+
+CMD [ "npm", "start" ]

+ 21 - 0
services/formatter/index.js

@@ -0,0 +1,21 @@
+const RabbitMQListener = require('./utils/RabbitMQListener');
+const rabbitmqListener = new RabbitMQListener();
+
+const RabbitMQProducer = require('./utils/RabbitMQProducer');
+let rabbitMQProducer = new RabbitMQProducer();
+
+async function formatForTwitter(message) {
+  await rabbitMQProducer.sendMessage('twitter', "message formatted for twitter: " + message);
+}
+
+async function formatForLinkedin(message) {
+  await rabbitMQProducer.sendMessage('linkedin', "message formatted for linkedin: " + message);
+}
+
+(async () => {
+  await rabbitmqListener.listenToQueue('formatter', (message) => {
+    console.log('Received message:', message);
+    formatForTwitter(message);
+    formatForLinkedin(message);
+  });
+})();

+ 16 - 0
services/formatter/package.json

@@ -0,0 +1,16 @@
+{
+    "name": "twitter-service",
+    "version": "1.0.0",
+    "description": "",
+    "main": "index.js",
+    "scripts": {
+        "start": "nodemon index.js"
+    },
+    "dependencies": {
+        "amqplib": "^0.10.3",
+        "nodemon": "^3.0.1"
+    },
+    "engines": {
+        "node": ">=12.0.0"
+    }
+}

+ 3 - 2
services/gateway/index.js

@@ -1,9 +1,10 @@
 const fastify = require('fastify')();
-const sendTestMessage = require('./utils');
+const RabbitMQProducer = require('./utils/RabbitMQProducer');
+let rabbitMQProducer = new RabbitMQProducer();
 
 fastify.post('/', async (request, reply) => {
   try {
-    sendTestMessage(request.body.message);
+    await rabbitMQProducer.sendMessage('formatter', request.body.message);
     reply.send({ status: 'Message Send' });
   } catch (error) {
     console.error('Error handling POST request:', error);

+ 0 - 21
services/gateway/utils.js

@@ -1,21 +0,0 @@
-const messageProducer = require('./messageProducer');
-let rabbitmq = new messageProducer('amqp://username:password@messageBroker');
-
-(async () => {
-  await rabbitmq.connect();
-})();
-
-
-async function sendMessage(queueName, message) {
-  try {
-    await rabbitmq.publishToQueue(queueName, message);
-  } catch (error) {
-    console.error('Error sending message:', error.message);
-  }
-}
-
-async function sendTestMessage(message) {
-    await sendMessage('myQueue', message);
-}
-
-module.exports = sendTestMessage;

+ 11 - 0
services/linkedin/dockerfile

@@ -0,0 +1,11 @@
+FROM node:current-alpine3.17
+
+WORKDIR /services/linkedin
+
+COPY package*.json ./
+
+RUN npm install
+
+COPY . .
+
+CMD [ "npm", "start" ]

+ 8 - 0
services/linkedin/index.js

@@ -0,0 +1,8 @@
+const RabbitMQListener = require('./utils/RabbitMQListener');
+const rabbitmqListener = new RabbitMQListener();
+
+(async () => {
+  await rabbitmqListener.listenToQueue('linkedin', (message) => {
+    console.log('Received message:', message);
+  });
+})();

+ 16 - 0
services/linkedin/package.json

@@ -0,0 +1,16 @@
+{
+    "name": "linkedin-service",
+    "version": "1.0.0",
+    "description": "",
+    "main": "index.js",
+    "scripts": {
+        "start": "nodemon index.js"
+    },
+    "dependencies": {
+        "amqplib": "^0.10.3",
+        "nodemon": "^3.0.1"
+    },
+    "engines": {
+        "node": ">=12.0.0"
+    }
+}

+ 2 - 23
services/twitter/index.js

@@ -1,29 +1,8 @@
-const RabbitMQWrapper = require('./messageConsumer');
-
-class RabbitMQListener {
-  constructor() {
-    this.rabbitmq = new RabbitMQWrapper();
-  }
-
-  async listenToQueue(queueName, callback) {
-    try {
-      await this.rabbitmq.consumeFromQueue(queueName, async (message) => {
-        console.log('Message came', {message})
-        // Process the message
-        await callback(message);
-      });
-    } catch (error) {
-      console.error('Error while listening:', error.message);
-    }
-  }
-}
-
-// Example usage
+const RabbitMQListener = require('./utils/RabbitMQListener');
 const rabbitmqListener = new RabbitMQListener();
 
 (async () => {
-  await rabbitmqListener.listenToQueue('myQueue', (message) => {
+  await rabbitmqListener.listenToQueue('twitter', (message) => {
     console.log('Received message:', message);
-    // Process the received message
   });
 })();

+ 20 - 0
services/utils/RabbitMQListener.js

@@ -0,0 +1,20 @@
+const RabbitMQWrapper = require('./RabbitMQWrapper');
+
+class RabbitMQListener {
+  constructor() {
+    this.rabbitmq = new RabbitMQWrapper();
+  }
+
+  async listenToQueue(queueName, callback) {
+    try {
+      await this.rabbitmq.consumeFromQueue(queueName, async (message) => {
+        // Process the message
+        await callback(message);
+      });
+    } catch (error) {
+      console.error('Error while listening:', error.message);
+    }
+  }
+}
+
+module.exports = RabbitMQListener;

+ 15 - 4
services/gateway/messageProducer.js → services/utils/RabbitMQProducer.js

@@ -1,10 +1,12 @@
 const amqp = require('amqplib');
 
-class RabbitMQWrapper {
-  constructor(connectionURL) {
-    this.connectionURL = connectionURL;
+class RabbitMQProducer {
+  
+  constructor() {
+    this.connectionURL = 'amqp://username:password@messageBroker';
     this.connection = null;
     this.channel = null;
+    this.connect();
   }
 
   async connect() {
@@ -26,6 +28,15 @@ class RabbitMQWrapper {
       console.error(`Error publishing to ${queueName}:`, error);
     }
   }
+  
+  async sendMessage(queueName, message) {
+    try {
+      await this.publishToQueue(queueName, message);
+    } catch (error) {
+      console.error('Error sending message:', error.message);
+    }
+  }
+
 }
 
-module.exports = RabbitMQWrapper;
+module.exports = RabbitMQProducer;

+ 0 - 0
services/twitter/messageConsumer.js → services/utils/RabbitMQWrapper.js


+ 0 - 1
ui/public/vite.svg

@@ -1 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--logos" width="31.88" height="32" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 257"><defs><linearGradient id="IconifyId1813088fe1fbc01fb466" x1="-.828%" x2="57.636%" y1="7.652%" y2="78.411%"><stop offset="0%" stop-color="#41D1FF"></stop><stop offset="100%" stop-color="#BD34FE"></stop></linearGradient><linearGradient id="IconifyId1813088fe1fbc01fb467" x1="43.376%" x2="50.316%" y1="2.242%" y2="89.03%"><stop offset="0%" stop-color="#FFEA83"></stop><stop offset="8.333%" stop-color="#FFDD35"></stop><stop offset="100%" stop-color="#FFA800"></stop></linearGradient></defs><path fill="url(#IconifyId1813088fe1fbc01fb466)" d="M255.153 37.938L134.897 252.976c-2.483 4.44-8.862 4.466-11.382.048L.875 37.958c-2.746-4.814 1.371-10.646 6.827-9.67l120.385 21.517a6.537 6.537 0 0 0 2.322-.004l117.867-21.483c5.438-.991 9.574 4.796 6.877 9.62Z"></path><path fill="url(#IconifyId1813088fe1fbc01fb467)" d="M185.432.063L96.44 17.501a3.268 3.268 0 0 0-2.634 3.014l-5.474 92.456a3.268 3.268 0 0 0 3.997 3.378l24.777-5.718c2.318-.535 4.413 1.507 3.936 3.838l-7.361 36.047c-.495 2.426 1.782 4.5 4.151 3.78l15.304-4.649c2.372-.72 4.652 1.36 4.15 3.788l-11.698 56.621c-.732 3.542 3.979 5.473 5.943 2.437l1.313-2.028l72.516-144.72c1.215-2.423-.88-5.186-3.54-4.672l-25.505 4.922c-2.396.462-4.435-1.77-3.759-4.114l16.646-57.705c.677-2.35-1.37-4.583-3.769-4.113Z"></path></svg>

+ 0 - 1
ui/src/assets/vue.svg

@@ -1 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--logos" width="37.07" height="36" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 198"><path fill="#41B883" d="M204.8 0H256L128 220.8L0 0h97.92L128 51.2L157.44 0h47.36Z"></path><path fill="#41B883" d="m0 0l128 220.8L256 0h-51.2L128 132.48L50.56 0H0Z"></path><path fill="#35495E" d="M50.56 0L128 133.12L204.8 0h-47.36L128 51.2L97.92 0H50.56Z"></path></svg>