From e8f497363f92180e79282f0371141b1055a529a8 Mon Sep 17 00:00:00 2001 From: joonaun93 Date: Mon, 31 Jul 2023 22:42:17 +0800 Subject: [PATCH] feat(wallet_event): added relevant queries for wallet_event --- ...0200901213252-CreateEnumWalletEventType.js | 22 +- .../20200901222910-CreateTableWallet-Event.js | 17 +- server/handlers/eventHandler/index.js | 22 ++ server/handlers/eventHandler/schemas.js | 9 + server/handlers/transferHandler/index.js | 4 + server/handlers/trustHandler/index.js | 4 + server/handlers/walletHandler/index.js | 1 + server/models/Event.js | 46 ++++ server/models/Transfer.js | 5 + server/models/Trust.js | 4 + server/repositories/EventRepository.js | 27 ++ server/routes/eventRouter.js | 15 ++ server/routes/index.js | 1 + server/services/AuthService.js | 10 + server/services/EventService.js | 38 +++ server/services/TransferService.js | 230 +++++++++++++++++- server/services/TrustService.js | 70 ++++++ server/services/WalletService.js | 8 + 18 files changed, 511 insertions(+), 22 deletions(-) create mode 100644 server/handlers/eventHandler/index.js create mode 100644 server/handlers/eventHandler/schemas.js create mode 100644 server/models/Event.js create mode 100644 server/repositories/EventRepository.js create mode 100644 server/routes/eventRouter.js create mode 100644 server/services/EventService.js diff --git a/database/migrations/20200901213252-CreateEnumWalletEventType.js b/database/migrations/20200901213252-CreateEnumWalletEventType.js index e2dcc08b..2bde83d0 100644 --- a/database/migrations/20200901213252-CreateEnumWalletEventType.js +++ b/database/migrations/20200901213252-CreateEnumWalletEventType.js @@ -1,27 +1,27 @@ - - let dbm; let type; let seed; /** - * We receive the dbmigrate dependency from dbmigrate initially. - * This enables us to not have to rely on NODE_PATH. - */ -exports.setup = function(options, seedLink) { + * We receive the dbmigrate dependency from dbmigrate initially. + * This enables us to not have to rely on NODE_PATH. + */ +exports.setup = function (options, seedLink) { dbm = options.dbmigrate; type = dbm.dataType; seed = seedLink; }; -exports.up = function(db) { - return db.runSql("CREATE TYPE wallet_event_type AS ENUM ('trust_request', 'trust_request_granted', 'trust_request_cancelled_by_originator', 'trust_request_cancelled_by_actor', 'trust_request_cancelled_by_target', 'transfer_requested', 'transfer_request_cancelled_by_source', 'transfer_request_cancelled_by_destination', 'transfer_request_cancelled_by_originator', 'transfer_pending_cancelled_by_source', 'transfer_pending_cancelled_by_destination', 'transfer_pending_cancelled_by_requestor', 'transfer_completed', 'transfer_failed')"); +exports.up = function (db) { + return db.runSql( + "CREATE TYPE wallet_event_type AS ENUM ('trust_request', 'trust_request_granted', 'trust_request_cancelled_by_originator', 'trust_request_cancelled_by_actor', 'trust_request_cancelled_by_target', 'transfer_requested', 'transfer_request_cancelled_by_source', 'transfer_request_cancelled_by_destination', 'transfer_request_cancelled_by_originator', 'transfer_pending_cancelled_by_source', 'transfer_pending_cancelled_by_destination', 'transfer_pending_cancelled_by_requestor', 'transfer_completed', 'transfer_failed','login','wallet_created)", + ); }; -exports.down = function(db) { - return db.runSql("DROP TYPE wallet_event_type"); +exports.down = function (db) { + return db.runSql('DROP TYPE wallet_event_type'); }; exports._meta = { - "version": 1 + version: 1, }; diff --git a/database/migrations/20200901222910-CreateTableWallet-Event.js b/database/migrations/20200901222910-CreateTableWallet-Event.js index 89ddd7ae..d1497095 100644 --- a/database/migrations/20200901222910-CreateTableWallet-Event.js +++ b/database/migrations/20200901222910-CreateTableWallet-Event.js @@ -1,20 +1,18 @@ - - let dbm; let type; let seed; /** - * We receive the dbmigrate dependency from dbmigrate initially. - * This enables us to not have to rely on NODE_PATH. - */ -exports.setup = function(options, seedLink) { + * We receive the dbmigrate dependency from dbmigrate initially. + * This enables us to not have to rely on NODE_PATH. + */ +exports.setup = function (options, seedLink) { dbm = options.dbmigrate; type = dbm.dataType; seed = seedLink; }; -exports.up = function(db) { +exports.up = function (db) { return db.createTable('wallet_event', { id: { type: 'uuid', primaryKey: true, notNull: true }, wallet_id: { type: 'uuid', notNull: true }, @@ -24,13 +22,14 @@ exports.up = function(db) { notNull: true, defaultValue: new String('now()'), }, + payload: { type: 'json', notNull: true }, }); }; -exports.down = function(db) { +exports.down = function (db) { return db.dropTable('wallet_event'); }; exports._meta = { - "version": 1 + version: 1, }; diff --git a/server/handlers/eventHandler/index.js b/server/handlers/eventHandler/index.js new file mode 100644 index 00000000..3090464a --- /dev/null +++ b/server/handlers/eventHandler/index.js @@ -0,0 +1,22 @@ +const EventService = require('../../services/EventService'); + +const { eventsGetQuerySchema } = require('./schemas'); + +const eventsGet = async (req, res) => { + await eventsGetQuerySchema.validateAsync(req.query, { abortEarly: false }); + + const { limit, since, wallet } = req.query; + + const eventService = new EventService(); + + const events = await eventService.getAllEvents({ + limit, + since, + wallet, + walletLoginId: req.wallet_id, + }); + + res.status(200).json({ events }); +}; + +module.exports = { eventsGet }; diff --git a/server/handlers/eventHandler/schemas.js b/server/handlers/eventHandler/schemas.js new file mode 100644 index 00000000..1e13e7fc --- /dev/null +++ b/server/handlers/eventHandler/schemas.js @@ -0,0 +1,9 @@ +const Joi = require('joi'); + +const eventsGetQuerySchema = Joi.object({ + limit: Joi.number().required(), + since: Joi.date().iso(), + wallet: Joi.string(), +}); + +module.exports = { eventsGetQuerySchema }; diff --git a/server/handlers/transferHandler/index.js b/server/handlers/transferHandler/index.js index b57d8877..d5ffa081 100644 --- a/server/handlers/transferHandler/index.js +++ b/server/handlers/transferHandler/index.js @@ -8,6 +8,7 @@ const { } = require('./schemas'); const transferPost = async (req, res) => { + // need to add to the events table await transferPostSchema.validateAsync(req.body, { abortEarly: false }); const transferService = new TransferService(); @@ -20,6 +21,7 @@ const transferPost = async (req, res) => { }; const transferIdAcceptPost = async (req, res) => { + // need to add to the events table await transferIdParamSchema.validateAsync(req.params, { abortEarly: false }); const transferService = new TransferService(); @@ -32,6 +34,7 @@ const transferIdAcceptPost = async (req, res) => { }; const transferIdDeclinePost = async (req, res) => { + // need to add to the events table await transferIdParamSchema.validateAsync(req.params, { abortEarly: false }); const transferService = new TransferService(); @@ -44,6 +47,7 @@ const transferIdDeclinePost = async (req, res) => { }; const transferIdDelete = async (req, res) => { + // need to add to the events table await transferIdParamSchema.validateAsync(req.params, { abortEarly: false }); const transferService = new TransferService(); diff --git a/server/handlers/trustHandler/index.js b/server/handlers/trustHandler/index.js index 0cb5370d..21f2398c 100644 --- a/server/handlers/trustHandler/index.js +++ b/server/handlers/trustHandler/index.js @@ -32,6 +32,7 @@ const trustGet = async (req, res) => { }; const trustPost = async (req, res) => { + // need to add to the events table await trustPostSchema.validateAsync(req.body, { abortEarly: false }); const trustService = new TrustService(); @@ -46,6 +47,7 @@ const trustPost = async (req, res) => { }; const trustRelationshipAccept = async (req, res) => { + // need to add to the events table await trustRelationshipIdSchema.validateAsync(req.params, { abortEarly: false, }); @@ -60,6 +62,7 @@ const trustRelationshipAccept = async (req, res) => { }; const trustRelationshipDecline = async (req, res) => { + // need to add to the events table await trustRelationshipIdSchema.validateAsync(req.params, { abortEarly: false, }); @@ -74,6 +77,7 @@ const trustRelationshipDecline = async (req, res) => { }; const trustRelationshipDelete = async (req, res) => { + // need to add to the events table await trustRelationshipIdSchema.validateAsync(req.params, { abortEarly: false, }); diff --git a/server/handlers/walletHandler/index.js b/server/handlers/walletHandler/index.js index 10e13362..a91b7648 100644 --- a/server/handlers/walletHandler/index.js +++ b/server/handlers/walletHandler/index.js @@ -55,6 +55,7 @@ const walletGetTrustRelationships = async (req, res) => { }; const walletPost = async (req, res) => { + // need to add to the events table await walletPostSchema.validateAsync(req.body, { abortEarly: false }); const walletService = new WalletService(); diff --git a/server/models/Event.js b/server/models/Event.js new file mode 100644 index 00000000..57c26bda --- /dev/null +++ b/server/models/Event.js @@ -0,0 +1,46 @@ +const log = require('loglevel'); +// const Joi = require('joi'); +const EventRepository = require('../repositories/EventRepository'); + +class Event { + constructor(session) { + this._eventRepository = new EventRepository(session); + } + + async getAllEvents(walletId, limit, since) { + const filter = { + and: [], + }; + + if (walletId) { + filter.and.push({ + wallet_id: walletId, + }); + } + + if (since) { + filter.and.push({ after: { 'wallet_event.created_at': since } }); + } + + const events = await this._eventRepository.getAllEvents(filter, limit); + + return events.map((eventObject) => { + return { + ...eventObject, + }; + }); + } + + async logEvent({ loggedInWalletId, type, payload }) { + log.info(loggedInWalletId); + const event = await this._eventRepository.create({ + wallet_id: loggedInWalletId, + type, + payload, + }); + + return event; + } +} + +module.exports = Event; diff --git a/server/models/Transfer.js b/server/models/Transfer.js index 66820df6..0602dc05 100644 --- a/server/models/Transfer.js +++ b/server/models/Transfer.js @@ -36,6 +36,8 @@ class Transfer { async getById({ transferId, walletLoginId }) { const transfers = await this.getTransfers({ walletLoginId, transferId }); + + log.info(transferId, walletLoginId, transfers); return transfers[0]; } @@ -176,6 +178,9 @@ class Transfer { // TODO: add boolean for claim in transferRepository claim: claimBoolean, }); + + log.info(transfer); + log.info('here'); log.debug('now, deal with tokens'); await this._token.completeTransfer(tokens, transfer, claimBoolean); return this.constructor.removeWalletIds(transfer); diff --git a/server/models/Trust.js b/server/models/Trust.js index 50fae34d..39c63a3f 100644 --- a/server/models/Trust.js +++ b/server/models/Trust.js @@ -11,6 +11,10 @@ class Trust { this._trustRepository = new TrustRepository(session); } + async getTrustRelationshipsById(id) { + return this._trustRepository.getById(id); + } + /* * Get trust relationships by filters, setting filter to undefined to allow all data */ diff --git a/server/repositories/EventRepository.js b/server/repositories/EventRepository.js new file mode 100644 index 00000000..4c9e3419 --- /dev/null +++ b/server/repositories/EventRepository.js @@ -0,0 +1,27 @@ +const log = require('loglevel'); +const BaseRepository = require('./BaseRepository'); + +class EventRepository extends BaseRepository { + constructor(session) { + super('wallet_event', session); + this._tableName = 'wallet_event'; + this._session = session; + } + + async getAllEvents(filter, limitOptions) { + log.info(filter); + let promise = this._session + .getDB() + .select('wallet_event.*') + .table('wallet_event') + .where((builder) => this.whereBuilder(filter, builder)); + + if (limitOptions && limitOptions.limit) { + promise = promise.limit(limitOptions.limit); + } + + return promise; + } +} + +module.exports = EventRepository; diff --git a/server/routes/eventRouter.js b/server/routes/eventRouter.js new file mode 100644 index 00000000..c19eb682 --- /dev/null +++ b/server/routes/eventRouter.js @@ -0,0 +1,15 @@ +const express = require('express'); + +const router = express.Router(); +const routerWrapper = express.Router(); +const { + handlerWrapper, + verifyJWTHandler, + apiKeyHandler, +} = require('../utils/utils'); +const { eventsGet } = require('../handlers/eventHandler'); + +router.get('/', handlerWrapper(eventsGet)); + +routerWrapper.use('/events', apiKeyHandler, verifyJWTHandler, router); +module.exports = routerWrapper; diff --git a/server/routes/index.js b/server/routes/index.js index c4ac0523..6e93180c 100644 --- a/server/routes/index.js +++ b/server/routes/index.js @@ -4,4 +4,5 @@ module.exports = [ require('./transferRouter'), require('./trustRouter'), require('./walletRouter'), + require('./eventRouter'), ]; diff --git a/server/services/AuthService.js b/server/services/AuthService.js index a7682fb8..23b5b986 100644 --- a/server/services/AuthService.js +++ b/server/services/AuthService.js @@ -1,9 +1,13 @@ const WalletService = require('./WalletService'); +const Event = require('../models/Event'); +const Session = require('../infra/database/Session'); const JWTService = require('./JWTService'); const HashService = require('./HashService'); class AuthService { static async signIn({ wallet, password }) { + const session = new Session(); + const event = new Event(session); const walletService = new WalletService(); const walletObject = await walletService.getByIdOrName(wallet); @@ -12,6 +16,12 @@ class AuthService { if (hash === walletObject.password) { const token = JWTService.sign(walletObject); + await event.logEvent({ + loggedInWalletId: walletObject.id, + type: 'login', + payload: {}, + }); + return token; } return false; diff --git a/server/services/EventService.js b/server/services/EventService.js new file mode 100644 index 00000000..269b972c --- /dev/null +++ b/server/services/EventService.js @@ -0,0 +1,38 @@ +const Event = require('../models/Event'); +const WalletService = require('./WalletService'); +const Session = require('../infra/database/Session'); +const HttpError = require('../utils/HttpError'); + +class EventService { + constructor() { + this._session = new Session(); + this._event = new Event(this._session); + this._walletService = new WalletService(); + } + + async getAllEvents({ wallet, limit, since, walletLoginId }) { + let events = []; + + if (wallet) { + const walletInstance = await this._walletService.getByName(wallet); + const isSub = await this._walletService.hasControlOver( + walletLoginId, + walletInstance.id, + ); + if (!isSub) { + throw new HttpError( + 403, + 'Wallet does not belong to the logged in wallet', + ); + } + + events = await this._event.getAllEvents(walletInstance.id, limit, since); + } else { + events = await this._event.getAllEvents(walletLoginId, limit, since); + } + + return events; + } +} + +module.exports = EventService; diff --git a/server/services/TransferService.js b/server/services/TransferService.js index 52a9e8f5..51222157 100644 --- a/server/services/TransferService.js +++ b/server/services/TransferService.js @@ -1,15 +1,18 @@ +const log = require('loglevel'); const Session = require('../infra/database/Session'); const Transfer = require('../models/Transfer'); const HttpError = require('../utils/HttpError'); const WalletService = require('./WalletService'); const TokenService = require('./TokenService'); const TransferEnums = require('../utils/transfer-enum'); +const Event = require('../models/Event'); class TransferService { constructor() { this._session = new Session(); this._transfer = new Transfer(this._session); this._walletService = new WalletService(); + this._event = new Event(this._session); } async getByFilter(query, walletLoginId) { @@ -49,10 +52,9 @@ class TransferService { const { claim, bundle, tokens } = transferBody; let result; - + const gottentokens = []; // TODO: put the claim boolean into each tokens if (tokens) { - const gottentokens = []; const tokenService = new TokenService(); await Promise.all( tokens.map(async (id) => { @@ -61,6 +63,8 @@ class TransferService { }), ); // Case 1: with trust, token transfer + + // log.info(walletLoginId, walletSender, walletReceiver, gottentokens); result = await this._transfer.transfer( walletLoginId, walletSender, @@ -80,13 +84,91 @@ class TransferService { ); } + const tokenArr = gottentokens.map((token) => token.id); + let status; if (result.state === TransferEnums.STATE.completed) { + // the log should show up on both sender and receiver + await this._event.logEvent({ + loggedInWalletId: walletSender.id, + type: 'transfer_completed', + payload: tokens + ? { + walletSender: walletSender.name, + walletReceiver: walletReceiver.name, + tokenTransferred: tokenArr, + claim, + } + : { + walletSender: walletSender.name, + walletReceiver: walletReceiver.name, + bundle: bundle.bundle_size, + claim, + }, + }); + + // the log should show up on both sender and receiver + await this._event.logEvent({ + loggedInWalletId: walletReceiver.id, + type: 'transfer_completed', + payload: tokens + ? { + walletSender: walletSender.name, + walletReceiver: walletReceiver.name, + tokenTransferred: tokenArr, + claim, + } + : { + walletSender: walletSender.name, + walletReceiver: walletReceiver.name, + bundle: bundle.bundle_size, + claim, + }, + }); + status = 201; } else if ( result.state === TransferEnums.STATE.pending || result.state === TransferEnums.STATE.requested ) { + // the log should show up on both sender and receiver + await this._event.logEvent({ + loggedInWalletId: walletSender.id, + type: 'transfer_requested', + payload: tokens + ? { + walletSender: walletSender.name, + walletReceiver: walletReceiver.name, + tokenTransferred: tokenArr, + claim, + } + : { + walletSender: walletSender.name, + walletReceiver: walletReceiver.name, + bundle: bundle.bundle_size, + claim, + }, + }); + + // the log should show up on both sender and receiver + await this._event.logEvent({ + loggedInWalletId: walletReceiver.id, + type: 'transfer_requested', + payload: tokens + ? { + walletSender: walletSender.name, + walletReceiver: walletReceiver.name, + tokenTransferred: tokenArr, + claim, + } + : { + walletSender: walletSender.name, + walletReceiver: walletReceiver.name, + bundle: bundle.bundle_size, + claim, + }, + }); + status = 202; } else { throw new Error(`Unexpected state ${result.state}`); @@ -105,6 +187,20 @@ class TransferService { try { await this._session.beginTransaction(); + const transfer = await this._transfer.getById({ + transferId, + walletLoginId, + }); + + const originator_wallet_id = await this._walletService.getByName( + transfer.originating_wallet, + ); + const destination_wallet_id = await this._walletService.getByName( + transfer.destination_wallet, + ); + + log.info(originator_wallet_id, destination_wallet_id); + // TODO: claim const result = await this._transfer.acceptTransfer( transferId, @@ -113,6 +209,22 @@ class TransferService { await this._session.commitTransaction(); + // transfer completed + // the log should show up on both sender and receiver + await this._event.logEvent({ + loggedInWalletId: originator_wallet_id.id, + type: 'transfer_completed', + payload: { transferId }, + }); + + // transfer completed + // the log should show up on both sender and receiver + await this._event.logEvent({ + loggedInWalletId: destination_wallet_id.id, + type: 'transfer_completed', + payload: { transferId }, + }); + return result; } catch (e) { if (this._session.isTransactionInProgress()) { @@ -126,12 +238,54 @@ class TransferService { try { await this._session.beginTransaction(); + const transfer = await this._transfer.getById({ + transferId, + walletLoginId, + }); + + const originator_wallet_id = await this._walletService.getByName( + transfer.originating_wallet, + ); + + const destination_wallet_id = await this._walletService.getByName( + transfer.destination_wallet, + ); + const result = await this._transfer.declineTransfer( transferId, walletLoginId, ); await this._session.commitTransaction(); + + // transfer request cancelled by destination + // the log should show up on both sender and receiver + await this._event.logEvent({ + loggedInWalletId: originator_wallet_id.id, + type: 'transfer_request_cancelled_by_destination', + payload: { transferId }, + }); + + await this._event.logEvent({ + loggedInWalletId: originator_wallet_id.id, + type: 'transfer_failed', + payload: { transferId }, + }); + + // transfer request cancelled by destination + // the log should show up on both sender and receiver + await this._event.logEvent({ + loggedInWalletId: destination_wallet_id.id, + type: 'transfer_request_cancelled_by_destination', + payload: { transferId }, + }); + + await this._event.logEvent({ + loggedInWalletId: destination_wallet_id.id, + type: 'transfer_failed', + payload: { transferId }, + }); + return result; } catch (e) { if (this._session.isTransactionInProgress()) { @@ -145,12 +299,54 @@ class TransferService { try { await this._session.beginTransaction(); + const transfer = await this._transfer.getById({ + transferId, + walletLoginId, + }); + + const originator_wallet_id = await this._walletService.getByName( + transfer.originating_wallet, + ); + + const destination_wallet_id = await this._walletService.getByName( + transfer.destination_wallet, + ); + const result = await this._transfer.cancelTransfer( transferId, walletLoginId, ); await this._session.commitTransaction(); + + // transfer pending cancelled by requestor + // the log should show up on both sender and receiver + await this._event.logEvent({ + loggedInWalletId: originator_wallet_id.id, + type: 'transfer_pending_cancelled_by_requestor', + payload: { transferId }, + }); + + await this._event.logEvent({ + loggedInWalletId: originator_wallet_id.id, + type: 'transfer_failed', + payload: { transferId }, + }); + + // transfer pending cancelled by requestor + // the log should show up on both sender and receiver + await this._event.logEvent({ + loggedInWalletId: destination_wallet_id.id, + type: 'transfer_pending_cancelled_by_requestor', + payload: { transferId }, + }); + + await this._event.logEvent({ + loggedInWalletId: destination_wallet_id.id, + type: 'transfer_failed', + payload: { transferId }, + }); + return result; } catch (e) { if (this._session.isTransactionInProgress()) { @@ -164,6 +360,19 @@ class TransferService { try { await this._session.beginTransaction(); + const transfer = await this._transfer.getById({ + transferId, + walletLoginId, + }); + + const originator_wallet_id = await this._walletService.getByName( + transfer.originating_wallet, + ); + + const destination_wallet_id = await this._walletService.getByName( + transfer.destination_wallet, + ); + let result; if (requestBody.implicit) { result = await this._transfer.fulfillTransfer( @@ -187,6 +396,23 @@ class TransferService { ); } await this._session.commitTransaction(); + + // transfer completed + // the log should show up on both sender and receiver + await this._event.logEvent({ + loggedInWalletId: originator_wallet_id.id, + type: 'transfer_completed', + payload: { transferId }, + }); + + // transfer completed + // the log should show up on both sender and receiver + await this._event.logEvent({ + loggedInWalletId: destination_wallet_id.id, + type: 'transfer_completed', + payload: { transferId }, + }); + return result; } catch (e) { if (this._session.isTransactionInProgress()) { diff --git a/server/services/TrustService.js b/server/services/TrustService.js index 8a5e34b7..8716e317 100644 --- a/server/services/TrustService.js +++ b/server/services/TrustService.js @@ -2,11 +2,13 @@ const Trust = require('../models/Trust'); const Session = require('../infra/database/Session'); const Wallet = require('../models/Wallet'); const WalletService = require('./WalletService'); +const Event = require('../models/Event'); class TrustService { constructor() { this._session = new Session(); this._trust = new Trust(this._session); + this._event = new Event(this._session); } async getTrustRelationships({ @@ -86,10 +88,42 @@ class TrustService { originatorWallet, }); + // the log should show up on both requester and requestee + await this._event.logEvent({ + loggedInWalletId: walletLoginId, + type: 'trust_request', + payload: { requesteeWallet, requesterWallet, trustRequestType }, + }); + + // the log should show up on both requester and requestee + await this._event.logEvent({ + loggedInWalletId: requesteeWalletDetails.id, + type: 'trust_request', + payload: { requesteeWallet, requesterWallet, trustRequestType }, + }); + return trustRelationship; } async acceptTrustRequestSentToMe({ walletLoginId, trustRelationshipId }) { + const trustRelationship = await this._trust.getTrustRelationshipsById( + trustRelationshipId, + ); + + // the log should show up on both requester and requestee + await this._event.logEvent({ + loggedInWalletId: walletLoginId, + type: 'trust_request_granted', + payload: { trustRelationshipId }, + }); + + // the log should show up on both requester and requestee + await this._event.logEvent({ + loggedInWalletId: trustRelationship.originator_wallet_id, + type: 'trust_request_granted', + payload: { trustRelationshipId }, + }); + return this._trust.acceptTrustRequestSentToMe({ walletId: walletLoginId, trustRelationshipId, @@ -97,6 +131,24 @@ class TrustService { } async declineTrustRequestSentToMe({ walletLoginId, trustRelationshipId }) { + const trustRelationship = await this._trust.getTrustRelationshipsById( + trustRelationshipId, + ); + + // the log should show up on both requester and requestee + await this._event.logEvent({ + loggedInWalletId: walletLoginId, + type: 'trust_request_cancelled_by_target', + payload: { trustRelationshipId }, + }); + + // the log should show up on both requester and requestee + await this._event.logEvent({ + loggedInWalletId: trustRelationship.originator_wallet_id, + type: 'trust_request_cancelled_by_target', + payload: { trustRelationshipId }, + }); + return this._trust.declineTrustRequestSentToMe({ walletId: walletLoginId, trustRelationshipId, @@ -104,6 +156,24 @@ class TrustService { } async cancelTrustRequest({ walletLoginId, trustRelationshipId }) { + const trustRelationship = await this._trust.getTrustRelationshipsById( + trustRelationshipId, + ); + + // the log should show up on both requester and requestee + await this._event.logEvent({ + loggedInWalletId: walletLoginId, + type: 'trust_request_cancelled_by_originator', + payload: { trustRelationshipId }, + }); + + // the log should show up on both requester and requestee + await this._event.logEvent({ + loggedInWalletId: trustRelationship.target_wallet_id, + type: 'trust_request_cancelled_by_target', + payload: { trustRelationshipId }, + }); + return this._trust.cancelTrustRequest({ walletId: walletLoginId, trustRelationshipId, diff --git a/server/services/WalletService.js b/server/services/WalletService.js index cf63edfe..66ee0dfd 100644 --- a/server/services/WalletService.js +++ b/server/services/WalletService.js @@ -2,11 +2,13 @@ const { validate: uuidValidate } = require('uuid'); const Wallet = require('../models/Wallet'); const Session = require('../infra/database/Session'); const Token = require('../models/Token'); +const Event = require('../models/Event'); class WalletService { constructor() { this._session = new Session(); this._wallet = new Wallet(this._session); + this._event = new Event(this._session); } async getSubWallets(id) { @@ -46,6 +48,12 @@ class WalletService { await this._session.commitTransaction(); + await this._event.logEvent({ + loggedInWalletId: addedWallet.id, + type: 'wallet_created', + payload: { wallet: addedWallet.name }, + }); + return { wallet: addedWallet.name, id: addedWallet.id }; } catch (e) { if (this._session.isTransactionInProgress()) {