feature/IO-3556-Chattr-Integration
This commit is contained in:
@@ -13,4 +13,5 @@
|
|||||||
.env.development.local
|
.env.development.local
|
||||||
.env.test.local
|
.env.test.local
|
||||||
.env.production.local
|
.env.production.local
|
||||||
bodyshop_translations.babel
|
.env.localstack.docker
|
||||||
|
bodyshop_translations.babel
|
||||||
|
|||||||
@@ -38,8 +38,6 @@ services:
|
|||||||
condition: service_healthy
|
condition: service_healthy
|
||||||
localstack:
|
localstack:
|
||||||
condition: service_healthy
|
condition: service_healthy
|
||||||
aws-cli:
|
|
||||||
condition: service_completed_successfully
|
|
||||||
ports:
|
ports:
|
||||||
- "4001:4000" # Different external port for local access
|
- "4001:4000" # Different external port for local access
|
||||||
volumes:
|
volumes:
|
||||||
@@ -65,8 +63,6 @@ services:
|
|||||||
condition: service_healthy
|
condition: service_healthy
|
||||||
localstack:
|
localstack:
|
||||||
condition: service_healthy
|
condition: service_healthy
|
||||||
aws-cli:
|
|
||||||
condition: service_completed_successfully
|
|
||||||
ports:
|
ports:
|
||||||
- "4002:4000" # Different external port for local access
|
- "4002:4000" # Different external port for local access
|
||||||
volumes:
|
volumes:
|
||||||
@@ -92,8 +88,6 @@ services:
|
|||||||
condition: service_healthy
|
condition: service_healthy
|
||||||
localstack:
|
localstack:
|
||||||
condition: service_healthy
|
condition: service_healthy
|
||||||
aws-cli:
|
|
||||||
condition: service_completed_successfully
|
|
||||||
ports:
|
ports:
|
||||||
- "4003:4000" # Different external port for local access
|
- "4003:4000" # Different external port for local access
|
||||||
volumes:
|
volumes:
|
||||||
@@ -156,23 +150,18 @@ services:
|
|||||||
|
|
||||||
# LocalStack
|
# LocalStack
|
||||||
localstack:
|
localstack:
|
||||||
image: localstack/localstack
|
image: localstack/localstack:4.13.1
|
||||||
container_name: localstack
|
container_name: localstack
|
||||||
hostname: localstack
|
hostname: localstack
|
||||||
networks:
|
networks:
|
||||||
- redis-cluster-net
|
- redis-cluster-net
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
volumes:
|
volumes:
|
||||||
|
- ./certs:/tmp/certs:ro # only if your script reads /tmp/certs/...
|
||||||
|
- ./localstack/init:/etc/localstack/init/ready.d:ro
|
||||||
- /var/run/docker.sock:/var/run/docker.sock
|
- /var/run/docker.sock:/var/run/docker.sock
|
||||||
environment:
|
env_file:
|
||||||
- SERVICES=s3,ses,secretsmanager,cloudwatch,logs
|
- .env.localstack.docker
|
||||||
- DEBUG=0
|
|
||||||
- AWS_ACCESS_KEY_ID=test
|
|
||||||
- AWS_SECRET_ACCESS_KEY=test
|
|
||||||
- AWS_DEFAULT_REGION=ca-central-1
|
|
||||||
- EXTRA_CORS_ALLOWED_HEADERS=Authorization,Content-Type
|
|
||||||
- EXTRA_CORS_ALLOWED_ORIGINS=*
|
|
||||||
- EXTRA_CORS_EXPOSE_HEADERS=Authorization,Content-Type
|
|
||||||
ports:
|
ports:
|
||||||
- "4566:4566"
|
- "4566:4566"
|
||||||
healthcheck:
|
healthcheck:
|
||||||
@@ -182,36 +171,6 @@ services:
|
|||||||
retries: 5
|
retries: 5
|
||||||
start_period: 20s
|
start_period: 20s
|
||||||
|
|
||||||
# AWS-CLI
|
|
||||||
aws-cli:
|
|
||||||
image: amazon/aws-cli
|
|
||||||
container_name: aws-cli
|
|
||||||
hostname: aws-cli
|
|
||||||
networks:
|
|
||||||
- redis-cluster-net
|
|
||||||
depends_on:
|
|
||||||
localstack:
|
|
||||||
condition: service_healthy
|
|
||||||
volumes:
|
|
||||||
- './localstack:/tmp/localstack'
|
|
||||||
- './certs:/tmp/certs'
|
|
||||||
environment:
|
|
||||||
- AWS_ACCESS_KEY_ID=test
|
|
||||||
- AWS_SECRET_ACCESS_KEY=test
|
|
||||||
- AWS_DEFAULT_REGION=ca-central-1
|
|
||||||
entrypoint: /bin/sh -c
|
|
||||||
command: >
|
|
||||||
"
|
|
||||||
aws --endpoint-url=http://localstack:4566 ses verify-domain-identity --domain imex.online --region ca-central-1
|
|
||||||
aws --endpoint-url=http://localstack:4566 ses verify-email-identity --email-address noreply@imex.online --region ca-central-1
|
|
||||||
aws --endpoint-url=http://localstack:4566 secretsmanager create-secret --name CHATTER_PRIVATE_KEY --secret-string file:///tmp/certs/io-ftp-test.key
|
|
||||||
aws --endpoint-url=http://localstack:4566 logs create-log-group --log-group-name development --region ca-central-1
|
|
||||||
aws --endpoint-url=http://localstack:4566 s3api create-bucket --bucket imex-large-log --create-bucket-configuration LocationConstraint=ca-central-1
|
|
||||||
aws --endpoint-url=http://localstack:4566 s3api create-bucket --bucket imex-carfax-uploads --create-bucket-configuration LocationConstraint=ca-central-1
|
|
||||||
aws --endpoint-url=http://localstack:4566 s3api create-bucket --bucket rome-carfax-uploads --create-bucket-configuration LocationConstraint=ca-central-1
|
|
||||||
aws --endpoint-url=http://localstack:4566 s3api create-bucket --bucket rps-carfax-uploads --create-bucket-configuration LocationConstraint=ca-central-1
|
|
||||||
"
|
|
||||||
|
|
||||||
networks:
|
networks:
|
||||||
redis-cluster-net:
|
redis-cluster-net:
|
||||||
driver: bridge
|
driver: bridge
|
||||||
|
|||||||
@@ -68,23 +68,18 @@ services:
|
|||||||
# LocalStack: Used to emulate AWS services locally, currently setup for SES
|
# LocalStack: Used to emulate AWS services locally, currently setup for SES
|
||||||
# Notes: Set the ENV Debug to 1 for additional logging
|
# Notes: Set the ENV Debug to 1 for additional logging
|
||||||
localstack:
|
localstack:
|
||||||
image: localstack/localstack
|
image: localstack/localstack:4.13.1
|
||||||
container_name: localstack
|
container_name: localstack
|
||||||
hostname: localstack
|
hostname: localstack
|
||||||
networks:
|
networks:
|
||||||
- redis-cluster-net
|
- redis-cluster-net
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
volumes:
|
volumes:
|
||||||
|
- ./certs:/tmp/certs:ro # only if your script reads /tmp/certs/...
|
||||||
|
- ./localstack/init:/etc/localstack/init/ready.d:ro
|
||||||
- /var/run/docker.sock:/var/run/docker.sock
|
- /var/run/docker.sock:/var/run/docker.sock
|
||||||
environment:
|
env_file:
|
||||||
- SERVICES=s3,ses,secretsmanager,cloudwatch,logs
|
- .env.localstack.docker
|
||||||
- DEBUG=0
|
|
||||||
- AWS_ACCESS_KEY_ID=test
|
|
||||||
- AWS_SECRET_ACCESS_KEY=test
|
|
||||||
- AWS_DEFAULT_REGION=ca-central-1
|
|
||||||
- EXTRA_CORS_ALLOWED_HEADERS=Authorization,Content-Type
|
|
||||||
- EXTRA_CORS_ALLOWED_ORIGINS=*
|
|
||||||
- EXTRA_CORS_EXPOSE_HEADERS=Authorization,Content-Type
|
|
||||||
ports:
|
ports:
|
||||||
- "4566:4566"
|
- "4566:4566"
|
||||||
healthcheck:
|
healthcheck:
|
||||||
@@ -94,38 +89,6 @@ services:
|
|||||||
retries: 5
|
retries: 5
|
||||||
start_period: 20s
|
start_period: 20s
|
||||||
|
|
||||||
# AWS-CLI - Used in conjunction with LocalStack to set required permission to send emails
|
|
||||||
aws-cli:
|
|
||||||
image: amazon/aws-cli
|
|
||||||
container_name: aws-cli
|
|
||||||
hostname: aws-cli
|
|
||||||
networks:
|
|
||||||
- redis-cluster-net
|
|
||||||
depends_on:
|
|
||||||
localstack:
|
|
||||||
condition: service_healthy
|
|
||||||
volumes:
|
|
||||||
- './localstack:/tmp/localstack'
|
|
||||||
- './certs:/tmp/certs'
|
|
||||||
|
|
||||||
environment:
|
|
||||||
- AWS_ACCESS_KEY_ID=test
|
|
||||||
- AWS_SECRET_ACCESS_KEY=test
|
|
||||||
- AWS_DEFAULT_REGION=ca-central-1
|
|
||||||
entrypoint: /bin/sh -c
|
|
||||||
command: >
|
|
||||||
"
|
|
||||||
aws --endpoint-url=http://localstack:4566 ses verify-domain-identity --domain imex.online --region ca-central-1
|
|
||||||
aws --endpoint-url=http://localstack:4566 ses verify-email-identity --email-address noreply@imex.online --region ca-central-1
|
|
||||||
aws --endpoint-url=http://localstack:4566 secretsmanager create-secret --name CHATTER_PRIVATE_KEY --secret-string file:///tmp/certs/io-ftp-test.key
|
|
||||||
aws --endpoint-url=http://localstack:4566 logs create-log-group --log-group-name development --region ca-central-1
|
|
||||||
aws --endpoint-url=http://localstack:4566 s3api create-bucket --bucket imex-large-log --create-bucket-configuration LocationConstraint=ca-central-1
|
|
||||||
aws --endpoint-url=http://localstack:4566 s3api create-bucket --bucket imex-job-totals --create-bucket-configuration LocationConstraint=ca-central-1
|
|
||||||
aws --endpoint-url=http://localstack:4566 s3api create-bucket --bucket parts-estimates --create-bucket-configuration LocationConstraint=ca-central-1
|
|
||||||
aws --endpoint-url=http://localstack:4566 s3api create-bucket --bucket imex-carfax-uploads --create-bucket-configuration LocationConstraint=ca-central-1
|
|
||||||
aws --endpoint-url=http://localstack:4566 s3api create-bucket --bucket rome-carfax-uploads --create-bucket-configuration LocationConstraint=ca-central-1
|
|
||||||
aws --endpoint-url=http://localstack:4566 s3api create-bucket --bucket rps-carfax-uploads --create-bucket-configuration LocationConstraint=ca-central-1
|
|
||||||
"
|
|
||||||
# Node App: The Main IMEX API
|
# Node App: The Main IMEX API
|
||||||
node-app:
|
node-app:
|
||||||
build:
|
build:
|
||||||
@@ -145,8 +108,7 @@ services:
|
|||||||
condition: service_healthy
|
condition: service_healthy
|
||||||
localstack:
|
localstack:
|
||||||
condition: service_healthy
|
condition: service_healthy
|
||||||
aws-cli:
|
|
||||||
condition: service_completed_successfully
|
|
||||||
ports:
|
ports:
|
||||||
- "4000:4000"
|
- "4000:4000"
|
||||||
- "9229:9229"
|
- "9229:9229"
|
||||||
|
|||||||
@@ -947,6 +947,7 @@
|
|||||||
- carfax_exclude
|
- carfax_exclude
|
||||||
- cdk_configuration
|
- cdk_configuration
|
||||||
- cdk_dealerid
|
- cdk_dealerid
|
||||||
|
- chatter_company_id
|
||||||
- chatterid
|
- chatterid
|
||||||
- city
|
- city
|
||||||
- claimscorpid
|
- claimscorpid
|
||||||
@@ -1063,6 +1064,7 @@
|
|||||||
- bill_allow_post_to_closed
|
- bill_allow_post_to_closed
|
||||||
- bill_tax_rates
|
- bill_tax_rates
|
||||||
- cdk_configuration
|
- cdk_configuration
|
||||||
|
- chatter_company_id
|
||||||
- city
|
- city
|
||||||
- country
|
- country
|
||||||
- created_at
|
- created_at
|
||||||
|
|||||||
@@ -0,0 +1,4 @@
|
|||||||
|
-- Could not auto-generate a down migration.
|
||||||
|
-- Please write an appropriate down migration for the SQL below:
|
||||||
|
-- alter table "public"."bodyshops" add column "chatter_company_id" text
|
||||||
|
-- null;
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
alter table "public"."bodyshops" add column "chatter_company_id" text
|
||||||
|
null;
|
||||||
65
localstack/init/10-bootstrap.sh
Normal file
65
localstack/init/10-bootstrap.sh
Normal file
@@ -0,0 +1,65 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
echo "Running LocalStack bootstrap script: 10-bootstrap.sh"
|
||||||
|
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
REGION="${AWS_DEFAULT_REGION:-ca-central-1}"
|
||||||
|
|
||||||
|
# awslocal is the LocalStack wrapper so you don't need --endpoint-url
|
||||||
|
# (it targets the LocalStack gateway automatically)
|
||||||
|
# Docs: https://docs.localstack.cloud/.../aws-cli/
|
||||||
|
ensure_bucket() {
|
||||||
|
local b="$1"
|
||||||
|
if ! awslocal s3api head-bucket --bucket "$b" >/dev/null 2>&1; then
|
||||||
|
awslocal s3api create-bucket \
|
||||||
|
--bucket "$b" \
|
||||||
|
--create-bucket-configuration LocationConstraint="$REGION" \
|
||||||
|
--region "$REGION" >/dev/null
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
ensure_log_group() {
|
||||||
|
local lg="$1"
|
||||||
|
awslocal logs create-log-group --log-group-name "$lg" --region "$REGION" >/dev/null 2>&1 || true
|
||||||
|
}
|
||||||
|
|
||||||
|
ensure_secret_string() {
|
||||||
|
local name="$1"
|
||||||
|
local value="$2"
|
||||||
|
|
||||||
|
if awslocal secretsmanager describe-secret --secret-id "$name" >/dev/null 2>&1; then
|
||||||
|
awslocal secretsmanager update-secret --secret-id "$name" --secret-string "$value" >/dev/null
|
||||||
|
else
|
||||||
|
awslocal secretsmanager create-secret --name "$name" --secret-string "$value" >/dev/null
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
ensure_secret_file() {
|
||||||
|
local name="$1"
|
||||||
|
local filepath="$2"
|
||||||
|
|
||||||
|
if awslocal secretsmanager describe-secret --secret-id "$name" >/dev/null 2>&1; then
|
||||||
|
awslocal secretsmanager update-secret --secret-id "$name" --secret-string "file://$filepath" >/dev/null
|
||||||
|
else
|
||||||
|
awslocal secretsmanager create-secret --name "$name" --secret-string "file://$filepath" >/dev/null
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# SES identities (idempotent-ish; ignoring if it already exists)
|
||||||
|
awslocal ses verify-domain-identity --domain imex.online --region "$REGION" >/dev/null || true
|
||||||
|
awslocal ses verify-email-identity --email-address noreply@imex.online --region "$REGION" >/dev/null || true
|
||||||
|
|
||||||
|
# Secrets
|
||||||
|
ensure_secret_file "CHATTER_PRIVATE_KEY" "/tmp/certs/io-ftp-test.key"
|
||||||
|
ensure_secret_string "CHATTER_COMPANY_KEY_6713" "${CHATTER_COMPANY_KEY_6713:-REPLACE_ME}"
|
||||||
|
|
||||||
|
# Logs
|
||||||
|
ensure_log_group "development"
|
||||||
|
|
||||||
|
# Buckets
|
||||||
|
ensure_bucket "imex-job-totals"
|
||||||
|
ensure_bucket "parts-estimate"
|
||||||
|
ensure_bucket "imex-large-log"
|
||||||
|
ensure_bucket "imex-carfax-uploads"
|
||||||
|
ensure_bucket "rome-carfax-uploads"
|
||||||
|
ensure_bucket "rps-carfax-uploads"
|
||||||
@@ -125,6 +125,7 @@ const applyRoutes = ({ app }) => {
|
|||||||
app.use("/payroll", require("./server/routes/payrollRoutes"));
|
app.use("/payroll", require("./server/routes/payrollRoutes"));
|
||||||
app.use("/sso", require("./server/routes/ssoRoutes"));
|
app.use("/sso", require("./server/routes/ssoRoutes"));
|
||||||
app.use("/integrations", require("./server/routes/intergrationRoutes"));
|
app.use("/integrations", require("./server/routes/intergrationRoutes"));
|
||||||
|
app.use("/chatter", require("./server/routes/chatterRoutes"));
|
||||||
|
|
||||||
// Default route for forbidden access
|
// Default route for forbidden access
|
||||||
app.get("/", (req, res) => {
|
app.get("/", (req, res) => {
|
||||||
|
|||||||
22
server/chatter/createLocation.js
Normal file
22
server/chatter/createLocation.js
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
const DEFAULT_COMPANY_ID = process.env.CHATTER_DEFAULT_COMPANY_ID;
|
||||||
|
|
||||||
|
const createLocation = (req, res) => {
|
||||||
|
const { logger } = req;
|
||||||
|
const { bodyshopID } = req.body;
|
||||||
|
|
||||||
|
// No Default company
|
||||||
|
if (!DEFAULT_COMPANY_ID) {
|
||||||
|
logger.log("chatter-create-location-no-default-company", "warn", null, null, { bodyshopID });
|
||||||
|
return res.json({ success: false });
|
||||||
|
}
|
||||||
|
|
||||||
|
// No Bodyshop data available
|
||||||
|
if (!bodyshopID) {
|
||||||
|
logger.log("chatter-create-location-invalid-bodyshop", "warn", null, null, { bodyshopID });
|
||||||
|
return res.json({ success: false });
|
||||||
|
}
|
||||||
|
|
||||||
|
return res.json({ success: true });
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports = createLocation;
|
||||||
@@ -1911,10 +1911,19 @@ exports.GET_AUTOHOUSE_SHOPS = `query GET_AUTOHOUSE_SHOPS {
|
|||||||
}`;
|
}`;
|
||||||
|
|
||||||
exports.GET_CHATTER_SHOPS = `query GET_CHATTER_SHOPS {
|
exports.GET_CHATTER_SHOPS = `query GET_CHATTER_SHOPS {
|
||||||
bodyshops(where: {chatterid: {_is_null: false}, _or: {chatterid: {_neq: ""}}}){
|
bodyshops(
|
||||||
|
where: {
|
||||||
|
chatterid: { _is_null: false, _neq: "" }
|
||||||
|
_or: [
|
||||||
|
{ chatter_company_id: { _is_null: true } }
|
||||||
|
{ chatter_company_id: { _eq: "" } }
|
||||||
|
]
|
||||||
|
}
|
||||||
|
) {
|
||||||
id
|
id
|
||||||
shopname
|
shopname
|
||||||
chatterid
|
chatterid
|
||||||
|
chatter_company_id
|
||||||
imexshopid
|
imexshopid
|
||||||
timezone
|
timezone
|
||||||
}
|
}
|
||||||
|
|||||||
12
server/routes/chatterRoutes.js
Normal file
12
server/routes/chatterRoutes.js
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
const express = require("express");
|
||||||
|
const createLocation = require("../chatter/createLocation");
|
||||||
|
const router = express.Router();
|
||||||
|
const validateFirebaseIdTokenMiddleware = require("../middleware/validateFirebaseIdTokenMiddleware");
|
||||||
|
const validateAdminMiddleware = require("../middleware/validateAdminMiddleware");
|
||||||
|
|
||||||
|
router.use(validateFirebaseIdTokenMiddleware);
|
||||||
|
router.use(validateAdminMiddleware);
|
||||||
|
|
||||||
|
router.post("/create-location", createLocation);
|
||||||
|
|
||||||
|
module.exports = router;
|
||||||
Reference in New Issue
Block a user