Explorar el Código

:recycle: auto-filling surveys from the frontend | login route handling after sign-up

tags/0.0.1
J hace 4 años
padre
commit
3b21a946f5

+ 5
- 2
backend/db/data-generator/config.json Ver fichero

1
 {
1
 {
2
     "mockOutputPath": "./db/generated",
2
     "mockOutputPath": "./db/generated",
3
     "magic": 10000,
3
     "magic": 10000,
4
-    "total": 50,
4
+    "total": 5,
5
     "batchSize": 5,
5
     "batchSize": 5,
6
     "percentageOfSeekers": 90,
6
     "percentageOfSeekers": 90,
7
     "scoreVals": [107, 414, 721, 1028, 1336, 1648, 2056],
7
     "scoreVals": [107, 414, 721, 1028, 1336, 1648, 2056],
28
         "91399",
28
         "91399",
29
         "91401",
29
         "91401",
30
         "97075"
30
         "97075"
31
-    ]
31
+    ],
32
+    "resKeys": [1, 2, 3, 4, 5, 6],
33
+    "zipcodeKey": 7,
34
+    "maxDistanceKey": 16
32
 }
35
 }

+ 16
- 16
backend/db/data-generator/index.js Ver fichero

134
             }
134
             }
135
             else {
135
             else {
136
                 switch (resToEdit.response_key_id) {
136
                 switch (resToEdit.response_key_id) {
137
-                    case 8:
138
-                        resToEdit.val = random.media()
139
-                        break
140
-                    case 9:
141
-                        resToEdit.val = random.language()
142
-                        break
143
-                    case 10:
144
-                        resToEdit.val = random.duration()
145
-                        break
146
-                    case 11:
147
-                        resToEdit.val = random.location()
148
-                        break
149
-                    case 12:
150
-                        resToEdit.val = random.blurb()
151
-                        break
137
+                case 8:
138
+                    resToEdit.val = random.media()
139
+                    break
140
+                case 9:
141
+                    resToEdit.val = random.language()
142
+                    break
143
+                case 10:
144
+                    resToEdit.val = random.duration()
145
+                    break
146
+                case 11:
147
+                    resToEdit.val = random.location()
148
+                    break
149
+                case 12:
150
+                    resToEdit.val = random.blurb()
151
+                    break
152
                 }
152
                 }
153
             }
153
             }
154
         }
154
         }
155
     })
155
     })
156
-    generatedResponseCount = generatedResponseCount + responses.length
156
+    // generatedResponseCount = generatedResponseCount + responses.length
157
     console.log('COMPLETED: Generated Responses...')
157
     console.log('COMPLETED: Generated Responses...')
158
     return responses
158
     return responses
159
 }
159
 }

+ 3
- 90
backend/db/data-generator/mock.js Ver fichero

191
     ],
191
     ],
192
     responses: [],
192
     responses: [],
193
     memberships: [
193
     memberships: [
194
-        {
195
-            membership_id: 1,
196
-            profile_id: 45,
197
-            grouping_id: 1,
198
-            membership_type: 'participant',
199
-            can_edit: 0,
200
-            is_active: 1,
201
-        },
202
-        {
203
-            membership_id: 2,
204
-            profile_id: 2,
205
-            grouping_id: 1,
206
-            membership_type: 'participant',
207
-            can_edit: 0,
208
-            is_active: 1,
209
-        },
210
-        {
211
-            membership_id: 3,
212
-            profile_id: 45,
213
-            grouping_id: 2,
214
-            membership_type: 'participant',
215
-            can_edit: 0,
216
-            is_active: 1,
217
-        },
218
-        {
219
-            membership_id: 4,
220
-            profile_id: 3,
221
-            grouping_id: 2,
222
-            membership_type: 'participant',
223
-            can_edit: 0,
224
-            is_active: 0,
225
-        }
194
+       
226
     ],
195
     ],
227
     groupings: [
196
     groupings: [
228
-        {
229
-            grouping_id: 1,
230
-            grouping_name: '1654664154.291_45_2',
231
-            grouping_type: 'match',
232
-        },
233
-        {
234
-            grouping_id: 2,
235
-            grouping_name: '1654664154.291_45_3',
236
-            grouping_type: 'match',
237
-        }
197
+       
238
     ],
198
     ],
239
     messages: [],
199
     messages: [],
240
     match_queues: [
200
     match_queues: [
241
-        {
242
-            match_queue_id: 1,
243
-            profile_id: 45,
244
-            target_id: 1,
245
-            is_deleted: false,
246
-        },
247
-        {
248
-            match_queue_id: 2,
249
-            profile_id: 45,
250
-            target_id: 5,
251
-            is_deleted: false,
252
-        },
253
-        {
254
-            match_queue_id: 3,
255
-            profile_id: 45,
256
-            target_id: 6,
257
-            is_deleted: false,
258
-        },
259
-        {
260
-            match_queue_id: 4,
261
-            profile_id: 45,
262
-            target_id: 7,
263
-            is_deleted: false,
264
-        },
265
-        {
266
-            match_queue_id: 5,
267
-            profile_id: 45,
268
-            target_id: 8,
269
-            is_deleted: false,
270
-        },
271
-        {
272
-            match_queue_id: 6,
273
-            profile_id: 45,
274
-            target_id: 9,
275
-            is_deleted: false,
276
-        },
277
-        {
278
-            match_queue_id: 7,
279
-            profile_id: 2,
280
-            target_id: 4,
281
-            is_deleted: false,
282
-        },
283
-        {
284
-            match_queue_id: 8,
285
-            profile_id: 2,
286
-            target_id: 10,
287
-            is_deleted: false,
288
-        },
201
+        
289
     ],
202
     ],
290
 }
203
 }

+ 10
- 0
backend/db/data-generator/random.js Ver fichero

86
     return l.generate(randomNumber(50))
86
     return l.generate(randomNumber(50))
87
 }
87
 }
88
 
88
 
89
+
89
 module.exports = {
90
 module.exports = {
91
+    randomNumber,
92
+    randomValFrom,
93
+    randomEmail,
94
+    randomName,
95
+    randomMedia,
96
+    randomLang,
97
+    randomDuration,
98
+    randomLocation,
99
+    randomBlurb,
90
     number: randomNumber,
100
     number: randomNumber,
91
     valFrom: randomValFrom,
101
     valFrom: randomValFrom,
92
     email: randomEmail,
102
     email: randomEmail,

+ 1
- 1
backend/lib/routes/user/create-profile.js Ver fichero

47
         tags: ['api'],
47
         tags: ['api'],
48
         /** Protect this route with authentication? */
48
         /** Protect this route with authentication? */
49
         auth: false,
49
         auth: false,
50
-
50
+        cors: true,
51
         handler: async function (request, h) {
51
         handler: async function (request, h) {
52
             const { userService, profileService } = request.server.services()
52
             const { userService, profileService } = request.server.services()
53
             const userId = request.params.user_id
53
             const userId = request.params.user_id

+ 6
- 9
backend/lib/routes/user/signup.js Ver fichero

14
 
14
 
15
 const validators = {
15
 const validators = {
16
     post: {
16
     post: {
17
-        payload: Joi.object({
18
-            user: userSchema.userSignup,
19
-            error: errorSchema.single,
20
-        }).append().label('signup_payload')
17
+        payload: userSchema.userSignup
21
     }
18
     }
22
 }
19
 }
23
 
20
 
41
         tags: ['api'],
38
         tags: ['api'],
42
         /** Protect this route with authentication? */
39
         /** Protect this route with authentication? */
43
         auth: false,
40
         auth: false,
44
-
41
+        cors: true,
45
         handler: async function (request, h) {
42
         handler: async function (request, h) {
46
             const { userService } = request.server.services()
43
             const { userService } = request.server.services()
47
             const res = request.payload
44
             const res = request.payload
48
-            const userName = res.user.user_name
49
-            const userEmail = res.user.user_email
50
-            const userType = res.user.user_type == 'poster' ? 1 : 0
51
-            const userPw = res.user.user_pass ? res.user.user_pass : 'changeme'
45
+            const userName = res.user_name
46
+            const userEmail = res.user_email
47
+            const userType = res.is_poster
48
+            const userPw = res.user_pass ? res.user_pass : 'changeme'
52
             try {
49
             try {
53
                 const user = await userService.signup({
50
                 const user = await userService.signup({
54
                     password: userPw,
51
                     password: userPw,

+ 49
- 46
backend/lib/services/profile.js Ver fichero

2
 const haversine = require('haversine')
2
 const haversine = require('haversine')
3
 const config = require('../../db/data-generator/config.json')
3
 const config = require('../../db/data-generator/config.json')
4
 
4
 
5
-// Keys that are profile data responses
6
-const _TEMP_RES_KEYS = [1, 2, 3, 4, 5, 6]
7
-const _ZIPCODEKEY = 7
5
+const _isScorableResponse = res_key_id => {
6
+    let isScorable = false
7
+    if(config.resKeys.includes(res_key_id)) {
8
+        isScorable = true
9
+    }
10
+    return isScorable
11
+}
12
+
8
 const scoreResponses = (seeker, potentialMatch, prescoreLookup) => {
13
 const scoreResponses = (seeker, potentialMatch, prescoreLookup) => {
9
     if (seeker.responses.length != potentialMatch.responses.length)
14
     if (seeker.responses.length != potentialMatch.responses.length)
10
         return {
15
         return {
12
         }
17
         }
13
 
18
 
14
     const aRes = seeker.responses.filter(
19
     const aRes = seeker.responses.filter(
15
-        res => _TEMP_RES_KEYS.includes(res.response_key_id)
20
+        res =>  _isScorableResponse(res.response_key_id)
16
     )
21
     )
17
     const bRes = potentialMatch.responses.filter(
22
     const bRes = potentialMatch.responses.filter(
18
-        res => _TEMP_RES_KEYS.includes(res.response_key_id)
23
+        res =>  _isScorableResponse(res.response_key_id)
19
     )
24
     )
20
 
25
 
21
     const composite = []
26
     const composite = []
56
  */
61
  */
57
 const getZipCodeFromProfile = profile => {
62
 const getZipCodeFromProfile = profile => {
58
     // There should only be one zip code entry per profile
63
     // There should only be one zip code entry per profile
59
-    let zipRes = profile.responses.filter(
60
-        // Whatever the zipcode questions is
61
-        response => response.response_key_id == _ZIPCODEKEY,
62
-    )[0]
63
-
64
-    const responseIndexForZip = profile.responses.indexOf(zipRes)
65
-    if (responseIndexForZip >= 0) {
66
-        profile.responses.splice(responseIndexForZip, 1)
67
-    }
64
+    let zipRes = profile.responses.find(
65
+        res => res.response_key_id == 7
66
+    )
68
     return zipRes.val
67
     return zipRes.val
69
 }
68
 }
70
 
69
 
106
         this.profile_languages = []
105
         this.profile_languages = []
107
         this.profile_prefs = {}
106
         this.profile_prefs = {}
108
         if (profile?.responses?.length) {
107
         if (profile?.responses?.length) {
109
-            this.responses = profile.responses.filter(
110
-                res => !_TEMP_RES_KEYS.includes(res.response_key_id),
111
-            ) // [] of all responses
112
-            const [image, language, duration, location, description] =
113
-                profile.responses.filter(res =>
114
-                    _TEMP_RES_KEYS.includes(res.response_key_id),
115
-                )
116
-            this.profile_prefs.location = location.val
117
-            this.profile_prefs.duration = duration.val
118
-            this.profile_prefs.zip = profile.responses.filter(
119
-                res => res.response_key_id == 7,
120
-            )[0].val // [] of all responses
121
-            this.profile_description = description.val
122
-            this.profile_media.push(image.val)
123
-            this.profile_languages.push(language.val)
108
+            // [] of all "profile" responses
109
+            this.responses = profile.responses
110
+            // image, language, duration, presence, blurb, urgency, role, pronouns, distance
111
+            const prefs = ['presence', 'duration', 'zipcode']
112
+            prefs.forEach(pref => {
113
+                this.profile_prefs[pref] = this.responses.filter(
114
+                    r => r.response_key_prompt === pref
115
+                )[0]
116
+            })
117
+            this.profile_description = this.responses.filter(r=> r.response_key_prompt === 'blurb')[0]
118
+            this.profile_media = this.responses.filter(r => r.response_key_prompt === 'image')
119
+            this.profile_languages = this.responses.filter(r => r.response_key_prompt === 'language')
124
         }
120
         }
125
     }
121
     }
126
 }
122
 }
261
             user_id: userId,
257
             user_id: userId,
262
         })
258
         })
263
         for (const responseToSave of responses) {
259
         for (const responseToSave of responses) {
260
+            /**
261
+             * Convert indexes to actual score values
262
+             * Using using the input and converting to index
263
+             * of the generated possible prescore array in config
264
+             * DUPLICATE:See saveResponseForProfile() line 343
265
+             */ 
266
+            let convertedResponse = responseToSave
267
+            if(_isScorableResponse(responseToSave.response_key_id)) {
268
+                // Convert -3 to 0, 0 to 3, 3 to 6
269
+                const offset = (config.scoreVals.length - 1) / 2
270
+                const indexFromInput = parseInt(responseToSave.val) + offset
271
+                convertedResponse.val = config.scoreVals[indexFromInput].toString()
272
+            }
273
+
264
             const responseInfo = {
274
             const responseInfo = {
265
                 profile_id: profile.id,
275
                 profile_id: profile.id,
266
-                response_key_id: responseToSave.response_key_id,
267
-                val: responseToSave.val,
276
+                response_key_id: convertedResponse.response_key_id,
277
+                val: convertedResponse.val,
268
             }
278
             }
269
             await Response.query(txn).insert(responseInfo)
279
             await Response.query(txn).insert(responseInfo)
270
         }
280
         }
332
          * of the generated possible prescore array in config
342
          * of the generated possible prescore array in config
333
          */ 
343
          */ 
334
         let convertedResponse = responseToSave
344
         let convertedResponse = responseToSave
335
-        if(_TEMP_RES_KEYS.includes(responseToSave.response_key_id)) {
345
+        if(_isScorableResponse(responseToSave.response_key_id)) {
336
             // Convert -3 to 0, 0 to 3, 3 to 6
346
             // Convert -3 to 0, 0 to 3, 3 to 6
337
             const offset = (config.scoreVals.length - 1) / 2
347
             const offset = (config.scoreVals.length - 1) / 2
338
             const indexFromInput = parseInt(responseToSave.val) + offset
348
             const indexFromInput = parseInt(responseToSave.val) + offset
339
-            convertedResponse.val = config.scoreVals[indexFromInput]
349
+            convertedResponse.val = config.scoreVals[indexFromInput].toString()
340
         }
350
         }
341
 
351
 
342
         await Response.query().insert(convertedResponse)
352
         await Response.query().insert(convertedResponse)
375
             .findOne('profile_id', profileId)
385
             .findOne('profile_id', profileId)
376
             .withGraphFetched('responses')
386
             .withGraphFetched('responses')
377
             .withGraphFetched('user')
387
             .withGraphFetched('user')
378
-
388
+        
379
         // Move unneeded responses
389
         // Move unneeded responses
380
         const userZip = getZipCodeFromProfile(userProfile)
390
         const userZip = getZipCodeFromProfile(userProfile)
381
 
391
 
387
 
397
 
388
         // TODO: Let Objection optimize this
398
         // TODO: Let Objection optimize this
389
         const isPosterOpposite = userProfile.user.is_poster == 1 ? 0 : 1
399
         const isPosterOpposite = userProfile.user.is_poster == 1 ? 0 : 1
390
-        profileIdsOfOppositeType = profileIdsOfOppositeType.filter(
391
-            profile => profile.user.is_poster == isPosterOpposite,
392
-        )
393
-
394
-        // Only include profiles that included zipcode response
395
         profileIdsOfOppositeType = profileIdsOfOppositeType.filter(profile => {
400
         profileIdsOfOppositeType = profileIdsOfOppositeType.filter(profile => {
396
-            const zipcodeResponses = profile.responses.filter(
397
-                res => res.response_key_id == _ZIPCODEKEY,
398
-            )
399
-            return zipcodeResponses.length > 0
401
+            return profile.user.is_poster == isPosterOpposite
402
+        }).filter(profile => {
403
+            // Only include profiles that included zipcode response
404
+            return getZipCodeFromProfile(profile) ? true : false
400
         })
405
         })
401
-
406
+        
402
         const profilePlusDistance = await Promise.all(
407
         const profilePlusDistance = await Promise.all(
403
             profileIdsOfOppositeType.map(async profile => {
408
             profileIdsOfOppositeType.map(async profile => {
404
                 const targetZip = getZipCodeFromProfile(profile)
409
                 const targetZip = getZipCodeFromProfile(profile)
417
                 }
422
                 }
418
             }),
423
             }),
419
         )
424
         )
420
-
421
         const distanceFilteredProfiles = filterByDistance(
425
         const distanceFilteredProfiles = filterByDistance(
422
             profilePlusDistance,
426
             profilePlusDistance,
423
             maxDistance,
427
             maxDistance,
424
         )
428
         )
425
-
426
         const scoredProfilesWithDistance = scoreAll(
429
         const scoredProfilesWithDistance = scoreAll(
427
             distanceFilteredProfiles,
430
             distanceFilteredProfiles,
428
             userProfile,
431
             userProfile,

Loading…
Cancelar
Guardar