Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

enhancing the emails for field activities (deploy and recall) with more specific content #3554

Merged
merged 3 commits into from
Oct 4, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 30 additions & 3 deletions k8s/kafka/topics/kafka-topics.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ spec:
partitions: 2
replicas: 2
config:
retention.ms: 86400000
retention.ms: 86400000

---
apiVersion: kafka.strimzi.io/v1beta2
Expand All @@ -79,7 +79,7 @@ spec:
partitions: 2
replicas: 2
config:
retention.ms: 86400000
retention.ms: 86400000

---
apiVersion: kafka.strimzi.io/v1beta2
Expand Down Expand Up @@ -262,4 +262,31 @@ spec:
replicas: 2
config:
retention.ms: 18000000


Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

introducing new Kafka topics for sending emails based on field activities

---
apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaTopic
metadata:
name: recall-topic
namespace: message-broker
labels:
strimzi.io/cluster: kafka-cluster
spec:
partitions: 2
replicas: 2
config:
retention.ms: 18000000

---
apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaTopic
metadata:
name: deploy-topic
namespace: message-broker
labels:
strimzi.io/cluster: kafka-cluster
spec:
partitions: 2
replicas: 2
config:
retention.ms: 18000000
123 changes: 123 additions & 0 deletions src/auth-service/.env.example
Original file line number Diff line number Diff line change
@@ -0,0 +1,123 @@
AIRQO_WEBSITE=https://airqo.net/
AIRQO_YOUTUBE=
DB_NAME_STAGING=
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Introduced the template .env file for open source contributions and new codebase setup

FIREBASE_DATABASE_URL=
GOOGLE_APPLICATION_CREDENTIALS=
INSTANCE_ID=
JWT_SECRET=
KICKBOX_API_KEY=
LOCAL_DB=
MAILCHIMP_API_KEY=
MAILCHIMP_LIST_ID=
MAILCHIMP_MOBILE_API_KEY=
MAILCHIMP_SERVER_PREFIX=
MAIL_PASS=
MAIL_USER=
MONGO_DEV=
MONGO_GCE_HOST=
MONGO_GCE_PASSWORD=
MONGO_GCE_PORT=
MONGO_GCE_URI=
MONGO_GCE_USERNAME=
MONGO_STAGE=
NODE_PATH=
REQUEST_ACCESS_EMAILS=
HARDWARE_AND_DS_EMAILS=
PLATFORM_AND_DS_EMAILS=
PLATFORM_EMAILS=
COMMS_EMAILS=
POLICY_EMAILS=
CHAMPIONS_EMAILS=
ASSISTANCE_EMAILS=
RESEARCHERS_EMAILS=
DEVELOPERS_EMAILS=
PARTNERS_EMAILS=
PASSWORD_REGEX=
PLATFORM_DEV_BASE_URL=
PLATFORM_STAGING_BASE_URL=
SESSION_SECRET=
MONGO_STAGE_URI=
SUPPORT_EMAIL=
MONGO_PROD_URI=
MONGO_DEV_URI=
FIREBASE_COLLECTION_USERS=
FIREBASE_COLLECTION_KYA=
FIREBASE_COLLECTION_ANALYTICS=
FIREBASE_COLLECTION_NOTIFICATIONS=
FIREBASE_COLLECTION_FAVORITE_PLACES=
PRODUCTS_DEV_EMAIL=
DEFAULT_LIMIT=
SLACK_TOKEN=
SLACK_CHANNEL=
SLACK_USERNAME=
PROD_DEFAULT_NETWORK=
STAGE_DEFAULT_NETWORK=
DEV_DEFAULT_NETWORK=
PROD_DEFAULT_NETWORK_ROLE=
STAGE_DEFAULT_NETWORK_ROLE=
DEV_DEFAULT_NETWORK_ROLE=
MOBILE_APP_USERS_TOPIC=
DEPLOY_TOPIC=
RECALL_TOPIC=
DEFAULT_TENANT=
UNIQUE_CONSUMER_GROUP=
UNIQUE_PRODUCER_GROUP=
NEW_MOBILE_APP_USER_TOPIC=
KAFKA_BOOTSTRAP_SERVERS_DEV=
KAFKA_CLIENT_ID_DEV=
KAFKA_CLIENT_GROUP_DEV=
KAFKA_BOOTSTRAP_SERVERS_STAGE=
KAFKA_CLIENT_ID_STAGE=
KAFKA_CLIENT_GROUP_STAGE=
KAFKA_BOOTSTRAP_SERVERS_PROD=
KAFKA_CLIENT_ID_PROD=
KAFKA_CLIENT_GROUP_PROD=
GOOGLE_CLIENT_ID=
GOOGLE_CLIENT_SECRET=
SUPER_ADMIN_PERMISSIONS=
TENANTS=
NETWORKS=
GMAIL_VERIFICATION_FAILURE_REDIRECT=
GMAIL_VERIFICATION_SUCCESS_REDIRECT=
FIREBASE_API_KEY=
FIREBASE_AUTH_DOMAIN=
FIREBASE_PROJECT_ID=
FIREBASE_TYPE=
FIREBASE_PRIVATE_KEY_ID=
FIREBASE_PRIVATE_KEY=
FIREBASE_CLIENT_EMAIL=
FIREBASE_CLIENT_ID=
FIREBASE_AUTH_URI=
FIREBASE_TOKEN_URI=
FIREBASE_AUTH_PROVIDER_X509_CERT_URL=
FIREBASE_CLIENT_X509_CERT_URL=
FIREBASE_UNIVERSE_DOMAIN=
FIREBASE_AUTHORIZATION_URL=
AIRQO_ANALYTICS_GMAIL=
AIRQO_ANALYTICS_GMAIL_PASS=
MOBILE_APP_PACKAGE_NAME=
MOBILE_APP_DYNAMIC_LINK_DOMAIN=
DEV_REDIS_SERVER=
DEV_REDIS_PORT=
PROD_REDIS_SERVER=
PROD_REDIS_PORT=
STAGE_REDIS_SERVER=
STAGE_REDIS_PORT=
STAGE_DEFAULT_GROUP=
DEV_DEFAULT_GROUP=
PROD_DEFAULT_GROUP=
ANALYTICS_PRODUCTION_BASE_URL=
ANALYTICS_STAGING_BASE_URL=
ANALYTICS_DEV_BASE_URL=
STAGE_DEFAULT_GROUP_ROLE=
PROD_DEFAULT_GROUP_ROLE=
DEV_DEFAULT_GROUP_ROLE=
STAGE_DEFAULT_AIRQLOUD=
PROD_DEFAULT_AIRQLOUD=
DEV_DEFAULT_AIRQLOUD=
STAGE_DEFAULT_GRID=
PROD_DEFAULT_GRID=
DEV_DEFAULT_GRID=
STAGE_DEFAULT_COHORT=
PROD_DEFAULT_COHORT=
DEV_DEFAULT_COHORT=
146 changes: 144 additions & 2 deletions src/auth-service/bin/jobs/kafka-consumer.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,14 +11,56 @@
const { jsonrepair } = require("jsonrepair");
const BlacklistedIPRangeModel = require("@models/BlacklistedIPRange");
const BlacklistedIPModel = require("@models/BlacklistedIP");
const UserModel = require("@models/User");
const stringify = require("@utils/stringify");
const rangeCheck = require("ip-range-check");
const asyncRetry = require("async-retry");
const mongoose = require("mongoose");
const isEmpty = require("is-empty");
const ObjectId = mongoose.Types.ObjectId;

const userSchema = Joi.object({
email: Joi.string().email().empty("").required(),
}).unknown(true);

const extractDeviceDetails = (updatedDevice) => {
const {
_id,
status,
category,
isActive,
long_name,
device_number,
name,
deployment_date,
latitude,
longitude,
mountType,
powerType,
} = updatedDevice;

Check warning on line 40 in src/auth-service/bin/jobs/kafka-consumer.js

View check run for this annotation

Codecov / codecov/patch

src/auth-service/bin/jobs/kafka-consumer.js#L40

Added line #L40 was not covered by tests

return {

Check warning on line 42 in src/auth-service/bin/jobs/kafka-consumer.js

View check run for this annotation

Codecov / codecov/patch

src/auth-service/bin/jobs/kafka-consumer.js#L42

Added line #L42 was not covered by tests
status,
category,
_id,
isActive,
long_name,
device_number,
name,
deployment_date,
latitude,
longitude,
mountType,
powerType,
};
};

const extractActivityDetails = (createdActivity) => {
return {

Check warning on line 59 in src/auth-service/bin/jobs/kafka-consumer.js

View check run for this annotation

Codecov / codecov/patch

src/auth-service/bin/jobs/kafka-consumer.js#L59

Added line #L59 was not covered by tests
...createdActivity, // Spread operator to include all properties directly
};
};
Comment on lines +26 to +62
Copy link
Contributor

@coderabbitai coderabbitai bot Oct 4, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Unit tests are missing for new utility functions

The utility functions extractDeviceDetails and extractActivityDetails are new additions but are not covered by unit tests.

Writing unit tests for these functions will improve code reliability and prevent future regressions. Would you like assistance in creating these tests or opening a GitHub issue to track this task?

🧰 Tools
🪛 GitHub Check: codecov/patch

[warning] 40-40: src/auth-service/bin/jobs/kafka-consumer.js#L40
Added line #L40 was not covered by tests


[warning] 42-42: src/auth-service/bin/jobs/kafka-consumer.js#L42
Added line #L42 was not covered by tests


[warning] 59-59: src/auth-service/bin/jobs/kafka-consumer.js#L59
Added line #L59 was not covered by tests

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

create a Github issue for this, please.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@Baalmart, I've created a GitHub issue to track adding unit tests for extractDeviceDetails and extractActivityDetails. You can find it here: #3556

🔗 Analysis chain
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Create a GitHub issue to track adding unit tests for the utility functions.
gh issue create \
  --title "Add unit tests for `extractDeviceDetails` and `extractActivityDetails`" \
  --body "The utility functions \`extractDeviceDetails\` and \`extractActivityDetails\` added in PR [#3554](https://github.com/airqo-platform/AirQo-api/pull/3554) lack unit tests. Writing unit tests for these functions will improve code reliability and prevent future regressions.

See the discussion at [this comment](https://github.com/airqo-platform/AirQo-api/pull/3554#discussion_r1787818825).

Requested by @Baalmart." \
  --assignee Baalmart

Length of output: 774


const operationForNewMobileAppUser = async (messageData) => {
try {
logger.info(
Expand Down Expand Up @@ -177,7 +219,106 @@
}
};

const operationFunction2 = async (messageData) => {};
const emailsForDeployedDevices = async (messageData) => {
let parsedData;
try {
parsedData = JSON.parse(messageData);

Check warning on line 225 in src/auth-service/bin/jobs/kafka-consumer.js

View check run for this annotation

Codecov / codecov/patch

src/auth-service/bin/jobs/kafka-consumer.js#L224-L225

Added lines #L224 - L225 were not covered by tests
} catch (error) {
logger.error("Invalid JSON format in messageData.");
return;

Check warning on line 228 in src/auth-service/bin/jobs/kafka-consumer.js

View check run for this annotation

Codecov / codecov/patch

src/auth-service/bin/jobs/kafka-consumer.js#L227-L228

Added lines #L227 - L228 were not covered by tests
}
const { createdActivity, updatedDevice, user_id } = parsedData;

Check warning on line 230 in src/auth-service/bin/jobs/kafka-consumer.js

View check run for this annotation

Codecov / codecov/patch

src/auth-service/bin/jobs/kafka-consumer.js#L230

Added line #L230 was not covered by tests

// Validate input data
if (!createdActivity || !updatedDevice || !user_id) {
logger.error("Invalid input data: Missing required fields.");
return;

Check warning on line 235 in src/auth-service/bin/jobs/kafka-consumer.js

View check run for this annotation

Codecov / codecov/patch

src/auth-service/bin/jobs/kafka-consumer.js#L234-L235

Added lines #L234 - L235 were not covered by tests
}

if (!ObjectId.isValid(user_id)) {
logger.error(`Invalid user_id format: ${user_id}`);
return;

Check warning on line 240 in src/auth-service/bin/jobs/kafka-consumer.js

View check run for this annotation

Codecov / codecov/patch

src/auth-service/bin/jobs/kafka-consumer.js#L239-L240

Added lines #L239 - L240 were not covered by tests
}

try {
const user = await UserModel("airqo")

Check warning on line 244 in src/auth-service/bin/jobs/kafka-consumer.js

View check run for this annotation

Codecov / codecov/patch

src/auth-service/bin/jobs/kafka-consumer.js#L243-L244

Added lines #L243 - L244 were not covered by tests
.findOne({ _id: ObjectId(user_id) }, "email _id firstName lastName")
.lean();

// Check if user exists
if (!user) {
logger.error(`User not found for user_id: ${user_id}`);
return;

Check warning on line 251 in src/auth-service/bin/jobs/kafka-consumer.js

View check run for this annotation

Codecov / codecov/patch

src/auth-service/bin/jobs/kafka-consumer.js#L250-L251

Added lines #L250 - L251 were not covered by tests
}

const emailResponse = await mailer.fieldActivity({

Check warning on line 254 in src/auth-service/bin/jobs/kafka-consumer.js

View check run for this annotation

Codecov / codecov/patch

src/auth-service/bin/jobs/kafka-consumer.js#L254

Added line #L254 was not covered by tests
email: user.email,
firstName: user.firstName,
lastName: user.lastName,
deviceDetails: extractDeviceDetails(updatedDevice),
activityDetails: extractActivityDetails(createdActivity),
activityType: "deploy",
});

// Handle email response
if (emailResponse && emailResponse.success === false) {
logger.error(`🐛 Internal Server Error -- ${stringify(emailResponse)}`);

Check warning on line 265 in src/auth-service/bin/jobs/kafka-consumer.js

View check run for this annotation

Codecov / codecov/patch

src/auth-service/bin/jobs/kafka-consumer.js#L265

Added line #L265 was not covered by tests
}
} catch (error) {
logger.error(`🐛 Internal Server Error -- ${error.message}`);

Check warning on line 268 in src/auth-service/bin/jobs/kafka-consumer.js

View check run for this annotation

Codecov / codecov/patch

src/auth-service/bin/jobs/kafka-consumer.js#L268

Added line #L268 was not covered by tests
}
};

const emailsForRecalledDevices = async (messageData) => {
// Parse the message and validate input data
let parsedData;
try {
parsedData = JSON.parse(messageData);

Check warning on line 276 in src/auth-service/bin/jobs/kafka-consumer.js

View check run for this annotation

Codecov / codecov/patch

src/auth-service/bin/jobs/kafka-consumer.js#L275-L276

Added lines #L275 - L276 were not covered by tests
} catch (error) {
logger.error("Invalid JSON format in messageData.");
return;

Check warning on line 279 in src/auth-service/bin/jobs/kafka-consumer.js

View check run for this annotation

Codecov / codecov/patch

src/auth-service/bin/jobs/kafka-consumer.js#L278-L279

Added lines #L278 - L279 were not covered by tests
}

const { createdActivity, updatedDevice, user_id } = parsedData;

Check warning on line 282 in src/auth-service/bin/jobs/kafka-consumer.js

View check run for this annotation

Codecov / codecov/patch

src/auth-service/bin/jobs/kafka-consumer.js#L282

Added line #L282 was not covered by tests

if (!createdActivity || !updatedDevice || !user_id) {
logger.error("Invalid input data: Missing required fields.");
return;

Check warning on line 286 in src/auth-service/bin/jobs/kafka-consumer.js

View check run for this annotation

Codecov / codecov/patch

src/auth-service/bin/jobs/kafka-consumer.js#L285-L286

Added lines #L285 - L286 were not covered by tests
}
Comment on lines +282 to +287
Copy link
Contributor

@coderabbitai coderabbitai bot Oct 4, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Validate user_id before converting to ObjectId

Similar to emailsForDeployedDevices, ensure that user_id is a valid ObjectId to prevent potential errors.

Add a validation step:

  if (!createdActivity || !updatedDevice || !user_id) {
    logger.error("Invalid input data: Missing required fields.");
    return;
  }
+ if (!ObjectId.isValid(user_id)) {
+   logger.error(`Invalid user_id format: ${user_id}`);
+   return;
+ }
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
const { createdActivity, updatedDevice, user_id } = parsedData;
if (!createdActivity || !updatedDevice || !user_id) {
logger.error("Invalid input data: Missing required fields.");
return;
}
const { createdActivity, updatedDevice, user_id } = parsedData;
if (!createdActivity || !updatedDevice || !user_id) {
logger.error("Invalid input data: Missing required fields.");
return;
}
if (!ObjectId.isValid(user_id)) {
logger.error(`Invalid user_id format: ${user_id}`);
return;
}
🧰 Tools
🪛 GitHub Check: codecov/patch

[warning] 270-270: src/auth-service/bin/jobs/kafka-consumer.js#L270
Added line #L270 was not covered by tests


[warning] 273-274: src/auth-service/bin/jobs/kafka-consumer.js#L273-L274
Added lines #L273 - L274 were not covered by tests

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

All cool, this is taken care of by the producing functionality, so the consumer does not have to worry about this input validation

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@Baalmart, understood. Thank you for the clarification that input validation for user_id is handled by the producing functionality, so the consumer does not need to perform this validation.

(_/)
(•ᗜ•)?
/    づ


✏️ Learnings added
Learnt from: Baalmart
PR: airqo-platform/AirQo-api#3554
File: src/auth-service/bin/jobs/kafka-consumer.js:270-275
Timestamp: 2024-10-04T14:41:56.941Z
Learning: In `src/auth-service/bin/jobs/kafka-consumer.js`, the `emailsForRecalledDevices` function relies on the producing functionality to validate `user_id`, so additional validation in the consumer is not necessary.

Note: Learnings are effective only in the context of similar code segments. To apply general coding guidelines, please configure review instructions. You can manage existing learnings in the app.


if (!ObjectId.isValid(user_id)) {
logger.error(`Invalid user_id format: ${user_id}`);
return;

Check warning on line 291 in src/auth-service/bin/jobs/kafka-consumer.js

View check run for this annotation

Codecov / codecov/patch

src/auth-service/bin/jobs/kafka-consumer.js#L290-L291

Added lines #L290 - L291 were not covered by tests
}

try {
const user = await UserModel("airqo")

Check warning on line 295 in src/auth-service/bin/jobs/kafka-consumer.js

View check run for this annotation

Codecov / codecov/patch

src/auth-service/bin/jobs/kafka-consumer.js#L294-L295

Added lines #L294 - L295 were not covered by tests
.findOne({ _id: ObjectId(user_id) }, "email _id firstName lastName")
.lean();

// Check if user exists
if (!user) {
logger.error(`User not found for user_id: ${user_id}`);
return;

Check warning on line 302 in src/auth-service/bin/jobs/kafka-consumer.js

View check run for this annotation

Codecov / codecov/patch

src/auth-service/bin/jobs/kafka-consumer.js#L301-L302

Added lines #L301 - L302 were not covered by tests
}

const emailResponse = await mailer.fieldActivity({

Check warning on line 305 in src/auth-service/bin/jobs/kafka-consumer.js

View check run for this annotation

Codecov / codecov/patch

src/auth-service/bin/jobs/kafka-consumer.js#L305

Added line #L305 was not covered by tests
email: user.email,
firstName: user.firstName,
lastName: user.lastName,
deviceDetails: extractDeviceDetails(updatedDevice),
activityDetails: extractActivityDetails(createdActivity),
activityType: "recall",
});

// Handle email response
if (emailResponse && emailResponse.success === false) {
logger.error(`🐛 Internal Server Error -- ${stringify(emailResponse)}`);

Check warning on line 316 in src/auth-service/bin/jobs/kafka-consumer.js

View check run for this annotation

Codecov / codecov/patch

src/auth-service/bin/jobs/kafka-consumer.js#L316

Added line #L316 was not covered by tests
}
} catch (error) {
logger.error(`🐛 Internal Server Error -- ${error.message}`);

Check warning on line 319 in src/auth-service/bin/jobs/kafka-consumer.js

View check run for this annotation

Codecov / codecov/patch

src/auth-service/bin/jobs/kafka-consumer.js#L319

Added line #L319 was not covered by tests
}
};

const kafkaConsumer = async () => {
try {
Expand All @@ -196,7 +337,8 @@
const topicOperations = {
// ["new-mobile-app-user-topic"]: operationForNewMobileAppUser,
["ip-address"]: operationForBlacklistedIPs,
// topic2: operationFunction2,
["deploy-topic"]: emailsForDeployedDevices,
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Added functions to send emails when device is deployed or recalled

["recall-topic"]: emailsForRecalledDevices,
};
await consumer.connect();
// Subscribe to all topics in the mapping
Expand Down
2 changes: 2 additions & 0 deletions src/auth-service/config/global/envs.js
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,8 @@ const envs = {
GOOGLE_CLIENT_ID: process.env.GOOGLE_CLIENT_ID,
GOOGLE_CLIENT_SECRET: process.env.GOOGLE_CLIENT_SECRET,
MOBILE_APP_USERS_TOPIC: process.env.MOBILE_APP_USERS_TOPIC,
DEPLOY_TOPIC: process.env.DEPLOY_TOPIC,
RECALL_TOPIC: process.env.RECALL_TOPIC,
Comment on lines +32 to +33
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codebase verification

DEPLOY_TOPIC and RECALL_TOPIC are declared but not used elsewhere.

It appears that the newly added environment variables DEPLOY_TOPIC and RECALL_TOPIC are declared in envs.js but are not referenced in the codebase. Please verify whether these variables are intended for future use or perform an oversight. If they are necessary, ensure they are properly integrated into the relevant parts of the system. Otherwise, consider removing them to maintain code cleanliness.

🔗 Analysis chain

New Kafka topics added for deployment and recallment processes.

The addition of DEPLOY_TOPIC and RECALL_TOPIC environment variables aligns well with the PR objectives. These new Kafka topics will facilitate the deployment and recallment processes, potentially enhancing the system's ability to manage field activities.

A few points to consider:

  1. The naming convention is consistent with existing variables, which is excellent.
  2. Ensure that these environment variables are properly set in all relevant environments (development, staging, production).
  3. Update any deployment scripts or documentation to include these new variables.

To ensure these new topics are being utilized correctly, let's verify their usage in the codebase:

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify the usage of new Kafka topics in the codebase

# Search for DEPLOY_TOPIC usage
echo "Searching for DEPLOY_TOPIC usage:"
rg --type js "DEPLOY_TOPIC" -C 3

echo "\nSearching for RECALL_TOPIC usage:"
rg --type js "RECALL_TOPIC" -C 3

Length of output: 1535

UNIQUE_CONSUMER_GROUP: process.env.UNIQUE_CONSUMER_GROUP,
UNIQUE_PRODUCER_GROUP: process.env.UNIQUE_PRODUCER_GROUP,
NEW_MOBILE_APP_USER_TOPIC: process.env.NEW_MOBILE_APP_USER_TOPIC,
Expand Down
Loading
Loading