Documentation Index

Fetch the complete documentation index at: https://docs.poja.io/llms.txt

Use this file to discover all available pages before exploring further.

Hello world, but with persistent memories

Prev Next

Goal

We want to add persistence using an S3 Bucket to an Hello World Application already hosted on Poja that exposes the /hello?name=your-name endpoint, for which it :

  • Writes a Hello World message inside a .txt file

  • Uploads the file to an S3 bucket

  • Returns a presigned uri to download the file

Deploy in one click

Before diving into the step-by-step guide, you can simply click the Deploy to Poja button. This will instantly deploy this template to your Poja account

Deploy to Poja  

How-to in 2 steps

Step 1: Enable file storage for the preprod environment

Select the preprod environment, click on the Edit button on the Poja Configuration section and then:

  • Enable the File Storage

  • Click on the Save button

Once it’s done, wait for the deployment to finish.

/health/bucket

Once the File Storage option is activated, /health/bucket endpoint will be added to the application. It returns a presigned URI which gives you read-only access to tiny files created in the bucket for testing purpose.

Step 2: Code your endpoint

The BucketComponent class

To interact with the S3 Bucket associated to your application, Poja provides the BucketComponent class which has 4 public methods:

  • upload()

  • download() to download a specific file by specifying its name

  • presign()  to get a presigned uri to access a specific file for a specified duration

  • getBucketName()

package com.my.company.service;

import static java.io.File.createTempFile;

import com.my.company.file.bucket.BucketComponent;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.time.Duration;
import lombok.AllArgsConstructor;
import lombok.SneakyThrows;
import org.springframework.stereotype.Service;

@Service
@AllArgsConstructor
public class HelloWorldService {
  private final BucketComponent bucketComponent;

  @SneakyThrows
  public String uploadHelloWorldMessage(String name) {
    var fileSuffix = ".txt";
    var filePrefix = "hello-world-" + name;
    var bucketKey = filePrefix + fileSuffix;
    var fileToUpload = createTempFile(filePrefix, fileSuffix);
    writeMessageIntoFile("Hello World " + name + " !", fileToUpload);
    bucketComponent.upload(fileToUpload, bucketKey);
    return bucketComponent.presign(bucketKey, Duration.ofMinutes(5)).toString();
  }

  private void writeMessageIntoFile(String message, File file) throws IOException {
    FileWriter writer = new FileWriter(file);
    writer.write(message);
    writer.close();
  }
}
package com.my.company.endpoint.rest.controller;

import com.my.company.service.HelloWorldService;
import lombok.AllArgsConstructor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
@AllArgsConstructor
public class HelloWorldController {
  private final HelloWorldService service;

  @GetMapping("/hello")
  public String helloWorld(@RequestParam String name) {
    return service.uploadHelloWorldMessage(name);
  }
}

To trigger a deployment, just commit and push the code to the preprod branch of the repository. Wait. And voilà!