Created
August 1, 2023 15:49
-
-
Save sherlockholmes/ee46fa60d69f9da26409f74119ec0afc to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import { randomBytes } from "crypto"; | |
import { DynamoDBClient } from "@aws-sdk/client-dynamodb"; | |
import { PutCommand, DynamoDBDocumentClient } from "@aws-sdk/lib-dynamodb"; | |
const client = new DynamoDBClient({ region: 'us-east-1' }); // Update with your desired region | |
const docClient = DynamoDBDocumentClient.from(client); | |
const fleet = [ | |
{ | |
Name: 'Bucephalus', | |
Color: 'Golden', | |
Gender: 'Male', | |
}, | |
{ | |
Name: 'Shadowfax', | |
Color: 'White', | |
Gender: 'Male', | |
}, | |
{ | |
Name: 'Rocinante', | |
Color: 'Yellow', | |
Gender: 'Female', | |
}, | |
]; | |
export const handler = async(event) => { | |
if (!event.requestContext.authorizer) { | |
return errorResponse('Authorization not configured', event.requestContext.requestId); | |
} | |
const rideId = toUrlString(randomBytes(16)); | |
console.log('Received event (', rideId, '): ', event); | |
const username = event.requestContext.authorizer.claims['cognito:username']; | |
const requestBody = JSON.parse(event.body); | |
const pickupLocation = requestBody.PickupLocation; | |
const unicorn = findUnicorn(pickupLocation); | |
try { | |
await recordRide(rideId, username, unicorn); | |
return { | |
statusCode: 201, | |
body: JSON.stringify({ | |
RideId: rideId, | |
Unicorn: unicorn, | |
UnicornName: unicorn.Name, | |
Eta: '30 seconds', | |
Rider: username, | |
}), | |
headers: { | |
'Access-Control-Allow-Origin': '*', | |
}, | |
}; | |
} catch (err) { | |
console.error(err); | |
return errorResponse(err.message, event.requestContext.requestId); | |
} | |
}; | |
function findUnicorn(pickupLocation) { | |
console.log('Finding unicorn for ', pickupLocation.Latitude, ', ', pickupLocation.Longitude); | |
return fleet[Math.floor(Math.random() * fleet.length)]; | |
} | |
async function recordRide(rideId, username, unicorn) { | |
const command = new PutCommand({ | |
TableName: 'Rides', | |
Item: { | |
RideId: rideId, | |
User: username, | |
Unicorn: unicorn, | |
UnicornName: unicorn.Name, | |
RequestTime: new Date().toISOString(), | |
}, | |
}); | |
const response = await docClient.send(command); | |
} | |
function toUrlString(buffer) { | |
return buffer | |
.toString('base64') | |
.replace(/\+/g, '-') | |
.replace(/\//g, '_') | |
.replace(/=/g, ''); | |
} | |
function errorResponse(errorMessage, awsRequestId) { | |
return { | |
statusCode: 500, | |
body: JSON.stringify({ | |
Error: errorMessage, | |
Reference: awsRequestId, | |
}), | |
headers: { | |
'Access-Control-Allow-Origin': '*', | |
}, | |
}; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment