Skip to content
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
8 changes: 4 additions & 4 deletions .circleci/config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ jobs:
environment:
DEPLOY_ENV: "DEV"
LOGICAL_ENV: "dev"
APPNAME: "project-service-v6"
APPNAME: "projects-api-v6"
DEPLOYMENT_ENVIRONMENT: "dev"
steps: *builddeploy_steps

Expand All @@ -59,7 +59,7 @@ jobs:
environment:
DEPLOY_ENV: "PROD"
LOGICAL_ENV: "prod"
APPNAME: "project-service-v6"
APPNAME: "projects-api-v6"
DEPLOYMENT_ENVIRONMENT: "prod"
steps: *builddeploy_steps

Expand Down Expand Up @@ -108,15 +108,15 @@ workflows:
filters:
branches:
only:
- develop
- dev
- deployment-validation-dev:
context: org-global
requires:
- build-dev
filters:
branches:
only:
- develop
- dev

build-prod:
jobs:
Expand Down
103 changes: 15 additions & 88 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -18,98 +18,12 @@ KAFKA_CLIENT_CERT=""
KAFKA_CLIENT_CERT_KEY=""
BUSAPI_URL="https://api.topcoder-dev.com/v5"

# Project resource topics
KAFKA_PROJECT_DRAFT_CREATED_TOPIC="project.draft.created"
# Project event topics (only active topics)
KAFKA_PROJECT_CREATED_TOPIC="project.created"
KAFKA_PROJECT_UPDATED_TOPIC="project.updated"
KAFKA_PROJECT_DELETED_TOPIC="project.deleted"
KAFKA_PROJECT_STATUS_CHANGED_TOPIC="project.status.changed"

# Project notification topics
KAFKA_PROJECT_CREATED_TOPIC="connect.notification.project.created"
KAFKA_PROJECT_UPDATED_NOTIFICATION_TOPIC="connect.notification.project.updated"
KAFKA_PROJECT_SUBMITTED_FOR_REVIEW_TOPIC="connect.notification.project.submittedForReview"
KAFKA_PROJECT_APPROVED_TOPIC="connect.notification.project.approved"
KAFKA_PROJECT_ACTIVE_TOPIC="connect.notification.project.active"
KAFKA_PROJECT_PAUSED_TOPIC="connect.notification.project.paused"
KAFKA_PROJECT_COMPLETED_TOPIC="connect.notification.project.completed"
KAFKA_PROJECT_CANCELED_TOPIC="connect.notification.project.canceled"
KAFKA_PROJECT_SPECIFICATION_MODIFIED_TOPIC="connect.notification.project.updated.spec"
KAFKA_PROJECT_LINK_CREATED_TOPIC="connect.notification.project.linkCreated"
KAFKA_PROJECT_PLAN_UPDATED_TOPIC="connect.notification.project.plan.updated"
KAFKA_PROJECT_PLAN_READY_TOPIC="connect.notification.project.plan.ready"
KAFKA_PROJECT_BILLING_ACCOUNT_UPDATED_TOPIC="connect.notification.project.billingAccount.updated"

# Member and invite topics
KAFKA_PROJECT_MEMBER_ADDED_TOPIC="project.member.added"
KAFKA_PROJECT_MEMBER_UPDATED_TOPIC="project.member.updated"
KAFKA_PROJECT_MEMBER_REMOVED_TOPIC="project.member.removed"
KAFKA_PROJECT_MEMBER_INVITE_CREATED_TOPIC="project.member.invite.created"
KAFKA_PROJECT_MEMBER_INVITE_UPDATED_TOPIC="project.member.invite.updated"
KAFKA_PROJECT_MEMBER_INVITE_REMOVED_TOPIC="project.member.invite.deleted"
KAFKA_MEMBER_JOINED_TOPIC="connect.notification.project.member.joined"
KAFKA_MEMBER_JOINED_COPILOT_TOPIC="connect.notification.project.member.copilotJoined"
KAFKA_MEMBER_JOINED_MANAGER_TOPIC="connect.notification.project.member.managerJoined"
KAFKA_MEMBER_LEFT_TOPIC="connect.notification.project.member.left"
KAFKA_MEMBER_REMOVED_TOPIC="connect.notification.project.member.removed"
KAFKA_MEMBER_ASSIGNED_AS_OWNER_TOPIC="connect.notification.project.member.assignedAsOwner"
KAFKA_PROJECT_TEAM_UPDATED_TOPIC="connect.notification.project.team.updated"

# Attachment topics
KAFKA_PROJECT_ATTACHMENT_ADDED_TOPIC="project.attachment.added"
KAFKA_PROJECT_ATTACHMENT_UPDATED_TOPIC="project.attachment.updated"
KAFKA_PROJECT_ATTACHMENT_REMOVED_TOPIC="project.attachment.removed"
KAFKA_PROJECT_FILE_UPLOADED_TOPIC="connect.notification.project.fileUploaded"
KAFKA_PROJECT_ATTACHMENT_UPDATED_NOTIFICATION_TOPIC="connect.notification.project.attachment.updated"

# Phase, work, and product topics
KAFKA_PROJECT_PHASE_ADDED_TOPIC="project.phase.added"
KAFKA_PROJECT_PHASE_UPDATED_TOPIC="project.phase.updated"
KAFKA_PROJECT_PHASE_REMOVED_TOPIC="project.phase.removed"
KAFKA_PROJECT_PHASE_PRODUCT_ADDED_TOPIC="project.phase.product.added"
KAFKA_PROJECT_PHASE_PRODUCT_UPDATED_TOPIC="project.phase.product.updated"
KAFKA_PROJECT_PHASE_PRODUCT_REMOVED_TOPIC="project.phase.product.removed"
KAFKA_PROJECT_PHASE_TRANSITION_ACTIVE_TOPIC="connect.notification.project.phase.transition.active"
KAFKA_PROJECT_PHASE_TRANSITION_COMPLETED_TOPIC="connect.notification.project.phase.transition.completed"
KAFKA_PROJECT_PHASE_UPDATE_PAYMENT_TOPIC="connect.notification.project.phase.update.payment"
KAFKA_PROJECT_PHASE_UPDATE_PROGRESS_TOPIC="connect.notification.project.phase.update.progress"
KAFKA_PROJECT_PHASE_UPDATE_SCOPE_TOPIC="connect.notification.project.phase.update.scope"
KAFKA_PROJECT_PRODUCT_SPECIFICATION_MODIFIED_TOPIC="connect.notification.project.product.update.spec"
KAFKA_PROJECT_WORKSTREAM_ADDED_TOPIC="project.workstream.added"
KAFKA_PROJECT_WORKSTREAM_UPDATED_TOPIC="project.workstream.updated"
KAFKA_PROJECT_WORKSTREAM_REMOVED_TOPIC="project.workstream.removed"
KAFKA_PROJECT_WORK_ADDED_TOPIC="project.work.added"
KAFKA_PROJECT_WORK_UPDATED_TOPIC="project.work.updated"
KAFKA_PROJECT_WORK_REMOVED_TOPIC="project.work.removed"
KAFKA_PROJECT_WORKITEM_ADDED_TOPIC="project.workitem.added"
KAFKA_PROJECT_WORKITEM_UPDATED_TOPIC="project.workitem.updated"
KAFKA_PROJECT_WORKITEM_REMOVED_TOPIC="project.workitem.removed"
KAFKA_PROJECT_WORK_TRANSITION_ACTIVE_TOPIC="connect.notification.project.work.transition.active"
KAFKA_PROJECT_WORK_TRANSITION_COMPLETED_TOPIC="connect.notification.project.work.transition.completed"
KAFKA_PROJECT_WORK_UPDATE_PAYMENT_TOPIC="connect.notification.project.work.update.payment"
KAFKA_PROJECT_WORK_UPDATE_PROGRESS_TOPIC="connect.notification.project.work.update.progress"
KAFKA_PROJECT_WORK_UPDATE_SCOPE_TOPIC="connect.notification.project.work.update.scope"
KAFKA_PROJECT_WORKITEM_SPECIFICATION_MODIFIED_TOPIC="connect.notification.project.workitem.update.spec"

# Timeline and milestone topics
KAFKA_TIMELINE_ADDED_TOPIC="timeline.added"
KAFKA_TIMELINE_UPDATED_TOPIC="timeline.updated"
KAFKA_TIMELINE_REMOVED_TOPIC="timeline.removed"
KAFKA_MILESTONE_ADDED_TOPIC="milestone.added"
KAFKA_MILESTONE_UPDATED_TOPIC="milestone.updated"
KAFKA_MILESTONE_REMOVED_TOPIC="milestone.removed"
KAFKA_TIMELINE_ADJUSTED_TOPIC="connect.notification.project.timeline.adjusted"
KAFKA_MILESTONE_NOTIFICATION_ADDED_TOPIC="connect.notification.project.timeline.milestone.added"
KAFKA_MILESTONE_NOTIFICATION_UPDATED_TOPIC="connect.notification.project.timeline.milestone.updated"
KAFKA_MILESTONE_NOTIFICATION_REMOVED_TOPIC="connect.notification.project.timeline.milestone.removed"
KAFKA_MILESTONE_TRANSITION_ACTIVE_TOPIC="connect.notification.project.timeline.milestone.transition.active"
KAFKA_MILESTONE_TRANSITION_COMPLETED_TOPIC="connect.notification.project.timeline.milestone.transition.completed"
KAFKA_MILESTONE_TRANSITION_PAUSED_TOPIC="connect.notification.project.timeline.milestone.transition.paused"
KAFKA_MILESTONE_WAITING_CUSTOMER_TOPIC="connect.notification.project.timeline.milestone.waiting.customer"

# Project setting topics
KAFKA_PROJECT_SETTING_CREATED_TOPIC="project.setting.created"
KAFKA_PROJECT_SETTING_UPDATED_TOPIC="project.setting.updated"
KAFKA_PROJECT_SETTING_DELETED_TOPIC="project.setting.deleted"

# Attachment and phase-product configuration
ATTACHMENTS_S3_BUCKET="topcoder-dev-media"
Expand All @@ -122,6 +36,19 @@ ENABLE_FILE_UPLOAD=true
MEMBER_API_URL=""
IDENTITY_API_URL=""

# Salesforce Billing Account integration
SALESFORCE_CLIENT_ID=""
SALESFORCE_CLIENT_AUDIENCE="https://login.salesforce.com"
# Legacy alias used in tc-project-service config mapping:
# SALESFORCE_AUDIENCE can be used instead of SALESFORCE_CLIENT_AUDIENCE.
SALESFORCE_SUBJECT=""
SALESFORCE_CLIENT_KEY=""
SALESFORCE_LOGIN_BASE_URL="https://login.salesforce.com"
SALESFORCE_API_VERSION="v37.0"
SFDC_BILLING_ACCOUNT_NAME_FIELD="Billing_Account_name__c"
SFDC_BILLING_ACCOUNT_MARKUP_FIELD="Mark_Up__c"
SFDC_BILLING_ACCOUNT_ACTIVE_FIELD="Active__c"

# Invite notification templates and links
INVITE_EMAIL_SUBJECT=""
INVITE_EMAIL_SECTION_TITLE=""
Expand Down
2 changes: 1 addition & 1 deletion Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -17,4 +17,4 @@ RUN npm install pnpm -g
RUN pnpm install
RUN pnpm run build
RUN chmod +x appStartUp.sh
CMD ./appStartUp.sh
CMD ./appStartUp.sh
31 changes: 31 additions & 0 deletions LISTENERS.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
# Kafka Listener Audit for `projects-api-v6` Topics

Date: 2026-02-08
Scope: all top-level services/apps in this monorepo.
Excluded per request: `projects-api-v6`, `tc-project-service`.

## Active topics in `projects-api-v6/.env.example`

- `project.created`
- `project.updated`
- `project.deleted`
- `project.member.added`
- `project.member.removed`

## Confirmed listeners (outside excluded services)

No non-excluded service in this monorepo statically subscribes to these topics.

## Topic-by-topic matrix

| Env Variable | Topic | Confirmed Listener(s) | Confirmed Usage |
|---|---|---|---|
| `KAFKA_PROJECT_CREATED_TOPIC` | `project.created` | None found | N/A |
| `KAFKA_PROJECT_UPDATED_TOPIC` | `project.updated` | None found | N/A |
| `KAFKA_PROJECT_DELETED_TOPIC` | `project.deleted` | None found | N/A |
| `KAFKA_PROJECT_MEMBER_ADDED_TOPIC` | `project.member.added` | None found | N/A |
| `KAFKA_PROJECT_MEMBER_REMOVED_TOPIC` | `project.member.removed` | None found | N/A |

## Runtime caveat

`tc-email-service` subscribes dynamically via runtime `TEMPLATE_MAP` keys. Those values are not committed in this monorepo, so runtime subscriptions cannot be proven from source alone.
9 changes: 0 additions & 9 deletions appStartUp.sh
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,5 @@ set -eo pipefail

export DATABASE_URL=$(echo -e ${DATABASE_URL})

echo "Database - running migrations."
if [ "$RESET_DB" = "true" ]; then
echo "Resetting DB"
npx prisma migrate reset --force
else
echo "Running migrations"
npx prisma migrate deploy
fi

# Start the app
pnpm start:prod
2 changes: 1 addition & 1 deletion build.sh
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
#!/bin/bash
set -eo pipefail
docker buildx build --no-cache=true --build-arg RESET_DB_ARG=false --build-arg SEED_DATA_ARG=${DEPLOYMENT_ENVIRONMENT:-dev} -t project-service-v6:latest .
docker buildx build --no-cache=true --build-arg RESET_DB_ARG=false --build-arg SEED_DATA_ARG=false -t project-service-v6:latest .
Loading