Procházet zdrojové kódy

:recycle: mapping input to score array | saving email | tweaking guard to use survey

tags/0.0.1
J před 4 roky
rodič
revize
679531049d

+ 16
- 16
backend/db/data-generator/mock.js Zobrazit soubor

95
             response_key_id: 1,
95
             response_key_id: 1,
96
             response_key_category: 'grit',
96
             response_key_category: 'grit',
97
             response_key_prompt: 'can you power through adversity',
97
             response_key_prompt: 'can you power through adversity',
98
-            response_key_description: null,
98
+            response_key_description: 'first round draft scoring question',
99
         },
99
         },
100
         {
100
         {
101
             response_key_id: 2,
101
             response_key_id: 2,
102
             response_key_category: 'openness',
102
             response_key_category: 'openness',
103
             response_key_prompt: 'are you open with your emotions with everyone',
103
             response_key_prompt: 'are you open with your emotions with everyone',
104
-            response_key_description: null,
104
+            response_key_description: 'first round draft scoring question',
105
         },
105
         },
106
         {
106
         {
107
             response_key_id: 3,
107
             response_key_id: 3,
108
             response_key_category: 'bravery',
108
             response_key_category: 'bravery',
109
             response_key_prompt: 'do you speak-up when you feel something is wrong',
109
             response_key_prompt: 'do you speak-up when you feel something is wrong',
110
-            response_key_description: null,
110
+            response_key_description: 'first round draft scoring question',
111
         },
111
         },
112
         {
112
         {
113
             response_key_id: 4,
113
             response_key_id: 4,
114
             response_key_category: 'empathy',
114
             response_key_category: 'empathy',
115
             response_key_prompt:
115
             response_key_prompt:
116
                 'do you stop to help others when they are struggling',
116
                 'do you stop to help others when they are struggling',
117
-            response_key_description: null,
117
+            response_key_description: 'first round draft scoring question',
118
         },
118
         },
119
         {
119
         {
120
             response_key_id: 5,
120
             response_key_id: 5,
121
             response_key_category: 'honesty',
121
             response_key_category: 'honesty',
122
             response_key_prompt: 'when telling a story do you exaggerate for dramatic effect',
122
             response_key_prompt: 'when telling a story do you exaggerate for dramatic effect',
123
-            response_key_description: null,
123
+            response_key_description: 'first round draft scoring question',
124
         },
124
         },
125
         {
125
         {
126
             response_key_id: 6,
126
             response_key_id: 6,
127
             response_key_category: 'respect',
127
             response_key_category: 'respect',
128
             response_key_prompt: 'do you treat difficult people as well as you treat your close friends',
128
             response_key_prompt: 'do you treat difficult people as well as you treat your close friends',
129
-            response_key_description: null,
129
+            response_key_description: 'first round draft scoring question',
130
         },
130
         },
131
         {
131
         {
132
             response_key_id: 7,
132
             response_key_id: 7,
133
             response_key_category: 'profile',
133
             response_key_category: 'profile',
134
             response_key_prompt: 'zipcode',
134
             response_key_prompt: 'zipcode',
135
-            response_key_description: null,
135
+            response_key_description: 'required for distance calculations',
136
         },
136
         },
137
         {
137
         {
138
             response_key_id: 8,
138
             response_key_id: 8,
139
             response_key_category: 'profile',
139
             response_key_category: 'profile',
140
             response_key_prompt: 'image',
140
             response_key_prompt: 'image',
141
-            response_key_description: null,
141
+            response_key_description: 'required for profile pictures',
142
         },
142
         },
143
         {
143
         {
144
             response_key_id: 9,
144
             response_key_id: 9,
145
             response_key_category: 'profile',
145
             response_key_category: 'profile',
146
             response_key_prompt: 'language',
146
             response_key_prompt: 'language',
147
-            response_key_description: null,
147
+            response_key_description: 'programming and spoken language preference',
148
         },
148
         },
149
         {
149
         {
150
             response_key_id: 10,
150
             response_key_id: 10,
151
             response_key_category: 'profile',
151
             response_key_category: 'profile',
152
             response_key_prompt: 'duration',
152
             response_key_prompt: 'duration',
153
-            response_key_description: null,
153
+            response_key_description: 'duration preference for hours able to dedicate to work',
154
         },
154
         },
155
         {
155
         {
156
             response_key_id: 11,
156
             response_key_id: 11,
157
             response_key_category: 'profile',
157
             response_key_category: 'profile',
158
             response_key_prompt: 'presence',
158
             response_key_prompt: 'presence',
159
-            response_key_description: null,
159
+            response_key_description: 'location preference for where work happens',
160
         },
160
         },
161
         {
161
         {
162
             response_key_id: 12,
162
             response_key_id: 12,
163
             response_key_category: 'profile',
163
             response_key_category: 'profile',
164
             response_key_prompt: 'blurb',
164
             response_key_prompt: 'blurb',
165
-            response_key_description: null,
165
+            response_key_description: 'required for profile description',
166
         },
166
         },
167
         {
167
         {
168
             response_key_id: 13,
168
             response_key_id: 13,
169
             response_key_category: 'profile',
169
             response_key_category: 'profile',
170
             response_key_prompt: 'urgency',
170
             response_key_prompt: 'urgency',
171
-            response_key_description: null,
171
+            response_key_description: 'urgency for when work is required',
172
         },
172
         },
173
         {
173
         {
174
             response_key_id: 14,
174
             response_key_id: 14,
175
             response_key_category: 'profile',
175
             response_key_category: 'profile',
176
             response_key_prompt: 'role',
176
             response_key_prompt: 'role',
177
-            response_key_description: null,
177
+            response_key_description: 'current and desired role',
178
         },
178
         },
179
         {
179
         {
180
             response_key_id: 15,
180
             response_key_id: 15,
181
             response_key_category: 'profile',
181
             response_key_category: 'profile',
182
             response_key_prompt: 'pronouns',
182
             response_key_prompt: 'pronouns',
183
-            response_key_description: null,
183
+            response_key_description: 'required for profile pronouns',
184
         },
184
         },
185
         {
185
         {
186
             response_key_id: 16,
186
             response_key_id: 16,
187
             response_key_category: 'profile',
187
             response_key_category: 'profile',
188
             response_key_prompt: 'distance',
188
             response_key_prompt: 'distance',
189
-            response_key_description: null,
189
+            response_key_description: 'preference for commuting distance cutoff',
190
         },
190
         },
191
     ],
191
     ],
192
     responses: [],
192
     responses: [],

+ 22
- 9
backend/lib/services/profile.js Zobrazit soubor

1
 const Schmervice = require('@hapipal/schmervice')
1
 const Schmervice = require('@hapipal/schmervice')
2
 const haversine = require('haversine')
2
 const haversine = require('haversine')
3
+const config = require('../../db/data-generator/config.json')
3
 
4
 
4
 // Keys that are profile data responses
5
 // Keys that are profile data responses
5
-const _TEMP_RES_KEYS = [8, 9, 10, 11, 12]
6
+const _TEMP_RES_KEYS = [1, 2, 3, 4, 5, 6]
6
 const _ZIPCODEKEY = 7
7
 const _ZIPCODEKEY = 7
7
 const scoreResponses = (seeker, potentialMatch, prescoreLookup) => {
8
 const scoreResponses = (seeker, potentialMatch, prescoreLookup) => {
8
     if (seeker.responses.length != potentialMatch.responses.length)
9
     if (seeker.responses.length != potentialMatch.responses.length)
11
         }
12
         }
12
 
13
 
13
     const aRes = seeker.responses.filter(
14
     const aRes = seeker.responses.filter(
14
-        res => !_TEMP_RES_KEYS.includes(res.response_key_id),
15
+        res => _TEMP_RES_KEYS.includes(res.response_key_id)
15
     )
16
     )
16
     const bRes = potentialMatch.responses.filter(
17
     const bRes = potentialMatch.responses.filter(
17
-        res => !_TEMP_RES_KEYS.includes(res.response_key_id),
18
+        res => _TEMP_RES_KEYS.includes(res.response_key_id)
18
     )
19
     )
19
 
20
 
20
     const composite = []
21
     const composite = []
129
         super(...args)
130
         super(...args)
130
         this.scoreLookup = {}
131
         this.scoreLookup = {}
131
         this.tagLookup = {}
132
         this.tagLookup = {}
132
-
133
         // this.responseKeyLookup = ResponseKey.query()
133
         // this.responseKeyLookup = ResponseKey.query()
134
     }
134
     }
135
     async _setScoreLookup() {
135
     async _setScoreLookup() {
309
         let allResponses = await Response.query().where({
309
         let allResponses = await Response.query().where({
310
             profile_id: profileId,
310
             profile_id: profileId,
311
         })
311
         })
312
+
313
+        // Delete matches
314
+        // ?:Maybe bad idea
312
         const matchingResponses = allResponses.filter(
315
         const matchingResponses = allResponses.filter(
313
             response =>
316
             response =>
314
                 response.response_key_id == responseToSave.response_key_id,
317
                 response.response_key_id == responseToSave.response_key_id,
315
         )
318
         )
316
-
317
-        // Delete matches
318
-        // ?:Maybe bad idea
319
         if (matchingResponses.length > 0) {
319
         if (matchingResponses.length > 0) {
320
             const alreadyAnswered = matchingResponses.map(
320
             const alreadyAnswered = matchingResponses.map(
321
-                matchingRes => matchingRes.response_key_id,
321
+                matchingRes => matchingRes.response_key_id
322
             )
322
             )
323
             await Response.query()
323
             await Response.query()
324
                 .where({ profile_id: profileId })
324
                 .where({ profile_id: profileId })
326
                 .whereIn('response_key_id', alreadyAnswered)
326
                 .whereIn('response_key_id', alreadyAnswered)
327
         }
327
         }
328
 
328
 
329
-        await Response.query().insert(responseToSave)
329
+        /**
330
+         * Convert indexes to actual score values
331
+         * Using using the input and converting to index
332
+         * of the generated possible prescore array in config
333
+         */ 
334
+        let convertedResponse = responseToSave
335
+        if(_TEMP_RES_KEYS.includes(responseToSave.response_key_id)) {
336
+            // Convert -3 to 0, 0 to 3, 3 to 6
337
+            const offset = (config.scoreVals.length - 1) / 2
338
+            const indexFromInput = parseInt(responseToSave.val) + offset
339
+            convertedResponse.val = config.scoreVals[indexFromInput]
340
+        }
341
+
342
+        await Response.query().insert(convertedResponse)
330
         return allResponses
343
         return allResponses
331
     }
344
     }
332
 
345
 

+ 2
- 2
frontend/src/components/ProfileCardList.vue Zobrazit soubor

9
             v-for="(profile, i) in loadedProfiles"
9
             v-for="(profile, i) in loadedProfiles"
10
             :style="{ 'z-index': 1000-i }"
10
             :style="{ 'z-index': 1000-i }"
11
         )
11
         )
12
-            .card.b-solid.rounded.p-0.bg-cover.randomize(
12
+            .card.b-solid.rounded.bg-cover.randomize(
13
                 :style="{ 'background-image': `url(${profile.avatar})`, 'top': `${randomize(10)}px`, 'right': `${randomize(20)}px`, 'transform': `rotate(${randomize(7)}deg)` }"
13
                 :style="{ 'background-image': `url(${profile.avatar})`, 'top': `${randomize(10)}px`, 'right': `${randomize(20)}px`, 'transform': `rotate(${randomize(7)}deg)` }"
14
             )
14
             )
15
                 .card__content
15
                 .card__content
27
             :key="profile.pid"
27
             :key="profile.pid"
28
             v-for="(profile, i) in loadedProfiles"
28
             v-for="(profile, i) in loadedProfiles"
29
         )
29
         )
30
-                .card.b-solid.rounded.p-0.bg-cover(
30
+                .card.b-solid.rounded.bg-cover(
31
                     :style="{ 'background-image': `url(${profile.avatar})` }"
31
                     :style="{ 'background-image': `url(${profile.avatar})` }"
32
                 )
32
                 )
33
                 .card__content
33
                 .card__content

+ 2
- 1
frontend/src/router/guards.js Zobrazit soubor

6
     console.warn('currentProfile completed:', currentProfile.isComplete())
6
     console.warn('currentProfile completed:', currentProfile.isComplete())
7
     if (
7
     if (
8
         destination.meta.requiresCompleteProfile &&
8
         destination.meta.requiresCompleteProfile &&
9
-        currentProfile.isLoggedIn() &&
9
+        !currentProfile.isLoggedIn() &&
10
         !currentProfile.isComplete() 
10
         !currentProfile.isComplete() 
11
     ) {
11
     ) {
12
         nextCb('survey')
12
         nextCb('survey')
13
     } else if(
13
     } else if(
14
+        destination.meta.requiresCompleteProfile &&
14
         destination.meta.requiresAuth &&
15
         destination.meta.requiresAuth &&
15
         !currentProfile.isLoggedIn()
16
         !currentProfile.isLoggedIn()
16
     ) {
17
     ) {

+ 1
- 1
frontend/src/services/login.service.js Zobrazit soubor

24
         return this.id.value != null
24
         return this.id.value != null
25
     }
25
     }
26
     isComplete() {
26
     isComplete() {
27
-        return this.responses.length == surveyFactory.questions.length
27
+        return this.responses.length == surveyFactory.questionsFromDb.length && surveyFactory.questionsFromDb.length > 0
28
     }
28
     }
29
     hasResponses() {
29
     hasResponses() {
30
         return this.responses.length && this.responses.length > 0
30
         return this.responses.length && this.responses.length > 0

+ 3
- 0
frontend/src/utils/lang.js Zobrazit soubor

1
 const DELIMITER = '_'
1
 const DELIMITER = '_'
2
 
2
 
3
 const stepToComponentMap = {
3
 const stepToComponentMap = {
4
+    email: 'InputString',
4
     name: 'InputString',
5
     name: 'InputString',
5
     seeking: 'ButtonChoice',
6
     seeking: 'ButtonChoice',
6
     urgency: 'ButtonChoice',
7
     urgency: 'ButtonChoice',
18
 // TODO: Combine these two
19
 // TODO: Combine these two
19
 const allSteps = {
20
 const allSteps = {
20
     usa: {
21
     usa: {
22
+        email: 'email',
21
         name: 'name',
23
         name: 'name',
22
         pronouns: 'pronouns',
24
         pronouns: 'pronouns',
23
         seeking: 'seeking',
25
         seeking: 'seeking',
50
 
52
 
51
 const possible = {}
53
 const possible = {}
52
 possible.usa = {
54
 possible.usa = {
55
+    email: [],
53
     name: [],
56
     name: [],
54
     seeking: ['position', 'candidate'],
57
     seeking: ['position', 'candidate'],
55
     language: [
58
     language: [

+ 8
- 4
frontend/src/utils/survey.js Zobrazit soubor

25
         return [...stepsInCommon, ...unseen]
25
         return [...stepsInCommon, ...unseen]
26
     }
26
     }
27
     async getQuestions() {
27
     async getQuestions() {
28
-        this.questionsFromDb = await fetchQuestions()
28
+        try {
29
+            this.questionsFromDb = await fetchQuestions()
30
+            return this.questionsFromDb
31
+        } catch(err) {
32
+            console.error(err)
33
+        }
29
     }
34
     }
30
     async createSurvey(langFile, roleTree) {
35
     async createSurvey(langFile, roleTree) {
31
         if(!this.questionsFromDb.length) {
36
         if(!this.questionsFromDb.length) {
32
-            console.error('Attempted to create a survey before getting questions')
33
-            await this.getQuestions()
37
+            const res = await this.getQuestions()
38
+            console.warn(`Attempted to create a survey before getting questions: retrieved ${res.length} questions`)
34
         }
39
         }
35
-
36
         const steps = this._setSteps(langFile)
40
         const steps = this._setSteps(langFile)
37
         return new Survey(steps, roleTree)
41
         return new Survey(steps, roleTree)
38
     }
42
     }

+ 2
- 1
frontend/src/views/SurveyView.vue Zobrazit soubor

74
             slideDuration: 1200,
74
             slideDuration: 1200,
75
             step: 0,
75
             step: 0,
76
             profile: {
76
             profile: {
77
+                email: '',
77
                 name: '',
78
                 name: '',
78
                 seeking: '',
79
                 seeking: '',
79
                 urgency: '',
80
                 urgency: '',
110
     },
111
     },
111
     async created() {
112
     async created() {
112
         /**
113
         /**
113
-         * Before this ever gets called, surveyFactory.questions
114
+         * Before this ever gets called, surveyFactory.questionsFromDb
114
          * must be set by App.created()
115
          * must be set by App.created()
115
          */
116
          */
116
         this.validSurvey = await surveyFactory.createSurvey(
117
         this.validSurvey = await surveyFactory.createSurvey(

Načítá se…
Zrušit
Uložit