diff --git a/.env.example b/.env.example index f40b07c2a9b5ba7369281050f0da521f62bd95a9..afa7e9eed7289360bd7d898eecf607eb453423e5 100644 --- a/.env.example +++ b/.env.example @@ -1,6 +1,13 @@ DATABASE_URL= JWT_SHARED_SECRET= +EXPRESS_PORT= + +# services +# SOAP SOAP_URL= SOAP_WS_URL= SOAP_API_KEY= -EXPRESS_PORT= \ No newline at end of file + +# PHP +PHP_URL= +PHP_API_KEY= diff --git a/src/clients/php-client.ts b/src/clients/php-client.ts new file mode 100644 index 0000000000000000000000000000000000000000..29d193bd526c800702d806f9a41cecf58637db29 --- /dev/null +++ b/src/clients/php-client.ts @@ -0,0 +1,56 @@ +import axios from "axios"; + +const phpClient = async (url : string, method : string, data : any, is_multipart_form_data : boolean = false) : Promise<object> => { + const responseData : string = await phpRequest(url, method, data, is_multipart_form_data); + return phpResponseDataParser(responseData); +} + +const phpRequest = async ( + url : string, + method : string, + data : any, + is_multipart_form_data : boolean, +) : Promise<string> => { + if (method === "GET") { + const response = await axios.get( + url, + { + params: data, + } + ); + return response.data as string; + } + else if (method === "POST") { + const formData = new FormData(); + if (is_multipart_form_data) { + // only accept 1 file + Object.keys(data).forEach((key) => { + (key !== "file") && formData.append(key, data[key]); + }); + const blobFile = new Blob([data.file.buffer]); + formData.append("rest-file", blobFile, data.file.filename) + } + + const response = await axios.post( + url, + is_multipart_form_data ? formData : data, + { + headers: { + "Content-Type": is_multipart_form_data ? "multipart/form-data" : "application/json", + "X-API-KEY": process.env.PHP_API_KEY + } + } + ); + return response.data as string; + } + else { + throw new Error("Invalid method"); + } +} + +const phpResponseDataParser = (data : string) : object => { + console.log(data) + return JSON.parse("{}"); +} + +export default phpClient; \ No newline at end of file diff --git a/src/controllers/premium-album-controller.ts b/src/controllers/premium-album-controller.ts index 0a27da6ebc386e87b17ad7c257ae72494b705d45..36595e5d942e933b415c570af386d4097468b6a6 100644 --- a/src/controllers/premium-album-controller.ts +++ b/src/controllers/premium-album-controller.ts @@ -3,6 +3,9 @@ import * as PremiumAlbumService from "../services/premium-album-service"; import { generateResponse } from "../utils/response"; import { StatusCodes } from "http-status-codes"; import {ErrorType, StandardError} from "../errors/standard-error"; +import phpClient from "../clients/php-client"; +import * as path from "path"; +import {v4 as uuidv4} from 'uuid'; const createPremiumAlbum = async ( req: Request, @@ -14,8 +17,20 @@ const createPremiumAlbum = async ( if (!req.file) { throw new StandardError(ErrorType.FILE_NOT_VALID); } - data.coverFilename = req.file.filename; + // data.coverFilename = req.file.filename; + data.coverFilename = uuidv4() + path.extname(req.file.originalname); const responseData = await PremiumAlbumService.createPremiumAlbum(data); + await phpClient( + process.env.PHP_URL + "upload", + "POST", + { + file : { + filename: data.coverFilename, + buffer: req.file.buffer + } + }, + true + ) generateResponse(res, StatusCodes.OK, responseData); } catch (err) { next(err); @@ -54,14 +69,33 @@ const updatePremiumAlbum = async ( // @ts-ignore if (req.files && req.files[0]) { // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-ignore - data.coverFilename = req.files[0].filename; + // @ts-ignore + data.coverFilename = uuidv4() + path.extname(req.files[0].originalname); } const updatedPremiumAlbum = await PremiumAlbumService.updatePremiumAlbum( data, premiumAlbumId, ); + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + if (req.files && req.files[0]) { + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + await phpClient( + process.env.PHP_URL + "upload", + "POST", + { + file : { + filename: data.coverFilename, + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + buffer: req.files[0].buffer + } + }, + true + ) + } generateResponse(res, StatusCodes.OK, updatedPremiumAlbum); } catch (err) { next(err); diff --git a/src/controllers/premium-song-controller.ts b/src/controllers/premium-song-controller.ts index a1bf4b0415822c12d92af4d50afa7ba0ee8aaa3f..a39b534f0165c2bc19049dfa4abfe4c457035b9c 100644 --- a/src/controllers/premium-song-controller.ts +++ b/src/controllers/premium-song-controller.ts @@ -3,6 +3,9 @@ import * as PremiumSongService from "../services/premium-song-services" import { generateResponse } from "../utils/response"; import { StatusCodes } from "http-status-codes"; import {ErrorType, StandardError} from "../errors/standard-error"; +import phpClient from "../clients/php-client"; +import {v4 as uuidv4} from "uuid"; +import path from "path"; const addNewSong = async ( req: Request, @@ -15,13 +18,24 @@ const addNewSong = async ( if (!req.file) { throw new StandardError(ErrorType.FILE_NOT_VALID); } - data.audioFilename = req.file.filename; + data.audioFilename = uuidv4() + path.extname(req.file.originalname); data.songNumber = Number(data.songNumber); if (data.discNumber) { data.discNumber = Number(data.discNumber); } data.duration = Number(data.duration); const responseData = await PremiumSongService.addNewSong(data, premiumAlbumId); + await phpClient( + process.env.PHP_URL + "upload", + "POST", + { + file : { + filename: data.audioFilename, + buffer: req.file.buffer + } + }, + true + ) generateResponse(res, StatusCodes.OK, responseData); } catch (err) { next(err); @@ -66,9 +80,28 @@ const updatePremiumSong = async ( if (req.files && req.files[0]) { // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore - data.audioFilename = req.files[0].filename; + data.audioFilename = uuidv4() + path.extname(req.files[0].originalname); } const responseData = await PremiumSongService.updatePremiumSong(data, premiumAlbumId, premiumSongId); + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + if (req.files && req.files[0]) { + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + await phpClient( + process.env.PHP_URL + "upload", + "POST", + { + file : { + filename: data.audioFilename, + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + buffer: req.files[0].buffer + } + }, + true + ) + } generateResponse(res, StatusCodes.OK, responseData); } catch (err) { next(err); diff --git a/src/routers/premium-song-router.ts b/src/routers/premium-song-router.ts index 3b576034b5c9cb3dc7c455abdd93717afba1a2ad..bcaa9a6bbaa2ace9ddd723b4610ea695b4639c00 100644 --- a/src/routers/premium-song-router.ts +++ b/src/routers/premium-song-router.ts @@ -9,7 +9,7 @@ const premiumSongRouter: Router = express.Router(); premiumSongRouter.post( "/api/premium-album/:premiumAlbumId", verifyToken, - uploadSong.single("songFile"), + uploadSong.single("audioFile"), PremiumSongController.addNewSong, handleStandardError, ); diff --git a/src/utils/file-processing.ts b/src/utils/file-processing.ts index 0242eb9b2824b7879c121388627d0a2b8c74fdf7..897cc537addedef78729138a493744817b47f73c 100644 --- a/src/utils/file-processing.ts +++ b/src/utils/file-processing.ts @@ -1,17 +1,7 @@ -import * as path from 'path'; -import {v4 as uuidv4} from 'uuid'; import multer from "multer"; // https://github.com/expressjs/multer - -const storage = multer.diskStorage({ - destination: function (req, file, cb) { - cb(null, "./storage/") - }, - filename: function (req, file, cb) { - cb(null, uuidv4() + path.extname(file.originalname)) - } -}) +const storage = multer.memoryStorage(); const uploadCover = multer({ storage: storage,