diff --git a/cdk/api_gateway/api_documentation/.openapi-generator-ignore b/cdk/api_gateway/api_documentation/.openapi-generator-ignore
new file mode 100644
index 00000000..7484ee59
--- /dev/null
+++ b/cdk/api_gateway/api_documentation/.openapi-generator-ignore
@@ -0,0 +1,23 @@
+# OpenAPI Generator Ignore
+# Generated by openapi-generator https://github.com/openapitools/openapi-generator
+
+# Use this file to prevent files from being overwritten by the generator.
+# The patterns follow closely to .gitignore or .dockerignore.
+
+# As an example, the C# client generator defines ApiClient.cs.
+# You can make changes and tell OpenAPI Generator to ignore just this file by uncommenting the following line:
+#ApiClient.cs
+
+# You can match any string of characters against a directory, file or extension with a single asterisk (*):
+#foo/*/qux
+# The above matches foo/bar/qux and foo/baz/qux, but not foo/bar/baz/qux
+
+# You can recursively match patterns against a directory, file or extension with a double asterisk (**):
+#foo/**/qux
+# This matches foo/bar/qux, foo/baz/qux, and foo/bar/baz/qux
+
+# You can also negate patterns with an exclamation (!).
+# For example, you can ignore all files in a docs folder with the file extension .md:
+#docs/*.md
+# Then explicitly reverse the ignore rule for a single file:
+#!docs/README.md
diff --git a/cdk/api_gateway/api_documentation/.openapi-generator/FILES b/cdk/api_gateway/api_documentation/.openapi-generator/FILES
new file mode 100644
index 00000000..c88b0186
--- /dev/null
+++ b/cdk/api_gateway/api_documentation/.openapi-generator/FILES
@@ -0,0 +1,24 @@
+Apis/DefaultApi.md
+Models/3dPrinterInfo.md
+Models/EquipmentUsage.md
+Models/EquipmentUsageProperties.md
+Models/EquipmentUsageRequiredProperties.md
+Models/EquipmentUsages.md
+Models/Qualification.md
+Models/Qualifications.md
+Models/QualificationsProperties.md
+Models/User.md
+Models/UserID.md
+Models/UserProperties.md
+Models/UserRequiredProperties.md
+Models/Users.md
+Models/Visit.md
+Models/VisitProperties.md
+Models/Visits.md
+Models/_users_post_400_response.md
+Models/completableItem.md
+Models/location.md
+Models/major.md
+Models/undergraduateClass.md
+Models/universityStatus.md
+README.md
diff --git a/cdk/api_gateway/api_documentation/.openapi-generator/VERSION b/cdk/api_gateway/api_documentation/.openapi-generator/VERSION
new file mode 100644
index 00000000..758bb9c8
--- /dev/null
+++ b/cdk/api_gateway/api_documentation/.openapi-generator/VERSION
@@ -0,0 +1 @@
+7.10.0
diff --git a/cdk/api_gateway/api_documentation/Apis/DefaultApi.md b/cdk/api_gateway/api_documentation/Apis/DefaultApi.md
new file mode 100644
index 00000000..1821148c
--- /dev/null
+++ b/cdk/api_gateway/api_documentation/Apis/DefaultApi.md
@@ -0,0 +1,413 @@
+# DefaultApi
+
+All URIs are relative to *https://api.cumaker.space*
+
+| Method | HTTP request | Description |
+|------------- | ------------- | -------------|
+| [**equipmentGet**](DefaultApi.md#equipmentGet) | **GET** /equipment | Retrieve all equipment usage data |
+| [**equipmentPost**](DefaultApi.md#equipmentPost) | **POST** /equipment | Create a new equipment usage data entry. Fails on existing UserID and Timestamp |
+| [**equipmentUserIdGet**](DefaultApi.md#equipmentUserIdGet) | **GET** /equipment/{user_id} | Retrieve all equipment usage data for a specific user. |
+| [**equipmentUserIdPatch**](DefaultApi.md#equipmentUserIdPatch) | **PATCH** /equipment/{user_id} | Update data in an existing equipment usage data entry. Specify the timestamp field to get a specific entry, or leave it blank to get the data entry with the latest timestamp. |
+| [**qualificationsGet**](DefaultApi.md#qualificationsGet) | **GET** /qualifications | Retrieve all qualification data |
+| [**qualificationsPost**](DefaultApi.md#qualificationsPost) | **POST** /qualifications | Create a new qualification entry for a user. Fails on existing UserID |
+| [**qualificationsUserIdGet**](DefaultApi.md#qualificationsUserIdGet) | **GET** /qualifications/{user_id} | Retrieve qualification data for a specific user |
+| [**qualificationsUserIdPatch**](DefaultApi.md#qualificationsUserIdPatch) | **PATCH** /qualifications/{user_id} | Update a qualification entry for a user. Unique items included in any completable item field are appended to that field. Any duplicate completable item is disregarded within that given field. |
+| [**usersGet**](DefaultApi.md#usersGet) | **GET** /users | Retrieve all user data |
+| [**usersPost**](DefaultApi.md#usersPost) | **POST** /users | Create a new user. Fails on existing UserID |
+| [**usersUserIdGet**](DefaultApi.md#usersUserIdGet) | **GET** /users/{user_id} | Retrieve user data for a specific user |
+| [**usersUserIdPatch**](DefaultApi.md#usersUserIdPatch) | **PATCH** /users/{user_id} | Update data for an existing user |
+| [**visitsGet**](DefaultApi.md#visitsGet) | **GET** /visits | Retrieve all visit data |
+| [**visitsPost**](DefaultApi.md#visitsPost) | **POST** /visits | Create a new visit entry. Fails on existing UserID and Timestamp |
+| [**visitsUserIdGet**](DefaultApi.md#visitsUserIdGet) | **GET** /visits/{user_id} | Retrieve all visits for a specific user |
+
+
+
+# **equipmentGet**
+> EquipmentUsages equipmentGet(start\_timestamp, end\_timestamp, limit)
+
+Retrieve all equipment usage data
+
+### Parameters
+
+|Name | Type | Description | Notes |
+|------------- | ------------- | ------------- | -------------|
+| **start\_timestamp** | **Date**| Used to query for results with timestamps greater than or equal to start_timestamp. If used alongside end_timestamp, it MUST be less than or equal to it. | [optional] [default to null] |
+| **end\_timestamp** | **Date**| Used to query for results with timestamps less than or equal to end_timestamp. If used alongside start_timestamp, it MUST be greater than or equal to it. | [optional] [default to null] |
+| **limit** | **Integer**| The maximum number of results to return from a table scan/query. | [optional] [default to null] |
+
+### Return type
+
+[**EquipmentUsages**](../Models/EquipmentUsages.md)
+
+### Authorization
+
+[ApiKeyAuth](../README.md#ApiKeyAuth)
+
+### HTTP request headers
+
+- **Content-Type**: Not defined
+- **Accept**: application/json
+
+
+# **equipmentPost**
+> equipmentPost(EquipmentUsage)
+
+Create a new equipment usage data entry. Fails on existing UserID and Timestamp
+
+### Parameters
+
+|Name | Type | Description | Notes |
+|------------- | ------------- | ------------- | -------------|
+| **EquipmentUsage** | [**EquipmentUsage**](../Models/EquipmentUsage.md)| Create a new equipment usage table entry. | [optional] |
+
+### Return type
+
+null (empty response body)
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+- **Content-Type**: application/json
+- **Accept**: application/json
+
+
+# **equipmentUserIdGet**
+> EquipmentUsages equipmentUserIdGet(user\_id, start\_timestamp, end\_timestamp, limit)
+
+Retrieve all equipment usage data for a specific user.
+
+### Parameters
+
+|Name | Type | Description | Notes |
+|------------- | ------------- | ------------- | -------------|
+| **user\_id** | [**UserID**](../Models/.md)| | [default to null] |
+| **start\_timestamp** | **Date**| Used to query for results with timestamps greater than or equal to start_timestamp. If used alongside end_timestamp, it MUST be less than or equal to it. | [optional] [default to null] |
+| **end\_timestamp** | **Date**| Used to query for results with timestamps less than or equal to end_timestamp. If used alongside start_timestamp, it MUST be greater than or equal to it. | [optional] [default to null] |
+| **limit** | **Integer**| The maximum number of results to return from a table scan/query. | [optional] [default to null] |
+
+### Return type
+
+[**EquipmentUsages**](../Models/EquipmentUsages.md)
+
+### Authorization
+
+[ApiKeyAuth](../README.md#ApiKeyAuth)
+
+### HTTP request headers
+
+- **Content-Type**: Not defined
+- **Accept**: application/json
+
+
+# **equipmentUserIdPatch**
+> equipmentUserIdPatch(user\_id, EquipmentUsageProperties)
+
+Update data in an existing equipment usage data entry. Specify the timestamp field to get a specific entry, or leave it blank to get the data entry with the latest timestamp.
+
+### Parameters
+
+|Name | Type | Description | Notes |
+|------------- | ------------- | ------------- | -------------|
+| **user\_id** | [**UserID**](../Models/.md)| | [default to null] |
+| **EquipmentUsageProperties** | [**EquipmentUsageProperties**](../Models/EquipmentUsageProperties.md)| Update an equipment usage entry. Changed fields are required to exhibit any documented required field sets (e.g., changing equipment_type from \"Laser Engraver\"->\"3D Printer\" means a 3d_printer_info object must be provided in the request body). The user_id and timestamp fields will NEVER be changed, even if they are provided in the request body. If the timestamp field is not provided, the latest entry in the equipment usage table for the user will be updated instead. | [optional] |
+
+### Return type
+
+null (empty response body)
+
+### Authorization
+
+[ApiKeyAuth](../README.md#ApiKeyAuth)
+
+### HTTP request headers
+
+- **Content-Type**: application/json
+- **Accept**: application/json
+
+
+# **qualificationsGet**
+> Qualifications qualificationsGet(start\_timestamp, end\_timestamp, limit)
+
+Retrieve all qualification data
+
+### Parameters
+
+|Name | Type | Description | Notes |
+|------------- | ------------- | ------------- | -------------|
+| **start\_timestamp** | **Date**| Used to query for results with timestamps greater than or equal to start_timestamp. If used alongside end_timestamp, it MUST be less than or equal to it. | [optional] [default to null] |
+| **end\_timestamp** | **Date**| Used to query for results with timestamps less than or equal to end_timestamp. If used alongside start_timestamp, it MUST be greater than or equal to it. | [optional] [default to null] |
+| **limit** | **Integer**| The maximum number of results to return from a table scan/query. | [optional] [default to null] |
+
+### Return type
+
+[**Qualifications**](../Models/Qualifications.md)
+
+### Authorization
+
+[ApiKeyAuth](../README.md#ApiKeyAuth)
+
+### HTTP request headers
+
+- **Content-Type**: Not defined
+- **Accept**: application/json
+
+
+# **qualificationsPost**
+> qualificationsPost(Qualification)
+
+Create a new qualification entry for a user. Fails on existing UserID
+
+### Parameters
+
+|Name | Type | Description | Notes |
+|------------- | ------------- | ------------- | -------------|
+| **Qualification** | [**Qualification**](../Models/Qualification.md)| Create a new qualifications table entry. The last_updated field will always be managed by the server, and will never change to a value provided in a request body. | [optional] |
+
+### Return type
+
+null (empty response body)
+
+### Authorization
+
+[ApiKeyAuth](../README.md#ApiKeyAuth)
+
+### HTTP request headers
+
+- **Content-Type**: application/json
+- **Accept**: application/json
+
+
+# **qualificationsUserIdGet**
+> Qualification qualificationsUserIdGet(user\_id)
+
+Retrieve qualification data for a specific user
+
+### Parameters
+
+|Name | Type | Description | Notes |
+|------------- | ------------- | ------------- | -------------|
+| **user\_id** | [**UserID**](../Models/.md)| | [default to null] |
+
+### Return type
+
+[**Qualification**](../Models/Qualification.md)
+
+### Authorization
+
+[ApiKeyAuth](../README.md#ApiKeyAuth)
+
+### HTTP request headers
+
+- **Content-Type**: Not defined
+- **Accept**: application/json
+
+
+# **qualificationsUserIdPatch**
+> qualificationsUserIdPatch(user\_id, QualificationsProperties)
+
+Update a qualification entry for a user. Unique items included in any completable item field are appended to that field. Any duplicate completable item is disregarded within that given field.
+
+### Parameters
+
+|Name | Type | Description | Notes |
+|------------- | ------------- | ------------- | -------------|
+| **user\_id** | [**UserID**](../Models/.md)| | [default to null] |
+| **QualificationsProperties** | [**QualificationsProperties**](../Models/QualificationsProperties.md)| Update a qualifications entry. It is required when updating any object that is an array of completable items that the request array contains all existing keys. Changed values of existing keys and any new key:value pairs will be added. The user_id field will NEVER be changed, even if it is provided in the request body. The last_updated field will always be managed by the server, and will never change to a value provided in a request body. | [optional] |
+
+### Return type
+
+null (empty response body)
+
+### Authorization
+
+[ApiKeyAuth](../README.md#ApiKeyAuth)
+
+### HTTP request headers
+
+- **Content-Type**: application/json
+- **Accept**: application/json
+
+
+# **usersGet**
+> Users usersGet(limit)
+
+Retrieve all user data
+
+### Parameters
+
+|Name | Type | Description | Notes |
+|------------- | ------------- | ------------- | -------------|
+| **limit** | **Integer**| The maximum number of results to return from a table scan/query. | [optional] [default to null] |
+
+### Return type
+
+[**Users**](../Models/Users.md)
+
+### Authorization
+
+[ApiKeyAuth](../README.md#ApiKeyAuth)
+
+### HTTP request headers
+
+- **Content-Type**: Not defined
+- **Accept**: application/json
+
+
+# **usersPost**
+> usersPost(User)
+
+Create a new user. Fails on existing UserID
+
+### Parameters
+
+|Name | Type | Description | Notes |
+|------------- | ------------- | ------------- | -------------|
+| **User** | [**User**](../Models/User.md)| Create a new user information table entry. | [optional] |
+
+### Return type
+
+null (empty response body)
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+- **Content-Type**: application/json
+- **Accept**: application/json
+
+
+# **usersUserIdGet**
+> User usersUserIdGet(user\_id)
+
+Retrieve user data for a specific user
+
+### Parameters
+
+|Name | Type | Description | Notes |
+|------------- | ------------- | ------------- | -------------|
+| **user\_id** | [**UserID**](../Models/.md)| | [default to null] |
+
+### Return type
+
+[**User**](../Models/User.md)
+
+### Authorization
+
+[ApiKeyAuth](../README.md#ApiKeyAuth)
+
+### HTTP request headers
+
+- **Content-Type**: Not defined
+- **Accept**: application/json
+
+
+# **usersUserIdPatch**
+> usersUserIdPatch(user\_id, UserProperties)
+
+Update data for an existing user
+
+### Parameters
+
+|Name | Type | Description | Notes |
+|------------- | ------------- | ------------- | -------------|
+| **user\_id** | [**UserID**](../Models/.md)| | [default to null] |
+| **UserProperties** | [**UserProperties**](../Models/UserProperties.md)| Update an equipment usage entry. Changed fields are required to exhibit any documented required field sets (e.g., changing university_status from Employee->Undergraduate means the major and undergraduate_class must be defined in the request body). The user_id field will NEVER be changed, even if it is provided in the request body. | [optional] |
+
+### Return type
+
+null (empty response body)
+
+### Authorization
+
+[ApiKeyAuth](../README.md#ApiKeyAuth)
+
+### HTTP request headers
+
+- **Content-Type**: application/json
+- **Accept**: application/json
+
+
+# **visitsGet**
+> Visits visitsGet(start\_timestamp, end\_timestamp, limit)
+
+Retrieve all visit data
+
+### Parameters
+
+|Name | Type | Description | Notes |
+|------------- | ------------- | ------------- | -------------|
+| **start\_timestamp** | **Date**| Used to query for results with timestamps greater than or equal to start_timestamp. If used alongside end_timestamp, it MUST be less than or equal to it. | [optional] [default to null] |
+| **end\_timestamp** | **Date**| Used to query for results with timestamps less than or equal to end_timestamp. If used alongside start_timestamp, it MUST be greater than or equal to it. | [optional] [default to null] |
+| **limit** | **Integer**| The maximum number of results to return from a table scan/query. | [optional] [default to null] |
+
+### Return type
+
+[**Visits**](../Models/Visits.md)
+
+### Authorization
+
+[ApiKeyAuth](../README.md#ApiKeyAuth)
+
+### HTTP request headers
+
+- **Content-Type**: Not defined
+- **Accept**: application/json
+
+
+# **visitsPost**
+> visitsPost(Visit)
+
+Create a new visit entry. Fails on existing UserID and Timestamp
+
+### Parameters
+
+|Name | Type | Description | Notes |
+|------------- | ------------- | ------------- | -------------|
+| **Visit** | [**Visit**](../Models/Visit.md)| Create a new visit table entry. | [optional] |
+
+### Return type
+
+null (empty response body)
+
+### Authorization
+
+[ApiKeyAuth](../README.md#ApiKeyAuth)
+
+### HTTP request headers
+
+- **Content-Type**: application/json
+- **Accept**: application/json
+
+
+# **visitsUserIdGet**
+> Visits visitsUserIdGet(user\_id, start\_timestamp, end\_timestamp, limit)
+
+Retrieve all visits for a specific user
+
+### Parameters
+
+|Name | Type | Description | Notes |
+|------------- | ------------- | ------------- | -------------|
+| **user\_id** | [**UserID**](../Models/.md)| | [default to null] |
+| **start\_timestamp** | **Date**| Used to query for results with timestamps greater than or equal to start_timestamp. If used alongside end_timestamp, it MUST be less than or equal to it. | [optional] [default to null] |
+| **end\_timestamp** | **Date**| Used to query for results with timestamps less than or equal to end_timestamp. If used alongside start_timestamp, it MUST be greater than or equal to it. | [optional] [default to null] |
+| **limit** | **Integer**| The maximum number of results to return from a table scan/query. | [optional] [default to null] |
+
+### Return type
+
+[**Visits**](../Models/Visits.md)
+
+### Authorization
+
+[ApiKeyAuth](../README.md#ApiKeyAuth)
+
+### HTTP request headers
+
+- **Content-Type**: Not defined
+- **Accept**: application/json
+
diff --git a/cdk/api_gateway/api_documentation/Models/3dPrinterInfo.md b/cdk/api_gateway/api_documentation/Models/3dPrinterInfo.md
new file mode 100644
index 00000000..d6281a0c
--- /dev/null
+++ b/cdk/api_gateway/api_documentation/Models/3dPrinterInfo.md
@@ -0,0 +1,14 @@
+# 3dPrinterInfo
+## Properties
+
+| Name | Type | Description | Notes |
+|------------ | ------------- | ------------- | -------------|
+| **printer\_name** | **String** | | [default to null] |
+| **print\_duration** | **Integer** | The duration of a 3d print in minutes. | [default to null] |
+| **print\_mass** | **Double** | The mass of an object. | [default to null] |
+| **print\_mass\_estimate** | **Double** | The mass of an object. | [default to null] |
+| **print\_status** | **String** | An enum of strings of possible print statuses. | [default to null] |
+| **print\_notes** | **String** | Notes about the print. | [optional] [default to null] |
+
+[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)
+
diff --git a/cdk/api_gateway/api_documentation/Models/400_response.md b/cdk/api_gateway/api_documentation/Models/400_response.md
new file mode 100644
index 00000000..8418c7d7
--- /dev/null
+++ b/cdk/api_gateway/api_documentation/Models/400_response.md
@@ -0,0 +1,9 @@
+# _users_post_400_response
+## Properties
+
+| Name | Type | Description | Notes |
+|------------ | ------------- | ------------- | -------------|
+| **errorMsg** | **String** | A message describing what was wrong with the request. | [optional] [default to null] |
+
+[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)
+
diff --git a/cdk/api_gateway/api_documentation/Models/EquipmentUsage.md b/cdk/api_gateway/api_documentation/Models/EquipmentUsage.md
new file mode 100644
index 00000000..60e6ce72
--- /dev/null
+++ b/cdk/api_gateway/api_documentation/Models/EquipmentUsage.md
@@ -0,0 +1,19 @@
+# EquipmentUsage
+## Properties
+
+| Name | Type | Description | Notes |
+|------------ | ------------- | ------------- | -------------|
+| **user\_id** | **String** | A string defined to only be valid for alphanumeric strings. | [default to null] |
+| **timestamp** | **Date** | A timestamp in date-time format (YYYY-MM-DDThh:mm:ss) in EST. | [default to null] |
+| **location** | [**location**](location.md) | | [default to null] |
+| **project\_name** | **String** | The name of the project. | [default to null] |
+| **project\_type** | **String** | The type of project. A string enum value. | [default to null] |
+| **class\_number** | **String** | | [optional] [default to null] |
+| **faculty\_name** | **String** | | [optional] [default to null] |
+| **project\_sponsor** | **String** | | [optional] [default to null] |
+| **organization\_affiliation** | **String** | | [optional] [default to null] |
+| **equipment\_type** | **String** | | [default to null] |
+| **3d\_printer\_info** | [**3dPrinterInfo**](3dPrinterInfo.md) | | [optional] [default to null] |
+
+[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)
+
diff --git a/cdk/api_gateway/api_documentation/Models/EquipmentUsageProperties.md b/cdk/api_gateway/api_documentation/Models/EquipmentUsageProperties.md
new file mode 100644
index 00000000..334ce630
--- /dev/null
+++ b/cdk/api_gateway/api_documentation/Models/EquipmentUsageProperties.md
@@ -0,0 +1,18 @@
+# EquipmentUsageProperties
+## Properties
+
+| Name | Type | Description | Notes |
+|------------ | ------------- | ------------- | -------------|
+| **timestamp** | **Date** | A timestamp in date-time format (YYYY-MM-DDThh:mm:ss) in EST. | [optional] [default to null] |
+| **location** | [**location**](location.md) | | [optional] [default to null] |
+| **project\_name** | **String** | The name of the project. | [optional] [default to null] |
+| **project\_type** | **String** | The type of project. A string enum value. | [optional] [default to null] |
+| **class\_number** | **String** | | [optional] [default to null] |
+| **faculty\_name** | **String** | | [optional] [default to null] |
+| **project\_sponsor** | **String** | | [optional] [default to null] |
+| **organization\_affiliation** | **String** | | [optional] [default to null] |
+| **equipment\_type** | **String** | | [optional] [default to null] |
+| **3d\_printer\_info** | [**3dPrinterInfo**](3dPrinterInfo.md) | | [optional] [default to null] |
+
+[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)
+
diff --git a/cdk/api_gateway/api_documentation/Models/EquipmentUsageRequiredProperties.md b/cdk/api_gateway/api_documentation/Models/EquipmentUsageRequiredProperties.md
new file mode 100644
index 00000000..9d43bc46
--- /dev/null
+++ b/cdk/api_gateway/api_documentation/Models/EquipmentUsageRequiredProperties.md
@@ -0,0 +1,8 @@
+# EquipmentUsageRequiredProperties
+## Properties
+
+| Name | Type | Description | Notes |
+|------------ | ------------- | ------------- | -------------|
+
+[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)
+
diff --git a/cdk/api_gateway/api_documentation/Models/EquipmentUsages.md b/cdk/api_gateway/api_documentation/Models/EquipmentUsages.md
new file mode 100644
index 00000000..93be10bb
--- /dev/null
+++ b/cdk/api_gateway/api_documentation/Models/EquipmentUsages.md
@@ -0,0 +1,9 @@
+# EquipmentUsages
+## Properties
+
+| Name | Type | Description | Notes |
+|------------ | ------------- | ------------- | -------------|
+| **equipment\_logs** | [**List**](EquipmentUsage.md) | | [optional] [default to null] |
+
+[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)
+
diff --git a/cdk/api_gateway/api_documentation/Models/Qualification.md b/cdk/api_gateway/api_documentation/Models/Qualification.md
new file mode 100644
index 00000000..fa962a65
--- /dev/null
+++ b/cdk/api_gateway/api_documentation/Models/Qualification.md
@@ -0,0 +1,13 @@
+# Qualification
+## Properties
+
+| Name | Type | Description | Notes |
+|------------ | ------------- | ------------- | -------------|
+| **user\_id** | **String** | A string defined to only be valid for alphanumeric strings. | [optional] [default to null] |
+| **last\_updated** | **Date** | A timestamp in date-time format (YYYY-MM-DDThh:mm:ss) in EST. | [optional] [default to null] |
+| **trainings** | [**List**](completableItem.md) | An array of training courses and the user’s completion status of them. | [optional] [default to null] |
+| **waivers** | [**List**](completableItem.md) | An array of waivers and the user’s completion status of them. | [optional] [default to null] |
+| **miscellaneous** | [**List**](completableItem.md) | An array of miscellaneous courses and the user’s completion status of them. | [optional] [default to null] |
+
+[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)
+
diff --git a/cdk/api_gateway/api_documentation/Models/Qualifications.md b/cdk/api_gateway/api_documentation/Models/Qualifications.md
new file mode 100644
index 00000000..93535ac8
--- /dev/null
+++ b/cdk/api_gateway/api_documentation/Models/Qualifications.md
@@ -0,0 +1,9 @@
+# Qualifications
+## Properties
+
+| Name | Type | Description | Notes |
+|------------ | ------------- | ------------- | -------------|
+| **qualifications** | [**List**](Qualification.md) | | [optional] [default to null] |
+
+[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)
+
diff --git a/cdk/api_gateway/api_documentation/Models/QualificationsProperties.md b/cdk/api_gateway/api_documentation/Models/QualificationsProperties.md
new file mode 100644
index 00000000..90e549f0
--- /dev/null
+++ b/cdk/api_gateway/api_documentation/Models/QualificationsProperties.md
@@ -0,0 +1,12 @@
+# QualificationsProperties
+## Properties
+
+| Name | Type | Description | Notes |
+|------------ | ------------- | ------------- | -------------|
+| **last\_updated** | **Date** | A timestamp in date-time format (YYYY-MM-DDThh:mm:ss) in EST. | [optional] [default to null] |
+| **trainings** | [**List**](completableItem.md) | An array of training courses and the user’s completion status of them. | [optional] [default to null] |
+| **waivers** | [**List**](completableItem.md) | An array of waivers and the user’s completion status of them. | [optional] [default to null] |
+| **miscellaneous** | [**List**](completableItem.md) | An array of miscellaneous courses and the user’s completion status of them. | [optional] [default to null] |
+
+[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)
+
diff --git a/cdk/api_gateway/api_documentation/Models/User.md b/cdk/api_gateway/api_documentation/Models/User.md
new file mode 100644
index 00000000..ee720f68
--- /dev/null
+++ b/cdk/api_gateway/api_documentation/Models/User.md
@@ -0,0 +1,12 @@
+# User
+## Properties
+
+| Name | Type | Description | Notes |
+|------------ | ------------- | ------------- | -------------|
+| **user\_id** | **String** | A string defined to only be valid for alphanumeric strings. | [default to null] |
+| **university\_status** | [**universityStatus**](universityStatus.md) | | [default to null] |
+| **major** | [**major**](major.md) | | [optional] [default to null] |
+| **undergraduate\_class** | [**undergraduateClass**](undergraduateClass.md) | | [optional] [default to null] |
+
+[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)
+
diff --git a/cdk/api_gateway/api_documentation/Models/UserID.md b/cdk/api_gateway/api_documentation/Models/UserID.md
new file mode 100644
index 00000000..b3d79e9f
--- /dev/null
+++ b/cdk/api_gateway/api_documentation/Models/UserID.md
@@ -0,0 +1,9 @@
+# UserID
+## Properties
+
+| Name | Type | Description | Notes |
+|------------ | ------------- | ------------- | -------------|
+| **user\_id** | **String** | A string defined to only be valid for alphanumeric strings. | [optional] [default to null] |
+
+[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)
+
diff --git a/cdk/api_gateway/api_documentation/Models/UserProperties.md b/cdk/api_gateway/api_documentation/Models/UserProperties.md
new file mode 100644
index 00000000..c40d41b9
--- /dev/null
+++ b/cdk/api_gateway/api_documentation/Models/UserProperties.md
@@ -0,0 +1,11 @@
+# UserProperties
+## Properties
+
+| Name | Type | Description | Notes |
+|------------ | ------------- | ------------- | -------------|
+| **university\_status** | [**universityStatus**](universityStatus.md) | | [optional] [default to null] |
+| **major** | [**major**](major.md) | | [optional] [default to null] |
+| **undergraduate\_class** | [**undergraduateClass**](undergraduateClass.md) | | [optional] [default to null] |
+
+[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)
+
diff --git a/cdk/api_gateway/api_documentation/Models/UserRequiredProperties.md b/cdk/api_gateway/api_documentation/Models/UserRequiredProperties.md
new file mode 100644
index 00000000..f1e0fb90
--- /dev/null
+++ b/cdk/api_gateway/api_documentation/Models/UserRequiredProperties.md
@@ -0,0 +1,8 @@
+# UserRequiredProperties
+## Properties
+
+| Name | Type | Description | Notes |
+|------------ | ------------- | ------------- | -------------|
+
+[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)
+
diff --git a/cdk/api_gateway/api_documentation/Models/Users.md b/cdk/api_gateway/api_documentation/Models/Users.md
new file mode 100644
index 00000000..f25f2f2d
--- /dev/null
+++ b/cdk/api_gateway/api_documentation/Models/Users.md
@@ -0,0 +1,9 @@
+# Users
+## Properties
+
+| Name | Type | Description | Notes |
+|------------ | ------------- | ------------- | -------------|
+| **users** | [**List**](User.md) | | [optional] [default to null] |
+
+[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)
+
diff --git a/cdk/api_gateway/api_documentation/Models/Visit.md b/cdk/api_gateway/api_documentation/Models/Visit.md
new file mode 100644
index 00000000..4cc72fd0
--- /dev/null
+++ b/cdk/api_gateway/api_documentation/Models/Visit.md
@@ -0,0 +1,11 @@
+# Visit
+## Properties
+
+| Name | Type | Description | Notes |
+|------------ | ------------- | ------------- | -------------|
+| **user\_id** | **String** | A string defined to only be valid for alphanumeric strings. | [optional] [default to null] |
+| **timestamp** | **Date** | A timestamp in date-time format (YYYY-MM-DDThh:mm:ss) in EST. | [optional] [default to null] |
+| **location** | [**location**](location.md) | | [optional] [default to null] |
+
+[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)
+
diff --git a/cdk/api_gateway/api_documentation/Models/VisitProperties.md b/cdk/api_gateway/api_documentation/Models/VisitProperties.md
new file mode 100644
index 00000000..b2c83fad
--- /dev/null
+++ b/cdk/api_gateway/api_documentation/Models/VisitProperties.md
@@ -0,0 +1,10 @@
+# VisitProperties
+## Properties
+
+| Name | Type | Description | Notes |
+|------------ | ------------- | ------------- | -------------|
+| **timestamp** | **Date** | A timestamp in date-time format (YYYY-MM-DDThh:mm:ss) in EST. | [optional] [default to null] |
+| **location** | [**location**](location.md) | | [optional] [default to null] |
+
+[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)
+
diff --git a/cdk/api_gateway/api_documentation/Models/Visits.md b/cdk/api_gateway/api_documentation/Models/Visits.md
new file mode 100644
index 00000000..8cfbc5ae
--- /dev/null
+++ b/cdk/api_gateway/api_documentation/Models/Visits.md
@@ -0,0 +1,9 @@
+# Visits
+## Properties
+
+| Name | Type | Description | Notes |
+|------------ | ------------- | ------------- | -------------|
+| **visits** | [**List**](Visit.md) | | [optional] [default to null] |
+
+[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)
+
diff --git a/cdk/api_gateway/api_documentation/Models/completableItem.md b/cdk/api_gateway/api_documentation/Models/completableItem.md
new file mode 100644
index 00000000..b51807ee
--- /dev/null
+++ b/cdk/api_gateway/api_documentation/Models/completableItem.md
@@ -0,0 +1,10 @@
+# completableItem
+## Properties
+
+| Name | Type | Description | Notes |
+|------------ | ------------- | ------------- | -------------|
+| **name** | **String** | The name of the completable item. | [optional] [default to null] |
+| **completion\_status** | **String** | The current status of the completable item. | [optional] [default to null] |
+
+[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)
+
diff --git a/cdk/api_gateway/api_documentation/Models/location.md b/cdk/api_gateway/api_documentation/Models/location.md
new file mode 100644
index 00000000..a56cb264
--- /dev/null
+++ b/cdk/api_gateway/api_documentation/Models/location.md
@@ -0,0 +1,8 @@
+# location
+## Properties
+
+| Name | Type | Description | Notes |
+|------------ | ------------- | ------------- | -------------|
+
+[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)
+
diff --git a/cdk/api_gateway/api_documentation/Models/major.md b/cdk/api_gateway/api_documentation/Models/major.md
new file mode 100644
index 00000000..c194e3ec
--- /dev/null
+++ b/cdk/api_gateway/api_documentation/Models/major.md
@@ -0,0 +1,8 @@
+# major
+## Properties
+
+| Name | Type | Description | Notes |
+|------------ | ------------- | ------------- | -------------|
+
+[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)
+
diff --git a/cdk/api_gateway/api_documentation/Models/undergraduateClass.md b/cdk/api_gateway/api_documentation/Models/undergraduateClass.md
new file mode 100644
index 00000000..f45cc199
--- /dev/null
+++ b/cdk/api_gateway/api_documentation/Models/undergraduateClass.md
@@ -0,0 +1,8 @@
+# undergraduateClass
+## Properties
+
+| Name | Type | Description | Notes |
+|------------ | ------------- | ------------- | -------------|
+
+[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)
+
diff --git a/cdk/api_gateway/api_documentation/Models/universityStatus.md b/cdk/api_gateway/api_documentation/Models/universityStatus.md
new file mode 100644
index 00000000..613487e3
--- /dev/null
+++ b/cdk/api_gateway/api_documentation/Models/universityStatus.md
@@ -0,0 +1,8 @@
+# universityStatus
+## Properties
+
+| Name | Type | Description | Notes |
+|------------ | ------------- | ------------- | -------------|
+
+[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)
+
diff --git a/cdk/api_gateway/api_documentation/README.md b/cdk/api_gateway/api_documentation/README.md
new file mode 100644
index 00000000..0dbfd4a3
--- /dev/null
+++ b/cdk/api_gateway/api_documentation/README.md
@@ -0,0 +1,63 @@
+# Documentation for User Management and Data Tracking API
+
+
+## Documentation for API Endpoints
+
+All URIs are relative to *https://api.cumaker.space*
+
+| Class | Method | HTTP request | Description |
+|------------ | ------------- | ------------- | -------------|
+| *DefaultApi* | [**equipmentGet**](Apis/DefaultApi.md#equipmentget) | **GET** /equipment | Retrieve all equipment usage data |
+*DefaultApi* | [**equipmentPost**](Apis/DefaultApi.md#equipmentpost) | **POST** /equipment | Create a new equipment usage data entry. Fails on existing UserID and Timestamp |
+*DefaultApi* | [**equipmentUserIdGet**](Apis/DefaultApi.md#equipmentuseridget) | **GET** /equipment/{user_id} | Retrieve all equipment usage data for a specific user. |
+*DefaultApi* | [**equipmentUserIdPatch**](Apis/DefaultApi.md#equipmentuseridpatch) | **PATCH** /equipment/{user_id} | Update data in an existing equipment usage data entry. Specify the timestamp field to get a specific entry, or leave it blank to get the data entry with the latest timestamp. |
+*DefaultApi* | [**qualificationsGet**](Apis/DefaultApi.md#qualificationsget) | **GET** /qualifications | Retrieve all qualification data |
+*DefaultApi* | [**qualificationsPost**](Apis/DefaultApi.md#qualificationspost) | **POST** /qualifications | Create a new qualification entry for a user. Fails on existing UserID |
+*DefaultApi* | [**qualificationsUserIdGet**](Apis/DefaultApi.md#qualificationsuseridget) | **GET** /qualifications/{user_id} | Retrieve qualification data for a specific user |
+*DefaultApi* | [**qualificationsUserIdPatch**](Apis/DefaultApi.md#qualificationsuseridpatch) | **PATCH** /qualifications/{user_id} | Update a qualification entry for a user. Unique items included in any completable item field are appended to that field. Any duplicate completable item is disregarded within that given field. |
+*DefaultApi* | [**usersGet**](Apis/DefaultApi.md#usersget) | **GET** /users | Retrieve all user data |
+*DefaultApi* | [**usersPost**](Apis/DefaultApi.md#userspost) | **POST** /users | Create a new user. Fails on existing UserID |
+*DefaultApi* | [**usersUserIdGet**](Apis/DefaultApi.md#usersuseridget) | **GET** /users/{user_id} | Retrieve user data for a specific user |
+*DefaultApi* | [**usersUserIdPatch**](Apis/DefaultApi.md#usersuseridpatch) | **PATCH** /users/{user_id} | Update data for an existing user |
+*DefaultApi* | [**visitsGet**](Apis/DefaultApi.md#visitsget) | **GET** /visits | Retrieve all visit data |
+*DefaultApi* | [**visitsPost**](Apis/DefaultApi.md#visitspost) | **POST** /visits | Create a new visit entry. Fails on existing UserID and Timestamp |
+*DefaultApi* | [**visitsUserIdGet**](Apis/DefaultApi.md#visitsuseridget) | **GET** /visits/{user_id} | Retrieve all visits for a specific user |
+
+
+
+## Documentation for Models
+
+ - [3dPrinterInfo](./Models/3dPrinterInfo.md)
+ - [EquipmentUsage](./Models/EquipmentUsage.md)
+ - [EquipmentUsageProperties](./Models/EquipmentUsageProperties.md)
+ - [EquipmentUsageRequiredProperties](./Models/EquipmentUsageRequiredProperties.md)
+ - [EquipmentUsages](./Models/EquipmentUsages.md)
+ - [Qualification](./Models/Qualification.md)
+ - [Qualifications](./Models/Qualifications.md)
+ - [QualificationsProperties](./Models/QualificationsProperties.md)
+ - [User](./Models/User.md)
+ - [UserID](./Models/UserID.md)
+ - [UserProperties](./Models/UserProperties.md)
+ - [UserRequiredProperties](./Models/UserRequiredProperties.md)
+ - [Users](./Models/Users.md)
+ - [Visit](./Models/Visit.md)
+ - [VisitProperties](./Models/VisitProperties.md)
+ - [Visits](./Models/Visits.md)
+ - [400 Response](./Models/400_response.md)
+ - [completableItem](./Models/completableItem.md)
+ - [location](./Models/location.md)
+ - [major](./Models/major.md)
+ - [undergraduateClass](./Models/undergraduateClass.md)
+ - [universityStatus](./Models/universityStatus.md)
+
+
+
+## Documentation for Authorization
+
+
+### ApiKeyAuth
+
+- **Type**: API key
+- **API key parameter name**: x-api-key
+- **Location**: HTTP header
+
diff --git a/cdk/api_gateway/api_documentation/documentation.yaml b/cdk/api_gateway/api_documentation/documentation.yaml
new file mode 100644
index 00000000..72dcec14
--- /dev/null
+++ b/cdk/api_gateway/api_documentation/documentation.yaml
@@ -0,0 +1,938 @@
+openapi: 3.0.0
+
+info:
+ title: User Management and Data Tracking API
+ description: |
+ API for managing users, visits, equipment usage, and qualifications. Regarding
+ the usage of this API, there is one non-standard implementation that should be
+ noted. The way POST methods work are as follows: the first POST guarantees a
+ new object will be created and stored; successive POSTs are subject to error
+ in two cases. 1) If the table does NOT store request body provided timestamps:
+ POST will fail if an entry with a UserID already exists. 2) If the table DOES
+ store request body provided timestamps: POST will fail if an entry with both
+ the UserID and timestamp already exists. In essence, POST acts like PUT based
+ on some criteria; this is design is intentional to prevent accidental data
+ overwriting as the primary (and secondary) identifiers are provided by request
+ bodies and not generated internally. POST methods will specify "Fails on existing
+ UserID" or "Fails on existing UserID and Timestamp" if it fails to case 1 or 2
+ respectively.
+ version: "1.0.0"
+
+servers:
+ - url: https://api.cumaker.space
+ description: Production api url (uses live data)
+ - url: https://beta-api.cumaker.space
+ description: Development api url (uses test data)
+
+paths:
+ /users:
+ get:
+ summary: Retrieve all user data
+ security:
+ - ApiKeyAuth: []
+ parameters:
+ - $ref: '#/components/parameters/Limit'
+ responses:
+ 200:
+ description: OK
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Users'
+ x-amazon-apigateway-integration:
+ type: aws_proxy
+ httpMethod: POST
+ uri: arn:aws:apigateway:us-east-1:lambda:path/2015-03-31/functions/arn:aws:lambda:us-east-1:944207523762:function:beta-api-handler/invocations
+ payloadFormatVersion: "1.0"
+ passthroughBehavior: when_no_match
+ timeoutInMillis: 29000
+
+ post:
+ summary: Create a new user. Fails on existing UserID
+ requestBody:
+ $ref: '#/components/requestBodies/CreateUser'
+ responses:
+ 201:
+ description: Created
+ 400:
+ $ref: '#/components/responses/BadRequest'
+ x-amazon-apigateway-integration:
+ type: aws_proxy
+ httpMethod: POST
+ uri: arn:aws:apigateway:us-east-1:lambda:path/2015-03-31/functions/arn:aws:lambda:us-east-1:944207523762:function:beta-api-handler/invocations
+ payloadFormatVersion: "1.0"
+ passthroughBehavior: when_no_match
+ timeoutInMillis: 29000
+
+ /users/{user_id}:
+ get:
+ summary: Retrieve user data for a specific user
+ security:
+ - ApiKeyAuth: []
+ parameters:
+ - $ref: '#/components/parameters/UserID'
+ responses:
+ 200:
+ description: OK
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/User'
+ 400:
+ $ref: '#/components/responses/BadRequest'
+ x-amazon-apigateway-integration:
+ type: aws_proxy
+ httpMethod: POST
+ uri: arn:aws:apigateway:us-east-1:lambda:path/2015-03-31/functions/arn:aws:lambda:us-east-1:944207523762:function:beta-api-handler/invocations
+ payloadFormatVersion: "1.0"
+ passthroughBehavior: when_no_match
+ timeoutInMillis: 29000
+
+ patch:
+ summary: Update data for an existing user
+ security:
+ - ApiKeyAuth: []
+ parameters:
+ - $ref: '#/components/parameters/UserID'
+ requestBody:
+ $ref: '#/components/requestBodies/UpdateUser'
+ responses:
+ 204:
+ description: Updated
+ 400:
+ $ref: '#/components/responses/BadRequest'
+ x-amazon-apigateway-integration:
+ type: aws_proxy
+ httpMethod: POST
+ uri: arn:aws:apigateway:us-east-1:lambda:path/2015-03-31/functions/arn:aws:lambda:us-east-1:944207523762:function:beta-api-handler/invocations
+ payloadFormatVersion: "1.0"
+ passthroughBehavior: when_no_match
+ timeoutInMillis: 29000
+
+
+ /visits:
+ get:
+ summary: Retrieve all visit data
+ security:
+ - ApiKeyAuth: []
+ parameters:
+ - $ref: '#/components/parameters/StartTimestamp'
+ - $ref: '#/components/parameters/EndTimestamp'
+ - $ref: '#/components/parameters/Limit'
+ responses:
+ 200:
+ description: OK
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Visits'
+ x-amazon-apigateway-integration:
+ type: aws_proxy
+ httpMethod: POST
+ uri: arn:aws:apigateway:us-east-1:lambda:path/2015-03-31/functions/arn:aws:lambda:us-east-1:944207523762:function:beta-api-handler/invocations
+ payloadFormatVersion: "1.0"
+ passthroughBehavior: when_no_match
+ timeoutInMillis: 29000
+
+ post:
+ summary: Create a new visit entry. Fails on existing UserID and Timestamp
+ security:
+ - ApiKeyAuth: []
+ requestBody:
+ $ref: '#/components/requestBodies/CreateVisit'
+ responses:
+ 201:
+ description: Created
+ 400:
+ $ref: '#/components/responses/BadRequest'
+ x-amazon-apigateway-integration:
+ type: aws_proxy
+ httpMethod: POST
+ uri: arn:aws:apigateway:us-east-1:lambda:path/2015-03-31/functions/arn:aws:lambda:us-east-1:944207523762:function:beta-api-handler/invocations
+ payloadFormatVersion: "1.0"
+ passthroughBehavior: when_no_match
+ timeoutInMillis: 29000
+
+ /visits/{user_id}:
+ get:
+ summary: Retrieve all visits for a specific user
+ security:
+ - ApiKeyAuth: []
+ parameters:
+ - $ref: '#/components/parameters/UserID'
+ - $ref: '#/components/parameters/StartTimestamp'
+ - $ref: '#/components/parameters/EndTimestamp'
+ - $ref: '#/components/parameters/Limit'
+ responses:
+ 200:
+ description: OK
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Visits'
+ 400:
+ $ref: '#/components/responses/BadRequest'
+ x-amazon-apigateway-integration:
+ type: aws_proxy
+ httpMethod: POST
+ uri: arn:aws:apigateway:us-east-1:lambda:path/2015-03-31/functions/arn:aws:lambda:us-east-1:944207523762:function:beta-api-handler/invocations
+ payloadFormatVersion: "1.0"
+ passthroughBehavior: when_no_match
+ timeoutInMillis: 29000
+
+
+ /equipment:
+ get:
+ summary: Retrieve all equipment usage data
+ security:
+ - ApiKeyAuth: []
+ parameters:
+ - $ref: '#/components/parameters/StartTimestamp'
+ - $ref: '#/components/parameters/EndTimestamp'
+ - $ref: '#/components/parameters/Limit'
+ responses:
+ 200:
+ description: OK
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/EquipmentUsages'
+ x-amazon-apigateway-integration:
+ type: aws_proxy
+ httpMethod: POST
+ uri: arn:aws:apigateway:us-east-1:lambda:path/2015-03-31/functions/arn:aws:lambda:us-east-1:944207523762:function:beta-api-handler/invocations
+ payloadFormatVersion: "1.0"
+ passthroughBehavior: when_no_match
+ timeoutInMillis: 29000
+
+ post:
+ summary: Create a new equipment usage data entry. Fails on existing UserID and Timestamp
+ requestBody:
+ $ref: '#/components/requestBodies/CreateEquipmentUsage'
+ responses:
+ 201:
+ description: Created
+ 400:
+ $ref: '#/components/responses/BadRequest'
+ x-amazon-apigateway-integration:
+ type: aws_proxy
+ httpMethod: POST
+ uri: arn:aws:apigateway:us-east-1:lambda:path/2015-03-31/functions/arn:aws:lambda:us-east-1:944207523762:function:beta-api-handler/invocations
+ payloadFormatVersion: "1.0"
+ passthroughBehavior: when_no_match
+ timeoutInMillis: 29000
+
+ /equipment/{user_id}:
+ get:
+ summary: Retrieve all equipment usage data for a specific user.
+ security:
+ - ApiKeyAuth: []
+ parameters:
+ - $ref: '#/components/parameters/UserID'
+ - $ref: '#/components/parameters/StartTimestamp'
+ - $ref: '#/components/parameters/EndTimestamp'
+ - $ref: '#/components/parameters/Limit'
+ responses:
+ 200:
+ description: OK
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/EquipmentUsages'
+ 400:
+ $ref: '#/components/responses/BadRequest'
+ x-amazon-apigateway-integration:
+ type: aws_proxy
+ httpMethod: POST
+ uri: arn:aws:apigateway:us-east-1:lambda:path/2015-03-31/functions/arn:aws:lambda:us-east-1:944207523762:function:beta-api-handler/invocations
+ payloadFormatVersion: "1.0"
+ passthroughBehavior: when_no_match
+ timeoutInMillis: 29000
+
+ patch:
+ summary: Update data in an existing equipment usage data entry. Specify the timestamp field to get a specific entry, or leave it blank to get the data entry with the latest timestamp.
+ security:
+ - ApiKeyAuth: []
+ parameters:
+ - $ref: '#/components/parameters/UserID'
+ requestBody:
+ $ref: '#/components/requestBodies/UpdateEquipmentUsage'
+ responses:
+ 204:
+ description: Updated
+ 400:
+ $ref: '#/components/responses/BadRequest'
+ x-amazon-apigateway-integration:
+ type: aws_proxy
+ httpMethod: POST
+ uri: arn:aws:apigateway:us-east-1:lambda:path/2015-03-31/functions/arn:aws:lambda:us-east-1:944207523762:function:beta-api-handler/invocations
+ payloadFormatVersion: "1.0"
+ passthroughBehavior: when_no_match
+ timeoutInMillis: 29000
+
+
+ /qualifications:
+ get:
+ summary: Retrieve all qualification data
+ security:
+ - ApiKeyAuth: []
+ parameters:
+ - $ref: '#/components/parameters/StartTimestamp'
+ - $ref: '#/components/parameters/EndTimestamp'
+ - $ref: '#/components/parameters/Limit'
+ responses:
+ 200:
+ description: OK
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Qualifications'
+ 400:
+ $ref: '#/components/responses/BadRequest'
+ x-amazon-apigateway-integration:
+ type: aws_proxy
+ httpMethod: POST
+ uri: arn:aws:apigateway:us-east-1:lambda:path/2015-03-31/functions/arn:aws:lambda:us-east-1:944207523762:function:beta-api-handler/invocations
+ payloadFormatVersion: "1.0"
+ passthroughBehavior: when_no_match
+ timeoutInMillis: 29000
+
+ post:
+ summary: Create a new qualification entry for a user. Fails on existing UserID
+ security:
+ - ApiKeyAuth: []
+ requestBody:
+ $ref: '#/components/requestBodies/CreateQualifications'
+ responses:
+ 201:
+ description: Created
+ 400:
+ $ref: '#/components/responses/BadRequest'
+ x-amazon-apigateway-integration:
+ type: aws_proxy
+ httpMethod: POST
+ uri: arn:aws:apigateway:us-east-1:lambda:path/2015-03-31/functions/arn:aws:lambda:us-east-1:944207523762:function:beta-api-handler/invocations
+ payloadFormatVersion: "1.0"
+ passthroughBehavior: when_no_match
+ timeoutInMillis: 29000
+
+ /qualifications/{user_id}:
+ get:
+ summary: Retrieve qualification data for a specific user
+ security:
+ - ApiKeyAuth: []
+ parameters:
+ - $ref: '#/components/parameters/UserID'
+ responses:
+ 200:
+ description: OK
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Qualification'
+ 400:
+ $ref: '#/components/responses/BadRequest'
+ x-amazon-apigateway-integration:
+ type: aws_proxy
+ httpMethod: POST
+ uri: arn:aws:apigateway:us-east-1:lambda:path/2015-03-31/functions/arn:aws:lambda:us-east-1:944207523762:function:beta-api-handler/invocations
+ payloadFormatVersion: "1.0"
+ passthroughBehavior: when_no_match
+ timeoutInMillis: 29000
+
+ patch:
+ summary: Update a qualification entry for a user. Unique items included in any completable item field are appended to that field. Any duplicate completable item is disregarded within that given field.
+ security:
+ - ApiKeyAuth: []
+ parameters:
+ - $ref: '#/components/parameters/UserID'
+ requestBody:
+ $ref: '#/components/requestBodies/UpdateQualifications'
+ responses:
+ 204:
+ description: Updated
+ 400:
+ $ref: '#/components/responses/BadRequest'
+ x-amazon-apigateway-integration:
+ type: aws_proxy
+ httpMethod: POST
+ uri: arn:aws:apigateway:us-east-1:lambda:path/2015-03-31/functions/arn:aws:lambda:us-east-1:944207523762:function:beta-api-handler/invocations
+ payloadFormatVersion: "1.0"
+ passthroughBehavior: when_no_match
+ timeoutInMillis: 29000
+
+components:
+ schemas:
+ alphaNumeric:
+ description: A string defined to only be valid for alphanumeric strings.
+ type: string
+ pattern: "^[a-zA-Z0-9]*$"
+
+ username:
+ description: The unique name a user should be referenced as. Currently the User ID
+ $ref: '#/components/schemas/alphaNumeric'
+ minLength: 2
+
+ timestamp:
+ description: A timestamp in date-time format (YYYY-MM-DDThh:mm:ss) in EST.
+ type: string
+ format: date-time
+
+ location:
+ description: An enum of strings containing the values of all CU Makerspace locations.
+ type: string
+ enum:
+ - "Watt"
+ - "Cooper"
+ - "CUICAR"
+
+ completableItem:
+ description: An object containing the name of a completable item (e.g., training or waiver) and the current completion status.
+ type: object
+ properties:
+ name:
+ description: The name of the completable item.
+ type: string
+ minLength: 1
+ completion_status:
+ description: The current status of the completable item.
+ type: string
+ enum:
+ - "Complete"
+ - "Incomplete"
+
+ mass:
+ description: The mass of an object.
+ type: number
+ format: double
+ minimum: 0
+
+ printDuration:
+ description: The duration of a 3d print in minutes.
+ type: integer
+ minimum: 0
+
+ universityStatus:
+ description: A string relating to one of the possible university statuses.
+ type: string
+ enum:
+ - "Undergraduate"
+ - "Graduate"
+ - "Faculty"
+
+ undergraduateClass:
+ description: An enum of strings of undergraduate classes.
+ type: string
+ enum:
+ - "Freshman"
+ - "Sophomore"
+ - "Junior"
+ - "Senior"
+
+ 3dPrinterInfo:
+ type: object
+ properties:
+ printer_name:
+ type: string
+ minLength: 1
+ print_duration:
+ $ref: '#/components/schemas/printDuration'
+ print_mass:
+ $ref: '#/components/schemas/mass'
+ print_mass_estimate:
+ $ref: '#/components/schemas/mass'
+ print_status:
+ description: An enum of strings of possible print statuses.
+ enum:
+ - "In progress"
+ - "Success"
+ - "Failure"
+ print_notes:
+ description: Notes about the print.
+ type: string
+ required:
+ - printer_name
+ - print_duration
+ - print_mass
+ - print_mass_estimate
+ - print_status
+
+ major:
+ description: A major an undergraduate can study.
+ type: string
+ enum:
+ - "Accounting"
+ - "African-American/Black Studies"
+ - "Agricultural and Extension Education Services"
+ - "Agricultural Business and Management, General"
+ - "Agricultural Economics"
+ - "Agricultural Engineering"
+ - "Agricultural Teacher Education"
+ - "Agriculture, Agriculture Operations, and Related Sciences"
+ - "Agriculture, Agriculture Operations, and Related Sciences, Other"
+ - "Animal Genetics"
+ - "Animal Physiology"
+ - "Animal Sciences, General"
+ - "Anthropology"
+ - "Applied Behavior Analysis"
+ - "Applied Horticulture/Horticulture Operations, General"
+ - "Aquaculture"
+ - "Architectural and Building Sciences/Technology"
+ - "Architecture"
+ - "Architecture and Related Services"
+ - "Area, Ethnic, Cultural, Gender, and Group Studies"
+ - "Art/Art Studies, General"
+ - "Behavioral Sciences"
+ - "Biochemistry"
+ - "Bioengineering and Biomedical Engineering"
+ - "Biological and Biomedical Sciences"
+ - "Biology/Biological Sciences, General"
+ - "Business Administration and Management, General"
+ - "Business Administration, Management and Operations, Other"
+ - "Business, Management, Marketing, and Related Support Services"
+ - "Ceramic Sciences and Engineering"
+ - "Chemical Engineering"
+ - "Chemistry, General"
+ - "Chemistry, Other"
+ - "City/Urban, Community and Regional Planning"
+ - "Civil Engineering, General"
+ - "Communication and Media Studies, Other"
+ - "Communication, Journalism, and Related Programs"
+ - "Community Psychology"
+ - "Computational Science"
+ - "Computer and Information Sciences and Support Services"
+ - "Computer and Information Sciences, General"
+ - "Computer Engineering, General"
+ - "Computer Programming/Programmer, General"
+ - "Construction Management"
+ - "Counselor Education/School Counseling and Guidance Services"
+ - "Criminology"
+ - "Crisis/Emergency/Disaster Management"
+ - "Curriculum and Instruction"
+ - "Early Childhood Education and Teaching"
+ - "Economics, General"
+ - "Education"
+ - "Education, General"
+ - "Education, Other"
+ - "Educational Assessment, Evaluation, and Research, Other"
+ - "Educational Leadership and Administration, General"
+ - "Educational/Instructional Technology"
+ - "Electrical and Electronics Engineering"
+ - "Elementary Education and Teaching"
+ - "Engineering"
+ - "Engineering Technologies and Engineering-Related Fields"
+ - "Engineering, General"
+ - "Engineering, Other"
+ - "Engineering-Related Fields, Other"
+ - "English Language and Literature, General"
+ - "English Language and Literature/letters"
+ - "Entomology"
+ - "Environmental Design/Architecture"
+ - "Environmental/Environmental Health Engineering"
+ - "Epidemiology"
+ - "Family and Community Services"
+ - "Family and Consumer Sciences/human Sciences"
+ - "Film/Cinema/Video Studies"
+ - "Finance, General"
+ - "Food Science"
+ - "Food Science and Technology, Other"
+ - "Foreign Languages and Literatures, General"
+ - "Foreign Languages, Literatures, and Linguistics"
+ - "Foreign Languages, Literatures, and Linguistics, Other"
+ - "Forest Management/Forest Resources Management"
+ - "Forest Sciences and Biology"
+ - "General Studies"
+ - "Genome Sciences/Genomics"
+ - "Geological and Earth Sciences/Geosciences, Other"
+ - "Geology/Earth Science, General"
+ - "Health Communication"
+ - "Health Professions and Related Clinical Sciences, Other"
+ - "Health Professions and Related Programs"
+ - "Historic Preservation and Conservation"
+ - "History"
+ - "History, General"
+ - "Homeland Security"
+ - "Homeland Security, Law Enforcement, Firefighting and Related Protective Services"
+ - "Horticultural Science"
+ - "Human Development, Family Studies, and Related Services, Other"
+ - "Human Resources Management/Personnel Administration, General"
+ - "Human/Medical Genetics"
+ - "Industrial and Organizational Psychology"
+ - "Industrial and Product Design"
+ - "Industrial Engineering"
+ - "Informatics"
+ - "Information Science/Studies"
+ - "International Public Health/International Health"
+ - "Junior High/Intermediate/Middle School Education and Teaching"
+ - "Landscape Architecture"
+ - "Learning Sciences"
+ - "Liberal Arts and Sciences, General Studies and Humanities"
+ - "Manufacturing Engineering"
+ - "Marketing, Other"
+ - "Marketing/Marketing Management, General"
+ - "Materials Engineering"
+ - "Mathematics and Statistics"
+ - "Mathematics Teacher Education"
+ - "Mathematics, General"
+ - "Mechanical Engineering"
+ - "Medical Informatics"
+ - "Medical Scientist"
+ - "Microbiology, General"
+ - "Multi-/interdisciplinary Studies, General"
+ - "Natural Resources and Conservation"
+ - "Natural Resources/Conservation, General"
+ - "Non-Profit/Public/Organizational Management"
+ - "Nursing Administration"
+ - "Nursing Practice"
+ - "Nursing Science"
+ - "Operations Management and Supervision"
+ - "Optics/Optical Sciences"
+ - "Organizational Leadership"
+ - "Packaging Science"
+ - "Parks, Recreation and Leisure Facilities Management, General"
+ - "Parks, Recreation and Leisure Studies"
+ - "Parks, Recreation, Leisure, and Fitness Studies"
+ - "Philosophy"
+ - "Philosophy and Religious Studies"
+ - "Physical Sciences"
+ - "Physics, General"
+ - "Plant Sciences, General"
+ - "Political Science and Government, General"
+ - "Pre-Dentistry Studies"
+ - "Pre-Medicine/Pre-Medical Studies"
+ - "Pre-Pharmacy Studies"
+ - "Professional, Technical, Business, and Scientific Writing"
+ - "Psychology"
+ - "Psychology, General"
+ - "Psychology, Other"
+ - "Public Administration"
+ - "Public Administration and Social Service Professions"
+ - "Public Health, Other"
+ - "Public Policy Analysis, General"
+ - "Reading Teacher Education"
+ - "Real Estate"
+ - "Registered Nursing/Registered Nurse"
+ - "Religion/Religious Studies"
+ - "Rhetoric and Composition"
+ - "Science Teacher Education/General Science Teacher Education"
+ - "Secondary Education and Teaching"
+ - "Selling Skills and Sales Operations"
+ - "Sign Language Interpretation and Translation"
+ - "Social Sciences"
+ - "Social Sciences, Other"
+ - "Sociology"
+ - "Soil Sciences, Other"
+ - "Spanish Language and Literature"
+ - "Special Education and Teaching, General"
+ - "Speech Communication and Rhetoric"
+ - "Sport and Fitness Administration/Management"
+ - "Sports Communication"
+ - "Systems Engineering"
+ - "Teacher Education and Professional Development, Specific Subject Areas, Other"
+ - "Technology Teacher Education/Industrial Arts Teacher Education"
+ - "Toxicology"
+ - "Trade and Industrial Teacher Education"
+ - "Transportation/Mobility Management"
+ - "Visual and Performing Arts"
+ - "Visual and Performing Arts, Other"
+ - "Wildlife, Fish and Wildlands Science and Management"
+ - "Women's Studies"
+
+ UserProperties:
+ description: An object containing a user's information. If the universityStatus is "Undergraduate", then the major and undergraduateClass fields are required.
+ type: object
+ properties:
+ university_status:
+ $ref: '#/components/schemas/universityStatus'
+ major:
+ $ref: '#/components/schemas/major'
+ undergraduate_class:
+ $ref: '#/components/schemas/undergraduateClass'
+
+ UserRequiredProperties:
+ type: object
+ required:
+ - user_id
+ - university_status
+ anyOf:
+ - required:
+ - major
+ - undergraduate_class
+ - required:
+ - major
+
+ UserID:
+ type: object
+ properties:
+ user_id:
+ $ref: '#/components/schemas/username'
+
+ User:
+ allOf:
+ - $ref: '#/components/schemas/UserID'
+ - $ref: '#/components/schemas/UserProperties'
+ - $ref: '#/components/schemas/UserRequiredProperties'
+
+ Users:
+ description: A collection of User objects
+ type: object
+ properties:
+ users:
+ type: array
+ items:
+ $ref: '#/components/schemas/User'
+
+ VisitProperties:
+ description: An object containing visit information.
+ type: object
+ properties:
+ timestamp:
+ $ref: '#/components/schemas/timestamp'
+ location:
+ $ref: '#/components/schemas/location'
+
+ VisitRequiredProperties:
+ required:
+ - user_id
+ - timestamp
+ - location
+
+ Visit:
+ allOf:
+ - $ref: '#/components/schemas/UserID'
+ - $ref: '#/components/schemas/VisitProperties'
+ - $ref: '#/components/schemas/VisitRequiredProperties'
+
+ Visits:
+ description: A collection of Visit objects
+ type: object
+ properties:
+ visits:
+ type: array
+ items:
+ $ref: '#/components/schemas/Visit'
+
+ EquipmentUsageProperties:
+ description: An object containing equipment usage data. If the project type is "class", the class_number, faculty_name, and project_sponsor fields are required. If the project type is club, the organization_affiliation field is required. If the equipment type is "FDM 3D Printer" or "SLA Printer", then the 3d_printer_info field is required.
+ type: object
+ properties:
+ timestamp:
+ $ref: '#/components/schemas/timestamp'
+ location:
+ $ref: '#/components/schemas/location'
+ project_name:
+ description: The name of the project.
+ type: string
+ project_type:
+ description: The type of project. A string enum value.
+ type: string
+ enum: ["Personal", "Class", "Club"]
+ class_number:
+ type: string
+ pattern: "^[A-Z]{4}-[0-9]{4}$"
+ faculty_name:
+ type: string
+ minLength: 1
+ project_sponsor:
+ type: string
+ minLength: 1
+ organization_affiliation:
+ type: string
+ minLength: 1
+ equipment_type:
+ type: string
+ enum:
+ - "FDM 3D Printer"
+ - "Laser Engraver"
+ - "Glowforge"
+ - "SLA Printer"
+ - "Fabric Printer"
+ - "Vinyl Cutter"
+ - "Button Maker"
+ - "3D Scanner"
+ - "Hand Tools"
+ - "Sticker Printer"
+ - "Embroidery Machine"
+ 3d_printer_info:
+ $ref: '#/components/schemas/3dPrinterInfo'
+
+ EquipmentUsageRequiredProperties:
+ required:
+ - user_id
+ - timestamp
+ - location
+ - project_name
+ - project_type
+ - equipment_type
+ anyOf:
+ - required:
+ - class_number
+ - faculty_name
+ - project_sponsor
+ - required:
+ - organization_affiliation
+ - required:
+ - 3d_printer_info
+
+ EquipmentUsage:
+ allOf:
+ - $ref: '#/components/schemas/UserID'
+ - $ref: '#/components/schemas/EquipmentUsageProperties'
+ - $ref: '#/components/schemas/EquipmentUsageRequiredProperties'
+
+ EquipmentUsages:
+ description: A collection of EquipmentUsage objects
+ type: object
+ properties:
+ equipment_logs:
+ type: array
+ items:
+ $ref: '#/components/schemas/EquipmentUsage'
+
+ QualificationsProperties:
+ description: An object containing qualification information about a user. Completable items quantified by having "training" (case insensitive) should be classified as belonging to the "trainings" array. Completable items quantified by having "waiver" (case insensitive) should be classified as belonging to the "waivers" array. All other completable items should be classified as belonging to the "miscellaneous" array.
+ type: object
+ properties:
+ last_updated:
+ description: A timestamp for the last time the data was changed.
+ $ref: '#/components/schemas/timestamp'
+ trainings:
+ description: An array of training courses and the user’s completion status of them.
+ type: array
+ items:
+ $ref: '#/components/schemas/completableItem'
+ waivers:
+ description: An array of waivers and the user’s completion status of them.
+ type: array
+ items:
+ $ref: '#/components/schemas/completableItem'
+ miscellaneous:
+ description: An array of miscellaneous courses and the user’s completion status of them.
+ type: array
+ items:
+ $ref: '#/components/schemas/completableItem'
+
+
+ QualificationsRequiredProperties:
+ required:
+ - user_id
+ - last_updated
+ - trainings
+ - waivers
+ - miscellaneous
+
+ Qualification:
+ allOf:
+ - $ref: '#/components/schemas/UserID'
+ - $ref: '#/components/schemas/QualificationsProperties'
+ - $ref: '#/components/schemas/QualificationsRequiredProperties'
+
+ Qualifications:
+ description: A collection of Qualification objects
+ type: object
+ properties:
+ qualifications:
+ type: array
+ items:
+ $ref: '#/components/schemas/Qualification'
+
+
+ parameters:
+ UserID:
+ name: user_id
+ in: path
+ required: true
+ schema:
+ $ref: '#/components/schemas/UserID'
+
+ EndTimestamp:
+ name: end_timestamp
+ in: query
+ description: Used to query for results with timestamps less than or equal to end_timestamp. If used alongside start_timestamp, it MUST be greater than or equal to it.
+ schema:
+ $ref: '#/components/schemas/timestamp'
+
+ StartTimestamp:
+ name: start_timestamp
+ in: query
+ description: Used to query for results with timestamps greater than or equal to start_timestamp. If used alongside end_timestamp, it MUST be less than or equal to it.
+ schema:
+ $ref: '#/components/schemas/timestamp'
+
+ Limit:
+ name: limit
+ in: query
+ description: The maximum number of results to return from a table scan/query.
+ schema:
+ type: integer
+ minimum: 1
+
+ requestBodies:
+ CreateUser:
+ description: Create a new user information table entry.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/User'
+
+ UpdateUser:
+ description: Update an equipment usage entry. Changed fields are required to exhibit any documented required field sets (e.g., changing university_status from Employee->Undergraduate means the major and undergraduate_class must be defined in the request body). The user_id field will NEVER be changed, even if it is provided in the request body.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/UserProperties'
+
+ CreateVisit:
+ description: Create a new visit table entry.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Visit'
+
+ CreateEquipmentUsage:
+ description: Create a new equipment usage table entry.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/EquipmentUsage'
+
+ UpdateEquipmentUsage:
+ description: Update an equipment usage entry. Changed fields are required to exhibit any documented required field sets (e.g., changing equipment_type from "Laser Engraver"->"3D Printer" means a 3d_printer_info object must be provided in the request body). The user_id and timestamp fields will NEVER be changed, even if they are provided in the request body. If the timestamp field is not provided, the latest entry in the equipment usage table for the user will be updated instead.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/EquipmentUsageProperties'
+
+ CreateQualifications:
+ description: Create a new qualifications table entry. The last_updated field will always be managed by the server, and will never change to a value provided in a request body.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Qualification'
+
+ UpdateQualifications:
+ description: Update a qualifications entry. It is required when updating any object that is an array of completable items that the request array contains all existing keys. Changed values of existing keys and any new key:value pairs will be added. The user_id field will NEVER be changed, even if it is provided in the request body. The last_updated field will always be managed by the server, and will never change to a value provided in a request body.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/QualificationsProperties'
+
+
+ responses:
+ BadRequest:
+ description: A response body to return when the user makes a bad request or doesn't supply an appropriate request body.
+ content:
+ application/json:
+ schema:
+ type: object
+ properties:
+ errorMsg:
+ description: A message describing what was wrong with the request.
+ type: string
+
+
+ securitySchemes:
+ ApiKeyAuth:
+ type: apiKey
+ name: x-api-key
+ in: header
diff --git a/cdk/api_gateway/lambda_code/equipment_handler/equipment_handler.py b/cdk/api_gateway/lambda_code/equipment_handler/equipment_handler.py
index cb7d34a6..3f029bef 100644
--- a/cdk/api_gateway/lambda_code/equipment_handler/equipment_handler.py
+++ b/cdk/api_gateway/lambda_code/equipment_handler/equipment_handler.py
@@ -221,6 +221,10 @@ def create_user_equipment_usage(self, data: dict):
# Always force GSI_ATTRIBUTE_NAME key to have value of "1"
data[GSI_ATTRIBUTE_NAME] = "1"
+ # Make sure "print_mass" field at least exists
+ if "print_mass" not in data:
+ data["print_mass"] = ""
+
# Actually try putting the item into the table
try:
self.equipment_table.put_item(
@@ -331,6 +335,10 @@ def patch_user_equipment_usage(self, user_id: str, data: dict):
# Ensure data[GSI_ATTRIBUTE_NAME] == '1'
data[GSI_ATTRIBUTE_NAME] = '1'
+ # Make sure "print_mass" field at least exists
+ if "print_mass" not in data:
+ data["print_mass"] = ""
+
# Copy all all fields from data to user
for key in data:
equipment_log[key] = data[key]
@@ -393,7 +401,7 @@ def validateEquipmentRequestBody(self, data: dict):
required field to check is '3d_printer_info' when the type is 'SLA Printer'
or 'FDM 3D Printer'. Otherwise, just make sure that the '3d_printer_info'
field is disallowed for all other types. In the future, split equipment
- type fields into more specificly defined ones as needed.
+ type fields into more specificaly defined ones as needed.
"""
printer_3d_fields = FieldCheck(
required = ["3d_printer_info"],
@@ -405,25 +413,15 @@ def validateEquipmentRequestBody(self, data: dict):
disallowed = ["3d_printer_info"]
)
- equipment_type_field_lookup: dict = {
- "FDM 3D Printer": printer_3d_fields,
- "SLA Printer": printer_3d_fields,
- "Laser Engraver": other_equipment_type_fields,
- "Glowforge": other_equipment_type_fields,
- "Fabric Printer": other_equipment_type_fields,
- "Vinyl Cutter": other_equipment_type_fields,
- "Button Maker": other_equipment_type_fields,
- "3D Scanner": other_equipment_type_fields,
- "Hand Tools": other_equipment_type_fields,
- "Sticker Printer": other_equipment_type_fields,
- "Embroidery Machine": other_equipment_type_fields,
+ required_equipment_field_check_lookup: dict = {
+ "FDM 3D Printer (Plastic)": printer_3d_fields,
+ "SLA Printer (Resin)": printer_3d_fields,
+ "Other": other_equipment_type_fields,
}
- valid_equipment_types: list[str] = [key for key in equipment_type_field_lookup]
-
# Used to check contents of '3d_printer_info' object
equipment_3d_printer_info_fields: list[str] = ["printer_name", "print_duration",
- "print_mass", "print_mass_estimate",
+ "print_mass_estimate",
"print_status", "print_notes"]
# Ensure all required fields are present
@@ -437,11 +435,10 @@ def validateEquipmentRequestBody(self, data: dict):
errorMsg: str = f"project_type {project_type} is not one of the valid project types {valid_project_types}."
raise InvalidRequestBody(errorMsg)
- # Error if equipment_type is not one of the defined ones
+ # Set equipment_type to "Other" if it doesn't require field checks
equipment_type: str = data['equipment_type']
- if equipment_type not in equipment_type_field_lookup:
- errorMsg: str = f"equipment_type {equipment_type} is not one of the valid equipment types {valid_equipment_types}."
- raise InvalidRequestBody(errorMsg)
+ if equipment_type not in required_equipment_field_check_lookup:
+ equipment_type = "Other"
# Check for and clean fields related to 'project_type'
checking_fields = project_type_field_lookup[project_type]
@@ -453,7 +450,7 @@ def validateEquipmentRequestBody(self, data: dict):
raise InvalidRequestBody(errorMsg)
# Check for and clean fields related to 'equipment_type'
- checking_fields = equipment_type_field_lookup[equipment_type]
+ checking_fields = required_equipment_field_check_lookup[equipment_type]
try:
data = checkAndCleanRequestFields(data, checking_fields)
except InvalidRequestBody:
diff --git a/cdk/api_gateway/shared_api_gateway.py b/cdk/api_gateway/shared_api_gateway.py
index 8fc28ee6..32e2d84c 100644
--- a/cdk/api_gateway/shared_api_gateway.py
+++ b/cdk/api_gateway/shared_api_gateway.py
@@ -155,19 +155,7 @@ def create_rest_api(self):
default_cors_preflight_options=aws_apigateway.CorsOptions(
allow_origins=aws_apigateway.Cors.ALL_ORIGINS, # Allow all origins
allow_methods=aws_apigateway.Cors.ALL_METHODS, # Allow all HTTP methods
- allow_headers=["*"]
- #allow_headers=[
- # "Content-Type",
- # "Authorization",
- # "X-Amz-Date",
- # "X-Api-Key",
- # "Accept",
- # "Accept-Encoding",
- # "Origin",
- # "Connection",
- # "Host",
- # "User-Agent",
- #],
+ allow_headers=["*"], # Allow all headers
),
)
diff --git a/site/visitor-console/src/components/EquipmentFormStages/InitialInfo.tsx b/site/visitor-console/src/components/EquipmentFormStages/InitialInfo.tsx
index d81f0eec..b2ed0910 100644
--- a/site/visitor-console/src/components/EquipmentFormStages/InitialInfo.tsx
+++ b/site/visitor-console/src/components/EquipmentFormStages/InitialInfo.tsx
@@ -61,7 +61,7 @@ const InitialInfo: React.FC = ({
className="form-control"
type="text"
placeholder="Enter username here"
- {...register("username")}
+ {...register("user_id")}
/>
{errors.username && (