"Mark Prayed" works
This commit is contained in:
		
							parent
							
								
									c703d717d8
								
							
						
					
					
						commit
						181dc5ea63
					
				| @ -32,59 +32,16 @@ const requestNotFound = { | ||||
| export default function (pool) { | ||||
|   return { | ||||
|     /** | ||||
|      * Get the current requests for a user (i.e., their complete current journal) | ||||
|      * @param {string} userId The Id of the user | ||||
|      * @return The requests that make up the current journal | ||||
|      * Add a history entry for this request | ||||
|      * @param {string} requestId The Id of the request | ||||
|      * @param {string} status The status for this history entry | ||||
|      * @param {string} updateText The updated text for the request (pass blank if no update) | ||||
|      */ | ||||
|     journal: async userId => (await pool.query(`${journalSql} ORDER BY "asOf" DESC`, [ userId ])).rows, | ||||
| 
 | ||||
|     /** | ||||
|      * Get the least-recently-updated prayer request for the given user | ||||
|      * @param {string} userId The Id of the current user | ||||
|      * @return The least-recently-updated request for the given user | ||||
|      */ | ||||
|     oldest: async userId => (await pool.query(`${journalSql} ORDER BY "asOf" LIMIT 1`, [ userId ])).rows[0], | ||||
|      | ||||
|     /** | ||||
|      * Get the "current" version of a request by its Id | ||||
|      * @param {string} requestId The Id of the request to retrieve | ||||
|      * @param {string} userId The Id of the user to which the request belongs | ||||
|      * @return The request, or a request-like object indicating that the request was not found | ||||
|      */ | ||||
|     byId: async (userId, requestId) => { | ||||
|       const reqs = await pool.query(`${currentRequestSql} | ||||
|         WHERE "requestId" = $1 | ||||
|           AND "userId" = $2 | ||||
|         GROUP BY request."requestId"`,
 | ||||
|         [ requestId, userId ]) | ||||
|       return (0 < req.rowCount) ? reqs.rows[0] : requestNotFound | ||||
|     }, | ||||
| 
 | ||||
|     /** | ||||
|      * Get a prayer request, including its full history, by its Id | ||||
|      * @param {string} userId The Id of the user to which the request belongs | ||||
|      * @param {string} requestId The Id of the request to retrieve | ||||
|      * @return The request, or a request-like object indicating that the request was not found | ||||
|      */ | ||||
|     fullById: async (userId, requestId) => { | ||||
|       const reqResults = await pool.query(` | ||||
|         SELECT "requestId", "enteredOn" | ||||
|           FROM mpj.request | ||||
|          WHERE "requestId" = $1 | ||||
|            AND "userId" = $2`,
 | ||||
|         [ requestId, userId ]) | ||||
|       if (0 === reqResults.rowCount) { | ||||
|         return requestNotFound | ||||
|       } | ||||
|       const req = reqResults.rows[0] | ||||
|       const history = await pool.query(` | ||||
|         SELECT "asOf", "status", COALESCE("text", '') AS "text" | ||||
|           FROM mpj.history | ||||
|          WHERE "requestId" = $1 | ||||
|          ORDER BY "asOf"`,
 | ||||
|         [ requestId ]) | ||||
|       req.history = history.rows | ||||
|       return req | ||||
|     addHistory: async (requestId, status, updateText) => { | ||||
|       const asOf = Date.now() | ||||
|       await pool.query(` | ||||
|         INSERT INTO mpj.history ("requestId", "asOf", "status", "text") VALUES ($1, $2, $3, NULLIF($4, ''))`,
 | ||||
|       [ requestId, asOf, status, updateText ]) | ||||
|     }, | ||||
| 
 | ||||
|     /** | ||||
| @ -121,17 +78,61 @@ export default function (pool) { | ||||
|     }, | ||||
| 
 | ||||
|     /** | ||||
|      * Add a history entry for this request | ||||
|      * @param {string} requestId The Id of the request | ||||
|      * @param {string} status The status for this history entry | ||||
|      * @param {string} updateText The updated text for the request (pass blank if no update) | ||||
|      * Get the "current" version of a request by its Id | ||||
|      * @param {string} requestId The Id of the request to retrieve | ||||
|      * @param {string} userId The Id of the user to which the request belongs | ||||
|      * @return The request, or a request-like object indicating that the request was not found | ||||
|      */ | ||||
|     addHistory: async (requestId, status, updateText) => { | ||||
|       const asOf = Date.now() | ||||
|       await pool.query(` | ||||
|         INSERT INTO mpj.history ("requestId", "asOf", "status", "text") VALUES ($1, $2, $3, NULLIF($4, ''))`,
 | ||||
|       [ requestId, asOf, status, updateText ]) | ||||
|     byId: async (userId, requestId) => { | ||||
|       const reqs = await pool.query(`${currentRequestSql} | ||||
|         WHERE "requestId" = $1 | ||||
|           AND "userId" = $2 | ||||
|         GROUP BY request."requestId"`,
 | ||||
|         [ requestId, userId ]) | ||||
|       return (0 < reqs.rowCount) ? reqs.rows[0] : requestNotFound | ||||
|     }, | ||||
| 
 | ||||
|     /** | ||||
|      * Get a prayer request, including its full history, by its Id | ||||
|      * @param {string} userId The Id of the user to which the request belongs | ||||
|      * @param {string} requestId The Id of the request to retrieve | ||||
|      * @return The request, or a request-like object indicating that the request was not found | ||||
|      */ | ||||
|     fullById: async (userId, requestId) => { | ||||
|       const reqResults = await pool.query(` | ||||
|         SELECT "requestId", "enteredOn" | ||||
|           FROM mpj.request | ||||
|          WHERE "requestId" = $1 | ||||
|            AND "userId" = $2`,
 | ||||
|         [ requestId, userId ]) | ||||
|       if (0 === reqResults.rowCount) { | ||||
|         return requestNotFound | ||||
|       } | ||||
|       const req = reqResults.rows[0] | ||||
|       const history = await pool.query(` | ||||
|         SELECT "asOf", "status", COALESCE("text", '') AS "text" | ||||
|           FROM mpj.history | ||||
|          WHERE "requestId" = $1 | ||||
|          ORDER BY "asOf"`,
 | ||||
|         [ requestId ]) | ||||
|       req.history = history.rows | ||||
|       return req | ||||
|     }, | ||||
| 
 | ||||
|     /** | ||||
|      * Get the current requests for a user (i.e., their complete current journal) | ||||
|      * @param {string} userId The Id of the user | ||||
|      * @return The requests that make up the current journal | ||||
|      */ | ||||
|     journal: async userId => (await pool.query(`${journalSql} ORDER BY "asOf" DESC`, [ userId ])).rows, | ||||
|      | ||||
|     /** | ||||
|      * Get the least-recently-updated prayer request for the given user | ||||
|      * @param {string} userId The Id of the current user | ||||
|      * @return The least-recently-updated request for the given user | ||||
|      */ | ||||
|     oldest: async userId => (await pool.query(`${journalSql} ORDER BY "asOf" LIMIT 1`, [ userId ])).rows[0] | ||||
|      | ||||
|      | ||||
|   } | ||||
| } | ||||
|  | ||||
| @ -16,15 +16,15 @@ export default function (checkJwt) { | ||||
|     // Add a request history entry (prayed, updated, answered, etc.)
 | ||||
|     .post('/:id/history', checkJwt, async (ctx, next) => { | ||||
|       const body = ctx.request.body | ||||
|       const result = await db.request.addHistory(ctx.params.id, body.status, body.updateText) | ||||
|       ctx.status(('Not Found' === result.text) ? 404 : 204) | ||||
|       await db.request.addHistory(ctx.params.id, body.status, body.updateText) | ||||
|       ctx.response.status = 204 | ||||
|       await next() | ||||
|     }) | ||||
|     // Get a journal-style request by its Id
 | ||||
|     .get('/:id', checkJwt, async (ctx, next) => { | ||||
|       const req = await db.request.byId(ctx.state.user.sub, ctx.params.id) | ||||
|       if ('Not Found' === req.text) { | ||||
|         ctx.status(404) | ||||
|         ctx.response.status = 404 | ||||
|       } else { | ||||
|         ctx.body = req | ||||
|       } | ||||
| @ -34,7 +34,7 @@ export default function (checkJwt) { | ||||
|     .get('/:id/full', checkJwt, async (ctx, next) => { | ||||
|       const req = await db.request.fullById(ctx.state.user.sub, ctx.params.id) | ||||
|       if ('Not Found' === req.text) { | ||||
|         ctx.status(404) | ||||
|         ctx.response.status = 404 | ||||
|       } else { | ||||
|         ctx.body = req | ||||
|       } | ||||
|  | ||||
| @ -35,6 +35,11 @@ export default { | ||||
|    * Mark a prayer request as having been prayed | ||||
|    * @param {string} requestId The Id of the request | ||||
|    */ | ||||
|   markPrayed: requestId => http.post('request/${requestId}/history', { status: 'Prayed', updateText: '' }) | ||||
|   markPrayed: requestId => http.post(`request/${requestId}/history`, { status: 'Prayed', updateText: '' }), | ||||
| 
 | ||||
|   /** | ||||
|    * Get a prayer request | ||||
|    */ | ||||
|   getPrayerRequest: requestId => http.get(`request/${requestId}`) | ||||
| 
 | ||||
| } | ||||
|  | ||||
| @ -9,7 +9,7 @@ | ||||
|         el-col(:span='4'): strong Actions | ||||
|         el-col(:span='16'): strong Request | ||||
|         el-col(:span='4'): strong As Of | ||||
|       request-list-item(v-for="request in journal" v-bind:request="request" v-bind:key="request.requestId") | ||||
|       request-list-item(v-for="request in journal" :request="request" :key="request.requestId") | ||||
| </template> | ||||
| 
 | ||||
| <script> | ||||
|  | ||||
| @ -28,7 +28,10 @@ export default { | ||||
|   }, | ||||
|   methods: { | ||||
|     saveRequest: async function () { | ||||
|       await this.$store.dispatch(actions.ADD_REQUEST, this.form.requestText) | ||||
|       await this.$store.dispatch(actions.ADD_REQUEST, { | ||||
|         progress: this.$Progress, | ||||
|         requestText: this.form.requestText | ||||
|       }) | ||||
|       this.showNewVisible = false | ||||
|     } | ||||
|   } | ||||
|  | ||||
| @ -10,8 +10,12 @@ | ||||
| </template> | ||||
| 
 | ||||
| <script> | ||||
| 'use strict' | ||||
| 
 | ||||
| import moment from 'moment' | ||||
| 
 | ||||
| import actions from '@/store/action-types' | ||||
| 
 | ||||
| export default { | ||||
|   name: 'request-list-item', | ||||
|   props: ['request'], | ||||
| @ -20,8 +24,10 @@ export default { | ||||
|   }, | ||||
|   methods: { | ||||
|     markPrayed () { | ||||
|       alert(`Marking ${this.request.requestId} prayed`) | ||||
|       // TODO: write function | ||||
|       this.$store.dispatch(actions.MARK_PRAYED, { | ||||
|         progress: this.$Progress, | ||||
|         requestId: this.request.requestId | ||||
|       }) | ||||
|     } | ||||
|   }, | ||||
|   computed: { | ||||
|  | ||||
| @ -4,5 +4,7 @@ export default { | ||||
|   /** Action to add a prayer request (pass request text) */ | ||||
|   ADD_REQUEST: 'add-request', | ||||
|   /** Action to load the user's prayer journal */ | ||||
|   LOAD_JOURNAL: 'load-journal' | ||||
|   LOAD_JOURNAL: 'load-journal', | ||||
|   /** Action to mark a request as prayed */ | ||||
|   MARK_PRAYED: 'mark-prayed' | ||||
| } | ||||
|  | ||||
| @ -38,17 +38,6 @@ export default new Vuex.Store({ | ||||
|     isLoadingJournal: false | ||||
|   }, | ||||
|   mutations: { | ||||
|     [mutations.USER_LOGGED_ON] (state, user) { | ||||
|       localStorage.setItem('user_profile', JSON.stringify(user)) | ||||
|       state.user = user | ||||
|       api.setBearer(localStorage.getItem('id_token')) | ||||
|       state.isAuthenticated = true | ||||
|     }, | ||||
|     [mutations.USER_LOGGED_OFF] (state) { | ||||
|       state.user = {} | ||||
|       api.removeBearer() | ||||
|       state.isAuthenticated = false | ||||
|     }, | ||||
|     [mutations.LOADING_JOURNAL] (state, flag) { | ||||
|       state.isLoadingJournal = flag | ||||
|     }, | ||||
| @ -57,9 +46,36 @@ export default new Vuex.Store({ | ||||
|     }, | ||||
|     [mutations.REQUEST_ADDED] (state, newRequest) { | ||||
|       state.journal.unshift(newRequest) | ||||
|     }, | ||||
|     [mutations.REQUEST_UPDATED] (state, request) { | ||||
|       let jrnl = state.journal.filter(it => it.requestId !== request.requestId) | ||||
|       jrnl.unshift(request) | ||||
|       state.journal = jrnl | ||||
|     }, | ||||
|     [mutations.USER_LOGGED_OFF] (state) { | ||||
|       state.user = {} | ||||
|       api.removeBearer() | ||||
|       state.isAuthenticated = false | ||||
|     }, | ||||
|     [mutations.USER_LOGGED_ON] (state, user) { | ||||
|       localStorage.setItem('user_profile', JSON.stringify(user)) | ||||
|       state.user = user | ||||
|       api.setBearer(localStorage.getItem('id_token')) | ||||
|       state.isAuthenticated = true | ||||
|     } | ||||
|   }, | ||||
|   actions: { | ||||
|     async [actions.ADD_REQUEST] ({ commit }, { progress, requestText }) { | ||||
|       progress.start() | ||||
|       try { | ||||
|         const newRequest = await api.addRequest(requestText) | ||||
|         commit(mutations.REQUEST_ADDED, newRequest.data) | ||||
|         progress.finish() | ||||
|       } catch (err) { | ||||
|         logError(err) | ||||
|         progress.fail() | ||||
|       } | ||||
|     }, | ||||
|     async [actions.LOAD_JOURNAL] ({ commit }, progress) { | ||||
|       commit(mutations.LOADED_JOURNAL, {}) | ||||
|       progress.start() | ||||
| @ -68,19 +84,24 @@ export default new Vuex.Store({ | ||||
|       try { | ||||
|         const jrnl = await api.journal() | ||||
|         commit(mutations.LOADED_JOURNAL, jrnl.data) | ||||
|         progress.finish() | ||||
|       } catch (err) { | ||||
|         logError(err) | ||||
|         progress.fail() | ||||
|       } finally { | ||||
|         commit(mutations.LOADING_JOURNAL, false) | ||||
|         progress.finish() | ||||
|       } | ||||
|     }, | ||||
|     async [actions.ADD_REQUEST] ({ commit }, requestText) { | ||||
|     async [actions.MARK_PRAYED] ({ commit }, { progress, requestId }) { | ||||
|       try { | ||||
|         const newRequest = await api.addRequest(requestText) | ||||
|         commit(mutations.REQUEST_ADDED, newRequest.data) | ||||
|         progress.start() | ||||
|         await api.markPrayed(requestId) | ||||
|         const request = await api.getPrayerRequest(requestId) | ||||
|         commit(mutations.REQUEST_UPDATED, request.data) | ||||
|         progress.finish() | ||||
|       } catch (err) { | ||||
|         logError(err) | ||||
|         progress.fail() | ||||
|       } | ||||
|     } | ||||
|   }, | ||||
|  | ||||
| @ -7,6 +7,8 @@ export default { | ||||
|   LOADED_JOURNAL: 'journal-loaded', | ||||
|   /** Mutation for adding a new prayer request (pass text) */ | ||||
|   REQUEST_ADDED: 'request-added', | ||||
|   /** Mutation to replace a prayer request at the top of the current journal */ | ||||
|   REQUEST_UPDATED: 'request-updated', | ||||
|   /** Mutation for logging a user off */ | ||||
|   USER_LOGGED_OFF: 'user-logged-off', | ||||
|   /** Mutation for logging a user on (pass user) */ | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user