Skip to content

Minor release - 3.2.0 #605

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 30 commits into from
Dec 29, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
30 commits
Select commit Hold shift + click to select a range
0d8910f
Temp change for fixing missing email in token
Nov 16, 2020
fda803e
added logging
Nov 16, 2020
efe9414
Using temporary middleware to parse missing info in token
Nov 16, 2020
b1584de
lint fix
Nov 16, 2020
a13cbe7
Merge pull request #589 from topcoder-platform/hotfix/fixing_jwt_deco…
Nov 16, 2020
3f1437b
Revert "Hotfix/fixing jwt decoding new auth0"
Nov 16, 2020
b28aebf
Merge pull request #590 from topcoder-platform/revert-589-hotfix/fixi…
Nov 16, 2020
40f59f8
docs: update README about Kafka consumer
maxceem Nov 20, 2020
8d2b09a
docs: fix README
maxceem Nov 20, 2020
c44dd43
feat: remove copilot members and invites (#594)
maxceem Nov 20, 2020
b75a435
create job after project was created (#595)
imcaizheng Dec 4, 2020
4116ef1
fix: Kafka topics handlers config
maxceem Dec 4, 2020
f8e3b8c
fix: improvements to job creation
maxceem Dec 4, 2020
26c30c3
fix: Kafka topics handlers config
maxceem Dec 4, 2020
cccb677
chore: deploy branch "feature/create-taas-jobs"
maxceem Dec 4, 2020
5e506c2
Merge pull request #597 from topcoder-platform/hotfix/kafka-handlers-…
maxceem Dec 5, 2020
55a667b
Revert "[DEV] [HOTFIX] Kafka Topics Handlers Config"
maxceem Dec 5, 2020
2a482a4
Merge pull request #599 from topcoder-platform/revert-597-hotfix/kafk…
maxceem Dec 5, 2020
4baf155
feat: use "skilliD" for job creation
maxceem Dec 7, 2020
6a9a216
Revert "Revert "[DEV] [HOTFIX] Kafka Topics Handlers Config""
maxceem Dec 8, 2020
ac22ec3
Merge pull request #600 from topcoder-platform/revert-599-revert-597-…
maxceem Dec 8, 2020
d4cf43f
Merge pull request #596 from topcoder-platform/feature/create-taas-jobs
maxceem Dec 8, 2020
0dbe5cc
chore: don't deploy feature branch
maxceem Dec 8, 2020
7a23414
fix: remove temporary user token for TaaS API
maxceem Dec 8, 2020
64a6e10
fix: allow update milestone start/end dates
maxceem Dec 11, 2020
4a70730
Revert "fix: allow update milestone start/end dates"
maxceem Dec 17, 2020
8575211
fix: don't require milestone dates match timeline
maxceem Dec 26, 2020
c1107f8
fix: unit test
maxceem Dec 26, 2020
819d447
fix: copilot is allowed to update project status
maxceem Dec 28, 2020
7269344
chore: temporary disable jobs creation
maxceem Dec 28, 2020
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
16 changes: 13 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -174,16 +174,26 @@ Local setup should work good on **Linux**, **macOS** and **Windows**.
Runs the Project Service using nodemon, so it would be restarted after any of the files is updated.
The project service will be served on `http://localhost:8001`.

4. *(Optional)* Start Project Service Kafka Consumer

*Run this only if you want to test or modify logic of `lastActivityAt` or `lastActivityBy`.*
4. Start Project Service Kafka Consumer

In another terminal window run:

```bash
npm run startKafkaConsumers:dev
```

<details><summary>Click to learn what this service does</summary>
<br>

This service run Kafka Consumer which listens to some events and handles the next things:
- updates `lastActivityAt` and `lastActivityUserId` for projects when we make any updates related to the project like updating project, project attachments, project plan, project members create/delete topics and so on
- create/update/delete topics for phases when we create/update/delete phases
- update phase progress and duration when milestone is completed
- see all the Kafka handlers in file [src/events/kafkaHandlers.js](./src/events/kafkaHandlers.js)

</details>


## Run Connect App with Project Service locally

To be able to run [Connect App](https://github.com/appirio-tech/connect-app) with the local setup of Project Service we have to do two things:
Expand Down
3 changes: 2 additions & 1 deletion config/default.json
Original file line number Diff line number Diff line change
Expand Up @@ -75,5 +75,6 @@
"EMBED_REPORTS_MAPPING": "{\"mock\": \"/embed/looks/2\"}",
"ALLOWED_USERS": "[]"
},
"DEFAULT_M2M_USERID": -101
"DEFAULT_M2M_USERID": -101,
"taasJobApiUrl": "https://api.topcoder.com/v5/jobs"
}
3 changes: 2 additions & 1 deletion config/development.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,5 +6,6 @@
"fileServiceEndpoint": "https://api.topcoder-dev.com/v3/files/",
"connectProjectsUrl": "https://connect.topcoder-dev.com/projects/",
"memberServiceEndpoint": "https://api.topcoder-dev.com/v3/members",
"identityServiceEndpoint": "https://api.topcoder-dev.com/v3/"
"identityServiceEndpoint": "https://api.topcoder-dev.com/v3/",
"taasJobApiUrl": "https://api.topcoder-dev.com/v5/jobs"
}
122 changes: 88 additions & 34 deletions docs/permissions.html
Original file line number Diff line number Diff line change
Expand Up @@ -259,6 +259,37 @@ <h2 class="anchor-container">
</div>
</div>
</div>
<div class="row border-top">
<div class="col py-2">
<div class="permission-title anchor-container">
<a href="#UPDATE_PROJECT_STATUS" name="UPDATE_PROJECT_STATUS" class="anchor"></a>Update Project Status
</div>
<div class="permission-variable"><small><code>UPDATE_PROJECT_STATUS</code></small></div>
<div class="text-black-50 small-text"></div>
</div>
<div class="col-9 py-2">
<div>
<span class="badge badge-primary" title="Allowed Project Role">manager</span>
<span class="badge badge-primary" title="Allowed Project Role">account_manager</span>
<span class="badge badge-primary" title="Allowed Project Role">program_manager</span>
<span class="badge badge-primary" title="Allowed Project Role">account_executive</span>
<span class="badge badge-primary" title="Allowed Project Role">solution_architect</span>
<span class="badge badge-primary" title="Allowed Project Role">project_manager</span>
<span class="badge badge-primary" title="Allowed Project Role">copilot</span>
</div>

<div>
<span class="badge badge-success" title="Allowed Topcoder Role">Connect Admin</span>
<span class="badge badge-success" title="Allowed Topcoder Role">administrator</span>
</div>

<div>
<span class="badge badge-dark" title="Allowed Topcoder Role">all:connect_project</span>
<span class="badge badge-dark" title="Allowed Topcoder Role">all:projects</span>
<span class="badge badge-dark" title="Allowed Topcoder Role">write:projects</span>
</div>
</div>
</div>
<div class="row border-top">
<div class="col py-2">
<div class="permission-title anchor-container">
Expand Down Expand Up @@ -523,19 +554,19 @@ <h2 class="anchor-container">
<div class="row border-top">
<div class="col py-2">
<div class="permission-title anchor-container">
<a href="#UPDATE_PROJECT_MEMBER_TO_COPILOT" name="UPDATE_PROJECT_MEMBER_TO_COPILOT" class="anchor"></a>Update Project Member (to copilot)
<a href="#DELETE_PROJECT_MEMBER_CUSTOMER" name="DELETE_PROJECT_MEMBER_CUSTOMER" class="anchor"></a>Delete Project Member (customer)
</div>
<div class="permission-variable"><small><code>UPDATE_PROJECT_MEMBER_TO_COPILOT</code></small></div>
<div class="text-black-50 small-text">Who can update project member role to &quot;copilot&quot;.</div>
<div class="permission-variable"><small><code>DELETE_PROJECT_MEMBER_CUSTOMER</code></small></div>
<div class="text-black-50 small-text">Who can delete project members with &quot;customer&quot; role.</div>
</div>
<div class="col-9 py-2">
<div>
<span class="badge badge-primary" title="Allowed">Any Project Member</span>
</div>

<div>
<span class="badge badge-success" title="Allowed Topcoder Role">Connect Admin</span>
<span class="badge badge-success" title="Allowed Topcoder Role">administrator</span>
<span class="badge badge-success" title="Allowed Topcoder Role">Connect Copilot Manager</span>
</div>

<div>
Expand All @@ -548,14 +579,19 @@ <h2 class="anchor-container">
<div class="row border-top">
<div class="col py-2">
<div class="permission-title anchor-container">
<a href="#DELETE_PROJECT_MEMBER_CUSTOMER" name="DELETE_PROJECT_MEMBER_CUSTOMER" class="anchor"></a>Delete Project Member (customer)
<a href="#DELETE_PROJECT_MEMBER_TOPCODER" name="DELETE_PROJECT_MEMBER_TOPCODER" class="anchor"></a>Delete Project Member (topcoder)
</div>
<div class="permission-variable"><small><code>DELETE_PROJECT_MEMBER_CUSTOMER</code></small></div>
<div class="text-black-50 small-text">Who can delete project members with &quot;customer&quot; role.</div>
<div class="permission-variable"><small><code>DELETE_PROJECT_MEMBER_TOPCODER</code></small></div>
<div class="text-black-50 small-text">Who can delete project members with some topcoder role like &quot;manager&quot; etc.</div>
</div>
<div class="col-9 py-2">
<div>
<span class="badge badge-primary" title="Allowed">Any Project Member</span>
<span class="badge badge-primary" title="Allowed Project Role">manager</span>
<span class="badge badge-primary" title="Allowed Project Role">account_manager</span>
<span class="badge badge-primary" title="Allowed Project Role">program_manager</span>
<span class="badge badge-primary" title="Allowed Project Role">account_executive</span>
<span class="badge badge-primary" title="Allowed Project Role">solution_architect</span>
<span class="badge badge-primary" title="Allowed Project Role">project_manager</span>
</div>

<div>
Expand All @@ -573,24 +609,20 @@ <h2 class="anchor-container">
<div class="row border-top">
<div class="col py-2">
<div class="permission-title anchor-container">
<a href="#DELETE_PROJECT_MEMBER_NON_CUSTOMER" name="DELETE_PROJECT_MEMBER_NON_CUSTOMER" class="anchor"></a>Delete Project Member (non-customer)
<a href="#DELETE_PROJECT_MEMBER_COPILOT" name="DELETE_PROJECT_MEMBER_COPILOT" class="anchor"></a>Delete Project Member (copilot)
</div>
<div class="permission-variable"><small><code>DELETE_PROJECT_MEMBER_NON_CUSTOMER</code></small></div>
<div class="text-black-50 small-text">Who can delete project members with non &quot;customer&quot; role.</div>
<div class="permission-variable"><small><code>DELETE_PROJECT_MEMBER_COPILOT</code></small></div>
<div class="text-black-50 small-text">Who can delete project members with &quot;copilot&quot; role.</div>
</div>
<div class="col-9 py-2">
<div>
<span class="badge badge-primary" title="Allowed Project Role">manager</span>
<span class="badge badge-primary" title="Allowed Project Role">account_manager</span>
<span class="badge badge-primary" title="Allowed Project Role">program_manager</span>
<span class="badge badge-primary" title="Allowed Project Role">account_executive</span>
<span class="badge badge-primary" title="Allowed Project Role">solution_architect</span>
<span class="badge badge-primary" title="Allowed Project Role">project_manager</span>
<span class="badge badge-primary" title="Allowed">Any Project Member</span>
</div>

<div>
<span class="badge badge-success" title="Allowed Topcoder Role">Connect Admin</span>
<span class="badge badge-success" title="Allowed Topcoder Role">administrator</span>
<span class="badge badge-success" title="Allowed Topcoder Role">Connect Copilot Manager</span>
</div>

<div>
Expand Down Expand Up @@ -680,15 +712,6 @@ <h2 class="anchor-container">
<div>
<span class="badge badge-success" title="Allowed Topcoder Role">Connect Admin</span>
<span class="badge badge-success" title="Allowed Topcoder Role">administrator</span>
<span class="badge badge-success" title="Allowed Topcoder Role">Connect Manager</span>
<span class="badge badge-success" title="Allowed Topcoder Role">Connect Account Manager</span>
<span class="badge badge-success" title="Allowed Topcoder Role">Connect Copilot Manager</span>
<span class="badge badge-success" title="Allowed Topcoder Role">Business Development Representative</span>
<span class="badge badge-success" title="Allowed Topcoder Role">Presales</span>
<span class="badge badge-success" title="Allowed Topcoder Role">Account Executive</span>
<span class="badge badge-success" title="Allowed Topcoder Role">Program Manager</span>
<span class="badge badge-success" title="Allowed Topcoder Role">Solution Architect</span>
<span class="badge badge-success" title="Allowed Topcoder Role">Project Manager</span>
</div>

<div>
Expand All @@ -701,10 +724,10 @@ <h2 class="anchor-container">
<div class="row border-top">
<div class="col py-2">
<div class="permission-title anchor-container">
<a href="#CREATE_PROJECT_INVITE_NON_CUSTOMER" name="CREATE_PROJECT_INVITE_NON_CUSTOMER" class="anchor"></a>Create Project Invite (non-customer)
<a href="#CREATE_PROJECT_INVITE_TOPCODER" name="CREATE_PROJECT_INVITE_TOPCODER" class="anchor"></a>Create Project Invite (topcoder)
</div>
<div class="permission-variable"><small><code>CREATE_PROJECT_INVITE_NON_CUSTOMER</code></small></div>
<div class="text-black-50 small-text">Who can invite project members with non &quot;customer&quot; role.</div>
<div class="permission-variable"><small><code>CREATE_PROJECT_INVITE_TOPCODER</code></small></div>
<div class="text-black-50 small-text">Who can invite project members with topcoder role like &quot;manager&quot; etc.</div>
</div>
<div class="col-9 py-2">
<div>
Expand All @@ -731,9 +754,9 @@ <h2 class="anchor-container">
<div class="row border-top">
<div class="col py-2">
<div class="permission-title anchor-container">
<a href="#CREATE_PROJECT_INVITE_COPILOT_DIRECTLY" name="CREATE_PROJECT_INVITE_COPILOT_DIRECTLY" class="anchor"></a>Create Project Invite (copilot)
<a href="#CREATE_PROJECT_INVITE_COPILOT" name="CREATE_PROJECT_INVITE_COPILOT" class="anchor"></a>Create Project Invite (copilot)
</div>
<div class="permission-variable"><small><code>CREATE_PROJECT_INVITE_COPILOT_DIRECTLY</code></small></div>
<div class="permission-variable"><small><code>CREATE_PROJECT_INVITE_COPILOT</code></small></div>
<div class="text-black-50 small-text">Who can invite user with &quot;copilot&quot; role directly without requesting.</div>
</div>
<div class="col-9 py-2">
Expand Down Expand Up @@ -876,10 +899,40 @@ <h2 class="anchor-container">
<div class="row border-top">
<div class="col py-2">
<div class="permission-title anchor-container">
<a href="#DELETE_PROJECT_INVITE_NOT_OWN_NON_CUSTOMER" name="DELETE_PROJECT_INVITE_NOT_OWN_NON_CUSTOMER" class="anchor"></a>Delete Project Invite (not own, non-customer)
<a href="#DELETE_PROJECT_INVITE_NOT_OWN_TOPCODER" name="DELETE_PROJECT_INVITE_NOT_OWN_TOPCODER" class="anchor"></a>Delete Project Invite (not own, topcoder)
</div>
<div class="permission-variable"><small><code>DELETE_PROJECT_INVITE_NOT_OWN_TOPCODER</code></small></div>
<div class="text-black-50 small-text">Who can delete project invites for other members with some topcoder role like &quot;manager&quot; etc.</div>
</div>
<div class="col-9 py-2">
<div>
<span class="badge badge-primary" title="Allowed Project Role">manager</span>
<span class="badge badge-primary" title="Allowed Project Role">account_manager</span>
<span class="badge badge-primary" title="Allowed Project Role">program_manager</span>
<span class="badge badge-primary" title="Allowed Project Role">account_executive</span>
<span class="badge badge-primary" title="Allowed Project Role">solution_architect</span>
<span class="badge badge-primary" title="Allowed Project Role">project_manager</span>
</div>

<div>
<span class="badge badge-success" title="Allowed Topcoder Role">Connect Admin</span>
<span class="badge badge-success" title="Allowed Topcoder Role">administrator</span>
</div>

<div>
<span class="badge badge-dark" title="Allowed Topcoder Role">all:connect_project</span>
<span class="badge badge-dark" title="Allowed Topcoder Role">all:project-invites</span>
<span class="badge badge-dark" title="Allowed Topcoder Role">write:project-invites</span>
</div>
</div>
</div>
<div class="row border-top">
<div class="col py-2">
<div class="permission-title anchor-container">
<a href="#DELETE_PROJECT_INVITE_NOT_OWN_COPILOT" name="DELETE_PROJECT_INVITE_NOT_OWN_COPILOT" class="anchor"></a>Delete Project Invite (not own, copilot)
</div>
<div class="permission-variable"><small><code>DELETE_PROJECT_INVITE_NOT_OWN_NON_CUSTOMER</code></small></div>
<div class="text-black-50 small-text">Who can delete project invites for other members with non &quot;customer&quot; role.</div>
<div class="permission-variable"><small><code>DELETE_PROJECT_INVITE_NOT_OWN_COPILOT</code></small></div>
<div class="text-black-50 small-text">Who can delete invites for other members with &quot;copilot&quot; role.</div>
</div>
<div class="col-9 py-2">
<div>
Expand All @@ -894,6 +947,7 @@ <h2 class="anchor-container">
<div>
<span class="badge badge-success" title="Allowed Topcoder Role">Connect Admin</span>
<span class="badge badge-success" title="Allowed Topcoder Role">administrator</span>
<span class="badge badge-success" title="Allowed Topcoder Role">Connect Copilot Manager</span>
</div>

<div>
Expand Down
94 changes: 70 additions & 24 deletions src/events/kafkaHandlers.js
Original file line number Diff line number Diff line change
@@ -1,18 +1,22 @@
/**
* BUS Event Handlers
*/
import { CONNECT_NOTIFICATION_EVENT, BUS_API_EVENT, RESOURCES } from '../constants';
import {
projectCreatedKafkaHandler,
projectUpdatedKafkaHandler } from './projects';
import { projectPhaseAddedKafkaHandler, projectPhaseRemovedKafkaHandler,
projectPhaseUpdatedKafkaHandler } from './projectPhases';
CONNECT_NOTIFICATION_EVENT,
BUS_API_EVENT,
RESOURCES,
} from '../constants';
import {
timelineAdjustedKafkaHandler,
} from './timelines';
projectCreatedKafkaHandler,
projectUpdatedKafkaHandler,
} from './projects';
import {
milestoneUpdatedKafkaHandler,
} from './milestones';
projectPhaseAddedKafkaHandler,
projectPhaseRemovedKafkaHandler,
projectPhaseUpdatedKafkaHandler,
} from './projectPhases';
import { timelineAdjustedKafkaHandler } from './timelines';
import { milestoneUpdatedKafkaHandler } from './milestones';

const kafkaHandlers = {
/**
Expand All @@ -33,22 +37,64 @@ const kafkaHandlers = {
// Events coming from timeline/milestones (considering it as a separate module/service in future)
[CONNECT_NOTIFICATION_EVENT.MILESTONE_TRANSITION_COMPLETED]: milestoneUpdatedKafkaHandler,
[CONNECT_NOTIFICATION_EVENT.TIMELINE_ADJUSTED]: timelineAdjustedKafkaHandler,
};

/**
* New Unified Bus Events
*/
[BUS_API_EVENT.PROJECT_CREATED]: {
[RESOURCES.PROJECT]: projectCreatedKafkaHandler,
},
[BUS_API_EVENT.PROJECT_PHASE_CREATED]: {
[RESOURCES.PHASE]: projectPhaseAddedKafkaHandler,
},
[BUS_API_EVENT.PROJECT_PHASE_UPDATED]: {
[RESOURCES.PHASE]: projectPhaseUpdatedKafkaHandler,
},
[BUS_API_EVENT.PROJECT_PHASE_DELETED]: {
[RESOURCES.PHASE]: projectPhaseRemovedKafkaHandler,
},
/**
* Register New Unified Bus Event Handlers
*
* We need this special method so it would properly merge topics with the same names
* but different resources.
*
* @param {String} topic Kafka topic name
* @param {String} resource resource name
* @param {Function} handler handler method
*
* @returns {void}
*/
const registerKafkaHandler = (topic, resource, handler) => {
let topicConfig = kafkaHandlers[topic];

// if config for topic is not yet initialized, create it
if (!topicConfig) {
topicConfig = {};
kafkaHandlers[topic] = topicConfig;
}

if (typeof topicConfig !== 'object') {
throw new Error(
`Topic "${topic}" should be defined as object with resource names as keys.`,
);
}

if (topicConfig[resource]) {
throw new Error(
`Handler for topic "${topic}" with resource ${resource} has been already registered.`,
);
}

topicConfig[resource] = handler;
};

registerKafkaHandler(
BUS_API_EVENT.PROJECT_CREATED,
RESOURCES.PROJECT,
projectCreatedKafkaHandler,
);
registerKafkaHandler(
BUS_API_EVENT.PROJECT_PHASE_CREATED,
RESOURCES.PHASE,
projectPhaseAddedKafkaHandler,
);
registerKafkaHandler(
BUS_API_EVENT.PROJECT_PHASE_UPDATED,
RESOURCES.PHASE,
projectPhaseUpdatedKafkaHandler,
);
registerKafkaHandler(
BUS_API_EVENT.PROJECT_PHASE_DELETED,
RESOURCES.PHASE,
projectPhaseRemovedKafkaHandler,
);


export default kafkaHandlers;
Loading