From d2ed29dbe2155277588d4c0edaab938074b464eb Mon Sep 17 00:00:00 2001 From: Jack Psaras Date: Sat, 25 Nov 2023 21:57:31 -0500 Subject: [PATCH 1/4] added lambda functions + made schedule searcher --- lambdafuncs/lambda_enroll.py | 50 ++++++++++++++++++++++++ lambdafuncs/lambda_searchCourse.py | 62 ++++++++++++++++++++++++++++++ lambdafuncs/lambda_searchUsers.py | 46 ++++++++++++++++++++++ 3 files changed, 158 insertions(+) create mode 100644 lambdafuncs/lambda_enroll.py create mode 100644 lambdafuncs/lambda_searchCourse.py create mode 100644 lambdafuncs/lambda_searchUsers.py diff --git a/lambdafuncs/lambda_enroll.py b/lambdafuncs/lambda_enroll.py new file mode 100644 index 0000000..e4de760 --- /dev/null +++ b/lambdafuncs/lambda_enroll.py @@ -0,0 +1,50 @@ +import json +import boto3 + +# Initialize the DynamoDB client +dynamodb = boto3.client('dynamodb') + +# DynamoDB table name +table_name = 'enroll_course' + +def lambda_handler(event, context): + # Extract the JSON data from the event + try: + if 'body' in event: + course_data = json.loads(event['body']) + else: + course_data = event + except Exception as e: + return { + 'statusCode': 400, + 'body': json.dumps({'error': 'Invalid JSON format in the request body'}) + } + + # Check if the required fields are present in the request + if 'name' not in course_data or 'courseName' not in course_data: + return { + 'statusCode': 400, + 'body': json.dumps({'error': 'Required fields ("name" and "courseName") are missing in the request body'}) + } + + # Create an item for the DynamoDB table + item = { + 'name': {'S': course_data['name']}, + 'courseName': {'S': course_data['courseName']} + } + + # Put the item into the DynamoDB table + try: + dynamodb.put_item( + TableName=table_name, + Item=item + ) + return { + 'statusCode': 200, + 'body': json.dumps({'message': 'Course added successfully'}) + } + except Exception as e: + return { + 'statusCode': 500, + 'body': json.dumps({'error': str(e)}) + } diff --git a/lambdafuncs/lambda_searchCourse.py b/lambdafuncs/lambda_searchCourse.py new file mode 100644 index 0000000..68bff93 --- /dev/null +++ b/lambdafuncs/lambda_searchCourse.py @@ -0,0 +1,62 @@ +import boto3 +import json + +# Initialize the DynamoDB client +dynamodb = boto3.client('dynamodb') + +# DynamoDB table name +table_name = 'course_createDB' + +def lambda_handler(event, context): + # Extract 'name' parameter from the query string + if event.get('queryStringParameters') and 'name' in event['queryStringParameters']: + name = event['queryStringParameters']['name'] + try: + response = dynamodb.get_item( + TableName=table_name, + Key={'name': {'S': name}} + ) + item = response.get('Item', {}) + if not item: + return { + 'statusCode': 404, + 'headers': { + 'Access-Control-Allow-Origin': 'http://localhost:5173', # Replace with your frontend URL + 'Access-Control-Allow-Methods': 'GET', # Adjust based on allowed methods + 'Access-Control-Allow-Headers': 'Content-Type', # Include necessary headers + 'Access-Control-Allow-Credentials': 'true', # Include if credentials (cookies, etc.) are needed + }, + 'body': json.dumps({'error': 'Item not found'}) + } + return { + 'statusCode': 200, + 'headers': { + 'Access-Control-Allow-Origin': 'http://localhost:5173', # Replace with your frontend URL + 'Access-Control-Allow-Methods': 'GET', # Adjust based on allowed methods + 'Access-Control-Allow-Headers': 'Content-Type', # Include necessary headers + 'Access-Control-Allow-Credentials': 'true', # Include if credentials (cookies, etc.) are needed + }, + 'body': json.dumps(item) + } + except Exception as e: + return { + 'statusCode': 500, + 'headers': { + 'Access-Control-Allow-Origin': 'http://localhost:5173', # Replace with your frontend URL + 'Access-Control-Allow-Methods': 'GET', # Adjust based on allowed methods + 'Access-Control-Allow-Headers': 'Content-Type', # Include necessary headers + 'Access-Control-Allow-Credentials': 'true', # Include if credentials (cookies, etc.) are needed + }, + 'body': json.dumps({'error': str(e)}) + } + else: + return { + 'statusCode': 400, + 'headers': { + 'Access-Control-Allow-Origin': 'http://localhost:5173', # Replace with your frontend URL + 'Access-Control-Allow-Methods': 'GET', # Adjust based on allowed methods + 'Access-Control-Allow-Headers': 'Content-Type', # Include necessary headers + 'Access-Control-Allow-Credentials': 'true', # Include if credentials (cookies, etc.) are needed + }, + 'body': json.dumps({'error': 'Missing or invalid "name" parameter in the query string'}) + } diff --git a/lambdafuncs/lambda_searchUsers.py b/lambdafuncs/lambda_searchUsers.py new file mode 100644 index 0000000..b47ebf3 --- /dev/null +++ b/lambdafuncs/lambda_searchUsers.py @@ -0,0 +1,46 @@ +import boto3 + +def lambda_handler(event, context): + # Assuming the partition key value is provided in the event + partition_key_value = event['name'] + + # Creating a DynamoDB client + dynamodb = boto3.resource('dynamodb') + + # Specify the table name + table_name = 'enroll_course' + + # Get a reference to the table + table = dynamodb.Table(table_name) + + try: + # Query the table using the partition key + response = table.query( + KeyConditionExpression=boto3.dynamodb.conditions.Key('name').eq(partition_key_value) + ) + + # Print the items found + items = response['Items'] + print(items) + + # You can do further processing with the items here + + # Modify the response to include the items + return { + 'statusCode': 200, + 'body': { + 'message': 'Query executed successfully!', + 'items': items + } + } + + except Exception as e: + print(f"Error querying DynamoDB table: {e}") + + # Modify the response to include the error message + return { + 'statusCode': 500, + 'body': { + 'message': f'Error querying DynamoDB table: {str(e)}' + } + } From aa70f38267e686a2adbb171a58b8b1b25068e709 Mon Sep 17 00:00:00 2001 From: Jack Psaras Date: Wed, 29 Nov 2023 13:31:19 -0500 Subject: [PATCH 2/4] WIP --- src/views/ScheduleView.vue | 218 ++++++++++++++++++++----------------- 1 file changed, 120 insertions(+), 98 deletions(-) diff --git a/src/views/ScheduleView.vue b/src/views/ScheduleView.vue index 1a199ab..4c0218c 100644 --- a/src/views/ScheduleView.vue +++ b/src/views/ScheduleView.vue @@ -1,105 +1,127 @@ - - - - - - \ No newline at end of file + }, +}; + + + From a76af9471c5ac11f5798b251f77c7c1c8b8c6476 Mon Sep 17 00:00:00 2001 From: Jack Psaras Date: Wed, 29 Nov 2023 17:44:42 -0500 Subject: [PATCH 3/4] working schedule view --- src/views/ScheduleView.vue | 160 +++++++++++++++++++------------------ 1 file changed, 83 insertions(+), 77 deletions(-) diff --git a/src/views/ScheduleView.vue b/src/views/ScheduleView.vue index 4c0218c..d7ce2a1 100644 --- a/src/views/ScheduleView.vue +++ b/src/views/ScheduleView.vue @@ -1,127 +1,133 @@ From 4aff2271bee7b2fa0d61c91a5061cd1536595fbc Mon Sep 17 00:00:00 2001 From: Jack Psaras Date: Wed, 29 Nov 2023 17:58:27 -0500 Subject: [PATCH 4/4] Added course details --- src/views/ScheduleView.vue | 45 +++++++++++++++++++++++++++++--------- 1 file changed, 35 insertions(+), 10 deletions(-) diff --git a/src/views/ScheduleView.vue b/src/views/ScheduleView.vue index d7ce2a1..fb26e9c 100644 --- a/src/views/ScheduleView.vue +++ b/src/views/ScheduleView.vue @@ -16,6 +16,16 @@

{{ course.courseName ? course.courseName.S : 'Course Name N/A' }}

+ +
+

Location: {{ courseDetails[index].location.S }}

+

Days: {{ courseDetails[index].days.S }}

+

Seats: {{ courseDetails[index].seats.N }}

+

Professor: {{ courseDetails[index].professor.S }}

+

Major: {{ courseDetails[index].major.S }}

+

Time: {{ courseDetails[index].time.S }}

+

Type: {{ courseDetails[index].type.S }}

+
@@ -37,21 +47,35 @@ export default { const parsedName = parsedUser._value.name; const parsedEmail = parsedUser._value.email; const schedule = ref([]); + const courseDetails = ref([]); - const viewSchedule = () => { + const viewSchedule = async () => { const url = 'https://xb55sqy2kf.execute-api.us-east-1.amazonaws.com/prod/testing'; - axios.get(url, { - params: { - name: parsedName, - }, - }) - .then(response => { + try { + const response = await axios.get(url, { + params: { + name: parsedName, + }, + }); + schedule.value = response.data; - }) - .catch(error => { + + // Fetch additional course details for each course + const promises = schedule.value.map(course => { + const courseDetailsUrl = 'https://8dbuywnj95.execute-api.us-east-1.amazonaws.com/Final_stage_course/search'; + return axios.get(courseDetailsUrl, { + params: { + name: course.courseName.S, + }, + }); + }); + + const detailsResponses = await Promise.all(promises); + courseDetails.value = detailsResponses.map(response => response.data); + } catch (error) { console.error('Error fetching schedule:', error); - }); + } }; const unenroll = (courseName) => { @@ -77,6 +101,7 @@ export default { parsedName, parsedEmail, schedule, + courseDetails, viewSchedule, unenroll, };