feat: initialize microservice architecture with auth, api, realtime, copernicus, ml, and console modules

This commit is contained in:
Giuseppe Raffa
2026-03-28 15:29:34 +01:00
commit bcfce32adb
89 changed files with 12025 additions and 0 deletions

136
api/src/storage/minio.js Normal file
View File

@@ -0,0 +1,136 @@
const Minio = require('minio');
const client = new Minio.Client({
endPoint: process.env.MINIO_ENDPOINT || 'localhost',
port: parseInt(process.env.MINIO_PORT) || 9000,
useSSL: process.env.MINIO_USE_SSL === 'true',
accessKey: process.env.MINIO_ACCESS_KEY,
secretKey: process.env.MINIO_SECRET_KEY
})
// Buckets
/**
*
* @param {String} bucket - Il nome del bucket
* @returns {String} - restituisce il nome del bucket creato
*/
async function bucketExists(bucket) {
const exists = await client.bucketExists(bucket);
if(!exists) {
await client.makeBucket(bucket);
}
return bucket
}
/**
* Restituisce un array con tutti i bucket sul server
* @returns {Array} - i diversi bucket presenti sul server
*/
async function getBuckets() {
const buckets = await client.listBuckets();
return buckets;
}
/**
* Restituisce i metadata del bucket passato come parametro
* @param {String} bucket - il nome del bucket
* @returns {Object} - i metadata del bucket
*/
async function getBucket(bucket) {
const buckets = await client.listBuckets();
return buckets.filter(b => b.name === bucket);
}
/**
* Restituisce un array con tutti gli oggetti presenti nel bucket passato come parametro
* @param {String} bucket - il nome del bucket
* @returns {Promise<Array>} - i file del bucket
*/
async function getObjects(bucket) {
return new Promise((resolve, reject) => {
const objects = [];
const stream = client.listObjects(bucket, '', true);
stream.on('data', obj => objects.push(obj));
stream.on('error', err => reject(err));
stream.on('end', () => resolve(objects));
});
}
/**
* Restituisce i metadata del file con id passato come parametro presente nel bucket
* @param {String} bucket - il nome del bucket
* @param {String} objectName - il nome dell'oggetto
* @returns {Object} - i metadata del file
*/
async function getObject(bucket, objectName) {
const item = await client.statObject(bucket, objectName);
return item;
}
/**
* Elimina il file con l'id passato a parametro dal bucket
* @param {String} bucket - il nome del bucket
* @param {String} objectName - il nome dell'oggetto
*/
async function removeObject(bucket, objectName) {
await client.removeObject(bucket, objectName);
}
//Upload - Download
/**
* Carica un file nel bucket come buffer
* @param {String} bucket - il nome del bucket
* @param {String} objectName - il nome che avrà il file in Minio
* @param {Buffer} fileBuffer - il file caricato
* @param {Number} size - dimensione del file
* @param {String} contentType - mimetype (es. 'image/png')
*/
async function upload(bucket, objectName, fileBuffer, size, contentType) {
await bucketExists(bucket);
const metaData = {
'Content-Type': contentType || 'application/octet-stream',
}
const result = await client.putObject(bucket, objectName, fileBuffer, size, metaData);
return result;
}
/**
* Genera un URL temporaneo di download
* @param {String} bucket - il nome del bucket
* @param {String} objectName - il nome del file
* @param {Number} expiry - quanto dura il link in secondi (default: 24h = 86400)
*
* @returns {String} url - url di download del file
*/
async function download(bucket, objectName, expiry = 86400) {
const url = await client.presignedGetObject(bucket, objectName, expiry);
return url;
}
/**
* Recupera e ritorna lo stream dei dati dal server Minio (per leggere il contenuto via API)
* @param {String} bucket - il nome del bucket
* @param {String} objectName - il nome dell'oggetto
*/
async function getFileStream(bucket, objectName) {
const dataStream = await client.getObject(bucket, objectName);
return dataStream;
}
module.exports = {
bucketExists,
getBuckets,
getBucket,
getObjects,
getObject,
removeObject,
upload,
download,
getFileStream
}