Skip to content

Commit ebd4b6f

Browse files
committed
Merge branch 'develop' into multitenancy
2 parents a2b8de7 + 721f513 commit ebd4b6f

8 files changed

Lines changed: 743 additions & 55 deletions

File tree

package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,8 @@
5858
"docker:start": "yarn database:setup:script && cd devContainerization && node start-containers.js",
5959
"docker:i": "cd devContainerization && docker compose -f docker-compose.dev.yml exec -T backend sh -c \"yarn install && cd src/backend && npx prisma generate\" && docker compose -f docker-compose.dev.yml exec -T frontend sh -c \"yarn install\"",
6060
"docker:test": "yarn test:setup && cd devContainerization && docker compose -f docker-compose.dev.yml exec backend bash -c \"yarn test:backend\" && docker compose -f docker-compose.dev.yml exec frontend sh -c \"yarn test:frontend\" && yarn test:teardown",
61-
"docker:rebuild": "docker compose -f devContainerization/docker-compose.dev.yml rm -f -s && yarn docker:start"
61+
"docker:rebuild": "docker compose -f devContainerization/docker-compose.dev.yml rm -f -s && yarn docker:start",
62+
"db:pull": "node scripts/db-pull.js"
6263
},
6364
"resolutions": {
6465
"@types/react": "17.0.1",

scripts/db-pull.js

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
const { execSync } = require('child_process');
2+
const readline = require('readline');
3+
4+
function promptUser(question) {
5+
const rl = readline.createInterface({
6+
input: process.stdin,
7+
output: process.stdout
8+
});
9+
10+
return new Promise((resolve) => {
11+
rl.question(question, (answer) => {
12+
rl.close();
13+
resolve(answer.trim());
14+
});
15+
});
16+
}
17+
18+
async function main() {
19+
console.log('🚀 Database Migration Script\n');
20+
21+
try {
22+
const targetUrl = "postgresql://postgres:docker@localhost:5432/nerpm"
23+
24+
console.log(`📍 Target database: ${targetUrl.replace(/\/\/[^@]*@/, '//***:***@')}`);
25+
26+
const sourceUrl = new URL(await promptUser('\nSource database URL (READ-ONLY - will not be modified): '));
27+
sourceUrl.search = '';
28+
29+
console.log(`\n📋 Migration Summary:`);
30+
console.log(`• Source (READ-ONLY): ${sourceUrl.href.replace(/\/\/[^@]*@/, '//***:***@')}`);
31+
console.log(`• Target (WILL BE OVERWRITTEN): ${targetUrl.replace(/\/\/[^@]*@/, '//***:***@')}`);
32+
33+
const confirm = await promptUser('\n⚠️ This will COMPLETELY OVERWRITE the target database. Continue? (y/n): ');
34+
35+
if (confirm.toLowerCase() !== 'y') {
36+
console.log('❌ Cancelled');
37+
return;
38+
}
39+
40+
console.log('\n🗑️ Clearing target database...');
41+
42+
// First, clear the target database completely
43+
const clearCommand = `psql "${targetUrl}" -c "DROP SCHEMA public CASCADE; CREATE SCHEMA public;"`;
44+
console.log(targetUrl)
45+
46+
try {
47+
execSync(clearCommand, { stdio: 'inherit' });
48+
console.log('✅ Target database cleared');
49+
} catch (error) {
50+
console.log('⚠️ Warning: Could not clear database, continuing anyway...');
51+
}
52+
53+
console.log('\n📦 Dumping and restoring database...');
54+
55+
const dumpCommand = `pg_dump "${sourceUrl}" --no-acl --no-owner --clean --if-exists | psql "${targetUrl}"`;
56+
57+
execSync(dumpCommand, { stdio: 'inherit' });
58+
59+
console.log('✅ Migration complete!');
60+
61+
} catch (error) {
62+
console.error('❌ Error:', error.message);
63+
process.exit(1);
64+
}
65+
}
66+
67+
main();

src/backend/package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,8 @@
3232
"jsonwebtoken": "^8.5.1",
3333
"multer": "^1.4.5-lts.1",
3434
"nodemailer": "^6.9.1",
35-
"shared": "1.0.0",
36-
"prisma": "^6.2.1"
35+
"prisma": "^6.2.1",
36+
"shared": "1.0.0"
3737
},
3838
"devDependencies": {
3939
"@types/express-jwt": "^6.0.4",
Lines changed: 266 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,266 @@
1+
-- CreateIndex
2+
CREATE INDEX "Account_Code_organizationId_idx" ON "public"."Account_Code"("organizationId");
3+
4+
-- CreateIndex
5+
CREATE INDEX "Activation_CR_changeRequestId_idx" ON "public"."Activation_CR"("changeRequestId");
6+
7+
-- CreateIndex
8+
CREATE INDEX "Announcement_organizationId_idx" ON "public"."Announcement"("organizationId");
9+
10+
-- CreateIndex
11+
CREATE INDEX "Assembly_wbsElementId_idx" ON "public"."Assembly"("wbsElementId");
12+
13+
-- CreateIndex
14+
CREATE INDEX "Availability_scheduleSettingsId_idx" ON "public"."Availability"("scheduleSettingsId");
15+
16+
-- CreateIndex
17+
CREATE INDEX "Budget_CR_changeRequestId_idx" ON "public"."Budget_CR"("changeRequestId");
18+
19+
-- CreateIndex
20+
CREATE INDEX "Car_wbsElementId_idx" ON "public"."Car"("wbsElementId");
21+
22+
-- CreateIndex
23+
CREATE INDEX "Change_wbsElementId_idx" ON "public"."Change"("wbsElementId");
24+
25+
-- CreateIndex
26+
CREATE INDEX "Change_changeRequestId_idx" ON "public"."Change"("changeRequestId");
27+
28+
-- CreateIndex
29+
CREATE INDEX "Change_categoryId_idx" ON "public"."Change"("categoryId");
30+
31+
-- CreateIndex
32+
CREATE INDEX "Change_accountCodeId_idx" ON "public"."Change"("accountCodeId");
33+
34+
-- CreateIndex
35+
CREATE INDEX "Change_Request_reviewerId_idx" ON "public"."Change_Request"("reviewerId");
36+
37+
-- CreateIndex
38+
CREATE INDEX "Change_Request_organizationId_idx" ON "public"."Change_Request"("organizationId");
39+
40+
-- CreateIndex
41+
CREATE INDEX "Checklist_organizationId_idx" ON "public"."Checklist"("organizationId");
42+
43+
-- CreateIndex
44+
CREATE INDEX "Checklist_teamId_idx" ON "public"."Checklist"("teamId");
45+
46+
-- CreateIndex
47+
CREATE INDEX "Checklist_teamTypeId_idx" ON "public"."Checklist"("teamTypeId");
48+
49+
-- CreateIndex
50+
CREATE INDEX "Contact_organizationId_idx" ON "public"."Contact"("organizationId");
51+
52+
-- CreateIndex
53+
CREATE INDEX "Description_Bullet_wbsElementId_idx" ON "public"."Description_Bullet"("wbsElementId");
54+
55+
-- CreateIndex
56+
CREATE INDEX "Description_Bullet_proposedChangeId_idx" ON "public"."Description_Bullet"("proposedChangeId");
57+
58+
-- CreateIndex
59+
CREATE INDEX "Description_Bullet_wbsElementTemplateId_idx" ON "public"."Description_Bullet"("wbsElementTemplateId");
60+
61+
-- CreateIndex
62+
CREATE INDEX "Description_Bullet_descriptionBulletTypeId_idx" ON "public"."Description_Bullet"("descriptionBulletTypeId");
63+
64+
-- CreateIndex
65+
CREATE INDEX "Description_Bullet_Type_organizationId_idx" ON "public"."Description_Bullet_Type"("organizationId");
66+
67+
-- CreateIndex
68+
CREATE INDEX "Design_Review_teamTypeId_idx" ON "public"."Design_Review"("teamTypeId");
69+
70+
-- CreateIndex
71+
CREATE INDEX "Graph_graphCollectionId_idx" ON "public"."Graph"("graphCollectionId");
72+
73+
-- CreateIndex
74+
CREATE INDEX "Graph_organizationId_idx" ON "public"."Graph"("organizationId");
75+
76+
-- CreateIndex
77+
CREATE INDEX "Graph_Collection_organizationId_idx" ON "public"."Graph_Collection"("organizationId");
78+
79+
-- CreateIndex
80+
CREATE INDEX "Index_Code_organizationId_idx" ON "public"."Index_Code"("organizationId");
81+
82+
-- CreateIndex
83+
CREATE INDEX "Link_wbsElementId_idx" ON "public"."Link"("wbsElementId");
84+
85+
-- CreateIndex
86+
CREATE INDEX "Link_wbsProposedChangesId_idx" ON "public"."Link"("wbsProposedChangesId");
87+
88+
-- CreateIndex
89+
CREATE INDEX "Link_organizationId_idx" ON "public"."Link"("organizationId");
90+
91+
-- CreateIndex
92+
CREATE INDEX "Link_linkTypeId_idx" ON "public"."Link"("linkTypeId");
93+
94+
-- CreateIndex
95+
CREATE INDEX "Link_Type_organizationId_idx" ON "public"."Link_Type"("organizationId");
96+
97+
-- CreateIndex
98+
CREATE INDEX "Manufacturer_organizationId_idx" ON "public"."Manufacturer"("organizationId");
99+
100+
-- CreateIndex
101+
CREATE INDEX "Material_assemblyId_idx" ON "public"."Material"("assemblyId");
102+
103+
-- CreateIndex
104+
CREATE INDEX "Material_materialTypeId_idx" ON "public"."Material"("materialTypeId");
105+
106+
-- CreateIndex
107+
CREATE INDEX "Material_manufacturerId_idx" ON "public"."Material"("manufacturerId");
108+
109+
-- CreateIndex
110+
CREATE INDEX "Material_reimbursementRequestId_idx" ON "public"."Material"("reimbursementRequestId");
111+
112+
-- CreateIndex
113+
CREATE INDEX "Material_wbsElementId_idx" ON "public"."Material"("wbsElementId");
114+
115+
-- CreateIndex
116+
CREATE INDEX "Material_Type_organizationId_idx" ON "public"."Material_Type"("organizationId");
117+
118+
-- CreateIndex
119+
CREATE INDEX "Message_Info_reimbursementRequestId_idx" ON "public"."Message_Info"("reimbursementRequestId");
120+
121+
-- CreateIndex
122+
CREATE INDEX "Message_Info_designReviewId_idx" ON "public"."Message_Info"("designReviewId");
123+
124+
-- CreateIndex
125+
CREATE INDEX "Message_Info_changeRequestId_idx" ON "public"."Message_Info"("changeRequestId");
126+
127+
-- CreateIndex
128+
CREATE INDEX "Milestone_organizationId_idx" ON "public"."Milestone"("organizationId");
129+
130+
-- CreateIndex
131+
CREATE INDEX "Part_Review_submissionId_idx" ON "public"."Part_Review"("submissionId");
132+
133+
-- CreateIndex
134+
CREATE INDEX "Part_Review_Popup_reviewId_idx" ON "public"."Part_Review_Popup"("reviewId");
135+
136+
-- CreateIndex
137+
CREATE INDEX "Part_Review_Request_partId_idx" ON "public"."Part_Review_Request"("partId");
138+
139+
-- CreateIndex
140+
CREATE INDEX "Part_Submission_partId_idx" ON "public"."Part_Submission"("partId");
141+
142+
-- CreateIndex
143+
CREATE INDEX "Part_Tag_organizationId_idx" ON "public"."Part_Tag"("organizationId");
144+
145+
-- CreateIndex
146+
CREATE INDEX "PopUp_organizationId_idx" ON "public"."PopUp"("organizationId");
147+
148+
-- CreateIndex
149+
CREATE INDEX "Project_carId_idx" ON "public"."Project"("carId");
150+
151+
-- CreateIndex
152+
CREATE INDEX "Project_Proposed_Changes_wbsProposedChangesId_idx" ON "public"."Project_Proposed_Changes"("wbsProposedChangesId");
153+
154+
-- CreateIndex
155+
CREATE INDEX "Project_Proposed_Changes_carId_idx" ON "public"."Project_Proposed_Changes"("carId");
156+
157+
-- CreateIndex
158+
CREATE INDEX "Proposed_Solution_scopeChangeRequestId_idx" ON "public"."Proposed_Solution"("scopeChangeRequestId");
159+
160+
-- CreateIndex
161+
CREATE INDEX "Receipt_reimbursementRequestId_idx" ON "public"."Receipt"("reimbursementRequestId");
162+
163+
-- CreateIndex
164+
CREATE INDEX "Refund_Source_reimbursementProductId_idx" ON "public"."Refund_Source"("reimbursementProductId");
165+
166+
-- CreateIndex
167+
CREATE INDEX "Refund_Source_indexCodeId_idx" ON "public"."Refund_Source"("indexCodeId");
168+
169+
-- CreateIndex
170+
CREATE INDEX "Reimbursement_organizationId_idx" ON "public"."Reimbursement"("organizationId");
171+
172+
-- CreateIndex
173+
CREATE INDEX "Reimbursement_Product_reimbursementRequestId_idx" ON "public"."Reimbursement_Product"("reimbursementRequestId");
174+
175+
-- CreateIndex
176+
CREATE INDEX "Reimbursement_Product_reimbursementProductReasonId_idx" ON "public"."Reimbursement_Product"("reimbursementProductReasonId");
177+
178+
-- CreateIndex
179+
CREATE INDEX "Reimbursement_Product_Other_Reason_indexCodeId_idx" ON "public"."Reimbursement_Product_Other_Reason"("indexCodeId");
180+
181+
-- CreateIndex
182+
CREATE INDEX "Reimbursement_Product_Reason_wbsElementId_idx" ON "public"."Reimbursement_Product_Reason"("wbsElementId");
183+
184+
-- CreateIndex
185+
CREATE INDEX "Reimbursement_Product_Reason_otherReasonId_idx" ON "public"."Reimbursement_Product_Reason"("otherReasonId");
186+
187+
-- CreateIndex
188+
CREATE INDEX "Reimbursement_Request_organizationId_idx" ON "public"."Reimbursement_Request"("organizationId");
189+
190+
-- CreateIndex
191+
CREATE INDEX "Reimbursement_Request_accountCodeId_idx" ON "public"."Reimbursement_Request"("accountCodeId");
192+
193+
-- CreateIndex
194+
CREATE INDEX "Reimbursement_Request_indexCodeId_idx" ON "public"."Reimbursement_Request"("indexCodeId");
195+
196+
-- CreateIndex
197+
CREATE INDEX "Reimbursement_Request_vendorId_idx" ON "public"."Reimbursement_Request"("vendorId");
198+
199+
-- CreateIndex
200+
CREATE INDEX "Reimbursement_Request_Comment_reimbursementRequestId_idx" ON "public"."Reimbursement_Request_Comment"("reimbursementRequestId");
201+
202+
-- CreateIndex
203+
CREATE INDEX "Reimbursement_Status_reimbursementRequestId_idx" ON "public"."Reimbursement_Status"("reimbursementRequestId");
204+
205+
-- CreateIndex
206+
CREATE INDEX "Role_organizationId_idx" ON "public"."Role"("organizationId");
207+
208+
-- CreateIndex
209+
CREATE INDEX "Scope_CR_Why_scopeCrId_idx" ON "public"."Scope_CR_Why"("scopeCrId");
210+
211+
-- CreateIndex
212+
CREATE INDEX "Sponsor_sponsorTierId_idx" ON "public"."Sponsor"("sponsorTierId");
213+
214+
-- CreateIndex
215+
CREATE INDEX "Sponsor_organizationId_idx" ON "public"."Sponsor"("organizationId");
216+
217+
-- CreateIndex
218+
CREATE INDEX "Sponsor_Task_sponsorId_idx" ON "public"."Sponsor_Task"("sponsorId");
219+
220+
-- CreateIndex
221+
CREATE INDEX "Sponsor_Tier_organizationId_idx" ON "public"."Sponsor_Tier"("organizationId");
222+
223+
-- CreateIndex
224+
CREATE INDEX "Stage_Gate_CR_changeRequestId_idx" ON "public"."Stage_Gate_CR"("changeRequestId");
225+
226+
-- CreateIndex
227+
CREATE INDEX "Task_wbsElementId_idx" ON "public"."Task"("wbsElementId");
228+
229+
-- CreateIndex
230+
CREATE INDEX "Team_headId_idx" ON "public"."Team"("headId");
231+
232+
-- CreateIndex
233+
CREATE INDEX "Team_organizationId_idx" ON "public"."Team"("organizationId");
234+
235+
-- CreateIndex
236+
CREATE INDEX "Team_Type_organizationId_idx" ON "public"."Team_Type"("organizationId");
237+
238+
-- CreateIndex
239+
CREATE INDEX "Unit_organizationId_idx" ON "public"."Unit"("organizationId");
240+
241+
-- CreateIndex
242+
CREATE INDEX "Vendor_organizationId_idx" ON "public"."Vendor"("organizationId");
243+
244+
-- CreateIndex
245+
CREATE INDEX "WBS_Element_organizationId_idx" ON "public"."WBS_Element"("organizationId");
246+
247+
-- CreateIndex
248+
CREATE INDEX "WBS_Element_Template_organizationId_idx" ON "public"."WBS_Element_Template"("organizationId");
249+
250+
-- CreateIndex
251+
CREATE INDEX "Wbs_Proposed_Changes_scopeChangeRequestAsOriginalDataId_idx" ON "public"."Wbs_Proposed_Changes"("scopeChangeRequestAsOriginalDataId");
252+
253+
-- CreateIndex
254+
CREATE INDEX "Wbs_Proposed_Changes_scopeChangeRequestId_idx" ON "public"."Wbs_Proposed_Changes"("scopeChangeRequestId");
255+
256+
-- CreateIndex
257+
CREATE INDEX "Work_Package_projectId_idx" ON "public"."Work_Package"("projectId");
258+
259+
-- CreateIndex
260+
CREATE INDEX "Work_Package_Proposed_Changes_wbsProposedChangesId_idx" ON "public"."Work_Package_Proposed_Changes"("wbsProposedChangesId");
261+
262+
-- CreateIndex
263+
CREATE INDEX "Work_Package_Proposed_Changes_projectProposedChangesId_idx" ON "public"."Work_Package_Proposed_Changes"("projectProposedChangesId");
264+
265+
-- CreateIndex
266+
CREATE INDEX "Work_Package_Template_projectTemplateId_idx" ON "public"."Work_Package_Template"("projectTemplateId");
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
# Please do not edit this file manually
22
# It should be added in your version-control system (e.g., Git)
3-
provider = "postgresql"
3+
provider = "postgresql"

0 commit comments

Comments
 (0)