Skip to content

fix: add endpoint to create skills #71

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 3 commits into from
Jan 10, 2022
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
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