Skip to content

Commit

Permalink
Merge pull request #71 from topcoder-platform/feat/create-skill-obj
Browse files Browse the repository at this point in the history
fix: add endpoint to create skills
  • Loading branch information
rakibansary authored Jan 10, 2022
2 parents be770fe + 0274585 commit b0b5530
Show file tree
Hide file tree
Showing 5 changed files with 85 additions and 12 deletions.
1 change: 1 addition & 0 deletions .circleci/config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,7 @@ workflows:
branches:
only:
- develop
- feat/create-skill-obj

# Production builds are exectuted only on tagged commits to the
# master branch.
Expand Down
11 changes: 11 additions & 0 deletions src/controllers/StatisticsController.js
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,16 @@ async function getMemberSkills (req, res) {
res.send(result)
}

/**
* Create member skills
* @param {Object} req the request
* @param {Object} res the response
*/
async function createMemberSkills (req, res) {
const result = await service.createMemberSkills(req.authUser, req.params.handle, req.body)
res.send(result)
}

/**
* Partially update member skills
* @param {Object} req the request
Expand All @@ -58,5 +68,6 @@ module.exports = {
getHistoryStats,
getMemberStats,
getMemberSkills,
createMemberSkills,
partiallyUpdateMemberSkills
}
6 changes: 6 additions & 0 deletions src/routes.js
Original file line number Diff line number Diff line change
Expand Up @@ -131,6 +131,12 @@ module.exports = {
allowNoToken: true,
scopes: [MEMBERS.READ, MEMBERS.ALL]
},
post: {
controller: 'StatisticsController',
method: 'createMemberSkills',
auth: 'jwt',
scopes: [MEMBERS.CREATE, MEMBERS.ALL]
},
patch: {
controller: 'StatisticsController',
method: 'partiallyUpdateMemberSkills',
Expand Down
20 changes: 8 additions & 12 deletions src/services/MemberService.js
Original file line number Diff line number Diff line change
Expand Up @@ -202,25 +202,21 @@ updateMember.schema = {
data: Joi.object().keys({
firstName: Joi.string(),
lastName: Joi.string(),
description: Joi.string(),
description: Joi.string().allow(''),
otherLangName: Joi.string(),
status: Joi.string(),
email: Joi.string().email(),
addresses: Joi.array().items(Joi.object().keys({
streetAddr1: Joi.string(),
streetAddr2: Joi.string(),
city: Joi.string(),
zip: Joi.string(),
stateCode: Joi.string(),
type: Joi.string(),
createdAt: Joi.date(),
updatedAt: Joi.date(),
createdBy: Joi.string(),
updatedBy: Joi.string()
streetAddr1: Joi.string().allow(''),
streetAddr2: Joi.string().allow(''),
city: Joi.string().allow(''),
zip: Joi.string().allow(''),
stateCode: Joi.string().allow(''),
type: Joi.string()
})),
homeCountryCode: Joi.string(),
competitionCountryCode: Joi.string(),
photoURL: Joi.string().uri(),
photoURL: Joi.string().uri().allow('').allow(null),
tracks: Joi.array().items(Joi.string())
}).required()
}
Expand Down
59 changes: 59 additions & 0 deletions src/services/StatisticsService.js
Original file line number Diff line number Diff line change
Expand Up @@ -244,6 +244,63 @@ getMemberSkills.schema = {
throwError: Joi.boolean()
}

async function createMemberSkills (currentUser, handle, data) {
// get member by handle
const member = await helper.getMemberByHandle(handle)
// check authorization
if (!helper.canManageMember(currentUser, member)) {
throw new errors.ForbiddenError('You are not allowed to update the member skills.')
}
// fetch tags data
if (!this.allTags) {
this.allTags = await helper.getAllTags(config.TAGS.TAGS_BASE_URL + config.TAGS.TAGS_API_VERSION + config.TAGS.TAGS_FILTER)
}
let memberEnteredSkill = {
userId: member.userId,
createdAt: new Date().getTime(),
createdBy: currentUser.handle || currentUser.sub,
handleLower: handle,
userHandle: handle,
skills: {}
}

// merge skills
memberEnteredSkill = helper.mergeSkills(memberEnteredSkill, {}, this.allTags)
// cleanup data
var tempSkill = {}
_.forIn(data, (value, key) => {
var tag = helper.findTagById(this.allTags, Number(key))
if (tag) {
value.tagName = tag.name
if (!value.hasOwnProperty('hidden')) {
value.hidden = false
}
if (!value.hasOwnProperty('score')) {
value.score = 1
}
value.sources = [ 'USER_ENTERED' ]
tempSkill[key] = value
}
})
_.assignIn(memberEnteredSkill.skills, tempSkill)
await helper.create('MemberEnteredSkills', memberEnteredSkill)

// get skills by member handle
const memberSkill = await this.getMemberSkills(currentUser, handle, {}, true)
return memberSkill
}

createMemberSkills.schema = {
currentUser: Joi.any(),
handle: Joi.string().required(),
data: Joi.object().min(1).pattern(/.*/, Joi.object().keys({
tagName: Joi.string(),
hidden: Joi.boolean(),
score: Joi.number().min(0),
sources: Joi.array().items(Joi.string())
}).required()).required()
}

/**
* Partially update member skills.
* @param {Object} currentUser the user who performs operation
Expand All @@ -264,6 +321,7 @@ async function partiallyUpdateMemberSkills (currentUser, handle, data) {
}
// get member entered skill by member user id
let memberEnteredSkill = await helper.getEntityByHashKey(handle, 'MemberEnteredSkills', 'userId', member.userId, true)

// cleanup - convert string to object
memberEnteredSkill = helper.convertToObjectSkills(memberEnteredSkill)
// cleanup
Expand Down Expand Up @@ -311,6 +369,7 @@ module.exports = {
getHistoryStats,
getMemberStats,
getMemberSkills,
createMemberSkills,
partiallyUpdateMemberSkills
}

Expand Down

0 comments on commit b0b5530

Please sign in to comment.