Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -43,4 +43,5 @@ courseconnect-c6a7b-firebase-adminsdk-dqqis-af57e2e045.json
playwright-report
test-results
playwright/.auth
playwright.accounts.json
playwright.accounts.json
nul
106 changes: 72 additions & 34 deletions functions/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -135,53 +135,91 @@ export const processSignUpForm = functions.https.onRequest(
);

export const processApplicationForm = functions.https.onRequest(
(request, response) => {
async (request, response) => {
response.set('Access-Control-Allow-Origin', '*');
response.set('Access-Control-Allow-Methods', 'GET, POST');
response.set('Access-Control-Allow-Headers', 'Content-Type');

if (request.method === 'OPTIONS') {
// Handle preflight request
response.status(204).send('');
} else {
// Handle other requests
return;
}

try {
// Determine application type (supervised_teaching sends this, course_assistant defaults)
const applicationType =
request.body.application_type || 'course_assistant';
const uid = request.body.uid;

if (!uid) {
response.status(400).send('Error: uid is required');
return;
}

// Extract user object data from post request
const applicationObject = {
firstname: request.body.firstname,
lastname: request.body.lastname,
email: request.body.email,
ufid: request.body.ufid,
phonenumber: request.body.phonenumber,
gpa: request.body.gpa,
department: request.body.department,
degree: request.body.degree,
semesterstatus: request.body.semesterstatus,
additionalprompt: request.body.additionalprompt,
nationality: request.body.nationality,
englishproficiency: 'NA',
position: request.body.position,
available_hours: request.body.available_hours,
available_semesters: request.body.available_semesters,
courses: request.body.courses,
qualifications: request.body.qualifications,
uid: request.body.uid,
date: request.body.date,
status: request.body.status,
resume_link: request.body.resume_link,
classnumbers: 'NA',
...request.body,
application_type: applicationType,
};

// Create the document within the "applications" collection
db.collection('applications')
.doc(applicationObject.uid)
.set(applicationObject)
.then(() => {
response.status(200).send('Application created successfully');
})
.catch((error: any) => {
response.send('Error creating application: ' + error.message);
// For course_assistant, ensure all expected fields are present
if (applicationType === 'course_assistant') {
applicationObject.phonenumber = request.body.phonenumber;
applicationObject.gpa = request.body.gpa;
applicationObject.department = request.body.department;
applicationObject.degree = request.body.degree;
applicationObject.semesterstatus = request.body.semesterstatus;
applicationObject.additionalprompt = request.body.additionalprompt;
applicationObject.nationality = request.body.nationality;
applicationObject.englishproficiency = 'NA';
applicationObject.position = request.body.position;
applicationObject.available_hours = request.body.available_hours;
applicationObject.available_semesters =
request.body.available_semesters;
applicationObject.courses = request.body.courses;
applicationObject.qualifications = request.body.qualifications;
applicationObject.resume_link = request.body.resume_link;
applicationObject.classnumbers = 'NA';
}

// Common fields for all application types
applicationObject.firstname = request.body.firstname;
applicationObject.lastname = request.body.lastname;
applicationObject.email = request.body.email;
applicationObject.ufid = request.body.ufid;
applicationObject.uid = uid;
applicationObject.date = request.body.date;
applicationObject.status = request.body.status;

// DUAL-WRITE MODE: Write to both old and new structures for backward compatibility

// 1. Write to new structure: applications/{userId}/{applicationType}/{auto-generated-id}
const newStructureRef = await db
.collection('applications')
.doc(uid)
.collection(applicationType)
.add({
...applicationObject,
created_at: admin.firestore.FieldValue.serverTimestamp(),
updated_at: admin.firestore.FieldValue.serverTimestamp(),
});

console.log(
`Created application in new structure: ${newStructureRef.id}`
);

// 2. Also write to old flat structure for backward compatibility (temporary)
// This allows existing code to continue working during migration
await db
.collection('applications')
.doc(uid)
.set(applicationObject, { merge: true });

response.status(200).send('Application created successfully');
} catch (error: any) {
console.error('Error creating application:', error);
response.status(500).send('Error creating application: ' + error.message);
}
}
);
Expand Down
7 changes: 7 additions & 0 deletions src/app/applications/applicationSections.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -43,8 +43,15 @@ export default function ApplicationSections({
.map(({ label, to, icon: Icon }: NavbarItem) => (
<DashboardCard key={to} icon={Icon} label={label} to={to} />
))}

{navItems
.filter((item) => item.type === 'supervised-teaching')
.map(({ label, to, icon: Icon }: NavbarItem) => (
<DashboardCard key={to} icon={Icon} label={label} to={to} />
))}
</div>
</div>

<div>
<h1 className="text-h6 mb-3 ">Research</h1>
<p className="text-sm">No available applications at this time.</p>
Expand Down
1 change: 1 addition & 0 deletions src/app/applications/courseAssistant/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -168,6 +168,7 @@ export default function Application() {

// extract the specific user data from the form data into a parsable object
const applicationData = {
application_type: 'course_assistant',
firstname: formData.get('firstName') as string,
lastname: formData.get('lastName') as string,
email: formData.get('email') as string,
Expand Down
Loading