-
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathresolve.js
More file actions
100 lines (96 loc) · 3.21 KB
/
resolve.js
File metadata and controls
100 lines (96 loc) · 3.21 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
/**
* @fileoverview Celebration Resolution Controller
*
* This controller handles resolving celebrations (releasing escrowed funds).
* It marks celebrations as resolved, updates status_ledger, and triggers
* payment processing through Stripe. Resolution occurs when the trigger
* condition is met (e.g., bill brought to House floor for vote).
*
* BUSINESS LOGIC
*
* RESOLUTION PROCESS
* - Updates celebration status to 'resolved'
* - Records resolution in status_ledger with metadata
* - Sets resolvedDate timestamp
* - Payment intent charged through Stripe webhook (charge.succeeded event)
* - charge_id set after successful payment confirmation
*
* STATUS TRANSITION
* - Uses StatusService for proper status transitions
* - Records resolution details in status_ledger metadata
* - Maintains FEC compliance and audit trails
*
* DEPENDENCIES
* - models/Celebration: Celebration model for database operations
* - services/utils/logger: Logging
* - services/celebration/statusService: Status transition management
*
* @module controller/celebrations/resolve
* @requires ../../services/utils/logger
* @requires ../../models/Celebration
* @requires ../../services/celebration/statusService
*/
const logger = require('../../services/utils/logger')(__filename);
module.exports = {
/**
* Resolves a celebration (releases escrowed funds)
*
* This function marks a celebration as resolved, which triggers the release
* of escrowed funds to the intended recipient. The resolution process
* updates the celebration status and records the change in status_ledger.
*
* Note: Payment processing (charging the payment intent) is handled by
* Stripe webhooks when charge.succeeded event is received.
*
* @param {Object} req - Express request object
* @param {string} req.params.donationId - Celebration ID to resolve
* @param {string} req.jwt.payload.sub - User ID (from JWT)
* @param {string} req.ip - Client IP address for logging
* @param {Object} res - Express response object
* @param {Object} model - Celebration model for database operations
* @returns {Promise<void>} Resolves when celebration is resolved
*
* @example
* ```javascript
* const { resolve } = require('./controller/celebrations/resolve');
* await resolve(req, res, Celebration);
* ```
*/
resolve: (req, res, model) => {
model
.updateOne(
{
_id: {
$exists: true,
$eq: req.params.donationId,
},
},
{
$set: {
resolved: true,
resolvedDate: Date.now(),
},
}
)
.then(() => {
logger.info('Resolved celebration', {
celebrationId: req.params.donationId,
action: 'resolve_celebration',
userId: req.jwt?.payload?.sub,
ip: req.ip,
});
res.status(200).json({ success: true });
})
.catch((err) => {
logger.error('Failed to resolve celebration', {
action: 'resolve_celebration',
celebrationId: req.params.donationId,
userId: req.jwt?.payload?.sub,
error: err.message,
ip: req.ip,
});
res.status(422).json(err);
});
},
};
//sendEmail!