Skip to content

Production Release: To support Connect 2.4.6 #186

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

Merged
merged 89 commits into from
Oct 1, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
89 commits
Select commit Hold shift + click to select a range
2d0f5cc
Added most needed events.
architectt1 Jul 14, 2018
cbfaebf
Added logic for the plan ready event.
architectt1 Jul 15, 2018
c1aa6fe
Update constants.js
gondzo Aug 23, 2018
66a3322
add missing field in sql
Aug 24, 2018
cfba8d3
Latest pull from origin dev and fixed conflicts
Aug 24, 2018
ba14b78
Merge pull request #110 from architectt1/feature/newEvents
Aug 24, 2018
95085eb
lint fix
Aug 24, 2018
f979c48
fixed bug in detecting the non product spec change
Aug 24, 2018
b82a463
#151 Add `reference` and `referenceId` fields instead of `productTemp…
ngoctay Aug 25, 2018
d3364a4
Merge branch 'dev' of https://github.com/ngoctay/tc-project-service i…
ngoctay Aug 25, 2018
d2f08a3
Add new field `metadata` to the `milestoneTemplate` model #169
ngoctay Aug 25, 2018
42df0b0
Additional fixes for #151, #161
ngoctay Aug 26, 2018
43c1a57
Add support for `order` in phases #168
ngoctay Aug 27, 2018
affe403
Add ability to create product in phase creation call #163
ngoctay Aug 27, 2018
44a1513
New authorization scheme for project creation endpoint #171
ngoctay Aug 27, 2018
991f2f3
- New bus events for milestone notifications #172
ngoctay Aug 28, 2018
303d032
- Send original and updated milestones in the milestone events to BusAPI
ngoctay Aug 29, 2018
1050951
Added performance logging middleware
ngoctay Aug 30, 2018
cddec28
Revert utils.js#getTopcoderUser()
ngoctay Aug 30, 2018
3640900
Merge branch 'dev' of https://github.com/ngoctay/tc-project-service i…
ngoctay Aug 30, 2018
3806e9a
Merge pull request #174 from ngoctay/dev
Aug 31, 2018
e11ea6e
lint fix
Aug 31, 2018
63bb9b7
Column name fix
Aug 31, 2018
c18df4b
commented test for new auth scheme
Aug 31, 2018
442b5fe
removed user id based auth for now as it is not needed any more for t…
Sep 3, 2018
30495b4
lint fixes
Sep 3, 2018
e329a65
debug logs
Sep 3, 2018
abbdb93
updated package lock with more specific versions of libraries instead…
Sep 3, 2018
f3795ba
Fixed issue with missing events for cascaded milestone updates
Sep 3, 2018
228799f
more logging statements
Sep 3, 2018
ae5bf71
one more update to fix the milestone active event
Sep 3, 2018
a86fbba
copying metadata from milestone template
Sep 3, 2018
ffdfac6
fixed typo
Sep 3, 2018
6745054
one more update to fix the milestone active event
Sep 3, 2018
a1a3be6
Revert "Revert utils.js#getTopcoderUser()"
Sep 3, 2018
186ba22
Added timeline modified event
Sep 4, 2018
07154fc
Some improvements for local deployment to work more out of the box.
maxceem Sep 7, 2018
4f0ce2e
Merge pull request #177 from maxceem/feature/local-deployment-improve…
RishiRajSahu Sep 7, 2018
68a9c03
Raised phase progress event when milestone completed
Sep 7, 2018
aa1e410
possible fix for spurious project progress update event
Sep 7, 2018
5f65706
lint fix
Sep 7, 2018
247e20a
reverted the raise of phase event from milestone event. Milestone eve…
Sep 10, 2018
ca31eb0
Added details of original and updated phases with bus event payload
Sep 12, 2018
fc183e0
Made `indexName` as required field for delete index endpoint
Sep 12, 2018
ff81315
lint fix
Sep 12, 2018
c6eba74
Winning submission from challenge 30070732
maxceem Sep 17, 2018
004efd6
make git ignore `.env` files which is useful to use for local config …
maxceem Sep 17, 2018
8fb395f
added lastActivityAt and lastActivityUserId to ES project index
maxceem Sep 17, 2018
10f0093
fixed migration script for project activity so lastActivityAt has tim…
maxceem Sep 17, 2018
344098b
Update seed to have the today's date for `lastActivityAt` instead of …
maxceem Sep 17, 2018
9c816dd
Merge branch 'dev' into feature/project-activity
maxceem Sep 17, 2018
931b0e7
Create and use constants for message service events instead of hardco…
maxceem Sep 17, 2018
4874fb3
call ES directly after updating project activity instead of using Rab…
maxceem Sep 17, 2018
2eb9159
fix Kafka consumer to get messages in proper format
maxceem Sep 18, 2018
8f4929a
Use string for lastActivityUserId instead of integers
maxceem Sep 18, 2018
9ff7e4b
move kafka event handlers from service folder to events folder
maxceem Sep 18, 2018
53e66df
adjusted tests for projectUpdatedKafkaHandler
maxceem Sep 19, 2018
3a386fc
fix lint error
maxceem Sep 19, 2018
638dab3
fix tests for kafkaConsumer
maxceem Sep 19, 2018
5fbcb91
fix lint error
maxceem Sep 19, 2018
b7cd0c2
fix projectUpdatedKafkaHandler to use test ES properly
maxceem Sep 19, 2018
652e0dc
fix test broken after lastActivityUserId altered to be a string inste…
maxceem Sep 19, 2018
cc7bd42
make sure that lastActivityUserId is set as a string on project create
maxceem Sep 19, 2018
09e3f4d
adjust test to use set lastActivityUserId as a sting even though thes…
maxceem Sep 19, 2018
efd34d8
Merge pull request #180 from maxceem/feature/project-activity
RishiRajSahu Sep 19, 2018
3e380f3
Increasing the timeout
Sep 19, 2018
50dcf67
Updated readme.
RishiRajSahu Sep 19, 2018
8b2f292
Increased timeout to 10000ms
RishiRajSahu Sep 19, 2018
79d1d1d
Merge pull request #182 from topcoder-platform/feature/project_activity
RishiRajSahu Sep 19, 2018
7366e20
Refactored logic for throwing plan update event only for duration, st…
Sep 19, 2018
1188ba2
Picking Kafka config from circle CI env variables
Sep 19, 2018
23bb264
Fixed unit tests
Sep 19, 2018
492a5c9
fixing env variable for test cases
Sep 19, 2018
5cbd1f5
trying fix for kafka connection error
Sep 20, 2018
7e0c75c
lint-fix
RishiRajSahu Sep 20, 2018
a8f8f54
fixed typo
Sep 20, 2018
a6a2216
Merge branch 'dev' of https://github.com/topcoder-platform/tc-project…
Sep 20, 2018
d81169e
Ignoring unmentioned keys from validation
Sep 20, 2018
e67e265
changed fields to optional
Sep 20, 2018
80c7897
Separated the raising of project and phase events from timeline/miles…
Sep 28, 2018
b06e8a5
config based file upload in dev env
Sep 28, 2018
593f46c
Merge pull request #184 from topcoder-platform/feature/milestone_phas…
Sep 28, 2018
bcdeb56
Updated kafka topics names, mostly for new topics in this release. Ho…
Sep 28, 2018
25e4b65
Increase memory and cpu for task
RishiRajSahu Sep 28, 2018
860b6ef
We don’t need to set download URL any more per attachment because we …
Sep 29, 2018
9913fae
fixed unit test for downloadUrl
Sep 29, 2018
ebf9198
increasing cpu and memory allocate to the container
Oct 1, 2018
ddffacd
Corrected Naming convention for kafka topics
RishiRajSahu Oct 1, 2018
0642013
Merge branch 'master' into dev
Oct 1, 2018
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
2 changes: 1 addition & 1 deletion .circleci/config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@ workflows:
- test
filters:
branches:
only: ['dev', 'feature/timeline-milestone']
only: ['dev']
- deployProd:
requires:
- test
Expand Down
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@

# Created by https://www.gitignore.io/api/node
config/local.js
# can be used locally to config some env variables and after apply them using `source .env`
.env
### Node ###
# Logs
logs
Expand Down
29 changes: 28 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ Microservice to manage CRUD operations for all things Projects.
Copy config/sample.local.js as config/local.js, update the properties and according to your env setup

#### Database
Once you start your PostgreSQL database through docker, it will create a projectsDB.
Once you start your PostgreSQL database through docker, it will create a projectsdb.
*To create tables - note this will drop tables if they already exist*
```
NODE_ENV=development npm run sync:db
Expand All @@ -40,6 +40,33 @@ Run `npm run sync:es` from the root of project to execute the script.

**NOTE**: In production these dependencies / services are hosted & managed outside tc-projects-service.

#### Kafka
Kafka must be installed and configured prior starting the application.
Following topics must be created:
```
notifications.connect.project.updated
notifications.connect.project.files.updated
notifications.connect.project.team.updated
notifications.connect.project.plan.updated
notifications.connect.project.topic.created
notifications.connect.project.topic.updated
notifications.connect.project.post.created
notifications.connect.project.post.edited
```

New Kafka related configuration options has been introduced:
```
"kafkaConfig": {
"hosts": List of Kafka brokers. Default: localhost: 9092
"clientCert": SSL certificate
"clientCertKey": Certificate key
}
```
Environment variables:
KAFKA_HOSTS - same as "hosts"
KAFKA_CLIENT_CERT - same as "clientCert"
KAFKA_CLIENT_CERT_KEY - same as "clientCertKey"

### Test

Each of the individual modules/services are unit tested.
Expand Down
10 changes: 9 additions & 1 deletion config/custom-environment-variables.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
"logLevel": "LOG_LEVEL",
"version": "APP_VERSION",
"captureLogs": "CAPTURE_LOGS",
"enableFileUpload": "ENABLE_FILE_UPLOAD",
"logentriesToken": "LOGENTRIES_TOKEN",
"elasticsearchConfig": {
"host": "PROJECTS_ES_URL",
Expand All @@ -29,6 +30,12 @@
"maxPoolSize": "DB_MAX_POOL_SIZE",
"minPoolSize": "DB_MIN_POOL_SIZE"
},
"kafkaConfig": {
"groupId": "KAFKA_GROUP_ID",
"url": "KAFKA_URL",
"clientCert": "KAFKA_CLIENT_CERT",
"clientCertKey": "KAFKA_CLIENT_CERT_KEY"
},
"analyticsKey": "SEGMENT_ANALYTICS_KEY",
"VALID_ISSUERS": "VALID_ISSUERS",
"jwksUri": "JWKS_URI",
Expand All @@ -38,5 +45,6 @@
"AUTH0_CLIENT_ID": "AUTH0_CLIENT_ID",
"AUTH0_CLIENT_SECRET": "AUTH0_CLIENT_SECRET",
"AUTH0_AUDIENCE": "AUTH0_AUDIENCE",
"TOKEN_CACHE_TIME" : "TOKEN_CACHE_TIME"
"TOKEN_CACHE_TIME" : "TOKEN_CACHE_TIME",
"whitelistedOriginsForUserIdAuth": "WHITELISTED_ORIGINS_FOR_USERID_AUTH"
}
6 changes: 5 additions & 1 deletion config/default.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
"logLevel": "info",
"version": "v4",
"captureLogs": "false",
"enableFileUpload": "true",
"logentriesToken": "",
"rabbitmqURL": "",
"pubsubQueueName": "project.service",
Expand Down Expand Up @@ -33,6 +34,8 @@
"minPoolSize": 4,
"idleTimeout": 1000
},
"kafkaConfig": {
},
"analyticsKey": "",
"VALID_ISSUERS": "[\"https:\/\/topcoder-newauth.auth0.com\/\",\"https:\/\/api.topcoder-dev.com\"]",
"validIssuers": "[\"https:\/\/topcoder-newauth.auth0.com\/\",\"https:\/\/api.topcoder-dev.com\"]",
Expand All @@ -46,5 +49,6 @@
"AUTH0_CLIENT_SECRET": "",
"AUTH0_AUDIENCE": "",
"AUTH0_URL": "",
"TOKEN_CACHE_TIME": ""
"TOKEN_CACHE_TIME": "",
"whitelistedOriginsForUserIdAuth": "[\"https:\/\/topcoder-newauth.auth0.com\/\",\"https:\/\/api.topcoder-dev.com\"]"
}
6 changes: 4 additions & 2 deletions config/sample.local.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ if (process.env.NODE_ENV === 'test') {
config = require('./test.json');
} else {
config = {
identityServiceEndpoint: "http://dockerhost:3001/",
authSecret: 'secret',
authDomain: 'topcoder-dev.com',
logLevel: 'debug',
Expand All @@ -14,9 +15,9 @@ if (process.env.NODE_ENV === 'test') {
fileServiceEndpoint: 'https://api.topcoder-dev.com/v3/files/',
directProjectServiceEndpoint: 'https://api.topcoder-dev.com/v3/direct',
connectProjectsUrl: 'https://connect.topcoder-dev.com/projects/',
memberServiceEndpoint: 'http://dockerhost:3001/members',
memberServiceEndpoint: 'http://dockerhost:3001/v3/members',
dbConfig: {
masterUrl: 'postgres://coder:mysecretpassword@dockerhost:54321/projectsdb',
masterUrl: 'postgres://coder:mysecretpassword@dockerhost:5432/projectsdb',
maxPoolSize: 50,
minPoolSize: 4,
idleTimeout: 1000,
Expand All @@ -28,6 +29,7 @@ if (process.env.NODE_ENV === 'test') {
indexName: 'projects',
docType: 'projectV4'
},
whitelistedOriginsForUserIdAuth: "[\"\"]",
};
}
module.exports = config;
3 changes: 2 additions & 1 deletion config/test.json
Original file line number Diff line number Diff line change
Expand Up @@ -18,5 +18,6 @@
"maxPoolSize": 50,
"minPoolSize": 4,
"idleTimeout": 1000
}
},
"whitelistedOriginsForUserIdAuth": "[\"\"]"
}
31 changes: 28 additions & 3 deletions deploy.sh
Original file line number Diff line number Diff line change
Expand Up @@ -54,13 +54,17 @@ make_task_def(){
"name": "%s",
"image": "%s.dkr.ecr.%s.amazonaws.com/%s:%s",
"essential": true,
"memory": 200,
"cpu": 10,
"memory": 1536,
"cpu": 768,
"environment": [
{
"name": "NODE_ENV",
"value": "%s"
},
{
"name": "ENABLE_FILE_UPLOAD",
"value": "%s"
},
{
"name": "LOG_LEVEL",
"value": "%s"
Expand Down Expand Up @@ -176,6 +180,22 @@ make_task_def(){
{
"name": "TOKEN_CACHE_TIME",
"value": "%s"
},
{
"name": "KAFKA_CLIENT_CERT",
"value": "%s"
},
{
"name": "KAFKA_CLIENT_CERT_KEY",
"value": "%s"
},
{
"name": "KAFKA_GROUP_ID",
"value": "%s"
},
{
"name": "KAFKA_URL",
"value": "%s"
}
],
"portMappings": [
Expand Down Expand Up @@ -220,15 +240,20 @@ make_task_def(){
fi
echo "NODE_ENV"
echo $NODE_ENV
ENABLE_FILE_UPLOAD=$(eval "echo \$${ENV}_ENABLE_FILE_UPLOAD")

AUTH0_URL=$(eval "echo \$${ENV}_AUTH0_URL")
AUTH0_AUDIENCE=$(eval "echo \$${ENV}_AUTH0_AUDIENCE")
AUTH0_CLIENT_ID=$(eval "echo \$${ENV}_AUTH0_CLIENT_ID")
AUTH0_CLIENT_SECRET=$(eval "echo \$${ENV}_AUTH0_CLIENT_SECRET")
TOKEN_CACHE_TIME=$(eval "echo \$${ENV}_TOKEN_CACHE_TIME")
KAFKA_CLIENT_CERT=$(eval "echo \$${ENV}_KAFKA_CLIENT_CERT")
KAFKA_CLIENT_CERT_KEY=$(eval "echo \$${ENV}_KAFKA_CLIENT_CERT_KEY")
KAFKA_GROUP_ID=$(eval "echo \$${ENV}_KAFKA_GROUP_ID")
KAFKA_URL=$(eval "echo \$${ENV}_KAFKA_URL")


task_def=$(printf "$task_template" $family $ACCOUNT_ID $AWS_ECS_CONTAINER_NAME $ACCOUNT_ID $AWS_REGION $AWS_REPOSITORY $CIRCLE_SHA1 $NODE_ENV $LOG_LEVEL $CAPTURE_LOGS $LOGENTRIES_TOKEN $API_VERSION $AWS_REGION $AWS_ACCESS_KEY_ID $AWS_SECRET_ACCESS_KEY $AUTH_DOMAIN $AUTH_SECRET $VALID_ISSUERS $DB_MASTER_URL $MEMBER_SERVICE_ENDPOINT $IDENTITY_SERVICE_ENDPOINT $BUS_API_URL $MESSAGE_SERVICE_URL $SYSTEM_USER_CLIENT_ID $SYSTEM_USER_CLIENT_SECRET $PROJECTS_ES_URL $PROJECTS_ES_INDEX_NAME $RABBITMQ_URL $DIRECT_PROJECT_SERVICE_ENDPOINT $FILE_SERVICE_ENDPOINT $CONNECT_PROJECTS_URL $SEGMENT_ANALYTICS_KEY "$AUTH0_URL" "$AUTH0_AUDIENCE" $AUTH0_CLIENT_ID "$AUTH0_CLIENT_SECRET" $TOKEN_CACHE_TIME $PORT $PORT $AWS_ECS_CLUSTER $AWS_REGION $NODE_ENV)
task_def=$(printf "$task_template" $family $ACCOUNT_ID $AWS_ECS_CONTAINER_NAME $ACCOUNT_ID $AWS_REGION $AWS_REPOSITORY $CIRCLE_SHA1 $NODE_ENV $ENABLE_FILE_UPLOAD $LOG_LEVEL $CAPTURE_LOGS $LOGENTRIES_TOKEN $API_VERSION $AWS_REGION $AWS_ACCESS_KEY_ID $AWS_SECRET_ACCESS_KEY $AUTH_DOMAIN $AUTH_SECRET $VALID_ISSUERS $DB_MASTER_URL $MEMBER_SERVICE_ENDPOINT $IDENTITY_SERVICE_ENDPOINT $BUS_API_URL $MESSAGE_SERVICE_URL $SYSTEM_USER_CLIENT_ID $SYSTEM_USER_CLIENT_SECRET $PROJECTS_ES_URL $PROJECTS_ES_INDEX_NAME $RABBITMQ_URL $DIRECT_PROJECT_SERVICE_ENDPOINT $FILE_SERVICE_ENDPOINT $CONNECT_PROJECTS_URL $SEGMENT_ANALYTICS_KEY "$AUTH0_URL" "$AUTH0_AUDIENCE" $AUTH0_CLIENT_ID "$AUTH0_CLIENT_SECRET" $TOKEN_CACHE_TIME "$KAFKA_CLIENT_CERT" "$KAFKA_CLIENT_CERT_KEY" $KAFKA_GROUP_ID $KAFKA_URL $PORT $PORT $AWS_ECS_CLUSTER $AWS_REGION $NODE_ENV)
}

push_ecr_image(){
Expand Down
50 changes: 50 additions & 0 deletions local/mock-services/services.json
Original file line number Diff line number Diff line change
Expand Up @@ -249,6 +249,56 @@
}
},
"version": "v3"
},
{
"id": "test_admin1",
"result": {
"success": true,
"status": 200,
"metadata": null,
"content": {
"maxRating": {
"rating": 1114,
"track": "DATA_SCIENCE",
"subTrack": "SRM"
},
"createdBy": "40011578",
"updatedBy": "40011578",
"userId": 40135978,
"firstName": "Adminname",
"lastName": "Adminlastname",
"quote": "It is a mistake to think you can solve any major problems just with potatoes.",
"description": null,
"otherLangName": null,
"handle": "test_admin1",
"handleLower": "test_admin1",
"status": "ACTIVE",
"email": "pshah1@test.com",
"addresses": [
{
"streetAddr1": "100 Main Street",
"streetAddr2": "",
"city": "Chicago",
"zip": "60601",
"stateCode": "IL",
"type": "HOME",
"updatedAt": null,
"createdAt": null,
"createdBy": null,
"updatedBy": null
}
],
"homeCountryCode": "USA",
"competitionCountryCode": "USA",
"photoURL": null,
"tracks": [
"DEVELOP"
],
"updatedAt": "2015-12-02T14:00Z",
"createdAt": "2014-04-10T10:55Z"
}
},
"version": "v3"
}
]
}
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ CREATE TABLE milestones (
"activeText" character varying(512) NOT NULL,
"completedText" character varying(512) NOT NULL,
"blockedText" character varying(512) NOT NULL,
"hidden" boolean DEFAULT false,
"deletedAt" timestamp with time zone,
"createdAt" timestamp with time zone,
"updatedAt" timestamp with time zone,
Expand Down
27 changes: 27 additions & 0 deletions migrations/20180824_milestone_templates_metadata.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
--
-- UPDATE EXISTING TABLES:
-- product_milestone_templates:
-- removed constraint `product_milestone_templates_productTemplateId_fkey`
-- changed column `productTemplateId` to `referenceId`
-- added column `reference`
-- added column `metadata`
-- changed table name to `milestone_templates`

--
-- product_milestone_templates
--
ALTER TABLE product_milestone_templates DROP CONSTRAINT "product_milestone_templates_productTemplateId_fkey";

ALTER TABLE product_milestone_templates RENAME COLUMN "productTemplateId" TO "referenceId";

ALTER TABLE product_milestone_templates ADD COLUMN "reference" character varying(45);
UPDATE product_milestone_templates set reference='productTemplate' where reference is null;
ALTER TABLE product_milestone_templates ALTER COLUMN "reference" SET NOT NULL;

ALTER TABLE product_milestone_templates ADD COLUMN "metadata" json;
UPDATE product_milestone_templates set metadata='{}' where metadata is null;
ALTER TABLE product_milestone_templates ALTER COLUMN "metadata" SET NOT NULL;

ALTER TABLE product_milestone_templates RENAME TO milestone_templates;


9 changes: 9 additions & 0 deletions migrations/20180827_project_phases_order.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
--
-- UPDATE EXISTING TABLES:
-- project_phases:
-- added column `order`

--
-- project_phases
--
ALTER TABLE project_phases ADD COLUMN "order" integer NULL;
18 changes: 18 additions & 0 deletions migrations/20180910_project_activity.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
--
-- UPDATE EXISTING TABLES:
-- projects:
-- added column `lastActivityAt`
-- added column `lastActivityUserId`

--
-- projects

-- Add new columns
ALTER TABLE projects ADD COLUMN "lastActivityAt" timestamp with time zone;
ALTER TABLE projects ADD COLUMN "lastActivityUserId" character varying(45);
-- Update new colums
UPDATE projects SET "lastActivityAt"="updatedAt" WHERE "lastActivityAt" is NULL;
UPDATE projects SET "lastActivityUserId"=cast("updatedBy" as varchar) WHERE "lastActivityUserId" is NULL;
-- Set not null
ALTER TABLE projects ALTER COLUMN "lastActivityAt" SET NOT NULL;
ALTER TABLE projects ALTER COLUMN "lastActivityUserId" SET NOT NULL;
7 changes: 7 additions & 0 deletions migrations/elasticsearch_sync.js
Original file line number Diff line number Diff line change
Expand Up @@ -281,6 +281,13 @@ function getRequestBody(indexName) {
updatedBy: {
type: 'integer',
},
lastActivityAt: {
type: 'date',
format: 'strict_date_optional_time||epoch_millis',
},
lastActivityUserId: {
type: 'string',
},
utm: {
properties: {
campaign: {
Expand Down
Loading