Skip to content

jbystronski/jb-fmanager-s3

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

15 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

S3 service package for @jb_fmanager/react in nodejs.

Install:

npm i @jb_fmanager/s3

yarn add @jb_fmanager/s3

Use:

Depending on your framework's specs you have to write a route that points to a relevant service function and pass the right arguments. Examples below show a basic setup in Express with default error handling behaviour. Steps can be reproduced in similar fashion in any nodejs based environment.

const express = require("express");
const app = express();
const cors = require("cors");
require("dotenv").config(); // to parse your config variables from the .env file as shown below (optional, yet recommended)

const jbfm_s3 = require("@jb_fmanager/s3")({
  accessKeyId: process.env.AWS_ACCESS_KEY_ID,
  secretAccessKey: process.env.AWS_SECRET_KEY,
  bucketName: process.env.AWS_BUCKET_NAME,
  endpoint: "your/s3/bucket/endpoint/url",
  // any other s3 configuration you want to include, the one above is the required minimum
});

const prefix = "/api/fm"; // prefix your routes with the same namespace used in the frontend component

[get] map

Maps the s3 bucket and returns a parent / child file tree structure

app.get(`${prefix}/map`, (req, res, next) =>
  jbfm_s3
    .map()
    .then((data) => res.status(200).send(data))
    .catch(next)
);

[get] create_folder

Creates a new directory object in the specified path

app.get(`${prefix}/create_folder`, ({ query }, res, next) =>
  jbfm_s3
    .create_folder(query.path, query.name) // pass query parameters: path, name
    .then((_) => res.status(200).send({}))
    .catch(next)
);

[get] rename

Renames an object and all objects down in hierarchy

app.get(`${prefix}/rename`, ({ query }, res, next) =>
  jbfm_s3
    .rename(query.oldPath, query.newPath) // pass query parameters: oldPath, newPath
    .then((_) => res.status(200).send({}))
    .catch(next)
);

[post] remove

Removes a number of objects

app.post(`${prefix}/remove`, ({ body }, res, next) =>
  jbfm_s3
    .remove(body) // pass the request body
    .then((_) => res.status(200).send({}))
    .catch(next)
);

[post] copy

Copies a number of objects from one path to another

app.post(`${prefix}/copy`, ({ query, body }, res, next) =>
  jbfm_s3
    .copy(query.target, body) // pass the requst body and query parameter: target
    .then((_) => res.status(200).send({}))
    .catch(next)
);

[post] move

Moves a number of objects from one path to another

app.post(`${prefix}/move`, ({ query, body }, res, next) =>
  jbfm_s3
    .move(query.target, body) // pass query parameter target and request body
    .then((_) => res.status(200).send({}))
    .catch(next)
);

[post] upload

Saves a number of objects into the given destination

app.post(`${prefix}/upload`, (req, res, next) =>
  jbfm_s3
    .upload(req, res, {
      keepOriginalName: false, // maintains or not the original name of a file
      overrideMaxSize: 1024 * 1024 * 5, // overrides the value from the frontend component
    })
    .then((result) => res.status(200).send(result))
    .catch(next)
);

Upload relies on a multipart/form-data type request. It can vary how your framework handles such requests. It might be passed with no issues or it might be blocked on the way, due reasons such as your framework not supporting multipart data in vanilla form or it may fall half-way when the framework tries to process it through it's default parser. What you should do is to disable the default parser on this specific route or, depending on your framework, add a custom parser or middleware that will pass the request onwards.

// Next.js - blocking default parser on "api/fm/upload" route example

export const config = {
  api: {
    bodyParser: false,
  },
};

// process upload
// fastify - adding a custom multipart/form-data parser which will pass the request onwards

const fastify = require("fastify")({});

fastify.addContentTypeParser(
  "multipart/form-data",
  function (request, payload, done) {
    done(null, payload);
  }
);

// then inside your route

upload(request.raw, response.raw);

// in fastify the instance of IncomingMessage can be found under request.raw,

About

s3 bridge for jb_fmanager

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published