1+ const mongoose = require ( 'mongoose' ) ;
2+
3+ /**
4+ * Schema for storing Pipedream trigger deployment information
5+ */
6+ const triggerDeploymentSchema = new mongoose . Schema ( {
7+ // User who deployed the trigger
8+ userId : {
9+ type : mongoose . Schema . Types . ObjectId ,
10+ ref : 'User' ,
11+ required : true ,
12+ index : true ,
13+ } ,
14+
15+ // Workflow this trigger belongs to
16+ workflowId : {
17+ type : String ,
18+ required : true ,
19+ unique : true ,
20+ index : true ,
21+ } ,
22+
23+ // Pipedream component information
24+ componentId : {
25+ type : String ,
26+ required : true ,
27+ } ,
28+
29+ // Trigger key (e.g., 'new_email_received')
30+ triggerKey : {
31+ type : String ,
32+ required : true ,
33+ } ,
34+
35+ // App slug (e.g., 'gmail')
36+ appSlug : {
37+ type : String ,
38+ required : true ,
39+ } ,
40+
41+ // Generated webhook URL
42+ webhookUrl : {
43+ type : String ,
44+ required : true ,
45+ } ,
46+
47+ // Pipedream deployment ID
48+ deploymentId : {
49+ type : String ,
50+ required : true ,
51+ } ,
52+
53+ // Configured properties for the trigger
54+ configuredProps : {
55+ type : mongoose . Schema . Types . Mixed ,
56+ default : { } ,
57+ } ,
58+
59+ // Deployment status
60+ status : {
61+ type : String ,
62+ enum : [ 'deployed' , 'active' , 'paused' , 'failed' , 'deleted' ] ,
63+ default : 'deployed' ,
64+ index : true ,
65+ } ,
66+
67+ // Deployment timestamp
68+ deployedAt : {
69+ type : Date ,
70+ default : Date . now ,
71+ } ,
72+
73+ // Last update timestamp
74+ updatedAt : {
75+ type : Date ,
76+ default : Date . now ,
77+ } ,
78+
79+ // Error information (if deployment failed)
80+ error : {
81+ type : String ,
82+ default : null ,
83+ } ,
84+
85+ // Metadata
86+ metadata : {
87+ type : mongoose . Schema . Types . Mixed ,
88+ default : { } ,
89+ } ,
90+ } , {
91+ timestamps : true ,
92+ } ) ;
93+
94+ // Indexes for efficient querying
95+ triggerDeploymentSchema . index ( { userId : 1 , workflowId : 1 } ) ;
96+ triggerDeploymentSchema . index ( { status : 1 , deployedAt : 1 } ) ;
97+ triggerDeploymentSchema . index ( { appSlug : 1 , triggerKey : 1 } ) ;
98+
99+ const TriggerDeployment = mongoose . model ( 'TriggerDeployment' , triggerDeploymentSchema ) ;
100+
101+ /**
102+ * Create a new trigger deployment
103+ * @param {Object } deploymentData - The deployment data
104+ * @returns {Promise<Object> } The created deployment document
105+ */
106+ async function createTriggerDeployment ( deploymentData ) {
107+ try {
108+ return await TriggerDeployment . create ( deploymentData ) ;
109+ } catch ( error ) {
110+ throw new Error ( `Error creating trigger deployment: ${ error . message } ` ) ;
111+ }
112+ }
113+
114+ /**
115+ * Get trigger deployment by workflow ID
116+ * @param {string } workflowId - The workflow ID
117+ * @returns {Promise<Object|null> } The deployment document or null if not found
118+ */
119+ async function getTriggerDeploymentByWorkflow ( workflowId ) {
120+ try {
121+ return await TriggerDeployment . findOne ( { workflowId } ) . lean ( ) ;
122+ } catch ( error ) {
123+ throw new Error ( `Error fetching trigger deployment: ${ error . message } ` ) ;
124+ }
125+ }
126+
127+ /**
128+ * Get trigger deployments by user
129+ * @param {string } userId - The user's ObjectId
130+ * @param {string } [status] - Optional status filter
131+ * @returns {Promise<Array> } Array of deployment documents
132+ */
133+ async function getTriggerDeploymentsByUser ( userId , status = null ) {
134+ try {
135+ const query = { userId } ;
136+ if ( status ) {
137+ query . status = status ;
138+ }
139+ return await TriggerDeployment . find ( query ) . lean ( ) ;
140+ } catch ( error ) {
141+ throw new Error ( `Error fetching trigger deployments: ${ error . message } ` ) ;
142+ }
143+ }
144+
145+ /**
146+ * Update trigger deployment
147+ * @param {string } workflowId - The workflow ID
148+ * @param {Object } updateData - The data to update
149+ * @returns {Promise<Object|null> } The updated deployment document or null if not found
150+ */
151+ async function updateTriggerDeployment ( workflowId , updateData ) {
152+ try {
153+ return await TriggerDeployment . findOneAndUpdate (
154+ { workflowId } ,
155+ { ...updateData , updatedAt : new Date ( ) } ,
156+ { new : true }
157+ ) . lean ( ) ;
158+ } catch ( error ) {
159+ throw new Error ( `Error updating trigger deployment: ${ error . message } ` ) ;
160+ }
161+ }
162+
163+ /**
164+ * Update trigger deployment status
165+ * @param {string } workflowId - The workflow ID
166+ * @param {string } status - The new status
167+ * @returns {Promise<Object|null> } The updated deployment document or null if not found
168+ */
169+ async function updateTriggerDeploymentStatus ( workflowId , status ) {
170+ try {
171+ return await TriggerDeployment . findOneAndUpdate (
172+ { workflowId } ,
173+ { status, updatedAt : new Date ( ) } ,
174+ { new : true }
175+ ) . lean ( ) ;
176+ } catch ( error ) {
177+ throw new Error ( `Error updating trigger deployment status: ${ error . message } ` ) ;
178+ }
179+ }
180+
181+ /**
182+ * Delete trigger deployment
183+ * @param {string } workflowId - The workflow ID
184+ * @returns {Promise<Object> } The result of the delete operation
185+ */
186+ async function deleteTriggerDeployment ( workflowId ) {
187+ try {
188+ return await TriggerDeployment . deleteOne ( { workflowId } ) ;
189+ } catch ( error ) {
190+ throw new Error ( `Error deleting trigger deployment: ${ error . message } ` ) ;
191+ }
192+ }
193+
194+ /**
195+ * Delete trigger deployments by user
196+ * @param {string } userId - The user's ObjectId
197+ * @returns {Promise<Object> } The result of the delete operation
198+ */
199+ async function deleteTriggerDeploymentsByUser ( userId ) {
200+ try {
201+ return await TriggerDeployment . deleteMany ( { userId } ) ;
202+ } catch ( error ) {
203+ throw new Error ( `Error deleting trigger deployments: ${ error . message } ` ) ;
204+ }
205+ }
206+
207+ /**
208+ * Get active trigger deployments (for health checks)
209+ * @returns {Promise<Array> } Array of active deployment documents
210+ */
211+ async function getActiveTriggerDeployments ( ) {
212+ try {
213+ return await TriggerDeployment . find ( {
214+ status : { $in : [ 'deployed' , 'active' ] }
215+ } ) . lean ( ) ;
216+ } catch ( error ) {
217+ throw new Error ( `Error fetching active trigger deployments: ${ error . message } ` ) ;
218+ }
219+ }
220+
221+ module . exports = {
222+ TriggerDeployment,
223+ createTriggerDeployment,
224+ getTriggerDeploymentByWorkflow,
225+ getTriggerDeploymentsByUser,
226+ updateTriggerDeployment,
227+ updateTriggerDeploymentStatus,
228+ deleteTriggerDeployment,
229+ deleteTriggerDeploymentsByUser,
230+ getActiveTriggerDeployments,
231+ } ;
0 commit comments