@@ -1133,6 +1133,62 @@ async function update (currentUser, challengeId, data, userToken, isFull) {
1133
1133
return challenge
1134
1134
}
1135
1135
1136
+ /**
1137
+ * Remove unwanted properties from the challenge object
1138
+ * @param {Object } challenge the challenge object
1139
+ */
1140
+ function sanitizeChallenge ( challenge ) {
1141
+ const sanitized = _ . pick ( challenge , [
1142
+ 'typeId' ,
1143
+ 'name' ,
1144
+ 'description' ,
1145
+ 'privateDescription' ,
1146
+ 'descriptionFormat' ,
1147
+ 'timelineTemplateId' ,
1148
+ 'tags' ,
1149
+ 'projectId' ,
1150
+ 'legacyId' ,
1151
+ 'startDate' ,
1152
+ 'status' ,
1153
+ 'attachmentIds' ,
1154
+ 'groups'
1155
+ ] )
1156
+ if ( challenge . legacy ) {
1157
+ sanitized . legacy = _ . pick ( challenge . legacy , [
1158
+ 'track' ,
1159
+ 'reviewType' ,
1160
+ 'confidentialityType' ,
1161
+ 'forumId' ,
1162
+ 'directProjectId' ,
1163
+ 'screeningScorecardId' ,
1164
+ 'reviewScorecardId' ,
1165
+ 'informixModified'
1166
+ ] )
1167
+ }
1168
+ if ( challenge . metadata ) {
1169
+ sanitized . metadata = _ . map ( challenge . metadata , meta => _ . pick ( meta , [ 'name' , 'value' ] ) )
1170
+ }
1171
+ if ( challenge . phases ) {
1172
+ sanitized . phases = _ . map ( challenge . phases , phase => _ . pick ( phase , [ 'phaseId' , 'duration' ] ) )
1173
+ }
1174
+ if ( challenge . prizeSets ) {
1175
+ sanitized . prizeSets = _ . map ( challenge . prizeSets , prizeSet => ( {
1176
+ ..._ . pick ( prizeSet , [ 'type' , 'description' ] ) ,
1177
+ prizes : _ . map ( prizeSet . prizes , prize => _ . pick ( prize , [ 'description' , 'type' , 'value' ] ) )
1178
+ } ) )
1179
+ }
1180
+ if ( challenge . events ) {
1181
+ sanitized . events = _ . map ( challenge . events , event => _ . pick ( event , [ 'id' , 'name' , 'key' ] ) )
1182
+ }
1183
+ if ( challenge . winners ) {
1184
+ sanitized . winners = _ . map ( challenge . winners , winner => _ . pick ( winner , [ 'userId' , 'handle' , 'placement' ] ) )
1185
+ }
1186
+ if ( challenge . terms ) {
1187
+ sanitized . terms = _ . map ( challenge . terms , term => _ . pick ( term , [ 'id' , 'roleId' ] ) )
1188
+ }
1189
+ return sanitized
1190
+ }
1191
+
1136
1192
/**
1137
1193
* Fully update challenge.
1138
1194
* @param {Object } currentUser the user who perform operation
@@ -1142,7 +1198,7 @@ async function update (currentUser, challengeId, data, userToken, isFull) {
1142
1198
* @returns {Object } the updated challenge
1143
1199
*/
1144
1200
async function fullyUpdateChallenge ( currentUser , challengeId , data , userToken ) {
1145
- return update ( currentUser , challengeId , data , userToken , true )
1201
+ return update ( currentUser , challengeId , sanitizeChallenge ( data ) , userToken , true )
1146
1202
}
1147
1203
1148
1204
fullyUpdateChallenge . schema = {
@@ -1158,7 +1214,7 @@ fullyUpdateChallenge.schema = {
1158
1214
screeningScorecardId : Joi . number ( ) . integer ( ) ,
1159
1215
reviewScorecardId : Joi . number ( ) . integer ( ) ,
1160
1216
informixModified : Joi . string ( )
1161
- } ) ,
1217
+ } ) . unknown ( true ) ,
1162
1218
typeId : Joi . optionalId ( ) ,
1163
1219
name : Joi . string ( ) . required ( ) ,
1164
1220
description : Joi . string ( ) ,
@@ -1167,12 +1223,12 @@ fullyUpdateChallenge.schema = {
1167
1223
metadata : Joi . array ( ) . items ( Joi . object ( ) . keys ( {
1168
1224
name : Joi . string ( ) . required ( ) ,
1169
1225
value : Joi . required ( )
1170
- } ) ) . unique ( ( a , b ) => a . name === b . name ) ,
1226
+ } ) . unknown ( true ) ) . unique ( ( a , b ) => a . name === b . name ) ,
1171
1227
timelineTemplateId : Joi . string ( ) , // Joi.optionalId(),
1172
1228
phases : Joi . array ( ) . items ( Joi . object ( ) . keys ( {
1173
1229
phaseId : Joi . id ( ) ,
1174
1230
duration : Joi . number ( ) . positive ( )
1175
- } ) ) ,
1231
+ } ) . unknown ( true ) ) ,
1176
1232
prizeSets : Joi . array ( ) . items ( Joi . object ( ) . keys ( {
1177
1233
type : Joi . string ( ) . valid ( _ . values ( constants . prizeSetTypes ) ) . required ( ) ,
1178
1234
description : Joi . string ( ) ,
@@ -1181,12 +1237,12 @@ fullyUpdateChallenge.schema = {
1181
1237
type : Joi . string ( ) . required ( ) ,
1182
1238
value : Joi . number ( ) . min ( 0 ) . required ( )
1183
1239
} ) ) . min ( 1 ) . required ( )
1184
- } ) ) ,
1240
+ } ) . unknown ( true ) ) ,
1185
1241
events : Joi . array ( ) . items ( Joi . object ( ) . keys ( {
1186
1242
id : Joi . number ( ) . required ( ) ,
1187
1243
name : Joi . string ( ) ,
1188
1244
key : Joi . string ( )
1189
- } ) ) ,
1245
+ } ) . unknown ( true ) ) ,
1190
1246
tags : Joi . array ( ) . items ( Joi . string ( ) . required ( ) ) , // tag names
1191
1247
projectId : Joi . number ( ) . integer ( ) . positive ( ) . required ( ) ,
1192
1248
legacyId : Joi . number ( ) . integer ( ) . positive ( ) ,
@@ -1199,12 +1255,12 @@ fullyUpdateChallenge.schema = {
1199
1255
userId : Joi . number ( ) . integer ( ) . positive ( ) . required ( ) ,
1200
1256
handle : Joi . string ( ) . required ( ) ,
1201
1257
placement : Joi . number ( ) . integer ( ) . positive ( ) . required ( )
1202
- } ) ) . min ( 1 ) ,
1258
+ } ) . unknown ( true ) ) . min ( 1 ) ,
1203
1259
terms : Joi . array ( ) . items ( Joi . object ( ) . keys ( {
1204
1260
id : Joi . id ( ) ,
1205
1261
roleId : Joi . id ( )
1206
- } ) ) . optional ( ) . allow ( [ ] )
1207
- } ) . required ( ) ,
1262
+ } ) . unknown ( true ) ) . optional ( ) . allow ( [ ] )
1263
+ } ) . unknown ( true ) . required ( ) ,
1208
1264
userToken : Joi . any ( )
1209
1265
}
1210
1266
@@ -1217,7 +1273,7 @@ fullyUpdateChallenge.schema = {
1217
1273
* @returns {Object } the updated challenge
1218
1274
*/
1219
1275
async function partiallyUpdateChallenge ( currentUser , challengeId , data , userToken ) {
1220
- return update ( currentUser , challengeId , data , userToken )
1276
+ return update ( currentUser , challengeId , sanitizeChallenge ( data ) , userToken )
1221
1277
}
1222
1278
1223
1279
partiallyUpdateChallenge . schema = {
@@ -1231,7 +1287,7 @@ partiallyUpdateChallenge.schema = {
1231
1287
directProjectId : Joi . number ( ) ,
1232
1288
forumId : Joi . number ( ) . integer ( ) . positive ( ) ,
1233
1289
informixModified : Joi . string ( )
1234
- } ) ,
1290
+ } ) . unknown ( true ) ,
1235
1291
typeId : Joi . optionalId ( ) ,
1236
1292
name : Joi . string ( ) ,
1237
1293
description : Joi . string ( ) ,
@@ -1240,17 +1296,17 @@ partiallyUpdateChallenge.schema = {
1240
1296
metadata : Joi . array ( ) . items ( Joi . object ( ) . keys ( {
1241
1297
name : Joi . string ( ) . required ( ) ,
1242
1298
value : Joi . required ( )
1243
- } ) ) . unique ( ( a , b ) => a . name === b . name ) ,
1299
+ } ) . unknown ( true ) ) . unique ( ( a , b ) => a . name === b . name ) ,
1244
1300
timelineTemplateId : Joi . string ( ) , // changing this to update migrated challenges
1245
1301
phases : Joi . array ( ) . items ( Joi . object ( ) . keys ( {
1246
1302
phaseId : Joi . id ( ) ,
1247
1303
duration : Joi . number ( ) . positive ( )
1248
- } ) ) . min ( 1 ) ,
1304
+ } ) . unknown ( true ) ) . min ( 1 ) ,
1249
1305
events : Joi . array ( ) . items ( Joi . object ( ) . keys ( {
1250
1306
id : Joi . number ( ) . required ( ) ,
1251
1307
name : Joi . string ( ) ,
1252
1308
key : Joi . string ( )
1253
- } ) ) ,
1309
+ } ) . unknown ( true ) ) ,
1254
1310
startDate : Joi . date ( ) ,
1255
1311
prizeSets : Joi . array ( ) . items ( Joi . object ( ) . keys ( {
1256
1312
type : Joi . string ( ) . valid ( _ . values ( constants . prizeSetTypes ) ) . required ( ) ,
@@ -1260,7 +1316,7 @@ partiallyUpdateChallenge.schema = {
1260
1316
type : Joi . string ( ) . required ( ) ,
1261
1317
value : Joi . number ( ) . min ( 0 ) . required ( )
1262
1318
} ) ) . min ( 1 ) . required ( )
1263
- } ) ) . min ( 1 ) ,
1319
+ } ) . unknown ( true ) ) . min ( 1 ) ,
1264
1320
tags : Joi . array ( ) . items ( Joi . string ( ) . required ( ) ) . min ( 1 ) , // tag names
1265
1321
projectId : Joi . number ( ) . integer ( ) . positive ( ) ,
1266
1322
legacyId : Joi . number ( ) . integer ( ) . positive ( ) ,
@@ -1272,9 +1328,9 @@ partiallyUpdateChallenge.schema = {
1272
1328
userId : Joi . number ( ) . integer ( ) . positive ( ) . required ( ) ,
1273
1329
handle : Joi . string ( ) . required ( ) ,
1274
1330
placement : Joi . number ( ) . integer ( ) . positive ( ) . required ( )
1275
- } ) ) . min ( 1 ) ,
1331
+ } ) . unknown ( true ) ) . min ( 1 ) ,
1276
1332
terms : Joi . array ( ) . items ( Joi . id ( ) . optional ( ) ) . optional ( ) . allow ( [ ] )
1277
- } ) . required ( ) ,
1333
+ } ) . unknown ( true ) . required ( ) ,
1278
1334
userToken : Joi . any ( )
1279
1335
}
1280
1336
0 commit comments