diff --git a/src/controllers/index.js b/src/controllers/index.js index 0437ee4..aa40379 100644 --- a/src/controllers/index.js +++ b/src/controllers/index.js @@ -4,9 +4,11 @@ const confirmService = require('@services/apis/confirm') const selectService = require('@services/apis/select') const statusService = require('@services/apis/status') const cancelService = require('@services/apis/cancel') +const sessionService = require('@services/session') const searchService = require('@services/apis/search') const initService = require('@services/apis/init') + exports.search = async (req, res) => { try { await res.status(200).send(responses.success_ack) @@ -60,3 +62,13 @@ exports.status = async (req, res) => { console.log(err) } } + +exports.sessionUpdate = async (req, res) => { + try { + console.debug(JSON.stringify(req.body, null, '\t')) + res.status(200).send(responses.success_ack) + await sessionService.session(req.body) + } catch (err) { + console.log(err) + } +} diff --git a/src/database/storage/bap/queries.js b/src/database/storage/bap/queries.js index 26a5771..3a95fed 100644 --- a/src/database/storage/bap/queries.js +++ b/src/database/storage/bap/queries.js @@ -27,3 +27,11 @@ exports.findOrCreate = async ({ where = {}, defaults = {} }) => { throw err } } + +exports.findByIds = async (ids) => { + try { + return await Bap.find({ _id: { $in: ids } }).lean() + } catch (err) { + console.log(err) + } +} diff --git a/src/database/storage/sessionAttendance/queries.js b/src/database/storage/sessionAttendance/queries.js index c9e203e..658e056 100644 --- a/src/database/storage/sessionAttendance/queries.js +++ b/src/database/storage/sessionAttendance/queries.js @@ -55,3 +55,10 @@ exports.setStatusAsCancelledById = async (id, { reasonId, reasonDesc }) => { console.log('SessionAttendance.findByOrderId: ', err) } } +exports.findBySessionId = async (sessionId) => { + try { + return await SessionAttendance.find({ sessionId: sessionId }) + } catch (err) { + console.log('SessionAttendance.findBySessionId: ', err) + } +} diff --git a/src/database/storage/user/queries.js b/src/database/storage/user/queries.js index 973934e..25eef08 100644 --- a/src/database/storage/user/queries.js +++ b/src/database/storage/user/queries.js @@ -35,3 +35,11 @@ exports.findOrCreate = async ({ where = {}, defaults = {} }) => { throw err } } + +exports.findByIds = async (ids) => { + try { + return await User.find({ _id: { $in: ids } }).lean() + } catch (err) { + console.log(err) + } +} diff --git a/src/dtos/onUpdateRequest.js b/src/dtos/onUpdateRequest.js new file mode 100644 index 0000000..022ce3f --- /dev/null +++ b/src/dtos/onUpdateRequest.js @@ -0,0 +1,15 @@ +'use strict' + +exports.onUpdateRequestDTO = async (context, statusBody, orderId, status) => { + return { + context, + message: { + order: { + id: orderId, + state: status, + type: 'DEFAULT', + provider: statusBody, + }, + }, + } +} diff --git a/src/routes/index.js b/src/routes/index.js index 2cc93d0..6479483 100644 --- a/src/routes/index.js +++ b/src/routes/index.js @@ -10,5 +10,6 @@ router.post('/init', bppController.init) router.post('/confirm', bppController.confirm) router.post('/cancel', bppController.cancel) router.post('/status', bppController.status) +router.post('/sessionUpdate', bppController.sessionUpdate) module.exports = router diff --git a/src/services/protocolCallbacks/index.js b/src/services/protocolCallbacks/index.js index ca73e4b..5a0a022 100644 --- a/src/services/protocolCallbacks/index.js +++ b/src/services/protocolCallbacks/index.js @@ -4,7 +4,9 @@ const { onConfirm } = require('./onConfirm') const { onSelect } = require('./onSelect') const { onStatus } = require('./onStatus') const { onCancel } = require('./onCancel') +const { onUpdate } = require('./onUpdate') const { onSearch } = require('./onSearch') const { onInit } = require('./onInit') -const protocolCallbacks = { onConfirm, onSelect, onStatus, onCancel, onSearch, onInit } + +const protocolCallbacks = { onConfirm, onSelect, onStatus, onCancel, onSearch, onInit, onUpdate } module.exports = protocolCallbacks diff --git a/src/services/protocolCallbacks/onUpdate.js b/src/services/protocolCallbacks/onUpdate.js new file mode 100644 index 0000000..5f21858 --- /dev/null +++ b/src/services/protocolCallbacks/onUpdate.js @@ -0,0 +1,37 @@ +'use strict' + +const { contextBuilder } = require('@utils/contextBuilder') +const { onUpdateRequestDTO } = require('@dtos/onUpdateRequest') +const { externalRequests } = require('@helpers/requests') +const { internalRequests } = require('@helpers/requests') + +exports.onUpdate = async (callbackData) => { + try { + const context = await contextBuilder( + callbackData.transactionId, + callbackData.messageId, + process.env.ON_UPDATE_ACTION + ) + const response = await internalRequests.catalogGET({ + route: process.env.CATALOG_GET_STATUS_BODY_ROUTE, + pathParams: { + sessionId: callbackData.sessionId, + fulfillmentId: callbackData.fulfillmentId, + }, + }) + const statusBody = response.statusBody + const onUpdateRequest = await onUpdateRequestDTO( + context, + statusBody.providers[0], + callbackData.orderId, + callbackData.status + ) + await externalRequests.callbackPOST({ + baseURL: callbackData.bapUri, + route: process.env.ON_UPDATE_ROUTE, + body: onUpdateRequest, + }) + } catch (err) { + console.log('OnUpdate.ProtocolCallbacks.services: ', err) + } +} diff --git a/src/services/session.js b/src/services/session.js new file mode 100644 index 0000000..e6e49cc --- /dev/null +++ b/src/services/session.js @@ -0,0 +1,50 @@ +'use strict' + +const protocolCallbacks = require('@services/protocolCallbacks/') +const sessionAttendanceQueries = require('@database/storage/sessionAttendance/queries') +const userQueries = require('@database/storage/user/queries') +const bapQueries = require('@database/storage/bap/queries') +const crypto = require('crypto') + +exports.session = async (requestBody) => { + try { + const sessionId = requestBody.sessionId + const sessionAttendance = await sessionAttendanceQueries.findBySessionId(sessionId) + if (!sessionAttendance) { + return console.log('SessionAttendance Not Found') + } + const userIds = sessionAttendance.map((sessionAttendee) => sessionAttendee.userId) + const users = await userQueries.findByIds(userIds) + if (!users) { + return console.log('Users Not Found') + } + const bapIds = users.map((user) => user.bapId) + const baps = await bapQueries.findByIds(bapIds) + if (!baps) { + return console.log('BAP Not Found') + } + let usersWithBapAndAttendance = users.map((user) => { + const bapInfo = baps.find((f) => f._id.toString() === user.bapId.toString()) + const sessionAttendanceInfo = sessionAttendance.find((f) => f.userId.toString() === user._id.toString()) + return { + ...user, + bapInfo, + sessionAttendanceInfo, + } + }) + usersWithBapAndAttendance.map(async (user) => { + await protocolCallbacks.onUpdate({ + transactionId: crypto.randomUUID(), + messageId: crypto.randomUUID(), + bapId: user.bapInfo.bapId, + bapUri: user.bapInfo.bapUri, + status: user.sessionAttendanceInfo.statusText, + sessionId: sessionId.toString(), + fulfillmentId: user.sessionAttendanceInfo.fulfillmentId.toString(), + orderId: user.sessionAttendanceInfo.orderId.toString(), + }) + }) + } catch (err) { + console.log(err) + } +}