Skip to content
This repository was archived by the owner on Mar 13, 2025. It is now read-only.

Commit 626a1dc

Browse files
committed
Search achievements by organization ID and keyword
1 parent ac95a77 commit 626a1dc

File tree

4 files changed

+143
-21
lines changed

4 files changed

+143
-21
lines changed

docs/UBahn_API.postman_collection.json

Lines changed: 80 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"info": {
3-
"_postman_id": "66538223-0d2c-42f0-a3e0-cccc51c21b4f",
3+
"_postman_id": "2e9d0d1e-22b4-4b5c-af7d-8e5d407de79b",
44
"name": "UBahn_API",
55
"schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
66
},
@@ -14,7 +14,7 @@
1414
{
1515
"listen": "test",
1616
"script": {
17-
"id": "05164ddd-c806-4bad-aea0-1bfd6e43e82c",
17+
"id": "256b27ab-e629-429f-ad93-372eaaa46239",
1818
"exec": [
1919
"var rsp = pm.response.json();",
2020
"if(rsp.id) pm.environment.set(\"userId\", rsp.id);"
@@ -61,13 +61,65 @@
6161
},
6262
"response": []
6363
},
64+
{
65+
"name": "{{HOST}}/search/userAchievements",
66+
"event": [
67+
{
68+
"listen": "test",
69+
"script": {
70+
"id": "d1951826-476c-4149-bfa7-2a853c30df4e",
71+
"exec": [
72+
""
73+
],
74+
"type": "text/javascript"
75+
}
76+
}
77+
],
78+
"request": {
79+
"method": "GET",
80+
"header": [
81+
{
82+
"key": "Authorization",
83+
"type": "text",
84+
"value": "Bearer {{token}}"
85+
},
86+
{
87+
"key": "Content-Type",
88+
"name": "Content-Type",
89+
"type": "text",
90+
"value": "application/json"
91+
}
92+
],
93+
"url": {
94+
"raw": "{{HOST}}/search/userAchievements?organizationId=36ed815b-3da1-49f1-a043-aaed0a4e81ad&keyword=Topcoder",
95+
"host": [
96+
"{{HOST}}"
97+
],
98+
"path": [
99+
"search",
100+
"userAchievements"
101+
],
102+
"query": [
103+
{
104+
"key": "organizationId",
105+
"value": "36ed815b-3da1-49f1-a043-aaed0a4e81ad"
106+
},
107+
{
108+
"key": "keyword",
109+
"value": "Topcoder"
110+
}
111+
]
112+
}
113+
},
114+
"response": []
115+
},
64116
{
65117
"name": "{{HOST}}/search/users",
66118
"event": [
67119
{
68120
"listen": "test",
69121
"script": {
70-
"id": "df73daae-0b9d-4381-a261-07b1ebc7eccc",
122+
"id": "75560f72-efeb-438e-ac29-24d7c6ab540e",
71123
"exec": [
72124
"var rsp = pm.response.json();",
73125
"if(rsp.id) pm.environment.set(\"userId\", rsp.id);"
@@ -123,7 +175,7 @@
123175
{
124176
"listen": "test",
125177
"script": {
126-
"id": "b37624d4-9657-4dad-9ddf-2d383a8e6d0d",
178+
"id": "5db9dc16-daad-4768-a3af-ea8983487bec",
127179
"exec": [
128180
"var rsp = pm.response.json();",
129181
"if(rsp.id) pm.environment.set(\"userId\", rsp.id);"
@@ -149,7 +201,10 @@
149201
],
150202
"body": {
151203
"mode": "raw",
152-
"raw": "{\n\t\"handle\":\"handle_01\"\n}"
204+
"raw": "{\n\t\"handle\":\"handle_01\"\n}",
205+
"options": {
206+
"raw": {}
207+
}
153208
},
154209
"url": {
155210
"raw": "{{HOST}}/users",
@@ -212,7 +267,10 @@
212267
],
213268
"body": {
214269
"mode": "raw",
215-
"raw": "{\n\t\"handle\":\"handle_05\"\n}"
270+
"raw": "{\n\t\"handle\":\"handle_05\"\n}",
271+
"options": {
272+
"raw": {}
273+
}
216274
},
217275
"url": {
218276
"raw": "{{HOST}}/users/{{userId}}",
@@ -454,7 +512,10 @@
454512
],
455513
"body": {
456514
"mode": "raw",
457-
"raw": ""
515+
"raw": "",
516+
"options": {
517+
"raw": {}
518+
}
458519
},
459520
"url": {
460521
"raw": "{{HOST}}/users/{{userId}}",
@@ -481,7 +542,7 @@
481542
{
482543
"listen": "test",
483544
"script": {
484-
"id": "dff9ccbc-34d7-47c1-9ceb-48d7472e693d",
545+
"id": "8469c20d-3ef5-4868-af50-d603584ed8a7",
485546
"exec": [
486547
"var rsp = pm.response.json();",
487548
"if(rsp.id) pm.environment.set(\"roleId\", rsp.id);"
@@ -716,7 +777,7 @@
716777
{
717778
"listen": "test",
718779
"script": {
719-
"id": "cce4f7a5-d16c-4bb4-bb46-e8e519f9ec11",
780+
"id": "d4ca59b9-f350-4c91-9667-a5e749eed956",
720781
"exec": [
721782
""
722783
],
@@ -958,7 +1019,7 @@
9581019
{
9591020
"listen": "test",
9601021
"script": {
961-
"id": "d6b690ec-4b75-4a8f-9099-16464365f51f",
1022+
"id": "ff10985c-75c8-48ba-b522-2c8213b0c6cd",
9621023
"exec": [
9631024
"var rsp = pm.response.json();",
9641025
"if(rsp.id) pm.environment.set(\"organizationId\", rsp.id);"
@@ -1193,7 +1254,7 @@
11931254
{
11941255
"listen": "test",
11951256
"script": {
1196-
"id": "e401a38a-b4cb-4b5b-8fdd-24e91249f6ff",
1257+
"id": "0a875ba8-b4dc-42cc-b8ba-deb560b73556",
11971258
"exec": [
11981259
"var rsp = pm.response.json();",
11991260
"if(rsp.id) pm.environment.set(\"skillsProviderId\", rsp.id);"
@@ -1428,7 +1489,7 @@
14281489
{
14291490
"listen": "test",
14301491
"script": {
1431-
"id": "a4db0fe1-638f-4d8d-81c8-08967498d1de",
1492+
"id": "909e2488-3801-4b57-90c5-6a6ae2e91f13",
14321493
"exec": [
14331494
"var rsp = pm.response.json();",
14341495
"if(rsp.id) pm.environment.set(\"skillId\", rsp.id);"
@@ -1664,7 +1725,7 @@
16641725
{
16651726
"listen": "test",
16661727
"script": {
1667-
"id": "95226f08-c8a4-4915-91bb-8018ba933ac3",
1728+
"id": "e3241acb-646f-4ec8-83fb-8a3d63da4990",
16681729
"exec": [
16691730
""
16701731
],
@@ -1912,7 +1973,7 @@
19121973
{
19131974
"listen": "test",
19141975
"script": {
1915-
"id": "63cd9db1-0910-4834-a3a6-519a8e2bea9f",
1976+
"id": "ee9256b0-cdc2-4194-9da7-c0b363082385",
19161977
"exec": [
19171978
""
19181979
],
@@ -2160,7 +2221,7 @@
21602221
{
21612222
"listen": "test",
21622223
"script": {
2163-
"id": "b6c6134f-a0af-4f0e-b5b2-90c6c2409491",
2224+
"id": "3c959e64-93e9-480d-b92e-44eacb46c2b1",
21642225
"exec": [
21652226
"var rsp = pm.response.json();",
21662227
"if(rsp.id) pm.environment.set(\"achievementsProviderId\", rsp.id);"
@@ -2395,7 +2456,7 @@
23952456
{
23962457
"listen": "test",
23972458
"script": {
2398-
"id": "33ed1f80-a4b5-4984-89b4-4c53836b9966",
2459+
"id": "9b4f70b8-3ca8-4c1c-a65a-8a8b37e2fa62",
23992460
"exec": [
24002461
""
24012462
],
@@ -2644,7 +2705,7 @@
26442705
{
26452706
"listen": "test",
26462707
"script": {
2647-
"id": "a0d7915e-0e12-4108-bf56-5d4767c03974",
2708+
"id": "fb796928-9848-47a3-be88-61a8fc9e60f7",
26482709
"exec": [
26492710
"var rsp = pm.response.json();",
26502711
"if (rsp.id) pm.environment.set(\"attributeGroupId\", rsp.id);"
@@ -2885,7 +2946,7 @@
28852946
{
28862947
"listen": "test",
28872948
"script": {
2888-
"id": "d6d57cb8-63a2-4778-b1e2-4dbc361aee0f",
2949+
"id": "eb028137-ee03-496c-a812-2966380bca42",
28892950
"exec": [
28902951
"var rsp = pm.response.json();",
28912952
"if (rsp.id) pm.environment.set(\"attributeId\", rsp.id);"
@@ -3125,7 +3186,7 @@
31253186
{
31263187
"listen": "test",
31273188
"script": {
3128-
"id": "0da60ea8-92b2-43e4-985a-4a507b26b59a",
3189+
"id": "06c18b73-b9e6-46a8-acfa-74fc7ae68ac5",
31293190
"exec": [
31303191
""
31313192
],

src/common/es-helper.js

Lines changed: 45 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -772,6 +772,36 @@ function isRegexReserved (char) {
772772
return reserved.indexOf(char) !== -1
773773
}
774774

775+
function buildEsQueryToGetAchievements (organizationId, keyword, size) {
776+
const queryDoc = DOCUMENTS.user
777+
778+
const esQuery = {
779+
index: queryDoc.index,
780+
type: queryDoc.type,
781+
body: {
782+
size: 0,
783+
query: {
784+
bool: {
785+
filter: []
786+
}
787+
},
788+
aggs: {
789+
achievements: {
790+
terms: {
791+
field: `${USER_FILTER_TO_MODEL.achievement.esDocumentValueQuery}.keyword`,
792+
include: `.*${keyword.replace(/[^a-zA-Z]/g, c => `[${!isRegexReserved(c) ? c : '\\' + c}]`).replace(/[A-Za-z]/g, c => `[${c.toLowerCase()}${c.toUpperCase()}]`)}.*`,
793+
size: size || 1000
794+
}
795+
}
796+
}
797+
}
798+
}
799+
800+
setUserOrganizationFiilterToEsQuery(esQuery.body.query.bool.filter, organizationId)
801+
802+
return esQuery
803+
}
804+
775805
/**
776806
* Build ES Query to get attribute values by attributeId
777807
* @param attributeId the attribute whose values to fetch
@@ -1382,9 +1412,23 @@ async function searchAttributeValues ({ attributeId, attributeValue }) {
13821412
return { result }
13831413
}
13841414

1415+
async function searchAchievementValues ({ organizationId, keyword }) {
1416+
const esQuery = buildEsQueryToGetAchievements(organizationId, querystring.unescape(keyword), 5)
1417+
logger.debug(`ES query for searching achievement values; ${JSON.stringify(esQuery, null, 2)}`)
1418+
1419+
const esResult = await esClient.search(esQuery)
1420+
logger.debug(`ES response ${JSON.stringify(esResult, null, 2)}`)
1421+
const result = esResult.aggregations.achievements.buckets.map(a => ({ name: a.key }))
1422+
1423+
return {
1424+
result
1425+
}
1426+
}
1427+
13851428
module.exports = {
13861429
searchElasticSearch,
13871430
getFromElasticSearch,
13881431
searchUsers,
1389-
searchAttributeValues
1432+
searchAttributeValues,
1433+
searchAchievementValues
13901434
}

src/modules/search/controller.js

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,16 @@ async function searchAttributeValues (req, res) {
2121
res.send(result.result)
2222
}
2323

24+
/**
25+
* Search for achievement values
26+
*/
27+
async function searchAchievementValues (req, res) {
28+
const result = await esHelper.searchAchievementValues(req.query)
29+
res.send(result.result)
30+
}
31+
2432
module.exports = {
2533
searchUsers,
26-
searchAttributeValues
34+
searchAttributeValues,
35+
searchAchievementValues
2736
}

src/modules/search/route.js

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,5 +21,13 @@ module.exports = {
2121
access: consts.AdminUser,
2222
scopes: ['create:userAttribute', 'all:userAttribute']
2323
}
24+
},
25+
'/search/userAchievements': {
26+
get: {
27+
method: Controller.searchAchievementValues,
28+
auth: 'jwt',
29+
access: consts.AdminUser,
30+
scopes: ['create:userAttribute', 'all:userAttribute']
31+
}
2432
}
2533
}

0 commit comments

Comments
 (0)