mirror of
https://github.com/hasura/graphql-engine.git
synced 2024-12-15 09:22:43 +03:00
parent
8ac78fdaec
commit
669bb40e72
@ -0,0 +1,30 @@
|
||||
# Setup tables
|
||||
1. Create table:
|
||||
|
||||
```
|
||||
notes:
|
||||
id: int
|
||||
note: text
|
||||
```
|
||||
|
||||
# Setup AWS Lambda
|
||||
Create a lambda function in AWS. This will be our webhook.
|
||||
|
||||
1. Create a function.
|
||||
2. Select Java 8 as the runtime.
|
||||
3. Select "start from scratch".
|
||||
4. Add API gateway as a trigger.
|
||||
5. Add an API to API gateway.
|
||||
6. Edit the code in the `handleRequest` method in `/src/main/java/example/Hello.java`.
|
||||
|
||||
# Deploy AWS Lambda
|
||||
|
||||
1. In terminal go into project: `cd community/boilerplates/serverless-triggers/aws-lambda/java/echo`
|
||||
2. Build deployment package: `mvn package`
|
||||
2. Upload `target/java-lambda-1.0-SNAPSHOT.jar` using AWS console.
|
||||
|
||||
|
||||
# Add the trigger in Hasura GraphQL
|
||||
1. In events tab, add a trigger
|
||||
2. Select all insert, update, delete operations for the trigger.
|
||||
3. Paste the API endpoint of your AWS lambda as the webhook.
|
@ -0,0 +1,65 @@
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
<groupId>io.hasura.serverless</groupId>
|
||||
<artifactId>java-lambda</artifactId>
|
||||
<packaging>jar</packaging>
|
||||
<version>1.0-SNAPSHOT</version>
|
||||
<name>Java Lambda</name>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>com.amazonaws</groupId>
|
||||
<artifactId>aws-lambda-java-core</artifactId>
|
||||
<version>1.2.0</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.jayway.jsonpath</groupId>
|
||||
<artifactId>json-path</artifactId>
|
||||
<version>2.4.0</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.slf4j</groupId>
|
||||
<artifactId>slf4j-nop</artifactId>
|
||||
<version>1.7.25</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.junit.jupiter</groupId>
|
||||
<artifactId>junit-jupiter-api</artifactId>
|
||||
<version>5.1.0</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
|
||||
</dependencies>
|
||||
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-shade-plugin</artifactId>
|
||||
<version>3.2.0</version>
|
||||
<configuration>
|
||||
<createDependencyReducedPom>false</createDependencyReducedPom>
|
||||
</configuration>
|
||||
<executions>
|
||||
<execution>
|
||||
<phase>package</phase>
|
||||
<goals>
|
||||
<goal>shade</goal>
|
||||
</goals>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-compiler-plugin</artifactId>
|
||||
<configuration>
|
||||
<source>1.8</source>
|
||||
<target>1.8</target>
|
||||
</configuration>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
</project>
|
@ -0,0 +1,48 @@
|
||||
package example;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import com.amazonaws.services.lambda.runtime.Context;
|
||||
import com.amazonaws.services.lambda.runtime.RequestHandler;
|
||||
import com.jayway.jsonpath.DocumentContext;
|
||||
import com.jayway.jsonpath.JsonPath;
|
||||
|
||||
public class Hello implements RequestHandler<Map<String, Object>, Map<String, Object>> {
|
||||
|
||||
private static final int INTERNAL_SERVER_ERROR = 500;
|
||||
private final Notebook notebook;
|
||||
|
||||
public Hello() {
|
||||
this.notebook = new Notebook();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Map<String, Object> handleRequest(Map<String, Object> request, Context context) {
|
||||
context.getLogger().log(request.toString());
|
||||
Map<String, Object> response = new HashMap<>();
|
||||
response.put("isBase64Encoded", false);
|
||||
try {
|
||||
String requestBody = (String) request.get("body");
|
||||
response.put("body", handleRequestBody(requestBody));
|
||||
response.put("statusCode", 200);
|
||||
} catch (Exception e) {
|
||||
response.put("body", e.toString());
|
||||
response.put("statusCode", INTERNAL_SERVER_ERROR);
|
||||
}
|
||||
return response;
|
||||
}
|
||||
|
||||
private String handleRequestBody(String requestBody) {
|
||||
DocumentContext body = JsonPath.parse(requestBody);
|
||||
String table = body.read("$.table.name");
|
||||
if (table != null && table.equals("notes")) {
|
||||
Notebook.Operation operation = Notebook.Operation.valueOf(body.read("$.event.op"));
|
||||
Note newNote = body.read("$.event.data.new", Note.class);
|
||||
Note oldNote = body.read("$.event.data.old", Note.class);
|
||||
return notebook.handleOperation(operation, newNote, oldNote);
|
||||
} else {
|
||||
throw new UnsupportedOperationException("table: " + table);
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,23 @@
|
||||
package example;
|
||||
|
||||
class Note {
|
||||
|
||||
private Integer id;
|
||||
private String note;
|
||||
|
||||
Integer getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
void setId(Integer id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
String getNote() {
|
||||
return note;
|
||||
}
|
||||
|
||||
void setNote(String note) {
|
||||
this.note = note;
|
||||
}
|
||||
}
|
@ -0,0 +1,22 @@
|
||||
package example;
|
||||
|
||||
class Notebook {
|
||||
|
||||
enum Operation {
|
||||
INSERT, UPDATE, DELETE;
|
||||
}
|
||||
|
||||
String handleOperation(Operation operation, Note newNote, Note oldNote) {
|
||||
switch (operation) {
|
||||
case INSERT:
|
||||
return "New note " + newNote.getId() + " inserted, with data: " + newNote.getNote();
|
||||
case UPDATE:
|
||||
return "Note " + newNote.getId() + " updated, with data: " + newNote.getNote();
|
||||
case DELETE:
|
||||
return "Note " + oldNote.getId() + " deleted, with data: " + oldNote.getNote();
|
||||
default:
|
||||
throw new UnsupportedOperationException("operation: " + operation);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,74 @@
|
||||
package example;
|
||||
|
||||
import com.amazonaws.services.lambda.runtime.ClientContext;
|
||||
import com.amazonaws.services.lambda.runtime.CognitoIdentity;
|
||||
import com.amazonaws.services.lambda.runtime.Context;
|
||||
import com.amazonaws.services.lambda.runtime.LambdaLogger;
|
||||
|
||||
public class ContextStub implements Context {
|
||||
|
||||
@Override
|
||||
public LambdaLogger getLogger() {
|
||||
return new LambdaLogger() {
|
||||
@Override
|
||||
public void log(String s) {
|
||||
System.out.println(s);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void log(byte[] bytes) {
|
||||
log(new String(bytes));
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getAwsRequestId() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getLogGroupName() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getLogStreamName() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getFunctionName() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getFunctionVersion() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getInvokedFunctionArn() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public CognitoIdentity getIdentity() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ClientContext getClientContext() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getRemainingTimeInMillis() {
|
||||
return -1;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getMemoryLimitInMB() {
|
||||
return -1;
|
||||
}
|
||||
}
|
@ -0,0 +1,35 @@
|
||||
package example;
|
||||
|
||||
import java.io.BufferedReader;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStreamReader;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
|
||||
class HelloTest {
|
||||
|
||||
@Test
|
||||
void handleRequestDelete() throws IOException {
|
||||
Map<String, Object> request = new HashMap<>();
|
||||
request.put("body", loadResource("delete.json"));
|
||||
|
||||
Map<String, Object> response = new Hello().handleRequest(request, new ContextStub());
|
||||
|
||||
assertEquals(200, response.get("statusCode"));
|
||||
assertEquals("Note 1 deleted, with data: a", response.get("body"));
|
||||
}
|
||||
|
||||
private String loadResource(String name) {
|
||||
return new BufferedReader(new InputStreamReader(
|
||||
ClassLoader.getSystemResourceAsStream(name)
|
||||
))
|
||||
.lines()
|
||||
.collect(Collectors.joining("\n"));
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,18 @@
|
||||
{
|
||||
"table": {
|
||||
"name": "notes"
|
||||
},
|
||||
"event": {
|
||||
"op": "DELETE",
|
||||
"data": {
|
||||
"new": {
|
||||
"id": 2,
|
||||
"note": "b"
|
||||
},
|
||||
"old": {
|
||||
"id": 1,
|
||||
"note": "a"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user