From 552b1d62fe7f8b01c834882caf11ba7d38d4fad7 Mon Sep 17 00:00:00 2001 From: Tina_Azure <-> Date: Mon, 7 Aug 2023 19:34:09 +0200 Subject: [PATCH] add file metadata to database --- src/database.cpp | 26 +++++++++++++++++++ src/databaseStatementConstCollection.cpp | 17 +++++++++--- src/main.cpp | 15 +++++++++-- src/utilities.cpp | 12 ++++++--- .../freelancerSubmissionUpload.js.html | 2 +- 5 files changed, 63 insertions(+), 9 deletions(-) diff --git a/src/database.cpp b/src/database.cpp index 4d2ff75..59c538a 100644 --- a/src/database.cpp +++ b/src/database.cpp @@ -694,6 +694,32 @@ namespace Database { work.commit(); return result; } + /* + * Executes the prepared statement INSERT_FREELANCER_FILE_SUBMISSION + * Takes an open pqxx::connection and the freelancer email, the file name, the full path and the filesize in byte + * returns errorLevel + * 0 = no error + * 1 = query error + * 2 = critical error + */ + int executePreparedStatement_INSERT_FREELANCER_FILE_SUBMISSION(pqxx::connection &connection, const std::string& email, const std::string& fileName, const std::string& fullPath, const std::size_t filesize) { + try { + pqxx::work work(connection); + work.exec_prepared(PREPARED_STATEMENT_INSERT_FREELANCER_FILE_SUBMISSION, email, fileName, fullPath, filesize); + work.commit(); + } + catch (pqxx::sql_error const &e) { + std::cerr + << "Database error: " << e.what() << std::endl + << "Query was: " << e.query() << std::endl; + return 1; + } + catch (std::exception const &e) { + std::cerr << e.what() << std::endl; + return 2; + } + return 0; + } /* * Prepares a statement based on ID diff --git a/src/databaseStatementConstCollection.cpp b/src/databaseStatementConstCollection.cpp index 147f3ac..bce26ab 100644 --- a/src/databaseStatementConstCollection.cpp +++ b/src/databaseStatementConstCollection.cpp @@ -264,7 +264,15 @@ namespace DatabaseStatementConstCollection { * Name and Statement for prepared statement to purge expired file submissions from the database */ const static std::string PREPARED_STATEMENT_PRUGE_FREELANCER_FILE_SUBMISSION = "purgeFreelancerFileSubmissions"; - const static std::string SQL_STATEMENT_PRUGE_FREELANCER_FILE_SUBMISSION_PATH = "delete from freelancersubmissions where (current_timestamp - uploaddate) > make_interval(hours => $1)"; + const static std::string SQL_STATEMENT_PRUGE_FREELANCER_FILE_SUBMISSION = "delete from freelancersubmissions where (current_timestamp - uploaddate) > make_interval(hours => $1)"; + + /* + * Name and Statement for prepared statement to insert metadata of a submission. + * 1=freelancer email, 2=filename, 3=fullpath, 4=filesize in byte + */ + const static std::string PREPARED_STATEMENT_INSERT_FREELANCER_FILE_SUBMISSION = "insertFreelancerFileSubmission"; + const static std::string SQL_STATEMENT_INSERT_FREELANCER_FILE_SUBMISSION = "insert into freelancersubmissions values ((select freelancers.id from freelancers where emailaddress = $1), $2, $3, $4, CURRENT_TIMESTAMP);"; + /* * IDs of prepared statements @@ -311,6 +319,7 @@ namespace DatabaseStatementConstCollection { const static int ID_SELECT_FREELANCER_FILE_SUBMISSION_PATH = 39; const static int ID_DELETE_FREELANCER_FILE_SUBMISSION = 40; const static int ID_PRUGE_FREELANCER_FILE_SUBMISSION = 41; + const static int ID_INSERT_FREELANCER_FILE_SUBMISSION = 42; @@ -359,7 +368,8 @@ namespace DatabaseStatementConstCollection { {PREPARED_STATEMENT_SELECT_FREELANCER_FILE_SUBMISSION_USED_STORAGE, SQL_STATEMENT_SELECT_FREELANCER_FILE_SUBMISSION_USED_STORAGE}, {PREPARED_STATEMENT_SELECT_FREELANCER_FILE_SUBMISSION_PATH, SQL_STATEMENT_SELECT_FREELANCER_FILE_SUBMISSION_PATH}, {PREPARED_STATEMENT_DELETE_FREELANCER_FILE_SUBMISSION, SQL_STATEMENT_DELETE_FREELANCER_FILE_SUBMISSION_PATH}, - {PREPARED_STATEMENT_PRUGE_FREELANCER_FILE_SUBMISSION, SQL_STATEMENT_PRUGE_FREELANCER_FILE_SUBMISSION_PATH} + {PREPARED_STATEMENT_PRUGE_FREELANCER_FILE_SUBMISSION, SQL_STATEMENT_PRUGE_FREELANCER_FILE_SUBMISSION}, + {PREPARED_STATEMENT_INSERT_FREELANCER_FILE_SUBMISSION, SQL_STATEMENT_INSERT_FREELANCER_FILE_SUBMISSION} }; /* * Easy access to prepared statement name via int @@ -406,7 +416,8 @@ namespace DatabaseStatementConstCollection { {ID_SELECT_FREELANCER_FILE_SUBMISSION_USED_STORAGE, PREPARED_STATEMENT_SELECT_FREELANCER_FILE_SUBMISSION_USED_STORAGE}, {ID_SELECT_FREELANCER_FILE_SUBMISSION_PATH, PREPARED_STATEMENT_SELECT_FREELANCER_FILE_SUBMISSION_PATH}, {ID_DELETE_FREELANCER_FILE_SUBMISSION, PREPARED_STATEMENT_DELETE_FREELANCER_FILE_SUBMISSION}, - {ID_PRUGE_FREELANCER_FILE_SUBMISSION, PREPARED_STATEMENT_PRUGE_FREELANCER_FILE_SUBMISSION} + {ID_PRUGE_FREELANCER_FILE_SUBMISSION, PREPARED_STATEMENT_PRUGE_FREELANCER_FILE_SUBMISSION}, + {ID_INSERT_FREELANCER_FILE_SUBMISSION, PREPARED_STATEMENT_INSERT_FREELANCER_FILE_SUBMISSION} }; /* diff --git a/src/main.cpp b/src/main.cpp index 1619c67..0edc722 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1023,7 +1023,8 @@ int main(int argc, char *argv[]) { pqxx::connection databaseConnection(configuration.databaseConnectionString); Database::prepareStatements(databaseConnection, { ID_SELECT_FREELANCER_ID, - ID_SELECT_FREELANCER_NAME + ID_SELECT_FREELANCER_NAME, + ID_INSERT_FREELANCER_FILE_SUBMISSION }); string freelancerName, freelancerID; @@ -1079,7 +1080,7 @@ int main(int argc, char *argv[]) { if (!Utilities::validateFolderPath(outputFolderPath)) return crow::response(400, "Unable to write to Freelancer folder"); - const std::string& outputFilename = filename; + const std::string& outputFilename = Utilities::generateHashedFileName(filename); const std::string outputFilePath = Utilities::generateSubmissionFilePath(outputFolderPath, outputFilename); if (!Utilities::validateFilePath(outputFilePath)) @@ -1098,6 +1099,16 @@ int main(int argc, char *argv[]) { outputFileStream << postRequest.body[i]; } outputFileStream.close(); + + size_t filesize = postRequest.body.size() - fileContentStart; //get filesize without metadata + + if (Database::executePreparedStatement_INSERT_FREELANCER_FILE_SUBMISSION(databaseConnection, cookieCtx.get_cookie(COOKIE_FREELANCER_EMAIL), outputFilename, outputFilePath, filesize) != 0) + Utilities::errorOut("Error occured on insert of file to database after successful completion of the upload and saving:\n FreelancerEmail: " + + cookieCtx.get_cookie(COOKIE_FREELANCER_EMAIL) + + "\noutputFilename: " + outputFilename + + "\noutputFilePath: " + outputFilePath + + "\nfileSize: " + to_string(filesize)); + return crow::response(200, "Upload was successfull"); } else { diff --git a/src/utilities.cpp b/src/utilities.cpp index 10c1c4c..de1ded6 100644 --- a/src/utilities.cpp +++ b/src/utilities.cpp @@ -735,11 +735,17 @@ namespace Utilities { return folderPath; } + std::string generateHashedFileName(const std::string& fileName) { + std::string hashedFileName = "["; + hashedFileName.append(generateRandomHashValueSHA1Short(5)); + hashedFileName.append("]"); + hashedFileName.append(fileName); + return hashedFileName; + } + std::string generateSubmissionFilePath(const std::string& folderPath, const std::string& fileName){ std::string filePath = folderPath; - filePath.append("/["); - filePath.append(generateRandomHashValueSHA1Short(5)); - filePath.append("]"); + filePath.append("/"); filePath.append(fileName); return filePath; } diff --git a/templates/templateIncludes/freelancerSubmissionUpload.js.html b/templates/templateIncludes/freelancerSubmissionUpload.js.html index 686e044..47d45f9 100644 --- a/templates/templateIncludes/freelancerSubmissionUpload.js.html +++ b/templates/templateIncludes/freelancerSubmissionUpload.js.html @@ -7,7 +7,7 @@ function upload() { var file = _("FILE_SUBMISSION").files[0]; const fileSize = file.size / 1024 / 1024; - const maxSize = {{MAXIMUM_STORAGE_IN_MB}} - {{AVAILIBLE_STORAGE_IN_MB}}; + const maxSize = {{MAXIMUM_STORAGE_IN_MB}} - {{USED_STORAGE_IN_MB}}; const maxFileNameLength = {{MAXIMUM_FILE_NAME_SIZE}}; console.log(maxSize); console.log(maxFileNameLength);